<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent sightings.</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent sightings.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 08 Oct 2026 15:03:11 +0000</lastBuildDate>
    <item>
      <title>f38d26d9-933d-4c3a-b598-5457b9e72ec6</title>
      <link>https://vulnerability.circl.lu/sighting/f38d26d9-933d-4c3a-b598-5457b9e72ec6/export</link>
      <description>{"uuid": "f38d26d9-933d-4c3a-b598-5457b9e72ec6", "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/407b3dbbb68fb4b062f68fe0a085be3c", "content": "\nSparkOps Python-to-Go migration\n\n:root{--bg:#f6f5f0;--paper:#fff;--ink:#19372e;--muted:#66746d;--line:#e1e5dc;--teal:#23775e;--lime:#dfeec8;--orange:#bb5c31;--soft:#f0f4ed}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.6 -apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}a{color:var(--teal);text-decoration:none}a:hover{text-decoration:underline}button,input,select{font:inherit}.shell{max-width:1360px;margin:auto;padding:0 40px}header{border-bottom:1px solid var(--line)}.top{display:flex;align-items:center;justify-content:space-between;min-height:76px;gap:20px}.brand{font-size:19px;font-weight:750;letter-spacing:-.6px}.brand small{font-size:12px;letter-spacing:1.8px;text-transform:uppercase;margin-left:14px;color:var(--muted);font-weight:500}nav{display:flex;gap:28px;font-size:13px}nav a{color:var(--ink)}.hero{padding:70px 0 40px;display:grid;grid-template-columns:1.2fr 1fr;gap:70px;align-items:end}.eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--muted);font-weight:650}.hero h1{font-size:clamp(38px,5vw,68px);line-height:1.07;letter-spacing:-3px;margin:16px 0 20px;font-weight:750}.hero h1 span{color:var(--teal)}.hero p{max-width:590px;color:var(--muted);font-size:16px}.hero-meta{background:var(--ink);color:#fff;border-radius:16px;padding:28px 32px}.hero-meta a{color:#d8eab8}.hero-meta .eyebrow{color:#a8b9af}.hero-meta h2{font-size:20px;letter-spacing:-.5px;margin:10px 0 12px}.hero-meta p{font-size:13px;color:#b6c6bd;line-height:1.7;margin:0}.meta-row{margin-top:20px;display:flex;gap:8px;flex-wrap:wrap}.pill{font-size:11px;padding:5px 10px;border:1px solid #4d675d;border-radius:40px;color:#dbe7df}.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:0 0 22px}.kpi{padding:28px 30px;border:1px solid var(--line);border-radius:14px;background:var(--paper)}.kpi .value{font-size:39px;line-height:1.2;letter-spacing:-1.5px;margin:10px 0 4px;font-weight:650}.kpi .value.teal{color:var(--teal)}.kpi small{color:var(--muted)}.note{font-size:12px;color:var(--muted);margin-bottom:54px}.section{scroll-margin-top:24px;margin-bottom:54px}.section-head{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:20px}.section h2{font-size:27px;letter-spacing:-.8px;margin:0}.section-head p{margin:4px 0 0;color:var(--muted);font-size:13px}.tools{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.tools input,.tools select,.btn{border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);padding:9px 12px;font-size:12px}.tools input{width:230px}.btn{cursor:pointer}.btn:hover{background:var(--soft)}.table-wrap{border:1px solid var(--line);border-radius:12px;overflow:auto;background:#fff;max-height:680px}table{width:100%;border-collapse:collapse;min-width:1020px;font-size:12px}th,td{padding:13px 14px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}thead th{background:var(--soft);color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;z-index:2;white-space:nowrap}th:first-child,td:first-child,th:nth-child(2),td:nth-child(2){text-align:left}tbody tr:hover{background:#f8faf6}.change{min-width:270px;max-width:370px;line-height:1.5;color:#43554b}.pr{font-weight:700;font-size:13px}.state{display:block;font-size:9px;color:var(--muted);margin-top:3px}.state.open{color:var(--orange)}.state.unmerged{color:#8a7072}.delta{font-weight:600}.reduction{color:var(--teal)}.growth{color:var(--teal)}tfoot td{font-weight:700;background:var(--soft);border-top:2px solid var(--line)}.table-info{font-size:11px;color:var(--muted);padding:12px 2px}.roadmap-card{background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden}.roadmap-top{padding:24px 30px;background:var(--soft);border-bottom:1px solid var(--line)}.roadmap-top p{margin:6px 0 0;color:var(--muted);font-size:12px}.stage-strip{display:flex;flex-wrap:wrap;gap:6px;margin-top:18px}.stage-strip span{background:#fff;border:1px solid var(--line);border-radius:5px;padding:5px 9px;font-size:10px;font-weight:600}.roadmap-content{padding:34px 40px;max-width:100%;overflow-wrap:anywhere}.roadmap-content&amp;gt;h1{font-size:25px;line-height:1.25;letter-spacing:-.5px;margin-top:0}.roadmap-content h2{font-size:23px;margin:32px 0 14px;line-height:1.35}.roadmap-content h3{font-size:18px;margin:28px 0 10px;line-height:1.4}.roadmap-content h4{font-size:15px;margin:24px 0 10px}.roadmap-content p,.roadmap-content li{color:#44564b;font-size:13px}.roadmap-content table{min-width:0;display:block;overflow:auto;max-width:100%;font-size:12px;margin:20px 0}.roadmap-content table th,.roadmap-content table td{text-align:left;min-width:130px;white-space:normal;vertical-align:top}.roadmap-content pre{background:#f2f4ef;padding:18px;overflow:auto;border-radius:8px;font-size:11px}.roadmap-content code{font-size:.9em;background:#f0f3eb;padding:2px 4px;border-radius:3px}.roadmap-content pre code{background:none;padding:0}.roadmap-content blockquote{border-left:3px solid #9db88b;padding-left:18px;margin:20px 0;color:var(--muted)}.roadmap-content details{border-bottom:1px solid var(--line);padding:16px 0}.roadmap-content details summary{cursor:pointer;font-size:19px;font-weight:650}.roadmap-content details summary::marker{color:var(--teal)}.method{display:grid;grid-template-columns:repeat(3,1fr);gap:28px}.method&amp;gt;div{border-top:2px solid var(--ink);padding-top:16px}.method h3{font-size:14px;margin:0 0 8px}.method p{font-size:12px;color:var(--muted);margin:0}footer{border-top:1px solid var(--line);padding:24px 0 38px;display:flex;justify-content:space-between;gap:20px;font-size:11px;color:var(--muted)}[hidden]{display:none!important}button:focus-visible,input:focus-visible,select:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--teal);outline-offset:4px}@media(max-width:900px){.shell{padding:0 22px}.hero{grid-template-columns:1fr;gap:24px;padding-top:38px}.hero h1{letter-spacing:-2px}.hero-meta{padding:24px}.kpi{padding:20px}.kpi .value{font-size:31px}.section-head{align-items:start;flex-direction:column}.roadmap-content{padding:24px}.method{grid-template-columns:1fr;gap:20px}.brand small{display:none}}@media(max-width:540px){.top{align-items:center}.top nav{gap:14px;font-size:11px}.kpis{grid-template-columns:1fr;gap:10px}.kpi{display:grid;grid-template-columns:1fr 1fr;align-items:center}.kpi .eyebrow{grid-row:1/3}.kpi .value{margin:0;font-size:31px}.kpi small{grid-column:2}.tools input{width:200px}.roadmap-top{padding:20px}footer{flex-direction:column}.hero-meta h2{font-size:18px}}@media print{body{background:#fff}.shell{padding:0}.hero{padding:25px 0}.hero h1{font-size:40px}.table-wrap{max-height:none;overflow:visible}.tools,nav,.btn{display:none}.roadmap-content details{break-inside:avoid}.kpi,.hero-meta{break-inside:avoid}table{min-width:0;font-size:9px}td,th{padding:6px}}\n\n\n\nSparkOps Migration report\nMetricsRoadmapMethod\n\n\n\n\nNative component migration\nPython \u2192 Go\nA record of the conversion work across PRs #330\u2013#418, with the full stage plan, substages, and evidence.\n\nArchitecture decision 0047\nGo daemons. Rust broker.Python product plane.\nThe program moves installed security and runtime boundaries into native binaries while retaining Python for the product layer.\nPR #330\u2013#41882 pull requestsOctober 6, 2026\n\n\n\nNet Python lines\n\u22124,39328,736 added \u00b7 33,129 removed\n\nNet Go lines\n+52,10853,774 added \u00b7 1,666 removed\n\nMerged pull requests\n78 / 822 open \u00b7 2 closed without merging\nSummary covers merged PRs. These are diff-line counts, including tests and support code, rather than the repository\u2019s current line count.\n\n\n\n\nEvery pull request\nAll 82 PRs in the inclusive range. \u0394 = additions \u2212 removals.\nAll PRsMergedOpenClosed, unmerged\n\nPR / statusChangePython +Python \u2212\u0394 PythonGo +Go \u2212\u0394 Go#330MergedADR 0047: Go daemons, Rust privileged broker, Python product plane (native stage 0)180+18000\n#331Openrc.35 rollout follow-ups: model+recipe naming, fleet upgrade --all with on-demand workers776+71000\n#332MergedGolden vectors and a shared contract-bytes module for the inference routing table (native stage 1, tracer)6763+673000\n#340MergedNode agent contract vectors and shared readers, part 1 (native stage 1)928134+794000\n#341MergedSPIRE helper contract vectors and shared DSSE encoding, node agent part 2 (native stage 1)764163+601000\n#342MergedPrivileged broker modules onto the shared contract-bytes module, node agent part 3 (native stage 1)190361\u2212171000\n#343MergedCloud connector contract vectors and shared module copy (native stage 1)32764+263000\n#344MergedRunner supervisor contract vectors and shared module copy (native stage 1)21314+199000\n#345MergedInstaller contract vectors and shared module copy (native stage 1)477121+356000\n#346MergedRelease tools contract vectors and shared module copy (native stage 1)483237+246000\n#347MergedController backend contract vectors and shared module copy (native stage 1)394386+8000\n#348MergedProduct plane contract vectors and shared module copy (native stage 1)471371+100000\n#349MergedStage 1 follow-up: close the registry-to-vector loop, fixed-order writers, dsse_pae bytes805157+648000\n#350MergedStage 2: Go foundation \u2014 native module, contract package, Go CI lane53490+4441,9320+1,932\n#351MergedLifecycle plan payload through the shared encoder (stage 1 hand-off)183+15000\n#352MergedStage 3: ship the Go inference router in the node work release18310+1731,8940+1,894\n#353MergedStage 4: delete the broker v1 request contract and freeze the v2 request vectors3965,143\u22124,747000\n#354MergedStage 3: retire the Python inference server after TP4 cutover115916\u2212801240321\u221281\n#355MergedStage 3: pin UTF-32 decoder refusals000326+26\n#356MergedFreeze broker policy, resource and effect-fence contracts18483+101000\n#357MergedRemove timing and port-reuse races from router retry test000283+25\n#358MergedFreeze broker receipt and trust contracts (stage 4, PR 3)1540+154000\n#359MergedFreeze helper broker documents and close stage 42050+205000\n#360Mergedtest(agent): freeze state and heartbeat contracts before the Go port20323+180000\n#361MergedMove release pruning planning to the native installer777156+6218790+879\n#362MergedRun the fleet node loop in Go with the existing Python actions44741+4062,8663+2,863\n#363MergedAdd dormant Rust broker admission and durable replay tracer1,563137+1,426000\n#364MergedVerify node phase receipt chains with the native installer838304058+397\n#365MergedMove verified VM image downloads into the native node agent1821,572\u22121,3902,93820+2,918\n#366MergedFold controller transport into shared Go contracts with an explicit cutover gate61465+549109104+5\n#367MergedMatch fleet diagnostics to canonical bootstrap credential custody891+88000\n#368MergedPort path, memory and ping actions into the native node agent208385\u221217787832+846\n#369MergedComplete native broker custody and retire the Python core3918,673\u22128,282000\n#370MergedAdd an isolated zynserver profile for native Rust CI66470+594000\n#371MergedMove installed node rendering into the native installer181208\u2212274691+468\n#372MergedRetire Python node orchestration and port the completed native action tranche1,2821,065+2173,76672+3,694\n#373MergedRun read-only NFS inspection in the native node agent3557\u2212223171+316\n#374MergedRun native Rust gates on the isolated zynserver fleet lane92917+912000\n#375MergedAccept authenticated FQDN memory observations during fleet attach514+47000\n#376MergedSelect the native architecture SDK in the Go CI driver6913+56000\n#377UnmergedRun read-only credential inspection in the native node agent2712+153401+339\n#378MergedMove runner policy and read-only diagnostics to packaged Go600478+1222,4740+2,474\n#379MergedIsolate the Rust CI engine from host containerd927+85000\n#380MergedRecover supervisor-only runner replacement and Rust image builds1587+151000\n#381MergedFix native runner image inventory and containerd snapshot permissions1023+99000\n#382MergedFix reenrollment after later runner admission changes16721+146000\n#383MergedPort installer rendering and diagnostic verification to native consumers885567+3181,4934+1,489\n#384Mergedfix: recover terminal helper activation across releases62223+599000\n#385MergedSwitch runner services to the native lifecycle supervisor36818+3503,415146+3,269\n#386MergedRepair native runner cutover, image supply and interrupted-job cleanup33812+3262362+234\n#387MergedRetire proven Python runner lifecycle and broker clients3152,665\u22122,350103+7\n#388MergedMove remaining runner administration to Go and delete Python launcher4871,294\u22128071,9391+1,938\n#389MergedDeny ARM CI containers access to host services1592+1571,65261+1,591\n#390MergedFold remaining SPIRE clients into the shared Go contract module1,27087+1,1831,770494+1,276\n#391MergedOwn video render status and cancel in native dispatch6794\u2212271,4882+1,486\n#392MergedStage 6: native heartbeat host metrics; delete the Python collector87377\u22122903,03213+3,019\n#393MergedRender a rollback with the retained target's sealed native installer191+18000\n#394MergedShow each CI runner's state in plain words and offer only the control that changes it520+52000\n#395MergedStage 6: native telemetry burst start/stop and sampler; delete the Python851,185\u22121,1001,73338+1,695\n#396MergedStage 6: native provider selection; delete the Python selection operations7825+5382046+774\n#397MergedStage 6: native broker shadow observation; delete the Python shadow operation6234+284902+488\n#398MergedStage 6: native heartbeat tail (probe-finalize), Python deleted191608\u22124172,03775+1,962\n#399MergedStage 6: native model runtime discovery, Python probe deleted206830\u22126242,22123+2,198\n#400MergedFrontend: source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q)000000\n#401UnmergedBump werkzeug from 3.1.8 to 3.1.9 in /deploy/github-actions-runner000000\n#402OpenBump anchore/sbom-action from 0.24.2 to 0.24.3000000\n#403MergedStage 7: native installer node identity owner689446+2432,2502+2,248\n#404MergedPin Werkzeug 3.1.9 (GHSA-g6x2-hccm-hh4m)000000\n#405MergedRetire the standalone controller release installer17193\u2212176000\n#406MergedStage 7: native controller identity store6541,650\u22129962,7853+2,782\n#407MergedHold the node installation lock for native identity changes482+467824+54\n#408MergedMove the node phase frame codec to the native installer (Stage 7 row 1)936327+60999695+901\n#409MergedMove the operator configuration reader to the native installer (Stage 7 row 2a)433226+2071,3638+1,355\n#410MergedMove the node trust context and admission checks to the native installer768113+65590543+862\n#411MergedReconcile stale documentation with the current system (weekly Markdown check 2026-10-06)000000\n#412MergedRefresh architecture maps for native components, SPIRE transfer and in-place upgrade000000\n#413MergedMove the attachment journal's checks into the native installer (Stage 7 row 5a)522455+678832+881\n#414MergedKeep the documentation to what is current133+10000\n#415MergedBalance Python shards by measured time and skip unaffected jobs for frontend-only changes33343+290000\n#416MergedMove the fleet capability profile checks into the native installer1,17881+1,0977162+714\n#417MergedMove the fleet capability declaration chain checks into the native installer585131+4541,0575+1,052\n#418MergedRun the controller upgrade validators natively (Stage 7 row 5c)847295+5521,1781+1,177All 82 PRs28,84033,147\u22124,30754,1141,667+52,447\n82 PRs shown \u00b7 Totals remain for the full scope. #333\u2013#339 are issue numbers, not PRs.\n\n\n\n\nThe migration roadmap\nStages 0\u20139, plus Stage 3b.Expand all stages\n\n\nSource of truth2026-10-02-sparkops-native-migration-map.md\nSource: sayhi / reviews. Full contents preserved below; source snapshot October 6, 2026, 22:49 PDT. PR metrics retain the #418 cutoff.\nStage 0Stage 1Stage 2Stage 3Stage 3bStage 4Stage 5Stage 6Stage 7Stage 8Stage 9\n\nSparkOps native migration map: Go and Rust split\n\nPinned to meanaverage/sparkops main@01e0e849 (2026-10-02). This replaces the\nCodex &amp;quot;SparkOps Rust Migration Map&amp;quot; of the same date. Line counts are non-test\nPython at that commit. Live figures were read from dgx1 and dgx3 on 2026-10-02.\nThat pin is the analysis baseline and stays fixed; progress is recorded in the\nstage ledger, current through main@9075eeb3 (#413, 2026-10-06).\n\nThe split\n\n\n\nGo owns the daemons that talk to the network or orchestrate the host. They\nsit beside the Go SPIRE transports that are already in the trust path.\n\nRust owns one boundary: the root privileged broker and its contract crate.\n\nPython keeps the product plane and everything that is not an installed\nsecurity or runtime boundary.\n\nTypeScript keeps the console.\n\n\nReact console / CLI / MCP                      (TypeScript, Python)\n        |\n        v\nPython FastAPI product plane                   (Python: stays)\n        |\n        +-- Go SPIRE transports                (Go: exists today)\n        +-- Go controller authorities          (Go: blocked, stage 9)\n        |\n        v  typed work over the SPIRE work channel\nGo node agent                                  (Go: stage 6)\n   +-- Go inference router                     (Go: stage 3, first native daemon)\n   +-- Rust privileged broker -- fixed effects (Rust: stages 4-5, dormant)\nGo installer, Go runner supervisor             (Go: stages 7, 8)\n\n\nOne rule governs every stage: a native component replaces an ownership\nboundary and deletes the Python it replaces. A native helper beside unchanged\nPython policy code makes the trusted codebase larger.\n\nWhy Go for most of it\n\n\n\nGo is already here. Five Go modules (about 14k lines) ship today.\ntools/build_spire_controller_transport_release.py is a hermetic builder\n(pinned go1.27.1, -mod=vendor, -trimpath, CGO_ENABLED=0, arm64 and\namd64), and tools/build_spire_work_release.py already reuses it to ship\nbin/action-client to every node.\n\nThe work is orchestration. cli.py has 39 subprocess call sites and 75\ndocker references. The runner supervisor is a single-threaded 30-second poll\nloop. Go&amp;#39;s standard library covers process control, Unix sockets, peer\ncredentials, HTTP proxying and Ed25519 without third-party modules.\n\nSPIFFE lives in Go. go-spiffe is the reference library, so Go\nauthorities share types with the transports.\n\nBuilds are light. Go cross-compiles from any host. Cargo is hook-blocked\non dgx1 to dgx4 and must run on zynserver.\n\nThere is no performance pressure. dgx1&amp;#39;s router used 27 s of CPU and\n33 MB at peak over a 41-hour run. Its node agent used 12 min 45 s of CPU\n(about 0.5% of one core) and 137 MB. Stages are therefore ordered by risk and\nby how much Python they delete, not by speed.\n\n\nWhy Rust for the broker only\n\n\n\nThe broker is root-owned and its security rests on strict decoding and\nfail-closed state machines. serde rejects unknown and duplicate fields with\nlittle effort, and exhaustive enums suit the journal and recovery states.\n\nIt is the sole verifier of its own contracts, so a Rust implementation adds\nno second copy of anything. A Rust kernel embedded in Python through PyO3\nwould be a third implementation next to Python and Go, and Go cannot link it\nunder CGO_ENABLED=0. That option is out of scope.\n\nIt needs no async runtime, HTTP stack or SPIFFE library, so its dependency\nset stays small.\n\nIt is dormant: no broker unit is installed on any host, so the port has no\nproduction blast radius.\n\n\nOwner decision at the stage 5 gate: if zero Rust is preferred, the broker\nbecomes a Go binary in the stage 2 module and nothing else in this plan changes.\n\nComponent map\n\n\n\n\nComponent\nLanguage\nStage\nCurrent code\nLines\n\n\n\nContract vectors and shared Python helpers\nPython\n1\nabout 105 files with private canonical* helpers\nn/a\n\n\nGo foundation and contract package\nGo\n2\nnew go/ module\nnew\n\n\nInference router\nGo\n3\nsparkpyro_node_agent/inference_router.py\n635\n\n\nPrivileged broker\nRust\n4, 5\nprivileged_broker*.py, spire_helper_privileged_broker*, spire_helper_broker*\n12,805\n\n\nNode agent core\nGo\n6\nrest of sparkpyro-node-agent/src\nabout 29,800\n\n\nInstaller\nGo\n7\ninstaller/\n21,151\n\n\nRunner supervisor\nGo\n8\ndeploy/github-actions-runner/\n2,155\n\n\nController authorities\nGo\n9, blocked\nbackend/spire_fleet_work*.py, spire_host_binding_authority.py, spire_fleet_admission.py, spire_helper_checkin_ingress.py, spire_helper_fleet_effect.py, spire_helper_canonical_authority_ipc.py, spire_helper_live_*.py\n6,289\n\n\nRelease platform and signer\nPython\nstays\nrelease_platform/, backend/signer*.py\n5,985\n\n\nRelease build and assurance tools\nPython\nstays\ntools/build_*release*.py and siblings\n13,012\n\n\nProduct plane, CLI, MCP gateway, cloud connector, runtime-manager scaffold, labs, ML and Blender workers\nPython\nstays\nbackend/, app/, others\nrest\n\n\nSPIRE transports\nGo\nstays\nscripts/spire-*\nabout 8,200\n\n\n\nStages 3 to 9 replace about 73,000 lines of Python. Stages 0 to 3 are worth\ndoing on their own; every later stage has a gate where the owner can stop and\nthe system is still coherent.\n\nFacts every stage must respect\n\n\n\nFour canonical byte behaviours exist today. Compact sorted-key JSON is\nwritten ASCII-escaped or as raw UTF-8, and each form either rejects NaN or\nemits it: 95, 92, 20 and 14 call sites. release_platform/.../canonical.py\nuses raw UTF-8; most SPIRE code uses ASCII escapes. Signed bytes must not\nchange.\n\nGo and Rust encoders differ from Python. Go&amp;#39;s json.Marshal escapes\n&amp;lt;, &amp;gt;, &amp;amp;, U+2028 and U+2029. Go, Rust and Python format floats\ndifferently and handle integers above 2^53 and lone surrogates differently.\nThe existing Go canonicalJSON in spire-client-comparison/.../release.go\nfails closed on a mismatch.\n\nRelease closures are allowlisted. A new import can fail a closure check\nthat only runs on main (tools/build_spire_controller_authority_release.py\nwalks whole files, including lazy imports). installer/fleet_bundle_bootstrap.py\nis stdlib-only and standalone by design and keeps its own helpers.\n\nThe work authority does not own its queue. backend/spire_fleet_work.py\ncalls claim_fleet_agent_work_items, renew_fleet_agent_work_lease and\nrecord_fleet_agent_work_result in backend/portal_fleet_service.py, which\nthe FastAPI portal also uses on the same SQLite database.\n\nThe real root exposure is sudo, not the broker. Nodes in the\nlegacy_privileged posture have passwordless docker, nvme, mount,\numount and mkdir. Only five of the 54 work actions are broker-eligible;\n32 need contract redesign first (docs/security/node-privileged-broker-v0.md).\n\nThe installer imports other packages. It pulls in modules from\nsparkpyro_node_agent, backend, app and tools, so it cannot be ported\nbefore the pieces it imports have native equivalents.\n\n\nStages\n\nEach stage is one or more pull requests against meanaverage/sparkops. A stage\nis done when every exit criterion is met and the ledger below is updated.\nStages 4 and later begin with a design note that the owner approves before\ncode is written.\n\nStage 0: decision record\n\nWrite ADR 0047 (check the next free number in docs/decisions/) recording this\nsplit, the governing rule, the Go module location (default: one module in a\ntop-level go/ directory with cmd/&amp;lt;binary&amp;gt; and internal/contract), the Rust\nworkspace location (default: top-level rust/), and the vector location\n(default: contracts/vectors/).\n\nExit: ADR merged; tools/ci_change_scope.py and any path filters know the new\ndirectories.\n\nStage 1: golden vectors and one Python helper per package\n\nNo native code. This stage is the foundation for every later one.\n\n\n\nClassify every compact sorted-key json.dumps call site in installed code\n(sparkpyro-node-agent/src, installer/, backend/, app/, tools/,\ndeploy/, sparkops-cloud-connector/) as a contract (its bytes are\nhashed, signed, compared or persisted for verification) or incidental.\nscripts/ labs are out of scope.\n\nFor each contract, freeze golden vectors generated from today&amp;#39;s Python\nbehaviour: canonical bytes, digests, DSSE pre-authentication bytes and\nsignatures, and one rejection vector per failure code (duplicate keys, NaN\nand Infinity, unknown and missing fields, invalid UTF-8, oversize input,\nout-of-bounds identifiers and timestamps). Include &amp;lt;, &amp;gt;, &amp;amp;, U+2028,\nU+2029, control characters, astral characters, large integers and floats.\n\nGive each package one shared module modelled on\nrelease_platform/src/sparkops_release_platform/canonical.py, with each\nbyte behaviour as a named function. Move contract call sites to it one\npackage per pull request, and delete the private copies.\n\nRun the existing Go canonicalJSON against the vectors and record every\ndifference as an issue.\n\n\nExit: every contract has vectors in the repository and a test that pins them;\nno file in installed code defines a private canonical*, strict-decode or DSSE\nhelper outside the shared modules and the documented bootstrap exception; no\nsigned or hashed byte changed (the vectors prove it).\n\nStage 2: Go foundation\n\n\n\nCreate the Go module from the ADR. Generalise the existing Go builder so a\nsecond module builds with the same pinned toolchain, vendoring and recorded\nenvironment.\n\nWrite internal/contract: strict decoding (reject duplicate keys, unknown\nfields, non-finite numbers and trailing content), each canonical byte\nbehaviour, digests, DSSE verification, and the length-prefixed Unix-socket\nframing with peer-credential checks. First check whether the pinned\ntoolchain offers a strict JSON decoder without an experiment flag; otherwise\nwalk tokens.\n\nAdd a Go test lane to CI on the fleet runners.\n\n\nExit: internal/contract passes every stage 1 vector; the builder produces\nbyte-identical binaries on two runs for arm64 and amd64; go vet and\ngo test run in CI.\n\nOwner decisions on the exit criteria (2026-10-03, on the GPT-6 Astra review of\n#350 at 09931d5): (1) &amp;quot;every stage 1 vector&amp;quot; means every vector family whose\ncapability internal/contract owns \u2014 the canonical byte behaviours, the strict\nreading behaviours, DSSE PAE and verification, and the framing cases; the\ndocument families are read and written by the daemons that own them and are\nconsumed by Go when those daemons arrive (stage 3 onwards), each recorded in\nthe README&amp;#39;s layout table. (2) Unknown-field rejection is part of stage 2: a\ntyped strict decode (DecodeObject or equivalent) that refuses a member not in\nthe caller&amp;#39;s allowed set, with its own tests. (3) The _finish_plan hand-off is\ntaken by the stage 1 agent in a separate pull request (#351, merged as bb153c4ba). (4) The reproducibility\nartifact for this stage is the contract package&amp;#39;s own test binary; its digests\nare re-recorded at the final head of the pull request. (5) #333\u2013#339 stay open:\nthe new encoder meets their first condition; the two json.Marshal writers in\nscripts/spire-controller-transport and scripts/spire-client-comparison keep\nthem open until stage 3 folds the controller transport into go/ and rewrites\nit on internal/contract (hand-off to stage 3).\n\nHand-offs from stage 1 (2026-10-03): the vectors and their file conventions\nare specified in contracts/vectors/README.md (how *_json members are\nparsed, reject codes, tolerated cases, the four byte behaviours, the two\nreading behaviours, DSSE PAE, the fixed-member-order forms); that README is the\nport&amp;#39;s spec. The existing Go canonicalJSON differs from Python in seven\nclasses, filed as #333 to #339; resolve each (match Python, or refuse the\ninput and record it) before the encoder is called done. registry.json lists\nevery contract and its vector files; its pinned_by/exercised_in rules and\nthe CI checks (tools/contract_bytes_inventory.py check,\ntools/contract_bytes_pin_coverage.py on Security Gate shard 4) are\nPython-side and must stay green; record the Go test that consumes a vector\nfamily in the README&amp;#39;s layout table rather than in pinned_by. The fleet\nrunners&amp;#39; CI environment is the scanned venv in\ndeploy/github-actions-runner/ci-requirements.txt (no jsonschema); a Go\nlane needs only the pinned toolchain the builder fetches and digest-checks.\nBroker documents have no vectors yet (deferred to stage 4); everything else\ndoes.\n\nStage 3: inference router in Go\n\nThe first production native daemon. Specification: ADR 0045, the Python module\nand its 13 tests.\n\n\n\nImplement cmd/inference-router: the same sparkops.inference-routes/v1\ninput, the same endpoints (/v1/models, /health, /healthz, /metrics,\n/router/status, the three OpenAI POST routes), the same affinity order,\nplacement choice, retry rule, limits and log events.\n\nOne intended behaviour change: cancel the upstream request when the client\ndisconnects. The Python router only notices on its next write. Any other\ndifference needs a justification in the pull request.\n\nPort the 13 tests to Go and add a differential harness that drives both\nrouters against the same backend: streaming, chunked responses, client\ndisconnect during prefill, unreachable placement and retry, affinity,\nmetric aggregation.\n\nShip the binary in the node work release next to bin/action-client and\nswitch ExecStart in installer/fleet_node_config.py. Keep DynamicUser\nand the unit hardening. The node agent keeps parse_routes and\nwrite_routes.\n\nAfter the owner deploys with the standard fleet upgrade, verify on all four\nnodes: /health 200, max_model_len in /v1/models, aggregated metrics,\nfour simultaneous subagents split two and two across the TP2 pairs, and a\ncancelled request releasing its backend slot.\n\nDelete the Python server half of inference_router.py and its unit\nrendering in a follow-up pull request.\n\nHand-off from stage 2: the dedicated UTF-32 refusal coverage is merged in\n#355. The transport module fold and #333\u2013#339 closure move to Stage 3b under\nthe owner decision below; they are not part of this router&amp;#39;s exit.\n\n\nExit: live verification recorded in the ledger, including the executed TP2\nsplit and multi-placement metric checks; the Python server code is gone from\nmain; UTF-32 refusal coverage merged. These criteria are met.\n\nOwner scope decision, 2026-10-03: in response to the proposed separate gate,\n\u201cok well do whatever you gotta do lets get this mission accomplished 100/100\u201d\nauthorizes adopting Stage 3b and continuing the migration through Stage 8.\nStage 3 is closed with transport work explicitly deferred, not declared done.\n#333\u2013#339 remain open until Stage 3b meets their closure criteria.\n\nOwner revision to step 5 (2026-10-03): the fleet now runs one DeepSeek TP4\nplacement spanning dgx1\u20134. The owner waives the two-TP2 live checks: four\nsimultaneous subagents split two-and-two and aggregation across multiple live\nplacements. Record these as waived, not executed, not as measured passes.\nThe independently verified TP4 deployment (four native services with the\nreproduced binary, health 200, advertised context length, single-placement\nmetrics and cancellation releasing a backend slot) satisfies this stage&amp;#39;s live\ngate. Keep the automated multi-placement tests. DeepSeek stays running; no\nmodel topology change is required. This supersedes the earlier instruction to\nrecord the TP2 absence as a blocker and allows step 6 to proceed. The deletion\nand step 7 exit criteria are unchanged.\n\nSubsequent owner authorization and evidence (2026-10-03): the owner permits\nstopping DeepSeek temporarily to run two Qwen TP2 placements. The live test now\npasses: four simultaneous Qwen roles split two-and-two across dgx1+dgx2 and\ndgx3+dgx4, and all four routers correctly aggregate metrics from both placements.\nThese checks are executed and passed, superseding reliance on the waiver.\nBoth temporary Qwen placements were removed with cleanup verified. DeepSeek TP4\nwas restored and independently verified on all four routers with its original\n1,048,576-token context; see the ledger and hashed evidence manifest.\n\nHand-offs from stage 2 (2026-10-03, #350 merged as 0937f0123): the module\nis go/ (sayhi.io/sparkops/go, stdlib only) with internal/contract\n(CanonicalASCII/ASCIINan/UTF8/UTF8Nan, DecodeStrict/DecodeUnique,\nDecodeObject with allowed-field rejection, DSSEPAE/VerifyDSSEEd25519,\nSHA256Hex, WriteFrame/ReadFrame, ReadPeerCredentials/RequirePeerUID);\nits tests read the vectors and are recorded in the vectors README&amp;#39;s layout\ntable, never in pinned_by. Builds go through\ntools/build_spire_controller_transport_release.py --module &amp;lt;policy&amp;gt;: one\nmachinery, a GoModulePolicy per module (MODULE_POLICIES); the\ngo-foundation policy&amp;#39;s artifact is still the contract package&amp;#39;s test binary,\nso this stage gives cmd/inference-router a real policy (binary name,\nmanifest, two-run reproducibility on arm64 and amd64) and ships it through\ntools/build_spire_work_release.py beside bin/action-client. The Security\nGate&amp;#39;s go-contract job runs tools/run_go_contract_tests.py on the fleet\nrunners; backend/tests/test_github_actions_runner_deployment.py pins the\nnumber of fleet-lane jobs in that workflow and the fork guard, so a new lane\nupdates that test deliberately. Fleet-runner traps: /tmp and the workspace\nare noexec (extract toolchains and build caches under RUNNER_TOOL_CACHE),\nand Unix socket paths under that cache exceed the 108-byte sun_path limit\n(tests use socketpair). Go&amp;#39;s internal visibility is why step 7 folds the\ncontroller transport into go/ rather than importing across modules; its\ngo.mod/go.sum are digest-pinned by its builder policy, so that move changes\nthe policy and the pins together. The router is live on dgx1\u2013dgx4 (ADR 0045;\nHermes subagents and the owner&amp;#39;s Codex profiles route through it), so the\ndifferential harness and the live verification in step 5 are the proof, and\nthe owner runs the deploy.\n\nStep 7 preflight correction (2026-10-03, main@f38df6a4): these source\nmodules are not wholly dormant. The work-release builder compiles the live\naction-client from scripts/spire-controller-transport, and the helper-release\nbuilder compiles the live heartbeat helper from scripts/spire-client-comparison.\nThe node installer&amp;#39;s upgrade_node refuses changes to either attested executable\nbefore effects; the documented replacement procedure retires/re-enrolls the host.\nThe owner has been asked whether this work moves to a separate gate or remains\nhere with a separately planned attested-client cutover. No decision is assumed,\nand no transport source or live identity has been changed. A complete audit for\n#333\u2013#339 must also include the runner client&amp;#39;s canonical helper and connector&amp;#39;s\ndecodeCanonical: both currently use json.Marshal for contract byte comparisons,\nso moving only the two named modules would not satisfy the issues&amp;#39; global closure\ncondition. The independent UTF-32 refusal-test hand-off is PR #355.\n\nGate: owner go/no-go for the remaining stages.\n\nStage 3b: transport fold + attested-client cutover\n\nDeferred from Stage 3 by owner decision on 2026-10-03. Coordinate with Stage 6\nS1 and the next required rebuild of attested clients; do not attach an unrelated\nfleet identity replacement to the completed router rollout.\n\n\n\nInventory every installed Go contract encoder/decoder, including the action\nclient, runner client, helper comparison module and connector. Fold the\ncontroller transport into go/, rewrite owned contract operations on\ninternal/contract, and retire the comparison copy or migrate its consumers.\n\nPreserve wire bytes against the frozen vectors. Remove replaced helpers and\nmodules in the same tracer PRs; retain refused-input decisions from #333\u2013#339.\n\nDesign and rehearse the attested-client replacement: exact old/new artifact\ndigests, per-host identity registrations, supported retirement/re-enrollment\nor an explicitly implemented replacement procedure, rollback, and dependent\nheartbeat/work/runner verification. Do not weaken the normal upgrade refusal.\n\nOwner performs the planned identity/deployment cutover; independently verify\nlive node work, heartbeat and every affected CI runner lane afterward.\n\n\nExit: no installed Go code canonicalises contract documents with bare\njson.Marshal; #333\u2013#339 closure conditions satisfied and issues closed;\nreplaced modules deleted; reviewed artifact and identity cutover proven live.\nUntil then the existing attested clients keep their established paths/digests.\n\nStage 4: one broker contract (Python)\n\n\n\nWrite a surface map of the broker modules: which are contract, daemon,\nstore, journal, lab or catalog, and which the node agent imports. The\naction catalog (56 actions; this plan first said 54, the catalog test asserts\n\n\nand the shadow classifier that cli.py uses must survive.\n\n\n\nKeep the v2 execution-context contract; delete the v1 request contract and\nwhat only serves it: the v1 journal (privileged_broker_journal.py), the v1\nverifier and recovery authorization in privileged_broker_authorization.py\n(the trust-bundle types v2 imports stay), and their tests including the v1\nprocess-transport test (owner-confirmed 2026-10-03; &amp;quot;lab copies&amp;quot; in the\nfirst wording had no other referent \u2014 every broker lab module serves v2).\nUpdate docs/security/node-privileged-broker-v0.md.\n\nAdd the broker&amp;#39;s request, receipt, policy, resource-registry and\neffect-fence documents to the stage 1 vectors.\n\n\nExit: one request contract remains; vectors cover it; the shadow adapter still\npasses its tests.\n\nHand-offs from stages 1\u20133 (2026-10-03): the broker modules already write and\nread through sparkpyro_node_agent/contract_bytes.py (#342 moved nineteen of\nthem by a mechanical rewrite, keeping each module&amp;#39;s error adapter); their\ndocuments are the one contract the registry records as deferred\n(privileged-broker, 28 sites) \u2014 this stage replaces that deferral with\nvector files and pinned_by tests under the rules in\ncontracts/vectors/README.md (a site is pinned by an entry whose callable\nenters it, or names its exercising test; tools/contract_bytes_inventory.py check and tools/contract_bytes_pin_coverage.py run in CI and must stay\ngreen; frozen cases are never edited). Deleting the v1 request contract\ndeletes registered sites: remove them from the registry in the same pull\nrequest. Stage 3 runs concurrently and owns inference_router.py,\ninstaller/fleet_node_config.py, the node work release builder and go/;\ndo not edit those files here. This stage is Python only; the Rust (or Go)\nbroker is stage 5 and starts from the contract and vectors this stage leaves.\nDesign note first, approved by the owner before code.\n\nStage 5: Rust contract crate and dormant broker\n\nDesign note first: journal storage (default: an append-only hash-chained file\nmodelled on release_platform/.../journal.py, since nothing deployed depends\non the SQLite layout), the dependency allowlist, and where the Rust checks run.\n\n\n\nCreate the workspace: sparkops-contract (strict decoding, the broker&amp;#39;s\ncanonical bytes, Ed25519 verification, bounded identifiers and timestamps)\nand sparkops-brokerd (root-owned Unix socket, kernel peer credentials,\ndescriptor-relative policy, resource and trust stores, the journal, and the\nfive fixed operations as effect-free admission first).\n\nVendor dependencies and build with --locked --offline as static binaries\nfor aarch64 and x86_64 on zynserver. No async runtime.\n\nRun the stage 1 and stage 4 vectors and a differential run against the\nPython admission model over generated request, policy and resource\nsequences.\n\nRehearse in a disposable VM on zynserver. DGX hosts and production are\nforbidden targets for broker tests.\n\nDelete the Python daemon, stores and journal that the Rust broker replaces.\nThe Python node agent keeps only request construction and the catalog.\n\n\nExit: vectors and differential run pass; VM rehearsal evidence recorded;\nreplaced Python deleted. The broker stays dormant: enabling enforcement needs\nsigning custody and the action redesigns, which are separate work.\n\nStage 6: node agent core in Go\n\nDesign note (draft for the stage 3 gate, 2026-10-03):\n2026-10-03-sparkops-native-stage6-node-agent-design-note.md in this directory.\n\nDesign note first. Strangler approach: a Go cmd/node-agent takes over the\nheartbeat, poll, lease and result loop over the existing work-client socket,\nand runs unported actions through one fixed Python entry point until each\ngroup is ported. Order: loop and leases, journals and secure download, the 15\nunprivileged actions, the benchmark engine (one engine; delete both Python\nones), then model lifecycle. ML and Blender workers stay Python as fixed\nexecutables. Preserve state.json, work-item schemas, lease semantics and\nresult documents.\n\nExit (revised by the owner, 2026-10-03 PDT / 2026-10-04 UTC): the Go agent\nowns the loop, journal, heartbeat and every unprivileged action. Delete the\nreplaced Python daemon and each ported implementation. The Python action entry\npoint remains only as a named legacy privileged boundary, listing exactly\nthe actions in the measured effect inventory; add an inventory rule that refuses\nadditions. Retained workers stay Python as fixed executables. The Go node agent\ngains no sudo path. Account for remaining adapter operations explicitly; this\nexception does not exempt unprivileged heartbeat or observation work.\n\nOwner decision: \u201cdo not implement the enforcement design.\u201d The privileged-tail\nproposal is separate unscheduled privilege separation work alongside Stage9,\nnot a Stage6 prerequisite or authorization to change queue ownership. Continue\nS1\u2013S4 and the other approved work. The prior requirement to remove every\nprivileged Python handler is superseded by this exact exception; all other\nvalidation and live-proof requirements remain.\n\nStage 7: installer in Go\n\nDesign note (draft for the stage 3 gate, 2026-10-03):\n2026-10-03-sparkops-native-stage7-installer-design-note.md in this directory.\n\nDesign note first. Port pure plan, render and verify functions and compare\ntheir output bytes with Python before porting any effect. Keep CLI names,\ncheck and plan behaviour, receipts and exit codes. Keep OpenSSH as a fixed\nexecutable. Upgrades stay one standard command.\n\nExit: a full install and upgrade rehearsal on the x86 VM lab and one arm64\nhost passes with the Go installer; the Python installer is deleted.\n\nStage 8: runner supervisor in Go\n\nPort runner.py and its clients as cmd/runner-supervisor with its own\naccount and the existing broker protocols. Low value; do it only once stages 6\nand 7 have proven the path.\n\nExit: a live CI job completes on each lane; the Python supervisor is deleted.\n\nStage 9: controller authorities in Go (blocked)\n\nPrecondition: the work-queue state machine has one owner. Either extract it\nfrom portal_fleet_service.py into a module the authority owns outright, or\nleave the authorities in Python. Also decide SQLite access under\nCGO_ENABLED=0. Cut over heartbeat observation first and work lease and\nresult authority last, with recorded-envelope replay before any writer\nswitches.\n\nUnscheduled: privilege separation\n\nThe owner explicitly separated this work from the native migration on\n2026-10-03 PDT / 2026-10-04 UTC. The proposal and measured effect inventory are\nin 2026-10-03-sparkops-native-stage6-privileged-tail-design.md. No enforcement\nimplementation is authorized. Signing custody, resource/action redesign,\neffect journal/recovery and the proposed queue reservation/cancellation boundary\nneed their own decisions. Stage9 remains blocked on queue ownership; neither\nitem is silently included in the approved migration through Stage8.\n\nOvernight authorization (owner, 2026-10-03)\n\nThe owner authorizes proceeding as far as possible through stage 8 and merging\nany resulting reviewed, validated pull requests without another per-merge\nquestion. This supersedes the initial single-stage session limit and per-merge\napproval requirement for this run. Merge commits, foreground CI, frozen-byte\nrules, deletion discipline and honest stage gates still apply. Production\ndeploys remain owner-run. Independent work may proceed while another stage\nwaits for its deploy or an unresolved design decision; a pending gate is not\nreported as complete. Stage 9 remains outside scope.\n\nContinued owner authorization (2026-10-03)\n\nThe owner&amp;#39;s instruction to finish the mission follows the published Stage 5\u20138\ndesigns and the Stage 3b recommendation. Proceed with the recommended Stage 5\u20137\ndesigns and their source/merge work, preserving documented live-proof and lab\nrequirements. Stage 8 implementation still waits for Stages 6/7 proof. The\nsecurity VM procedure, agent/runner frozen-unit revisions, production deploys\nand the unresolved privileged-handler tail are not silently waived. Prepare\nconcrete reviewable decisions for those gates while completing independent work.\n\nOwner gate decision after stage 3 (2026-10-03)\n\nThe owner&amp;#39;s decision at the stage 3 gate: proceed with stages 5, 6 and 7 as\ndrafted (design notes in this directory, Astra&amp;#39;s audits included), 3b\nalongside stage 6 S1, stage 8 after 6 and 7, stage 9 still blocked. Standing\nconditions that replace per-item questions:\n\n\n\nEvery service switch (a unit&amp;#39;s ExecStart moving to a Go binary) follows\nthe router precedent: the unit&amp;#39;s rendered bytes change only in ExecStart,\nthe old fleet-node-config-v1 cases stay as superseded, the new cases are\nfrozen in the same pull request as the binary and the switch.\n\nA switch is proven on dgx1\u2013dgx4 after an owner-run (or owner-authorised)\ndeploy before the Python it replaces is deleted; the live check is recorded\nin the ledger row.\n\nThe privileged handlers and the legacy_privileged sudoers path stay\nPython until the stage 5 broker is live; no Go daemon gains a sudo path.\n\nMerges still happen one at a time on the owner&amp;#39;s word; DeepSeek cross-reviews\neach stage&amp;#39;s pull requests before the stage is called done (stage 4&amp;#39;s\n#353/#356/#358/#359 are owed that review now).\n\nGolden vectors are never edited; additions and superseded cases only.\n\n\nStanding execution authorization (owner, 2026-10-03, latest)\n\nThe owner explicitly lifts remaining per-stage and per-merge approval stops for\nStages 5, 6, 7, 3b and 8. Designs in reviews/ are approved as drafted, including\nthe bounded Stage 5 zynserver rehearsal procedure. Complete a gate, record its\nactual evidence, then continue; Stage 9 remains blocked/outside this assignment.\nThree Astra xhigh implementation agents now own Stages 5, 6 and 7; the root\ncoordinates shared changes, serial merges, deployments and verification.\n\nProduction deployment is now explicitly authorized. From this workspace use\nstate/spire-fleet-enrollment-20260920/cut-and-upgrade-cp1.sh &amp;lt;full-commit&amp;gt; &amp;lt;version&amp;gt; &amp;lt;label&amp;gt;\n(the verified location of the named standard helper), then on sparkops-cp1:\nsudo sparkops-installer fleet upgrade dgx1 dgx2 dgx3 dgx4 --known-hosts /root/sparkops-inputs/fleet-known-hosts.\nThe owner accepts fleet breakage; verify and record every node after each deploy\nand expose failures rather than treating successful command submission as proof.\nSelect a new release version/label from current release state before cutting.\n\nThis supersedes earlier owner-run-deploy and per-merge-question wording above.\nGolden cases remain immutable: dated supersession and additive successors only.\nService switches preserve every unit byte except ExecStart and ship binary,\nsuccessor vectors and switch together. The Go node agent gains no sudo path. Stage8 preserves the runner supervisor\u2019s\nexisting dedicated account and fixed Docker/firewall/install/unlink grants, as\nits approved design requires; this is not a new node-agent privilege or a generic\ncommand interface. Rust broker enforcement is still outside the approved\ndormant-broker design. Shared\nprivileged Python handlers remain under the owner\u2019s explicit revised Stage6\nexception above, with an exact inventory refusing additions. Stage6 still needs\nall unprivileged ownership, deletion, inventory and live-proof gates; approval\nof this scope revision is not completion evidence.\n\nOwner decision on stage 6&amp;#39;s privileged tail (2026-10-03)\n\nThe enforcement design in 2026-10-03-sparkops-native-stage6-privileged-tail-design.md\nis not implemented in this migration. Stage 6&amp;#39;s exit is revised: the Go agent\nowns the loop, leases, journal, heartbeat and every unprivileged action; the\nPython action entry point remains only as a named legacy privileged boundary\nlisting exactly the actions in that note&amp;#39;s effect inventory, with an inventory\nrule refusing additions; the coding, UniFi and Blender workers stay Python; no\nGo daemon gains a sudo path. The privileged-tail note becomes a separate,\nunscheduled &amp;quot;privilege separation&amp;quot; item alongside stage 9&amp;#39;s queue-ownership\ndecision. Stage 5&amp;#39;s Rust broker stays dormant.\n\nOwner handover decision (2026-10-04; received through the Claude bridge)\n\nWrap up this thread and hand the migration to a fresh Claude / Opus 5.5 thread.\nBring in-flight operations to a safe resting point; start no new implementation,\nPR, release or cutover. Preserve every native worktree&amp;#39;s source on its agent\nbranch, record exact fleet state and remaining gates, and write\n2026-10-04-sparkops-native-handoff.md. This thread ends after that handover.\nAll57 worktrees are clean and their heads remotely reachable;18 remote branches\nwere created/advanced normally, and the one existing untracked video oracle was\ncommitted unchanged for preservation. No force push or source deletion occurred.\n\nThe owner is drafting /home/meanaverage/sayhi/sparkops-iam-roles.md to replace\nthe Stage6 legacy privileged boundary. Note it only; do not act on it. The\ncurrent41-action/five-worker exception remains, with no Go sudo or broker\nenforcement. Stage9 and separate privilege separation remain outside scope.\nFinal handover evidence is under state/native-handoff-b1e_d8ba; its all-host\nreadback at16:19UTC records cp1rc51, new node/work releases on dgx1/2, unchanged\nolder node/work releases on dgx3/4 due to the exact attested-client refusal,\nfive active/ready native CI supervisors and DeepSeekTP4ready.\n\nStage ledger\n\nUpdate this table at the end of every working session. It is the only record\nof progress.\n\nMerge and revert rule (owner, 2026-10-02). Pull requests merge to main\nstage by stage; they are not stacked until the end, because releases and the\nclosure checks only exist on main and stage 3 is proven on the live fleet.\nThe owner&amp;#39;s condition is that any merge can be undone easily afterwards:\n\n\n\nEvery pull request merges as one merge commit and must be revertible with\ngit revert -m 1 &amp;lt;merge&amp;gt; on its own. Record each merge commit in the ledger.\n\nA pull request that deletes Python a running service still needs waits until\nthe native replacement is verified live (stage 3 already works this way).\n\nIf a later pull request would make an earlier one unrevertable, say so in\nthe pull request and ask the owner before merging.\n\n\n\n\n\nStage\nStatus\nPull requests\nEvidence and notes\n\n\n\n0 Decision record\ndone\n#330, merged 2026-10-02 as d3fc648b\nmain was still at 01e0e849 when the stage started, no plan fact stale. ADR 0047 is docs/decisions/0047-native-components-go-daemons-rust-broker.md. Push runs on main at d3fc648b: Security Gate 37051206294 and Secret Scan 37051206281 green; no path-filtered workflow fired. Revert: git revert -m 1 d3fc648b (nothing deployed). CI scoping: ci_change_scope.py already sends go/, rust/, contracts/vectors/ to the full gate (allowlist is docs/ only); pinned by new tests, plus CODEOWNERS and .gitignore (rust/target/). No workflow paths: filter changed on purpose: none builds from these directories yet; ADR rule is that a workflow gains the directory in the PR that makes its build consume it (stage 3 for the work release). CI: 9/9 green (Security Gate run 37049689078), Codex security review no findings, merge state CLEAN. Local: 32 change-scope tests, docs validator PASS. Traps for stage 1/2 recorded in the ADR: .gitignore ignores build/, dist/ at any depth and *.key, *.pem, *.db; release builders stage contracts/ files by name. Nothing remains.\n\n\n1 Vectors and Python helpers\ndone 2026-10-03 (11 PRs merged incl. review follow-up #349; broker document vectors deferred to stage 4)\n#332 tracer, merged 2026-10-02 as cc3f0260 (owner approved; push runs on main green: Security Gate 37056262007, Secret Scan 37056261965). #340 node agent part 1, merged 2026-10-02 as 115ef114 (owner approved; push runs on main green: Signer SPIRE acceptance, Security Gate, Secret Scan). #341 node agent part 2 (SPIRE helper), merged 2026-10-02 as 697d8bf7 (owner approved). #342 node agent part 3 (privileged broker, reconciliation), merged 2026-10-02 as 5eef4e98 (owner approved). #343 cloud connector, merged 2026-10-02 as d0b32ee (owner approved; push runs on main green: Security Gate, Secret Scan, Connector SPIRE acceptance). #344 runner supervisor client (deploy/), merged 2026-10-02 as 5b84159 (owner approved). #345 installer, merged 2026-10-02 as 8b1c214 (owner approved). #346 tools, merged 2026-10-03 (owner approved; first push failed the runner lane on the by-path engine loader, fixed). #347 backend, open, label spire-acceptance (worktree native-s1-backend). #347 backend, merged 2026-10-03 as 4685487 (owner approved). #348 app, merged 2026-10-03 as d10014f (owner approved). Review follow-up (#349, branch agent/native-s1-followup, merged 2026-10-03 as ce30aacc4, owner approved; push runs on main green: Security Gate, Secret Scan, Connector and Runner SPIRE acceptance, seam convergence): on the owner&amp;#39;s external review (seven findings): shared dsse_pae takes bytes payload types (app wrapper no longer decodes); the two model-based writers&amp;#39; non-finite cases corrected (pydantic dumps non-finite as null before the encoder, recorded); every registered site now claimed by a vector file (sites per entry or top-level) and the check enforces both directions; tools/contract_bytes_pin_coverage.py (sys.monitoring, 1.5 min) proves 226/226 sites executed by pinned_by+exercised_by tests, three CI/operator-only sites acknowledged via exercised_in; scanner widened to fixed-order compact writers (49: five ordered_* sites incl. new model-lifecycle-intent-v1, 44 incidental) and non-literal keywords; cross-package contract_bytes imports refused; surrogate probe on every site-level writer. Round 2 (same PR, 2026-10-03; DeepSeek&amp;#39;s full-series review and GPT-6 Astra&amp;#39;s assessment of it): Astra&amp;#39;s central point held \u2014 27 vector entries (14 app, 9 backend, 4 tools) pinned a test-local json.dumps, not a function in the tree. Now a registered site is pinned (a vector entry whose callable provably enters it, checked per entry under a sys.monitoring tracer) or exercised (its registry entry names the test file, lane or operator path that runs it), never neither, never both; contract-level exercised_by lists removed. Result: 189 sites pinned, 34 exercised by a named test, 3 by a lane (226 total, unchanged); 10 of the 27 substitute sites are now pinned through their own function with a probe or a fixed input (incl. SpireHelperBuildRecipe.environment_is_closed cross-linked to the frozen recipe digest and InferenceRouteStore.publish storing each frozen routing table), the rest exercised. No surviving frozen value changed (checked member by member). Inventory check also refuses a vector file that freezes nothing (Astra&amp;#39;s empty-vector demonstration) and classifies json.dumps by keywords, so ** splats, partials and JSONEncoder are found. B4: installer families gain unique_reads pinning six unique readers&amp;#39; refusals, incl. the operator-config message the installer prints, now duplicate JSON key &amp;#39;a&amp;#39; (was duplicate configuration key; #345, decision (e) below); verify_release_inputs keeps SpireHelperReleaseError(&amp;quot;signed helper build facts differ&amp;quot;) (Astra&amp;#39;s correction of DeepSeek A2), pinned with its DuplicateKey cause. A1: affinity_key keeps no default=str (body is json.loads output; Go has no such fallback), pinned by a test and recorded in the registry. The pin-coverage tool now runs on the fleet runners in Security Gate shard 4. Trap found on its first run: the fleet runners&amp;#39; CI venv has no jsonschema (the canonical-installer job&amp;#39;s minimal venv does), so an installer pin that goes through validate_control_plane_release.validate() fails closed there; the validator pin calls _preservation_checks directly. Astra&amp;#39;s corrections accepted: vectors do reach releases (the fleet installer bundle copies every source-archive member, contracts/vectors/ included; a native test context naming them is a stage 2/3 concern); C3 was a hazard, not a demonstrated miss (guard test stands); #331&amp;#39;s host-id concern is a precaution. DeepSeek&amp;#39;s .gitignore note stands as a trap: a fixture named *.key/*.pem or under build/ would be untracked (CI, not local, would then fail). Validation discrepancy: DeepSeek reported 9 failed + 2 errors in the backend suite at d10014f, Astra 1 failed (the known dgx3 node-agent-directory isolation defect); my runs match Astra. That one failure (test_fresh_granted_install_refuses_a_legacy_runner_still_in_place) was a test-isolation defect, fixed in #349 (the test now redirects node_config.STATE); local runs on installed nodes are clean from here on. Stage gate (main@d10014f): tools/contract_bytes_inventory.py check clean; 29 contracts, 28 with vectors (32 vector files, 24 pin-test modules), privileged-broker recorded deferred to stage 4; 253 registered sites (ascii 105, ascii_nan 48, utf8 19, utf8_nan 7, strict 37, unique 33, dsse_pae 4) across node agent 85, app 51, backend 45, installer 33, tools 31, connector 7, deploy 1; 7 byte-identical copies of contract_bytes.py (node agent, connector, deploy runner supervisor, installer, tools, backend, app), kept identical by backend/tests/test_contract_bytes_copies.py; 8 documented exceptions (bootstrap, guard runtime under python -I, release-set entry, candidate installer, rotation lab guest, fixed-VM receiver, two superseded spire-mvp-v1 scripts); 15 incidental sites; 0 unclassified. Every package followed freeze-then-move (vectors + pin test committed and passing against untouched code, then the move with the same vectors passing); main&amp;#39;s push runs green after every merge (Security Gate, Secret Scan, Signer/Runner/Connector acceptance, seam convergence). Exit criteria: (1) met except the broker documents (deferred by registry entry); (2) met with the eight exceptions above; (3) met by the vectors plus live-fleet reproductions on dgx1\u20134 (routes.json, 48 release records, selection.json, provider-expectation.json); (4) met by #333\u2013#339. Owner decisions taken, to confirm or overturn: (a) adapters allowed; (a2) DSSE only PAE shared, envelope rules per contract; (a3) fifth byte form (fixed member order) left with its contract; (b) broker documents to stage 4; (c) bootstrap-class scripts that run alone before a tree exists keep their helpers (eight exceptions; alternative is shipping the copy beside each, which changes their delivery closures); (d) plain-ValueError hooks replaced by the shared DuplicateKey without adapters where no handler inspects text; typed errors kept via adapters. (e) the installer&amp;#39;s operator-configuration refusal text changed under (d) and is user-visible (fleet_install.py prints str(exc)): kept and pinned as duplicate JSON key &amp;#39;&amp;lt;name&amp;gt;&amp;#39; because it names the key; restoring duplicate configuration key is a three-line adapter in fleet_operator.load if the owner prefers. Hand-offs to later stages: the Go canonicalJSON differences (#333\u2013#339) must be resolved before stage 2&amp;#39;s Go encoder is built; app/domains/capability_lifecycle/service._finish_plan used default=str (no shared hook) \u2014 discharged by #351 (merged 2026-10-03 as bb153c4ba, owner approved: shared canonical_ascii_nan, default removed after proving nothing non-JSON reached it, three plan ids frozen in the lifecycle tests, and the site pinned by a fixed-input product-plane-v1 entry on the lifecycle fixtures&amp;#39; ready Qwen plan after Astra noted the registry reserves &amp;#39;exercised&amp;#39; for sites no entry can call); fleet_attachment raises IdentityError for a repeated member in a journal record (latent bug, preserved); the signer VM&amp;#39;s SPARKOPS_SIGNER_AUTHORITY_MODE compose command and scripts/security/spire_assurance_successor.py inventory were untouched (the latter&amp;#39;s test already failed on main). Worktrees worktrees/sparkops/native-s1-* (contract-vectors, deploy, tools, backend, app) can be removed after the owner&amp;#39;s review (consult KEEP-WORKTREES.txt first). Step 4 issues: #333 to #339\nStarted from main@d3fc648b (only stage 0 since the pin; no plan fact stale). Worktree worktrees/sparkops/native-s1-contract-vectors, branch agent/native-s1-contract-vectors (head c580ec1). Backend (#347): controller-backend-v1 frozen (31 writers, 10 readers on eleven inputs; cross-links: lab heartbeat decodes the node&amp;#39;s frozen requests, deployment registry writes the frozen deployment document, portal_actions computes the frozen worker Action digests, backend and signer agree on an execution envelope); 32 modules moved onto backend/contract_bytes.py (five by the node-agent transformer); four incidental (render metadata, opencode config, runner authority journal/result prints); closures: signer service Dockerfile, Codex preview Dockerfile, controller authority MODULES; enrollment client now uses the backend copy. App (#348): product-plane-v1 frozen (37 writers, 12 readers; cross-links: routing table content digests, connector transport frames, DSSE PAE); 40 modules moved onto app/contract_bytes.py; signatures.dsse_pae keeps its bytes signature and delegates; compose_lock_v2.decode_strict shared with studio trust; four incidental incl. _finish_plan plan_id (default=str, no shared hook); closure: controller authority MODULES admits app.contract_bytes. Tools (#346, branch agent/native-s1-tools): release-tools-v1 frozen (18 writer sites on a behaviour-separating document and a non-finite one, 12 strict readers on nine inputs with refusal types and messages, helper recipe digest, node-agent builder reproduces the installed record, catalog descriptor digests on a snapshot; the validator&amp;#39;s decode pinned through validate() on a fixture release from installer/tests in the minimal env); 21 modules moved onto tools/contract_bytes.py (17 encoders, 13 hooks deleted; dual import for script/by-path modules); three more exceptions (install_development_candidate.py, spire_rotation_lab_guest.py run alone from a candidate archive; spire_helper_fixed_component_receiver_v2.py guest receiver not yet provisioned); scanner marker recorded incidental. Closures: reconciler release FILES ships the copy; docs/environments/catalog.json re-pins tools/compose_admission.py; four by-path test loaders put tools/ on sys.path. 78 files remain (app 44, backend 34). Exception list now eight; raised as a judgement call in the PR. Installer (#345, branch agent/native-s1-installer, worktree native-s1-contract-vectors): three families frozen (fleet-node-config-v1 rendered node and runner files with custody, fleet-installer-node-v1 identity, protocol, release set, restart expectation, retirement and enrollment documents, fleet-installer-control-plane-v1 nine control-plane documents, activation command digest cross-check, diagnostic reads) by a unittest module (installer tests run under unittest discover); 23 modules moved onto installer/contract_bytes.py (16 encoders, 7 hooks deleted; dual-context modules import relative-then-flat); two new exceptions with reasons in the registry: control_plane_guard_runtime.py (builder runs it with python -I, no sibling import path) and fleet_release_set.py (release-set entry run from the unverified set with the bootstrap as its only dependency; tools/tests/test_fleet_release_set.py stages exactly those two files). Refusal policy applied: typed hook errors (IdentityError, DiagnosticError) kept via three-line adapters; plain-ValueError hooks replaced by the shared DuplicateKey (handlers catch ValueError, none inspects text, no frame carries it); fleet_attachment keeps the borrowed IdentityError escape (noted as a latent bug, not fixed). Closure lists gained the copy: validator PRESERVATION_PAYLOAD + CANONICAL_PAYLOAD, builder leaf check, fleet_release_materialize.required_guards. backend/worker_enrollment_client.py read frames through the installer&amp;#39;s hook; now loads_unique from the installer copy, registered as a site until the backend copy exists. 103 files remain unclassified (app 44, backend 34, tools 25). Deploy (#344): spire-github-runner-client-v1 frozen (6 operations, 24 refused responses, 1 tolerated), deploy/github-actions-runner/contract_bytes.py copy, spire_broker_client moved; contract_bytes.py added to RUNNER_SUPERVISOR_FILES and RELEASE_FILES; deploy/spire-mvp-v1/{activate,prepare}_node.py recorded as exceptions (superseded profile kept as evidence). Connector (#343, merged d0b32ee): spire-connector-local-v1, execution-host-advertisement-v1, codespace-fixture-canary-v1 frozen; connector copy of the shared module; backend/tests/test_contract_bytes_copies.py keeps every registered copy byte-identical to the node agent&amp;#39;s. Node agent part 3 (#342, branch agent/native-s1-node-agent-broker): spire-helper-reconciliation-v2 frozen (threshold DSSE, 14 envelope and 6 review refusals); nineteen broker modules moved by a narrow mechanical rewrite (24 hooks and one DSSE encoder deleted, 19 canonical implementations now delegate behind their error adapters); broker documents recorded as deferred to stage 4 in the registry (the check requires vectors or a stated deferral); the node agent&amp;#39;s unclassified list is empty; 137 files remain (app 44, backend 35, installer 25, tools 25, connector 5, deploy 3). Node agent part 2 (#341, merged 697d8bf7): five families frozen (helper IPC check-in exchange, helper release records with DSSE-signed deployment, activation v2 records with DSSE-signed command and heartbeat selection, systemd materialization and runtime evidence, provider expectation); shared dsse_pae with dsse/pae.json; eight modules moved; 156 files left unclassified. Evidence: frozen vectors pass unchanged after the move; existing Python/Go goldens still hold; live selection.json and provider-expectation.json on dgx1 to dgx4 read and reproduced byte for byte by the moved code. Closure change: contract_bytes.py enrolled in the root-broker bundle (tools/build_spire_helper_root_broker_bundle.py PYTHON_MODULES) and as one exact additional closure in app/domains/releases/component_build_records_v2.py, following 180df0a; three historical closures still accepted. .gitleaks.toml allows three exact public test-key digests in two vector files. Node agent part 1 (#340, merged 115ef114): nine families frozen (execution journal fingerprint and outcome, signed provider prompt authority, signed VM image provenance, release record, video request digest, worker Action digest and stored UniFi plan, mpirun ring frame, lab SPIRE client request and response); shared module gained loads_strict/loads_unique with canonical-json/decode.json; ten modules moved and their private helpers deleted; registry now records readers too; 164 files left unclassified. Evidence: vectors committed before the move pass unchanged after it; all 48 node agent release records installed on dgx1 to dgx4 are read and reproduced byte for byte by the moved code. Closure change: Dockerfile.backend and packaging/control-plane/Dockerfile.app now copy contract_bytes.py beside coding_policy.py (isolation tests failed without it), hence the spire-acceptance label. Revert: git revert -m 1 &amp;lt;merge&amp;gt;. Tracer (#332): vectors for sparkops.inference-routes/v1 (12 tables with file bytes and parsed table, 23 refusals, size limit, 38 conversation keys) and for the four byte behaviours (canonical-json/encode.json, 36 inputs); node agent shared module sparkpyro_node_agent/contract_bytes.py; write_routes and affinity_key moved, inline json.dumps deleted; contracts/vectors/registry.json plus tools/contract_bytes_inventory.py check (runs in backend/tests/test_contract_bytes_inventory.py) classify every call site and refuse new private helpers. No byte changed: commit 1 pins the vectors against the untouched router, commit 2 moves the call sites and the same vectors pass; the moved writer reproduces the live routes.json on dgx3 byte for byte (cccdc584\u2026, same hash on dgx1, dgx2, dgx4). CI 10/10 green (Security Gate run 37055333707), Codex security review no findings, merge state CLEAN. Local: 4 shards, tools/tests, installer/tests pass except one test that fails on any installed node, main included (test_fleet_node_runner_attach.py::test_fresh_granted_install_refuses_a_legacy_runner_still_in_place reads /var/lib/sparkops/node-agent). Step 4 done: existing Go canonicalJSON (verbatim, go1.27.1) agrees with Python on 15 of 36 byte-behaviour cases and 11 of 12 routing-table files; the seven difference classes are #333 to #339 (HTML escapes, raw non-ASCII and DEL, U+2028/9, lone surrogates, -0 and integers above 2^53, float spelling, non-finite). Counts: 182 compact sorted-key call sites in the plan&amp;#39;s seven roots (85 ascii, 68 ascii_nan, 19 utf8, 10 utf8_nan), 82 strict-decode hooks, 5 DSSE encoders; the plan&amp;#39;s 221 included other trees. Remains: 174 files listed unclassified in the registry (app 44, node agent 37, backend 35, installer 25, tools 25, connector 5, deploy 3), one package per pull request: classify, freeze vectors per contract, add that package&amp;#39;s contract_bytes (identical copy, pinned by the same vectors), move, delete. The shared module still needs strict decoding and DSSE pre-authentication encoding with their vectors (first needed by the node agent pull request). Exit criteria 1 to 3 are met only for the routes family so far. Open decisions for the owner: (a) modules that translate a refusal into their own error code keep a small adapter around the shared call; the check forbids private implementations, not adapters. (a2) DSSE: only the pre-authentication encoding is shared; each signed contract keeps its own envelope rules, pinned by its own refusal vectors. (a3) A fifth byte form exists that the plan did not count: fixed member order (the helper IPC response and receipt preimage in spire_helper_client._ordered_json); it is frozen in vectors and left with its contract. (b) Broker document vectors are stage 4 step 3; stage 1 will move the broker helpers and record their document vectors as deferred to stage 4. Traps: docs/DEVELOPMENT.md is hash-pinned by docs/environments/catalog.json (editing it fails tools/tests/test_environment_catalog.py); Dockerfile.backend copies coding_policy.py from the node agent by name, so it must also copy contract_bytes.py once that file imports it (needs the spire-acceptance label); the root-broker bundle&amp;#39;s PYTHON_MODULES list must gain contract_bytes.py when a listed module imports it. Revert of #332: git revert -m 1 cc3f0260; later stage 1 pull requests depend on its registry and conventions, so they revert first.\n\n\n2 Go foundation\ndone 2026-10-03 (#350 merged as 0937f0123, owner approved; DeepSeek implemented, GPT-6 Astra reviewed and corrected)\n#350\nBased on main@ce30aac; corrections at 81bed6cc418b1f796fad4a3c56af65d31bc35c9d, in the separate worktree worktrees/sparkops/native-s2-fixes (the implementing agent&amp;#39;s worktree was not touched). Owner decisions of 2026-10-03 above govern the exit criteria: (1) every stage 1 vector means the families whose capabilities internal/contract owns; document-specific families gain Go consumers with their owning daemons in stage 3 onwards, recorded in the README layout table; (2) unknown-field rejection is supplied by DecodeObject; (3) _finish_plan is taken by the stage 1 agent in separate PR #351; (4) the reproducibility artifact is the package&amp;#39;s own test binary; (5) #333\u2013#339 remain open: the encoder meets their first condition, but the two bare json.Marshal writers in scripts/spire-controller-transport and scripts/spire-client-comparison keep the second unmet until stage 3 step 7 migrates or retires them. Code: stdlib-only go/ module with four canonical byte behaviours, strict and unique readers, DecodeObject(raw, allowed...), digests, DSSE PAE and Ed25519 verification, length-prefixed framing and peer credentials. DecodeObject applies strict rules and refuses unknown top-level members as unknown_field; nested objects require their own field validation. Corrections, one code commit each: e18f9e6 reads accepted decode expectations from value and requires exactly one value or refusal for every regular/tolerated expectation; the strict-1e999-returns-zero mutation now fails with got {&amp;quot;x&amp;quot;:0}, want {&amp;quot;x&amp;quot;:Infinity}, and empty expectations fail for both readers in both case groups. 8d0334b adds and tests DecodeObject and documents unknown_field. 81bed6c documents Go&amp;#39;s own defensive depth bound and tests 511/512 accepted versus 513/600 refused (invalid_json) for arrays, objects and mixed nesting under both readers, plus invalid_number and unsupported_value across all four encoders. CPython 3.12.3 accepts arrays and objects at 513 and 600: this is deliberately stricter than Python. Vectors: encode 36 \u00d7 4; decode 29 \u00d7 2 plus 5 tolerated \u00d7 2; DSSE PAE/digests/signatures; ring framing and helper request frames. No file under contracts/vectors/ changed in the corrections. Final-head reproducibility: builder ran two isolated native builds per architecture with matching digests; arm64 23aaed61472690f18ef14f26d0072f4d01ed8032e96933315e8c31b4ae95370d (5,938,308 bytes); amd64 on zynserver d7c188737a5e889e9594f8978b48785a59805156c2587fbe7682ac621e557605 (6,330,258 bytes). Both produced test binaries ran and passed. Generalisation evidence from the prior review at 09931d5: controller transport matches the pre-change ce30aac builder byte for byte, SHA-256 6811885b29bf6422912478fde167cba61d37c2db358aeafc18721bdd1f313f81 (17,360,604 bytes); artifact, recipe, dependencies, packaging, toolchain and reproducibility records equal; source closure, commit, tree and builder source record differ. Correction commits leave that builder/policy/source unchanged. Empty-cache/no-vendor allowance is only enabled by the stdlib foundation policy. Validation at 81bed6c: pinned Go 1.27.1 build/vet/test pass; tools/tests 658 passed, 20 subtests passed; inventory check exit 0; pin coverage 223/223 executed (189 pinned, 34 named-test, 3 elsewhere); packaging selection 47 passed with tools on PYTHONPATH; environment catalog 10 profiles/22 source files; local-app boundary verified. Exact Ruff command: .venv/bin/ruff check backend/tests/test_ci_change_scope.py backend/tests/test_github_actions_runner_deployment.py tools/build_spire_controller_transport_release.py tools/run_go_contract_tests.py tools/tests/test_go_module_policy.py \u2192 All checks passed!. CI: fleet Go lane retains executable tool-cache extraction, Socketpair instead of a long sun_path, the fourth-lane count pin and the Python-equivalent fork guard. CI at 81bed6c: 15/15 passed, foreground gh pr checks 350 --watch exit 0. Security Gate 37099517857 (Go job 111136167502, 12 s), Secret Scan 37099517848, runner canary 37099517879, Signer/Connector/Runner SPIRE acceptance 37099517833 / 37099517840 / 37099517842, and common seam convergence 37099517829 all passed. spire-acceptance remains. Deletion: no production code removed in this foundation stage; old Go writers are an explicit stage 3 hand-off, not a reason to close their issues. Evidence: /tmp/sparkops-s2-fixes-evidence-MsEsaIqu contains commands, logs, mutation failures and both manifests. Remains: owner merge; record merge commit, git revert -m 1 &amp;lt;merge&amp;gt;, and main push checks. No live-fleet deployment or verification is claimed.\n\n\n3 Go inference router\ndone 2026-10-03 \u2014 transport explicitly deferred to 3b\n#355 UTF-32 refusal coverage, head 69cd4da7dc59772a6a84a84a3a163714c7517089; #354 retirement, head 2c9d42677463b78f30b8d74d110c25c9356ac091; #352 tracer, head 6766df5e5464d730505816a5be544f0879b6fa2e, label spire-acceptance\nStarted from origin/main@0937f0123 (48 commits beyond 01e0e849); tracer rebased onto main@bb153c4 after #351 landed. Worktree worktrees/sparkops/native-s3-inference-router, branch agent/native-s3-inference-router. Owner decision, 2026-10-03 UTC / 2026-10-02 PDT: approve the planned router-unit revision: only ExecStart changes; preserve all DynamicUser/hardening/ordering/port/route-path bytes; show all three diffs in the PR; retain the three original node cases with dated supersession metadata and freeze three native successors; ship the vectors, unit switch and binary in one PR. Router unit bytes are regression evidence, not a digest-verified fleet contract. This resolves the initial golden-vector stop. Tracer: stdlib Go router, route/affinity vectors, HTTP and Python/Go differential tests, immediate cancellation during prefill, work-release policy/binary/build-record validation, native node publication and ExecStart. Standard upgrades stage the target work release for the router while preserving the SPIRE-attested action-client path/digest. Tests enforce all three single-line unit diffs and intact old cases. The Python publisher and server are retained pending live proof; this PR deletes the Python launch rendering. Local evidence: pinned Go build/vet/tests, race detector, 914 focused Python/tools tests + 20 subtests, 527 installer tests, Ruff, local-app boundary; final-head inventory clean and pin coverage 224/224 sites (190 pinned, 34 named-test, 3 elsewhere). Both native builders reproduced twice at 6766df5: arm64 96f36ebc2ec4a07429a5a5547722f2840d2ba82568fedad51b24116b0b47194c (10,197,984 bytes); amd64 on zynserver c713724616cd4d2d27d833be6fb121bdb51b93b8974a4f013f8dac7e0a7369f7 (10,974,516 bytes). Final manifests in /tmp/sparkops-s3-final-Cngpv6jH and zynserver /tmp/sparkops-s3-final-6BW9MUTG; first-run logs and built-binary HTTP/SIGTERM smoke in /tmp/sparkops-s3-build-8Orh8cpB. CI: final-head Security Gate 37102584797, Secret Scan 37102584780, signer/connector/runner acceptance 37102584767 / 37102584802 / 37102584812, seam convergence 37102584748, runner canary 37102584776 \u2014 all 15/15 checks passed, foreground gh pr checks 352 --watch exit 0, merge state CLEAN at 6766df5. Merge: owner explicitly approved #352 on 2026-10-03; merged reviewed head as f49a804b86e1cad9e67170d9c44618b83a5919b3 (parents bb153c4ba, 6766df5e). Revert: git revert -m 1 f49a804b86e1cad9e67170d9c44618b83a5919b3. Main push CI: all six workflows / 14 checks passed in the foreground (each gh run watch --exit-status returned 0): Security Gate 37105348622, Secret Scan 37105348604, signer/connector/runner acceptance 37105348632 / 37105348678 / 37105348769, seam convergence 37105348645. Merge tree 9a471cb43dcd9fbb754aba5770097ae72fcf5170 equals the tested PR-head tree. Full main check results and watch logs: /tmp/sparkops-s3-final-Cngpv6jH/main-ci-final.json and main-ci-*.log. Deployment: owner reports cp1 rc.36 (main@f49a804b), dgx1\u20134 node release 07a8d058 / work release 25a84c07f62cc6d8bf622650f1ee2be76dc43bff8c6a013bbb43d28b85d5e198, with authenticated SPIRE work jobs verified during the owner-run upgrades. The owner named dgx1\u20134 after --all refused the powered-off on-demand unifi-worker; that separate #331 issue is outside this stage. Independent live evidence, 2026-10-03 08:24\u201308:32 UTC: all four services active, running executable under that work release, DynamicUser=yes, and binary SHA-256 96f36ebc2ec4a07429a5a5547722f2840d2ba82568fedad51b24116b0b47194c matching the reproduced arm64 artifact; /health and /healthz 200, /v1/models advertises DeepSeek aliases with max_model_len=1048576; all four authenticated fleet heartbeats healthy. Each router reproduces all 523 stable samples from the one real SGLang backend with zero mismatches. Four sequential bounded synthetic streaming requests (one via each router) held an observed running backend slot; client closure released router inflight in 0.0061 / 0.0108 / 0.0111 / 0.0109 s and backend running/queued gauges in 0.1116 / 0.1214 / 0.1222 / 0.1224 s (sampled upper bounds). All four journals report client_closed; all remain health 200 and inflight 0 afterward. These cancel tests occurred after generated tokens, not during prefill. The first shorter diagnostic completed before a reliable cancellation observation and is retained as unproven evidence. Blocker and owner decision: the current route table and authenticated lifecycle status have one DeepSeek TP4 placement on dgx1\u20134, not two TP2 placements. Four simultaneous subagents split two-and-two, and real multi-placement metric aggregation, therefore cannot be proved. Owner explicitly answered \u201cRecord the blocker; keep DeepSeek running.\u201d No model/topology/service/deployment changes made. That initial blocker decision is superseded by the owner revision below. Evidence: /tmp/sparkops-s3-live-sZChIqr2/gate-summary.json, four service/HTTP/metric snapshots, authenticated CLI snapshots, per-node post-cancel journals, cancel-active-9myspwu5/ request timelines, and sha256-manifest.json. Owner revision, 2026-10-03: owner explicitly directs Stage 3 to proceed on DeepSeek TP4. Two-TP2 live distribution and multi-placement metric checks are waived, not executed; retain automated multi-placement coverage. The recorded TP4 evidence now meets the live gate, allowing Python retirement without changing the running model. Retirement PR #354: branch agent/native-s3-retire-python in the same focused router worktree, based on current origin/main@f49a804b. Removes 527 net production Python lines: HTTP server, balancer, affinity, metrics, health loop and entry point; retained parser/publisher function ASTs are identical. Deletes Python differential launcher; native conformance coverage retains prefill cancellation, streaming, retry, HTTP affinity and multi-placement metrics. Frozen vectors are unchanged. Registry retired_sites preserves the removed affinity name in frozen provenance; inventory rejects surviving definitions, live registrations and undocumented/unclaimed retirements. Local: 2,287 tests + 669 subtests (one skipped), 527 installer tests, 65 inventory/vector regression tests, pinned Go build/vet/test and race, node-agent wheel/sdist build, Ruff and boundary; inventory clean, pin coverage 223/223 (189 pinned, 34 named-test, three elsewhere). Evidence /tmp/sparkops-s3-retire-fE21wn7f. #354 CI: all 11/11 triggered checks passed at 2c9d426, foreground gh pr checks 354 --watch exit 0, merge state CLEAN. Security Gate 37111840668, Secret Scan 37111840697, runner canary 37111840681. Label spire-acceptance set; these paths do not select the separate SPIRE acceptance workflows. Final check records in /tmp/sparkops-s3-retire-fE21wn7f/pr-354-final-checks.json. #354 merge: owner approved; merged 2026-10-03 as f38df6a4c582b6cb9d688519bab5ca9aca43df0c (parents f49a804b, 2c9d426). Revert: git revert -m 1 f38df6a4c582b6cb9d688519bab5ca9aca43df0c. #354 main CI: Security Gate 37112624933 and Secret Scan 37112624932 passed, all 10/10 checks green; both foreground watches exited 0. Full check records and watch logs in /tmp/sparkops-s3-retire-fE21wn7f/main-ci-final.json, main-security.log and main-secret.log. The Python server is gone from main. Main is now 57 commits beyond the original 01e0e849 pin. Step 7 fact correction: despite the dormant/lab names, tools/build_spire_work_release.py::_go_binaries builds the live action-client from the controller transport module, and tools/build_spire_helper_release.py::MODULE_RELATIVE selects the comparison module for the live heartbeat helper. installer/fleet_node_install.py::upgrade_node refuses changed work-client/helper/SPIRE-agent digests before effects. The standard upgrade therefore cannot deploy their module migration; the documented attested replacement path is retirement/re-enrollment (docs/installer/spire-fleet-user-flow.md). No transport code or production state changed. Asked the owner whether to move this work and #333\u2013#339 to a separate gate or keep a separately planned attested-client cutover in Stage 3; decision pending. UTF-32 follow-up #355: independent regression coverage committed on agent/native-s3-decoder-refusals: 18 cases across strict/unique readers, UTF-8 BOM and UTF-16/32 byte orders with/without BOM. Replaces the old narrow strict-only check; production code and all golden bytes unchanged. Each literal was independently decoded to the expected JSON document with its named Python codec. Pinned Go 1.27.1 build/vet/all tests and focused 18-case run passed. #355 CI: all 10/10 checks passed at 69cd4da, foreground gh pr checks 355 --watch exited 0, merge state CLEAN. Security Gate 37112878225, Secret Scan 37112878174. Evidence /tmp/sparkops-s3-decoder-ntFk8nOk/refusals.log, pr-ci.log and pr-final-checks.json. #355 merge: blanket owner authorization received; merged as e8c7ee6606f6fd844f4b0dd3cb766c2c43d82706. Revert: git revert -m 1 e8c7ee6606f6fd844f4b0dd3cb766c2c43d82706. Main Security Gate 37115913626 and Secret Scan 37115913645 both passed; foreground watches exited 0. Remains: controller transport/comparison migration with #333\u2013#339 closure and a supported attested-client cutover. Stage exit criteria remain unmet pending that transport work. Owner subsequently authorized work through stage 8. Owner authorization, 2026-10-03 (subsequent): explicitly permits taking DeepSeek V4.1 down to test two Qwen TP2 placements and router balancing. Temporary test uses the supported Flash-Next TP2 profile on dgx1+dgx2 and dgx3+dgx4 through scoped sparkops --session model lifecycle operations, followed by restoration of DeepSeek TP4 on all four nodes. Before-state, catalog and plans saved in /tmp/sparkops-s3-tp2-aui186_0; stop and restoration plans executable, initial Qwen plans correctly refused while DeepSeek occupies the complete TP4 topology. Live TP2 evidence pending; the earlier waiver is historical, not a measured pass. This permission does not authorize #355 merge or resolve transport step 7. TP2 live proof, 2026-10-03: user-authorized DeepSeek stop op-ba596beb819007f54104bfcd completed with cleanup verified; Flash-Next TP2 operations op-1a3b25f4c361b028f96880ca (dgx1+dgx2, generation 11) and op-28f2eff18084fca373eb5dbb (dgx3+dgx4, generation 12) both semantically ready. All four native routers retain the reproduced arm64 binary and DynamicUser, health/healthz 200, two healthy placements, and max_model_len=644732. Four Qwen role workers through dgx3&amp;#39;s router all succeeded with overlapping request windows; router inflight and both real vLLM running-request gauges simultaneously measured [2,2]; exactly four body-affinity routing events split two per placement, all HTTP 200 on first attempt. Every router correctly aggregates 502 stable samples shared by both backends (418 nonzero), zero mismatches. Evidence /tmp/sparkops-s3-tp2-aui186_0: tp2-verification-summary.json, roles-results.json, roles-samples.json, roles-routed-events.json, metrics-checks.json, all raw backend/router scrapes and four service inspections. These two previously waived checks are now executed and passed. Qwen stops op-c689a0ff00b6282331fefe0c and op-1bd904362bb8845ea606e7a2 both succeeded with absence and cleanup verified. Restoration verified: DeepSeek TP4 operation op-7d22c3151a4251ac336927c3 succeeded at 2026-10-03T10:05:18.963711Z; semantic readiness and original endpoint http://10.10.10.101:8888/v1 verified at binding generation 5. Only DeepSeek remains bound, all four fleet heartbeats healthy, all four native routers active with the reproduced binary and DynamicUser, health/healthz 200, one healthy placement, and max_model_len=1048576. Each restored router reproduces 400 stable real-backend metric samples with zero mismatches. Four TP2 request windows overlapped for 10.249 seconds. Final proof and restoration records: /tmp/sparkops-s3-tp2-aui186_0/gate-summary.json, restored/inspection-summary.json, restored-models.json, restored-fleet.json, restore-deepseek.json, and sha256-manifest.json. Stage 3 step 5 is now fully evidenced; #355 main checks subsequently passed as recorded above. Transport migration/issue-closure scope remains pending. No further production change is required for this TP2 test. CI reliability follow-up #357: #356 exposed premature slot inspection in TestUnreachableRetriesButHTTPErrorDoesNot; 1,000 local repetitions reproduced. Waiting on ServeHTTP completion exposed ephemeral-port reuse/self-proxy under stress; fixed the target test with one deterministic dial refusal and a real HTTP responding backend. Assert one refusal, one HTTP 500, unchanged body and zero slots after handler completion. Pinned Go build/vet/full tests, 3,000 repetitions and 100 race repetitions passed; separate Standards/Spec reviews clear. PR #357, head 45fe8d5, 10/10 CI passed; merged as f6a2722a060ce5aadab4ff567794a7d574156500. Main Security Gate 37118892924 and Secret Scan 37118892928 both passed in foreground. Revert: git revert -m 1 f6a2722a060ce5aadab4ff567794a7d574156500; production/router vectors unchanged. Evidence /tmp/sparkops-s3-completion-LtgogzfX. Final fleet recheck, 2026-10-03 11:47 UTC: only DeepSeek TP4 remains, ready generation 5 with max_model_len=1048576, all four heartbeats healthy and a fresh semantic probe passed. Scoped CLI evidence and hashes: /tmp/sparkops-native-overnight-final-baOg29ND.\n\n\n3b Transport fold + attested-client cutover\ndone 2026-10-05 \u2014 rc.53 (38fa5ba7) on cp1 and attested clients cut over on dgx1\u20134 + zynserver; #333\u2013#339 closed\n#366, #390; #333\u2013#339 remain open\nOwner accepted the separate gate on 2026-10-03 after the router live checks and retirement passed. Includes action/helper/runner clients and connector canonical comparison audit; supported identity replacement, rollback and live proof remain required. Initial transport/action-client/rotation-probe source fold, merged with current main at local b6507d4, is in worktrees/sparkops/native-s3b-transport-fold, design 2026-10-03-sparkops-native-s3b-transport-design.md. Shared canonical bytes, strict decoding, framing and Unix credentials replace private implementations; pinned Go build/vet/tests, 86 focused packaging/record/lab tests, 677 tools tests +20 subtests, Ruff, contract inventory and local-app boundary pass locally. Full Python shards passed 1754/1538/1904/2034 tests plus isolated CLI suites (evidence /tmp/sparkops-3b-shards-8h3suh8j); intentional skipped/xfailed cases remain reported in their logs. Invalid UTF-8/lone-surrogate/deep-nesting config refusal documented; old vectors unchanged. Historical build inventories remain accepted; the new inventory is distinct. Merged-main validation also passed the actual pinned Go CI driver including isolated Python adapter/prune tests and four Python shards1720/1642/1948/1970 plusCLI (evidence /tmp/sparkops-3b-merged-shards-kr__j8u7, /tmp/sparkops-3b-merged-go-lane.log). Draft PR366 at 7a9c4a1 includes explicit pinned cutover planning, the exact 67-file native closure after #364, and corrected transport-lane package selection; ordinary upgrade refusal preserved. Tools762+20subtests and33 focused cutover/release-set tests pass; review 2026-10-03-sparkops-pr366-review.md records corrected artifact reference validation. Corrected measurer verified rc36/rc37 attested node/runner bytes identical on botharchitectures (/tmp/sparkops-native-rc37-attested-artifact-comparison.json). Pinned native arm64 transport/action-client tests and unsigned component reproduction passed; all 15 PR366 checks passed at7a9c4a1 (Security37147918794). Exact records in /tmp/sparkops-s3b-native-arm-records.jsonl; x86 reproduction and cutover rehearsal remain. No live identity changed. Comparison/helper, runner and connector audit, final combined source closure, cutover rehearsal and live verification remain. Exact transport tracer head is474ad94; both older7a native reproductions passed, and the exact B474 syntheticrc40 source/core/components/package and independent native installer reproduction now pass on the x86 builder. A remains actual rc38 source5fb68c1 under fresh fixture keys; both official builders are released to root. B archive935d1838859fc3b114d691a496a3626cadd3634aff17111c60351fb076ddb7b4, manifestbb39735cab71fa2deb966de8d723fe64f1755f9c371902ef7786ed81a67b74ea. Fresh04 guests are not yet allocated; verified artifact comparison precedes allocation. Audit of remaining installed helper/runner/connector/signer modules is in 2026-10-03-sparkops-native-s3b-contract-surface-audit.md; first transport tracer alone does not close333\u2013339. Fresh04 A5fb baseline initially refused activation after publishingready; direct read-only readiness then passed with allphase/identityhashes unchanged. Identical publicattachretry passed, preserving the original refusal and unproven cause. A jobs82dd6a0b/8b142914 passed. B474 publiccontrollerupgrade/status/doctor passed. Ordinary fleetupgrade --check correctly refused changed work-client attestation; before/after phase receipts, node identity, heartbeatselection, processPIDs, authhead and registrations were byte-identical. Actual04 rehearsal now passed A5fb\u2192B474\u2192A plus cold boot, ordinary-upgrade refusal and idempotent reenrollment. A supplemental B\u2192A cycle captured fresh independent routes files and exact authenticated controller/node job outcomes. Stablehost/workloadIDs/UIDs are preserved across authorization revisions1/3/5/7/9; old parents are absent/unselected. Final A installation6f305f59-fe88-42a1-98b3-7d6a8876a11a and job934204e4d0943640a8aba07d passed. Report state/sparkops-native-s3b-rehearsal-20261003/rehearsal-report.json SHA700935a3a69caf1770d9a898760447a3f5711a3c54bd7f0a12fac16701ebbd45 binds227 evidence files. Exact04 domains/files/ports are absent; final canonical receipts await natural DHCP lease expiry. Initial activation refusal and invalid combined rollback/check attempt remain recorded honestly. No production cutover or full3b pass is claimed; current-main source integration/reproduction comes next. Final379-integrated tracer2ef208366462d1030722b75f416780a50ad8c101 passed all15PRchecks in foreground (/tmp/sparkops-pr366-ci-watch-2ef-current.log). Native Go inputs equal independently reproduced0bc2b33, but executable hashes differ from474 because main added Unicode15 source; supplemental exact-current05rehearsal is prepared under state/sparkops-native-s3b-current-rehearsal-20261003, approved procedure 2026-10-03-sparkops-native-s3b-current-node-rehearsal.md. No merge or production cutover before that proof. The04rehearsal guests are fully retired after natural lease expiry: controller13cadf5a4e7c9ef245911cf0b3093a54aca7cff12399051718ea404175879303, nodec4ecfb31bb86ea3af1189485869009c3ed489bb13e374d501554407294a5b378; domains/files/ports/leases absent. Final index state/sparkops-native-s3b-rehearsal-20261003/rehearsal-retirement-final.json SHAbe00aa32792b40edc84976f556ec7c0914f9e1687e2d79a15c4b35438ec1c668 binds the unchanged original report. Current branch integrated unrelated #380 as91b2d5e387eae1804104cbec9927955448cd0256; Go, native builder inputs and node installation effect source are byte-identical to rehearsed2ef.847 integration tests+20subtests pass; newCIwatch running.05 exact artifact archiveb333483c7e19dfc36c28598d3f6725a65232768c8e42d8640d0111246f64da4b, manifest474eddcc6bb419555423f35b6c406963fb8c75c921ff239dba8ded4769ff15d0 (exact verified manifest remains in task report), actual actioncb1a9232/transport5c2db7e9 match independent reproduction.05 A install/attach/health/job passed; normal B upgrade refused changed attested client before effects; supported reenrollment underway. Current supplemental05 exact-native rehearsal passes A\u2192B\u2192A with old/new current binary hashes, supported controller upgrade/rollback and node reenrollment, ordinary refusal without effects, coldboot, four authenticated jobs, stable accounts/host/workload IDs and repeated convergence. Root verified175 evidence hashes against report319e9ceb94d8a0d220c67a25ab401287accba9a90e6066d4dd88040164a74711 instate/sparkops-native-s3b-current-rehearsal-20261003/. Domains/files/ports absent; lease expiry00:31:34/35UTC pending under agent custody. PR366 final e5531b48 all15 checks passed foreground;91b2 CI import failure corrected with isolated by-path regression; native/rehearsed effect inputs unchanged. #366 merged00:09:16UTC2026-10-04 as9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871; revertgit revert -m 1 9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871. Final head72cb91cd integrates381;56focused+62subtests passed, all15 PR checks passed rootforeground, no unresolvedthreads. Main six workflows+dependencygraph watched; rc43nativebuild started atfixedmerge. Production baseline records allfourDGX andzynserver identities/accounts/runningclienthashes and controllerauth/SPIRE inventory atstate/sparkops-native-s3b-production-20261003-PWqz8bIH/. No production3b identity changed yet. zyn also needs action-client reenrollment; runnerreplacement alone would leaveitsoldworkclient. #366 all main workflows and dependency graph passed foreground (/tmp/sparkops-pr366-main-watch-results.json). Standardrc43 build initially stopped on x86 disk guard; two hash-matched redundant retired-lab candidate copies were removed after owner-agent release, preserving full local archives. Next attempt exposed stale operational test setup: shared-module installer tests require vendoring. Operational driver now invokes source-owned tools.run_go_contract_tests; full pinned Go build/vet/all tests passed on both native builders, component packaging continues. No product byte or test was waived. rc43 preparation, 2026-10-04 00:33 UTC: both pinned native builders passed the complete source-owned Go driver and reproduced the rehearsed action-client/transport pins. The ordinary assembler correctly refused with exit3 because only work_client changes on both platforms. Independently measured explicit plan e52775f8091d58ced93570c5a1ab0d0b60000d734024493eb68b4a475b436f1f binds rc42 set e76ac957..., source 9bcab813..., ARM manifest 3b8c26e2..., x86 manifest 7aaf3ba6..., and immutable rehearsal report 319e9ceb...; explicit assembly is underway. 05 rehearsal is fully retired: final index c2e822be40799b2e354b698097d3f4204cbe30711d72c9f4daa2cd3202557975, controller receipt 816ad56810ac27c6cc4c2114d6e2a519116b302b151a531d0885cc322c7a2797, node receipt 594c1a92f1c107113ddbdd61b79e4cea4b15ec8782b3c021f899a23441e0f7c6; all175 original evidence files rehashed, report unchanged. Signed rc43 set aa62b3bb32e0e936224737ca77fd549f8d86603eefbe6fbb8e1844b49b5d2d4e assembled; archive b4b7d7fcce3415de5fafb37ff317f29c9d3f479b1d7224ebaf7e419fa42b4f0e. Standard cp1 upgrade completed00:46:09UTC; independent source observation and sequential status/doctor both canonical_healthy=true. Production evidence directory state/sparkops-native-s3b-production-20261003-PWqz8bIH/. dgx1 re-enrollment refused before retirement at reenroll_check: recorded/node contexts are identical but current admission adds runners=true from a later verified grant. Comparison against the rc43 controller pre-reenrollment observation confirms all registrations/authorizations and dgx1 identity/release/six active services/model container unchanged. Evidence context-difference-dgx1.json, controller-refused-dgx1.json, refused-rc43-dgx1.json. Fleet remains on rc42 node software; zyn remains on its older node release. A narrow controller-side retained-context observation fix is in progress in fix-reenroll-retained-context; strict node context equality remains required. Production cutover/live gate is pending that fix and a new signed release. PR382 retained-context repair merged at01:08:17UTC2026-10-04 ase77df2ff00a70458b0629afe504ef4eb8e9fc9cf, after all10 exact-head checks passed; no unresolved review threads. #382, review2026-10-04-sparkops-reenroll-retained-context-review.md; revertgit revert -m 1 e77df2ff00a70458b0629afe504ef4eb8e9fc9cf. Custody-checked historical context is used only for the read-only observation; current admission still governs the replacement, and node context equality is unchanged. Both main foreground watches passed: Security37167091438 and Secret37167091473; evidence/tmp/sparkops-pr382-main-watch-results.json. rc44 two-architecture signed build is underway, batching already-green #371 and #368; cp1 remains rc43, DGX nodes rc42, no node reenrollment has completed. rc44 set78bd417effcbbffec95740369e4c53567246da2a16f2c2506546a9fe19021055 built/signed frome77df2f on both native builders. Measured rc42\u219244 cutover plan069e4c3fd78149b2fdb3910208319e9639207b5b682afcf0c73df080b94181cf confirms only action-client changes; exact action/transport bytes equal the05 rehearsal and installed five-host helper/action/SPIRE baselines match expected previous pins. ARM manifeste6ad676316364e0c76968a7cb76bf7df5822b1e9723c7649911b526a23b69157, x86c471d62b09b3595d44938130be2dbe3ad87e2ec377eaa1a4419a24bf439e8610. Evidencestate/sparkops-native-s3b-production-20261003-PWqz8bIH/rc44-measurement.json. Standard cp1 upgrade started01:24UTC; live node cutover remains pending. rc44 standard cp1 deployment completed01:26:59UTC; independent serialized status/doctor each report canonical_healthy=true, and measured installed source is e77df2f. Evidencecontroller-status-rc44.stdout, controller-doctor-rc44.stdout, controller-rc44-controller.json in the production directory; standard deploy log/tmp/sparkops-native-rc44-deploy.log. First supported dgx1 reenroll started after idle-runner verification; no success assumed before completion. rc44 first production cutover verified on dgx1 at01:31:30UTC2026-10-04: stable host/account/model state preserved, old SPIRE parent retired, new parent4e93c3f9 and installationd323be8f selected, action-clientf734dac2 runs from recorded work release, helper authorization revision3. Authenticated attach job939514b5 and subsequent standard upgrade job6b8e1d19 passed; exact runner UID/path/hash selectors and installed doctor passed before reactivation. dgx2 initially refused before effects because its original known-hosts pin3bbfc6b2 differs from the later four-host file27a328a4. Controller entries/auth and all six process start identities remained unchanged. Restored the exact original188 public bytes from the first two unchanged lines, SHA matching the immutable request, into a new root0600 input; no trust record or guard changed. Retrying supported reenrollment with preserved failed evidence. DGX3/4 and zyn supplied known-hosts files independently match their original pins. Evidence filenames verified-rc44-dgx1-dgx1.json, verified-runner-rc44-dgx1-dgx1.json, dgx2-pinned-known-hosts-restoration.json under the production directory. Remaining four-component fold plan is reviewed in 2026-10-04-sparkops-native-s3b-remaining-fold-plan.md; local source work authorized, installed cutover remains separate. dgx2 retry reached new installatione8271163/new agentadb6197a, then failed helper activation at01:49:57UTC. Actual provider events are admitted\u2192rollback_started\u2192drop_in_restored\u2192helper_inactive\u2192selected_state_removed\u2192provider_legacy\u2192rolled_back; no candidate_started or semantic health event. Exact original exception is discarded by the current product adapter, so a startup race is unproven. Partial observation partial-rc44-dgx2.json proves model container and accounts unchanged, SPIRE active, helper/node/work/router stopped; dgx2 router is unavailable. Failed attempt retains its original signed activation expiry02:48:55UTC. Supported resume may reuse this terminally rolled-back command before expiry; no state/authority/pin edits made to bypass it. Root pauses remaining hosts and prepares a passive installed observer and supported recovery. Follow-up routers on dgx1/3/4 now report HTTP503, zero placements and empty model catalog (router-outage-rc44-dgx2-*.json); running model containers alone do not prove availability. dgx2 node-heartbeat outage is the leading explanation for TP4 withdrawal, not yet independently proven. Confirmed source regression reproduces actual signed provider terminal rollback while controller still offers resume before expiry; source note 2026-10-04-sparkops-helper-activation-refusal-source-note.md, red log/tmp/s7-reenroll-completed-rollback-red.log. No speculative startup correction or authority bypass. 2026-10-04 02:32Z: reviewed completed-rollback correction f092000e cannot yet recover the old rc44 attempt through a newer release: existing cross-release guard refuses a fresh attachment under the prior release before marker observation. Same-release natural expiry at 02:48:55Z is being checked as the supported recovery path. Do not bypass the release/identity guard. Exact e77 same-release expiry path now has executable source proof: 2026-10-04-test-e77-expired-rollback-successor.py passed, unchanged prior plan/request retained and separately named retirement/successor selected only after expiry. One guarded live script recover-dgx2-rc44-expired.py is prepared for after 02:48:55Z; no early retry or altered clock. Recovery update 2026-10-04 UTC: rc45 source98d4f528 deployed on cp1 at02:54:21Z; release set eaa63dac52cc99e5b16b351a34ad2770368b76ed0687065960dffe4b5f737e2c reproduced on both pinned builders. Installed zynserver and dgx1 runner doctors report ready; zyn supervisor enabled/active, actual fleet CI resumed. PR384 all13checks passed in sole foreground watch exit0 (/tmp/sparkops-pr384-checks-watch.log); merge held for owner convergence order372first. Earlier same-release dgx2 successor7f4beccf-1de3-4a6a-87b6-2112fd6f054f failed activation02:50:39Z. Passive observer and actual installed read-only parser both identify duplicate inode0 rows from unrelated X11 sockets in /proc/net/unix. Reviewed source b3df670f excludes zero from descriptor identities; duplicate positive inode and zero helper-listener refusals remain,39tests55subtests pass. DeepSeek remains unavailable; no fleet recovery success claimed. The newer-release recovery guard also requires a durable correction:226focused tests now prove a separate terminal-rollback successor without rewriting the failed plan; independent review pending. Evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/. Recovery source8c5836b2 independently reviewed;230focused tests plus43terminal tests after review correction, all historical goldens preserved. ExistingPR384 fast-forwarded to this head for incident repair; its prior13greenchecks apply only to98d, new sole watch /tmp/sparkops-pr384-recovery-checks-watch.log pending. rc46 official two-builder build underway after x86 diskguard stopped initial attempt. Reviewed exact generated candidate-e77df2ff00a7/build-e77df2ff00a7 removed on x86, source and no-process-use checked, signed rc44 archive retained locally;8.46GB free. Detail 2026-10-04-sparkops-terminal-activation-recovery.md. rc46source8c5836b2 built/reproduced/signed successfully on botharchitectures; setc970a8c70c5a44067e2e00c1c92dc7701b179069f7dd9b059fbda15400efbf7b, ARMmanifest5a405fbacc436efc716dabeb767f2b84cfb69ebdcc241e1976f8832348060ce6, x86manifestca7f4ca5426779bba5dd5b15d12391a3cd0af2c7e2dbc26a49a90c0e54fc344b. Normalupgrade-fromrc45 gatepassed (attestedbytesunchanged). Standardcp1upgrade running. PR3848c CI12/13 passed; shard2\u2019s36failures were one test-mock lifetime leak, reproduced with2modules and fixed atlocalfad34c70 (89pass), tests-only, unpushed. Built8c productionfilesunchanged; nextproductionrelease mustcontainrepair. No recoveryclaimed yet. Standardrc46cp1upgrade completed03:35:38Z (doctor/status/runnerrefreshpassed), supported one-shot dgx2terminalrecovery nowrunning from exactretained024930operation. Evidence rc46-helper-recovery-controller-upgrade.log and rc46-dgx2-recovery-driver.log. LIVE RECOVERY PASSED03:38:34Z: rc46supportedreenroll plusstandarddgx2upgrade completed; newinstallationd801be5c-5e05-4ff1-80c3-0e2e1ab0eaac, node released6f11c2666b9, source8c5836b2, authorizationrev7. Authenticatedmemoryjobs57a79f7f4a66fc8ceeb88c2e and3d90c00c32c17aff081688f5passed. Independentproof verifiesnewparent/unchangedstableowner,NSS,modelcontainer, measuredactionclientf734dac2, oldandfailedparentregistrationsabsent. Installedfixedobserver SHA32df65ea11e362238414ee03bffb419be4cb8c11c695da18ebf4bc01693d2fa1 returned9healthy observations with noerrors. All4routershealth200/onehealthyplacement andDeepSeek1048576models; actualdgx3routerstream200,DONE,2contentchars,stop,0.306s at03:39:30Z. Authenticatedlifecycle read reportsDeepSeekready withfreshsemantic toolcallproof. One earlycapture503beforefreshroutepublicationpreserved. Evidence verified-rc46-dgx2-terminal-recovery-dgx2.json, router-after-rc46-dgx1..4.json, router-stream-after-rc46.json, installed-helper-observer-after-rc46.jsonl. Runnerinstalledbutdisabledasdesigned; doctor/enablepending. dgx3/4attestedcutoversandfourremainingclientfoldstillopen. dgx2installedrunnerdoctor all7checks andbothrepositoryproviders ready; enabled/startedcanonicalsupervisor afterbindingproof (runner-doctor-rc46-dgx2.json, runner-enabled-rc46-dgx2.log). FleetCIcapacityfullyrestored; actualRustworkflow remainsopen. PR384 local test-only follow-up fad34c700b98473c082cacc0b1fb6b8ca97e4d32 fixes a fixture-owned provider mock teardown leak: the two-module regression reproduced36 failures before the fix and passed89 tests afterward. It changes no production source from live rc46/8c5836b2. Root reviewed the narrow correction; publication waits for PR372 under the convergence order. Recovery PR384 integrated published head ba7d4e1f75b5b466d21c77cf98a8fc7311af43bf includes merged372 and test-only provider-mock repairfad34c70. Both vector-README additions preserved;223 focused integration tests, inventory/boundary checks and69 unchanged original JSON goldens pass. One foreground watch /tmp/sparkops-pr384-integrated-checks-watch.log is active. rc46/8c remains the measured deployed source; no new live action-tranche proof is inferred from this integration. PR384 exactba7d4e1f finished11/11 checks successfully in the sole foreground watch; exact-head snapshot /tmp/sparkops-pr384-integrated-ci-final.json. Final DeepSeek review raised a possible short-history indexing issue; root traced native fixed-order/hole-refusing journal validation, which makes the alleged activation-prepared short history unreachable. Independent final adjudication is finishing before merge; no merge claimed yet. PR384 merged2026-10-04 04:28:22Z: 529867d769b832faf72f1970972defb05ea23882; revert git revert -m 1 529867d769b832faf72f1970972defb05ea23882. Finalheadba7d4e1f passed11/11; final DeepSeek/Astra adjudication has no actionable finding (state/sparkops-pr384-final-review-9tq61vlw/adjudication.md). Root independently confirmed the native journal prevents the alleged short activation-prepared history. Main Security37177092675 and Secret37177092674 are under foreground watch; result pending. This merge preserves the recovery already measured live inrc46 and merged372 source; it is not a new deployment. WIP preservation 2026-10-04: remaining helper/runner/connector/signer fold is now committed and pushed as 9291274aeb8dcfb8686ce0eb021762b71581fca7 on agent/native-s3b-remaining-clients; clean tree, no PR or release readiness claimed. All 45 original Go files have counterparts (33 byte-identical, 12 changed), with 72 preserved outcomes and 18 explicit successors. Missing pin harness, builder/inventory/validator/workflow consumers, focused passing tests, reproduction and supported live identity cutover remain; see the branch checkpoint note. Original source/capture hashes were verified. Read-only integration preparation2026-10-04 saved in state/s3b-readonly-preparation-xzxn9zi5/: all72 preserved capture/source hashes verified; missing pin harness and stale closures/workflow filters enumerated. Generic-map lone-surrogate response handling is an unexecuted compatibility concern requiring original-producer regression before acceptance. Final combined release should use one supported reenrollment per affected host, because reenrollment already republishes granted runner identity. Source remains clean; no implementation or cutover claimed. Remaining-client preparation resumed locally: exactmainac014ba integrated at2b52ba06 preserving all59 current registry families plus the Stage3b family; clean checkpoint91798caa49945ab65f7d7ef6f17aa532230969e8 adds the missing immutable pin verifier/consumer enrollment and a55-input raw-response differential harness.28 focused checks, registry inventory/Ruff and correctly configured239/239 pin coverage pass. All original72captures/53producer-file hashes remain intact. Actual original/candidate Go trace refused its preflight at887,623,680B free before scratch/copy/compiler invocation; capacity recovery is being prepared, so surrogate/numeric compatibility remains unmeasured. No wire implementation change, push/CI or live identity cutover in this continuation. Executed raw55compatibility trace: originale77df2ff/candidate91798caa usedidentical pinnedGo1.27.1 harness andunchangedtrackedsource;24observationsidentical,31different. Four lone-surrogate composedresponse widenings andfournumeric narrowings are real; synthetic typed-struct post-processing errors are separatelyclassified. Originalreport49f4dd38ff460de6f12440da36ef6db42b368fdace561ceb587ecbfb3153418d remainsfrozen; adjudication state/s3b-raw-trace-retry-xo9z2w23/adjudication.md. Wire/decoder/golden outcomes remainunchanged pendingexplicit boundarydisposition; independentbuild/packagingclosurework resumes locally againstStage8b2. Completedtracescratch retiredbyrootafterfullunique-bytepreservation, exactidentity/no-referencechecks; x86free9,389,723,648B/off beforefinalStage8build. Noattestedclientcutover. Raw-response scope adjudication: root plus independent Astra read-only review found the minimal repair already authorized by Stage2 match-Python-or-refuse and approved3b case-by-case new refusals. Keep conservative numeric intersection and document four new refusals; restore map lone-surrogate refusal without changing shared canonical semantics; compose additive Unicode/response evidence from preserved originals. state/s3b-wire-decision-yd7fuu_t/scope-adjudication-20261004.md. This is an implementation disposition, not a new owner decision or a passed wire gate. Packaging checkpoint8df77bbb passes465Python checks plus64subtests; root independently verifies224shared module files and exact230controller/230runner/232helper closures. Native execution/finalCI/cutover remain pending. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. #366 merge 9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871 is already in main. Remaining four-client fold is clean and pushed as agent/native-s3b-remaining-clients@b7fb3a1ada3cb17febc95dd24073075e41d8d066 (current83ad integrated; final docs only after tested670). Native155 top-level+316 subtests, permanent41-case consumer, vet/gofmt and final long-GOTMPDIR old-red/new-green3/3 passed; four isolated interop drivers explicitly skipped. Root/independent source reviews recorded. Next: recheck head/base, review prepared state/s3b-pr-preparation-azvev3ht/body.md, obtain remaining cross-review, open labelled PR, watch exact PR/main CI, then reproduce both architectures, rehearse exact-artifact identity forward/rollback, and perform the supported combined attested cutover. X86 free2.69GB blocks full release until reviewed capacity recovery. dgx3/4 normal node upgrades still refuse changed attested action-client bytes; do not bypass. Actual heartbeat/work/affected CI lanes and signer/connector proof remain owed. #333\u2013#339 freshly confirmed open; close only after live gate. Historical native-s3b-transport-fold@72cb91cd is fully merged. No new PR/release/cutover started at handover. See successor handoff for exact commands, branch dispositions and live release digests. Takeover 2026-10-04 (Claude Opus 5.5): fresh readback at 16:36Z matched the handoff exactly (state/native-takeover-VEMDbjIG/final-health/). #390 opened from b7fb3a1a with spire-acceptance; first CI failed the fleet Go lane (moved connector/signer socket fixtures exceeded sockaddr_un under the lane&amp;#39;s hermetic HOME) and Gitleaks (three filename digests in the fold provenance). GPT-6 Astra xhigh cross-review found one real widening: the typed runner request decoder kept number literals, so local requests admitted 1.0, -0.0, 1e-07 and 2^53+1; plus under-documented helper/signer refusals. Fix cc75927f applies the legacy numeric intersection to request bodies (json.Number too), gives the connector/signer fixtures a private spc-* custody root via their existing SPARKOPS_CUSTODY_TEST_ROOT, adds an exact filename+digest Gitleaks exception, a signer GET/GET duplicate test and docs; pinned Go1.27.1 ARM64 connector old-red/new-green, runner/connector/signer/vet/gofmt, 70 focused Python tests and assurance verify passed; Astra re-review: no actionable findings. All 16 PR checks passed in one foreground watch at cc75927f, including the four isolated composition drivers in their acceptance lanes. Merged 17:04:26Z as 6ffb395c922aa23239695b13236b9ee459e5b81b; revert git revert -m 1 6ffb395c922aa23239695b13236b9ee459e5b81b. All 8 exact-main runs (Security Gate, Secret Scan, Rust build, connector/signer/runner acceptance, seam convergence, dependency graph) passed. Deployment scope (state/native-takeover-VEMDbjIG/s3b-deployment-scope.md): no connector unit/container on any host, so no live connector cutover; signer helper rides the cp1 control-plane upgrade; helper+runner client change on dgx1-4 and zynserver; dgx3/4 also still need the #366 action-client transition. Blocked on builder capacity: x86 builder 2.69 GB and ARM builder 5.41 GB free versus the 8 GB release guard; both hold ~100/61 old sparkops/cp release image sets. Literal retirement plan keeping 0.1.17-rc.46..51 (state/s3b-x86-capacity-ng7g8fXJ/retire-plan.json) was denied by the auto-mode classifier and awaits owner approval; nothing removed, both builders shut off. Disk growth 2026-10-04 (owner: grow VM disks 3\u20134x, no TrueNAS zvol change): x86 builder qcow2 64\u2192256 GiB, guest / now 202.4 GB free (24% used), zynserver keeps \u226536% free worst case; ARM builder unchanged (dgx1 / only 16.1% free) and the 3x resize was denied by the auto-mode classifier (&amp;quot;Interfere With Workloads&amp;quot;, dgx1 serves DeepSeek), so ARM still has 5.4 GB and every release remains blocked. Evidence state/builder-disk-double-gBLMQd/. Owner then approved ARM 3x: qcow2 64\u2192192 GiB, guest / 138.5 GB free (31%), dgx1 worst case ~175 GB free. Builder capacity is no longer a blocker. Both builders shut off. Next: build rc.52 candidates from main 1705f7eb (helper state/native-takeover-VEMDbjIG/build-cutover-candidates.sh, build+sign without assembly), lab-rehearse A=rc.51 83ad466b \u2192 B on fresh x86 lab guests (harness template state/sparkops-native-s3b-current-rehearsal-20261003/plan/, procedure reviews/2026-10-03-sparkops-native-s3b-current-node-rehearsal.md, readiness steps 4\u20137), then cutover plan + assembly, cp1 upgrade, per-host reenroll. rc.52 (2026-10-04): official candidates from 1705f7eb signed on both builders (x86 16c9e956\u2026, ARM 14b4facd\u2026), unassembled pending the cutover plan; changed attested set vs rc.51 = heartbeat_helper + runner_client. Lab rehearsal state/sparkops-native-s3b-cutover-rehearsal-20261004/ (fresh -06 x86 pair): lab A/B attested bytes equal production rc.51 pins and the official rc.52 candidate; baseline A job, ordinary-upgrade refusal (no effects) and forward reenroll onto B with stable identities and a fresh authenticated job passed; repeat reenroll converged and the cold cycle passed, but the return leg found a release defect: upgrade control-plane --rollback refused &amp;quot;immutable installer cache drifted&amp;quot; (since 325d1366 the installed release rendered the rollback target with its own sealed cache). Fixed by #393, merged 38fa5ba73c5fb842dd79804e6a1d04ffd07e431f; rc.52 abandoned unpublished, -06 pair retired. rc.53 (2026-10-04): official candidates from 38fa5ba7; full rehearsal repeated on a fresh -07 pair (state/sparkops-native-s3b-cutover-rehearsal-20261004b/) and passed end to end, including the controller rollback rc.53\u2192rc.51 (report sha e378b274\u2026, 190 evidence files; pair retired). Cutover plan pin 5c14eabd\u2026 (changed: heartbeat_helper + runner_client on both platforms); release set release-set-38fa5ba73c5f-v0117rc53 sha 89e97db7\u2026 assembled through the cutover gate. cp1 on rc.53 since 2026-10-05 00:36Z (doctor healthy; read-back of dgx1\u20134 node services, five runner doctors, heartbeats and DeepSeek readiness passed). Per-host cutover 2026-10-05: fleet reenroll dgx1 00:40Z, dgx2 01:21Z (recorded known-hosts native-rc44-dgx2-pinned-lo58oegh/known-hosts), dgx3 01:59Z, dgx4 02:38Z, zynserver 03:03Z (native-rust-known-hosts); each: memory diagnostic over SPIRE, helper/runner client equal the cutover plan (ARM 941735b4/e494afd8, x86 065356f0/d15c4b88), work client f734dac2/cb1a9232 (dgx3/dgx4/zynserver completed the #366 move), spire-agent unchanged, DeepSeek TP4 untouched, router healthy, and a CI job on the new runner client (security-gate reruns of run 37243905936; zynserver native Rust run 37230688271). capabilities adopt --check: no blockers, +44 reported capabilities per host (pre-existing frozen-capability drift); owner approved and it was applied 2026-10-05 ~06:10Z: dgx1\u20134 record 54, zynserver 47 (7 admission-controlled refused), recheck shows nothing left to add. #333\u2013#339 closed. Findings: (1) reenroll leaves the new runner unit stopped and disabled (console Start needed; disabled at boot on all five hosts); (2) zynserver&amp;#39;s runner replacement emptied the native-rust private engine \u2014 image rebuilt+rescanned (d7828864\u2026); (3) console runner Inspect shows nothing and nothing marks a stopped runner. Installer part (per the ADR 0047 hold, goes into the Stage 7 Go installer, not Python): fleet reenroll must carry the retired runner unit&amp;#39;s recorded active/enabled state (05-node-retire.done.json units) to the new install \u2014 enable at install, queue ci.github_actions.runner_start via the controller-local admin session after refresh_runner_authority \u2014 and keep the approved native-rust image across the node retirement (save/load the approval&amp;#39;s exact image ID instead of archiving /var/lib/sparkops/native-rust-docker; dockerd sets that root to 0710 vs rendered 0700). Product PR #394 (merged 8dfc6a78): private-engine images; runners page shows state and a real details view; shipped as rc.54 (release set 60d10012\u2026, ordinary assembly from rc.53), owner deployed cp1 2026-10-05 07:22Z, doctor all five gates true, heartbeats healthy, DeepSeek ready dgx1\u20134 (state/native-takeover-VEMDbjIG/readback-rc54/). Deploys were run by the owner (classifier blocks the agent). Runner replacement cannot be rehearsed on x86 lab (release runner policy is ARM64-only except hostname zynserver); production runner --replace goes one host first with a CI job proof. #333\u2013#339 remain open until the live gate.\n\n\n4 One broker contract\ndone 2026-10-03\n#353, #356, #358, #359\nOwner-approved design: reviews/2026-10-02-sparkops-native-s4-broker-contract-design.md; five scope decisions recorded 2026-10-03: retain the 56-action catalog and shadow classifier, delete v1 request/verifier/recovery/journal and its process harness, retain all v2 labs, freeze every deferred helper site in four PRs, and add an exact current root closure while preserving historical ones. Started from bb153c4 (52 commits after 01e0e849); the plan&amp;#39;s 54-action and v1-only-lab assumptions were corrected before code. Deletion/exit: only the core v2 execution-context request/admission remains. V1 request/admission symbols, verifier/recovery, privileged_broker_journal.py, v1 process/journal tests and unused v1 resource-context helpers are gone. Security surface map/docs updated; catalog and CLI shadow adapter pass. The separate fixed-operation helper protocol remains and is frozen. Vectors: 15 new files across request, policy, resources, effect fence, receipt, trust and helper families. Zero deferred or unclassified entries; inventory clean. Runtime coverage 250/250 (216 vector-pinned, 34 named-test; 3 exercised elsewhere). Stage 4 changed no pre-existing golden case. Final helper family has 176 unique cases/177 tests, including 24 closure refusals, six document kinds, observed response/drop-in, stable authority digest, real admission/start/success/failure/indeterminate event chains and server refusal bytes. Receipt vectors include approval-limited validity; isolated mutations dropping approval digest/expiry, ignoring observation request ID, including observation time in stable authority or breaking journal links fail. Both independent review axes clear (2026-10-03-sparkops-pr353-review.md, 2026-10-03-sparkops-pr358-review.md, 2026-10-03-sparkops-pr359-review.md). Final local: 1662/1778/1535/2201 tests in the four shards, plus CLI 19/72/44/10; 177 focused final helper vector tests; tools 677 passed + 20 subtests; Ruff, inventory, pin coverage, secret scan, boundary and v1-definition audit pass. Merges and main proof: #353=813a4220204ea99180eae5ecf593c05d0eda75e3 (Security 37117037065,Secret 37117037062,runner 37117037063,seam 37117037068 green); #356=dde1d56c20636e9a6688640a7ad9cbd0740f7a8c (Security 37119502908,Secret 37119502902 green); #358=ca21297ed0de0ebfe88f12bf9fe6313fb96b4fdf (Security 37120629375,Secret 37120629344 green); #359=25dd44601753d692109250f16b3faa0527a6595b (Security 37121648652,Secret 37121648704 green). Every PR&amp;#39;s final checks passed before merge, and every main workflow was watched in the foreground; final PR Security 37120941249,Secret 37120941291,canary37120941253 all green at 811e64b. Revert a PR with git revert -m 1 &amp;lt;its merge SHA&amp;gt;. Evidence roots /tmp/sparkops-s4-review-y0plQBOI, /tmp/sparkops-s4-policy-4Bw71FYq, /tmp/sparkops-s4-receipts-AxiXebsv, /tmp/sparkops-s4-helper-Bn9bJKSs. Earlier incomplete/cancelled runs are not counted as passes; review corrections and synthetic-key false positives were resolved before final checks. Remains for this stage: nothing. Broker activation remains outside this migration stage; Stage 5 starts only after its design/lab gates. DeepSeek review closed 2026-10-03: all four PRs reviewed; exact-base #353 rerun; Astra source adjudication and 487 focused tests passed. 2026-10-03-sparkops-stage4-deepseek-adjudication.md records each finding/disposition; no golden changed. Work-deadline-minimum coverage handed to Stage 5 before receipt retirement.\n\n\n5 Rust broker\ndone 2026-10-04; dormant Rust broker and real Rust CI lifecycle proved\ndesign, VM procedure\nStanding owner authorization above supersedes prior VM-pending wording. Astra xhigh implementation in worktrees/sparkops/native-s5-rust-broker: Rust workspace, typed request/admission, Ed25519 verification, descriptor-relative stores and append/fsync journal under test. Rust 1.90.0 verified and installed only in task-owned /tmp/sparkops-native-s5-JHR6fz5G/toolchain on zynserver; two musl targets. No production enforcement enabled. Laterdeterministicjournaltestexposed same-lengthbyteedits survivingmetadata-onlycheckswithinonefilesystemtick; tracerfix ce426d7 retains/comparesboundedvalidatedbytes beforeoperations. Native23groups+compilefail/Clippy pass; finalartifactreproductionandfreshVMrepetitionrequired. Earlier6aVMpassdoesnotprovefixedbytes. Approved isolated zynserver VM UUID dade8a5b-c248-472e-adef-ed33df881718 completed 19 adversarial cases using reproduced amd64 binary; exact-UUID shutdown and retirement removed the guest and instance files. First VM fully retired after natural lease expiry; final receipt cfcb05d776a20a9f449293ab91af71e3ff32aae02340c81517073bd0eeed958e in /tmp/sparkops-native-s5-vm-f46da3c/retirement-final.json. First tracer local f46da3c passes 353 Python tests +57 subtests, 21 Rust groups/Clippy and 238 generated differential cases. Independent review found malformed Unicode hex and sliding socket deadlines; both fixed with composed signed admission, real peer-credential IPC/restart/replay/conflict coverage and separate new internal journal vectors. Complete vendoring validated after restoring 17 upstream checksum-bound public test PEMs; all 46 dependencies have zero OSV advisories at the recorded audit. Source/vendor/toolchain integrity now checked before and after Cargo. Committed f46da3c static binaries reproduced twice: amd64 dc0b00f4704ec2eec26e9c3f2f2fe111ffe576238cdaa563dbf3a5726aee61ef, arm64 1663ed95483a0f81a82d7c61dc1e303c33f838b30b67a80735fab10e750d1cec; final reviewed head 6a2f6af reproduced twice per architecture: amd64 c268213129e4d9b9db0055a71cc47f6bc8da1be0a209c5aaada1c76a18377e72, arm64 bac3d82b971502a6e477e4959ca856bbe2c839fe3cd29b4bc1bf62a251cd170c (/tmp/sparkops-native-s5-build-6a2f6af). New VM UUID 6c286b47-61cc-48a0-8332-e6745b2638b5 passed all19 cases against final6a2f6af amd64binary, evidence /tmp/sparkops-native-s5-vm-6a2f6af; domain/files/ports removed with no remaining broker processes or mounts. VM2 retirement is now complete: final receipt 7c0f059ca4f81b177fd014e148ad1f178c9a86c3031b57a7a864b21c6be05007. VM3 cb01633 lease receipt remains pending until20:26:13UTC. Review 2026-10-03-sparkops-pr363-review.md. Tracer #363 merged at 0dc50100d87d5e9682e1d8c2adcba63e5c3eedcf (20:03:09 UTC), final head2161b6f passed all11checks with no review threads. Final-source reproduction is byte-identical to the20-case VM artifacts. Main Secret37150128356 and Security37150128397 both passed in root foreground watches. VM proof /tmp/sparkops-native-s5-vm-f46da3c; first run correctly refused incomplete vendor closure and is not a pass. Final tracer cb01633 reproduced twice per architecture and passed 20/20 cases in fresh isolated VM e02506bc-6d5a-40f0-820e-7b9bab5a82a8, including the equal-timestamp journal edit refusal; evidence /tmp/sparkops-native-s5-build-cb01633 and /tmp/sparkops-native-s5-vm-cb01633. Final CI and exact retirement receipts remain. Widening checkpoint e8e34cd has 34 native tests, two compile-fail checks and 303 generated admission comparisons. Full widening and Python deletion remain. Fleet CI still lacks a confined zynserver build channel; internet-only one-job isolation is not weakened. Concrete x86 one-job design in 2026-10-03-sparkops-native-rust-ci-lane-design.md; Owner explicitly approved the narrow CI-container Cargo exception on 2026-10-03. Root PR #370, head cad4edc, adds the exact zynserver profile, a canonical dedicated engine and the shared pinned build entry; all13 current PR checks passed and it merged as 38a222fb0d50a9ad6a619aaa870a182417a1060e at20:32:55UTC. Main Security37151937928, Secret37151937929, Runner37151937954 and seam37151937930 all passed in root foreground watches (/tmp/sparkops-pr370-main-watch-results.json). Official rc39 reproduced on both native builders, set pin 328138b3669c8a92052b0d91fe3caf6fb728562ea2fd0214859bc136503fa481, and the standard cp1 upgrade completed at20:53UTC. Independent status and doctor both report canonical_healthy=true with all five health gates true. Standard dgx1\u2013dgx4 upgrade exited0, each authenticated diagnostic passed (jobs b1111e0e/117ba34e/064e93d6/0365d950). Root independently measured the unchanged Go binary and source38a222f bindings, active node/work/router/SPIRE services and healthy DeepSeek discovery on all four (/tmp/sparkops-native-rc39-live-ngf001xl). The authorized cp1-to-zynserver SSH channel is pinned and verified; only the existing public key crossed hosts (/tmp/sparkops-native-rust-ssh-5b2t_pon/preparation.json). The exact hardened zynserver admission is host_spire_0677dead8099a0c01091d3d4 with only runner controls and memory diagnostic; creation token was revoked. Canonical attachment is underway, evidence state/sparkops-native-rust-ci-20261003/. Independent review reproduced and closed the engine-stop retirement recovery defect. Local evidence: 265 focused tests +129 subtests, 531 installer tests, four Python shards and CLI suites, with the sole concurrent-edit source check rerun clean; Tools/clean-source/recovery suite 816 +32 subtests. Actual image scan, enrolled runner and Rust PR/main execution remain required. Root diagnosed reduced CI capacity: DGX1/3/4 had exact pending JIT registrations (DGX3 since September30; DGX1/4 during rc40 upgrade). Installed provider status was ready on allhosts, but pending rows intentionally fenced new claims. No matching GitHub runners or job containers existed. The documented installed-authority reconcile-registration command cleared only those three exact records; all reported github_runner_removed=false. Independent observation then found one real job container on each DGX (/tmp/sparkops-native-runner-reconciliation-20261003.json, /tmp/sparkops-native-runners-after-reconciliation.json). No trust rule or database row was hand-edited. Interactive Rust remains one SSH command; no job host credential or private-network exception is permitted. Widening/deletion PR #369, final head 8438c24, passed all11 current checks in root foreground watch and merged at20:56:33UTC as fadaeb21d124d0a9177163defa18bc39fb56121f; no unresolved review threads. Revert git revert -m 1 fadaeb21d124d0a9177163defa18bc39fb56121f. It deletes8753 replaced Python lines; shared SPIRE helper evidence and production helper stay. Final36 native tests, two compile-fail groups, fmt/clippy, and two static builds per architecture pass; exact binaries match the31/31-case final VM proof. Main Secret37153336975 and Security37153336976 both passed in root foreground watches (/tmp/sparkops-pr369-main-watch-results.json). VM4 and5 are now fully retired (receipts82315d9f and d143d78f); all six Stage5 guests are now fully canonically retired. VM6 final receipt SHA2567f7fa211653a259d57c8ead2054abbcd83f9634f02bd88a74cd773382c26b505 confirms its exact UUID15b38dd1-1677-40fe-9d5a-3b33868f1862 has absent domain/files/leases/ports/processes; /tmp/sparkops-native-s5-vm-85dcc7f/retirement-final.json and /tmp/sparkops-native-s5-retirements.json preserve allsix final results. Rust workflow draft #374 is queued for the native lane. zynserver canonical attach exposed a verifier defect: actual authenticated native diagnostic job54cbdf4e succeeded, but kernel FQDN zynserver.sayhi.internal differs from its admitted short name. Root narrow fix #375, head2face96, preserves signed result bytes and exact identity checks; two original failing real-queue regressions now pass,81 focused tests+8subtests and532 installer tests pass. No old golden changed. #375 final2face96 passed all10 checks in root foreground watch and merged21:28:58UTC as f13d9866b427cf2a59e44669da94b4d57daf5ffa; revert git revert -m 1 f13d9866b427cf2a59e44669da94b4d57daf5ffa. Main Secret37155253937 and Security37155253944 both passed in root foreground watches; /tmp/sparkops-pr375-main-watch-results.json records completed conclusions. Standard rc40f13d986 two-native-builder build, signing and upgrade compatibility gate passed; release-set pin13ad2e1439f2362b4c2c285540613959d571aeacaafe401a6410403beaf25256, ARM manifest2ae6359c1c7df465c0bbe0f7951bc9cc5d54eed11958336523888506fe2ab71c, x86manifest a0b9c26ed3342c57af8a37c9f6eeb6abb0cee5fd5b089ac10cdfe5650e5beef8. Result state/spire-fleet-enrollment-20260920/release-set-f13d9866b427-v0117rc40-result.json. Standard cp1 upgrade completed21:49:51UTC; independent status confirms0.1.17-rc.40 and independent doctor reports canonical_healthy=true/allfive health gates true. Evidence /tmp/sparkops-native-rc40-cp1-status.json, /tmp/sparkops-native-rc40-cp1-doctor-retry.json, /tmp/sparkops-native-rc40-deploy.log. The first concurrent doctor correctly refused the held identity lock; serial retry passed, with original stderr retained. Supported zynserver reenroll now runs with its original identityfile/knownhosts (/tmp/sparkops-native-rust-reenroll-rc40.log). All four DGX upgrades exited 0 with fresh authenticated jobs 69031322/188e68a4/2bff704f/b3311e5d. Independent process executable hashes, f13d986 source bindings, active node/work/router/SPIRE units, healthy placement and DeepSeek 1048576-token model discovery passed on every node (/tmp/sparkops-native-rc40-live-30ldcd_8). Canonical zynserver reenrollment completed with authenticated FQDN job job_20d571764fe972599abfd0f7 and current runner authority bindings. The runner remains disabled. Starting its new private Docker engine exposed a defect: Docker 29.8.1 auto-selected the host containerd socket and listed four unrelated cached images. No build/job ran; root stopped only the new engine, preserved shared containerd/default-Docker state and verified both lab guests remained reachable. Source fix #379, head f8f7427, adds an explicit separate containerd service/configuration/socket and canonical retirement before enabling CI. Root/Astra independent review found no confirmed defect; 533 installer tests, 125 integration tests, 83 focused tests+48subtests passed. Actual host config parse, systemd validation and file-access trace passed, proving no shared containerd config read. CI and installed runtime proof remain pending. Evidence /tmp/sparkops-native-rust-engine-containerd-inspection.txt, /tmp/sparkops-native-rust-engine-stopped.json. Recovery requires a standard newer release and supported re-enrollment, preserving prior records but creating a successor node/parent identity. No runner was enabled; CI image/enrollment/execution remain open. Independent post-refusal cp1 doctor still reports canonical_healthy=true with all five gates true, and explicitly warns that zynserver is runner-admitted but not yet bound; /tmp/sparkops-native-rust-partial-cp1-doctor.json. PR379 passed all12 checks in root foreground watch atb74f4ca, no review threads, and merged22:38:19UTC as31ea17f86ac7be614ff568dc8bf49d20ea6e92dd. Revert git revert -m 1 31ea17f86ac7be614ff568dc8bf49d20ea6e92dd. All three main runs passed in root foreground watches: Security37159117417, Secret37159117438 and Runner37159117432 (/tmp/sparkops-pr379-main-watch-results.json); official rc41 build uses both native builders. Installed private-runtime verification and actual Rust PR/main/cancel/timeout jobs remain open. Official rc41 source31ea17f reproduced and signed on both native builders; ordinary upgrade compatibility passed. Release set4327727b4ab87bf399021e7b36243ec2db749008c57822759da7d9724f7f8343, ARMmanifest2f41c5ce6b9968ebe996c6664cfde76639e74373712626a0652152c65ef5e573, x86manifestc6da8305c9a911795f8b02e7f32320e741ea77c389622c0e9f2c6f61acd5bc91. Standardcp1 upgrade completed22:56:20UTC with canonicalhealth; four-node upgrade underway (/tmp/sparkops-native-rc41-fleet-upgrade.log). A concurrent status read was correctly refused by the upgrade identity lock; serial independent post-upgrade status/doctor remain pending. rc41 live follow-up, 23:10 UTC: serialized cp1 status and doctor are canonical healthy; all five health entries pass. Supported zyn fleet runners attach --replace installed the new31ea private-runtime files, then refused recorded runner attachment differs: the client registration is unchanged but the supervisor measurement changed. Runner remains disabled. Root is preparing a durable same-registration record-retention/retry fix on agent/native-s5-runner-record-recovery. Private Docker/containerd start succeeds with distinct sockets/PIDs/data and zero pre-existing images/containers; default Docker stays stopped. Canonical trusted-image build exposed a second source defect (network bridge not found with private engine bridge disabled); no CI job was enabled. Logs /tmp/sparkops-native-rust-runner-replace-rc41.log, /tmp/sparkops-native-rust-private-runtime-first-start.log, /tmp/sparkops-native-rust-private-image-build.log. #380 merged23:21:50UTC as25daac9abf666aaa17d710d2f02eb244d143d8d5; revertgit revert -m 1 25daac9abf666aaa17d710d2f02eb244d143d8d5. Same-registration attachment recovery plus fixed native supply-image build networking; no golden/service/job-network changes. Independent Astra standards/spec review found no actionable issues. 151focused+50subtests,533installer,773tools+20subtests and all local Python shards passed. Foreground PR watch exited0:12 current successful checks, one superseded canceled same-head acceptance retained. Main watches and standardrc42 build running. Corrected exact build argv succeeded on zyn; image scan running, supervisor still disabled. Review2026-10-03-sparkops-pr380-review.md. #380 main Runner37161536232, Secret37161536210 and Security37161536203 all passed foreground watches (/tmp/sparkops-pr380-main-watch-results.json). Native image first build succeeded, but canonical scan refused leftover upstream Alpine Node20.20.2/24.18.0; a confined non-root smoke also found rootfs/0700 while descendants0755. S5 agent is fixing only the native image (remove unused Alpine runtimes, publish traversable container root); no job enabled and no scanner bypass. rc41 main CI live job inventory independently confirms successful jobs on dgx1,dgx2,dgx3,dgx4 (/tmp/sparkops-native-rc41-main-runner-job-proof.jsonl). rc42 standard deployment completed23:41:28UTC from25daac9; set e76ac9573c3950c2fbc5f77ca222f70f14b7fe4647c9a451b7efa05e4681f82f. Canonical native image probe under Docker0077/containerd0022 passed nonroot build/run and canonical scan; image SHA1a395d54345c0a243be33228115b44410c9d1d54e47145b94e567e9e39c3f4ee. PR381 preserves all historical vectors and adds containerd-only0022 successor; installed runner replacement/lane proof still pending. #381 merged23:56:21UTC as112d8d98db1eecfec8d68823e3fd8db0399333f9; revertgit revert -m 1 112d8d98db1eecfec8d68823e3fd8db0399333f9. All12 final-head checks green, root28tests+47subtests and golden-member comparison passed. Source removes unused Alpine Node runtimes, adds actual nonroot image build guard and changes only private containerd UMask0022. Root review2026-10-03-sparkops-pr381-review.md; actual full candidate image/scanner proof retained. Main Runner37163344597/Security37163344520/Secret37163344535 watches running; installed replacement and Rust lane still pending. #381 main Runner37163344597,Security37163344520,Secret37163344535 all passed foreground (/tmp/sparkops-pr381-main-watch-results.json). rc44 supported runner-only replacement on zynserver completed01:58:54UTC using installed e77 files, preserving exact node identity/release/helper selection/all five running PID-start identities. Installed containerd UMask0022 and Docker0077 run on distinct private sockets; defaultDocker stays inactive and hostcontainerdPID1639 unchanged. Canonical installed image build passed; scanner then refused public-network timeout. Exact archived old private networkDB SHAa0bed4d755be25680e8c8b3364c1210773368036ec22fcc7afbff85d713be57f proved orphan bridgebr-d887108ce16b ownership. Both old/new bridges routed172.30.250.0/28; kernel selectedold. Reviewed literal cleanup proved oldbridgeempty, engineidle, root-custodied retirementrecord/currentnetwork distinct, removed onlyoldbridge and its exact staleMASQUERADE rule, and verified allfilterrules unchanged/route selectsnewbridgebr-6326019ebd7d. Canonical scan retry is running; durable retirement cleanup is being fixed separately. Evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/runner-replace-rc44-zyn.log, runner-image-build-rc44-zyn.log, retired-rust-bridge-cleanup.log. Docker itself sets private data rootroot:root0710 at startup (no other access); original0700 observation assumption corrected, no chmod or policy widening. Actual Rust CI remains open. 2026-10-04 02:30Z live recovery finding: canonical zyn runner image 2701389fcb6c9dd899d4fb2d306ad69c2dc76b4d73ef158dfa537169918ac855 scan passed after exact retired bridge cleanup. Runner provider requests then failed on zyn and dgx1. A bounded socket trace proved requests reach runner authority; read-only installed-code validation of its observation DB proved five hosts violate the obsolete four-host projection ceiling (authority admits 64). No database edits. Capacity correction 98d4f528 shares the existing 64-host bound, preserving record/custody/64KiB gates; 86 focused tests +7 subtests pass, including real service/SQLite/publication for five hosts and repeat dgx1. Reviewed recovery release is being prepared before fleet CI can run; no green merge claimed. Recovery PR #384, exact head 98d4f528359c548d7a44fdbf48f9679119c7ed90, spire-acceptance; one foreground watch /tmp/sparkops-pr384-checks-watch.log (installer/docs pass, fleet checks queued behind outage). Independent review 2026-10-04-sparkops-recovery-independent-review.md found no issue. rc45 is capacity-only; rollback correction stays a separate local checkpoint. Initial build refused x86 &amp;lt;8GB free; reviewed literal cleanup removed archived rc43 generated candidate-9bcab813f4e0 and interrupted-candidate-9bcab813f4e0-001657, retaining release archive/current rc44. Retry runs both pinned builders; controller activation intentionally follows same-rc44 dgx2 recovery. Current recovery outcome: rc45 capacity fix (exactsource98d4f528) deployed02:54:21Z; installed zyn/dgx1doctors allready, zynsupervisor enabled/active and actualfleetCIrestored. Initial384head98d all13checks passed; PR384 nowextends to8c5836b2 for separately reviewed dgx2terminalactivation repair and has a new watch, so priorgreen is not finalhead proof. Rustworkflow374 remains unpublished local0d31771b pending372-first convergence; no CargoCI execution claimed. Native networkretirement sourcef8665126 is reviewed/held,73tests16subtests passed, actualnewcleanupgate outstanding. S5implementation parked; readonlyreviews of372and8c are clear. ExistingPR374 is now local950f2abcf52144d64196dfad46526a03084cd03d, integrating merged372/384; its diff remains the130-line native Rust workflow and four operator-doc lines. Workflow bytes unchanged from reviewedfabf16c8. Final DeepSeek/Astra review has no actionable finding; five model allegations were source-adjudicated in state/sparkops-native-rust-ci-20261003/pr374-fabf16c8-review/adjudication.md. Fresh installed zynserver doctor passed all7 checks, providerready and supervisoractive at e77 runner source; evidence state/sparkops-native-rust-ci-20261003/acceptance-gz2pfqgt/doctor-before-pr374.json. Actual PR/main Cargo and success/cancel/timeout cleanup remain pending; PR publication follows384 main green. 2026-10-04 04:41Z actual PR374 head950f2abc run37177712285 job111363720357 FAILED before Cargo: CapEff0/NoNewPrivs1 and checkout boundary passed; TCP10.10.10.20:22 refused but zyn host-local10.10.10.10:22 connected. Host read confirms six DOCKER-USER private rejects but no runner INPUT guard; doctor readiness was insufficient. Evidence /home/meanaverage/sayhi/state/sparkops-native-rust-ci-20261003/pr374-host-input-failure-n8v7_24b; exact workflow refusal stays unchanged. Native bridge-scoped INPUT/doctor correction in existing374 underway; no isolation/build/cleanup pass claimed. Existing374 final localce12feee integrates native INPUT fixfd7b71d9, reviewednetworkretirementf866 as93b330e2, exactrulecleanup0b78fe9c, inactiveorphanrefusal46d80281 and validbasefixturece12. Root+independentAstra review clear; runner60+52subtests and retirement81+19subtests pass; final5fencecases pass. No golden/policy/grant/unit edits. Standard rc47 cut-and-upgrade started from this reviewed source while native lane remains safelyheld; evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/rc47-rust-isolation-cut.log. Live boundary/Cargo/cleanup remain pending. Reviewedce12 folded merged383 cleanly ascfb90631; runtime/retirement/workflowbytesunchanged and novectordelta; postmerge93tests+19subtests pass. Publishedcfb90631, Rust run37179357178 queuedunderheldlane; solePRwatch64975. rc47 initialbuilddiskrefusal clearedbyverifiedarchived-outputretirement state/rc47-reviewed-builder-retirement-7_gcrx8v; standardretryrunning (rc47-rust-isolation-cut-retry1.log). 2026-10-04 05:36Z continuation: #374 head3cb0d2d6 fixes the two broader-CI failures (strict-reader inventory entries and an engine-state test adapter); 126focused tests+19subtests pass, and entered_sites proves both new registry entries through their declared retirement test module. No production or frozen-case bytes changed from reviewedce12. Supersededcfb CI remains recorded failed; one foreground watch now follows3cb. rc47 is built/signed (set3155610a28c1caa33d27e4ecabbbe901e991557fe7e307adbd1803917ab85050), shipped and in standard control-plane preflight. Shipment initially refused disk pressure; only /root/sets/e77df2ff00a7 was removed after signed-archive/hash, process and service-reference checks, with unchanged installed identity and free space5.56\u21928.01GB (state/rc47-staging-retirement-4hyfmsyp). Installed release pruning was inspected only, not applied. Native Rust supervisor remains held until canonical replacement, fresh image scan and actual CI isolation/cleanup proof. 05:42Z retention result; exact3cb CI now12green checks with native Rust queued; narrow independent review clear. rc47 upgrade dry-run also refused5.0GiB&amp;lt;5.3GiB before mutation. Supported sparkops-installer releases prune then succeeded after independent retention review and live process/mount audit: keepsrc45/rc46, all historical attachment records, remote node installations and locally retained signedrc42/44/45/46 sets. Evidence state/rc47-cp1-prune-dojahvsv; free5.33\u219280.64GB; no conflicting running process or mount among5containers. Standardrc47 retry3 now running. 2026-10-04 05:48Z: standard rc47 upgrade completed on cp1; independent doctor/status command exits0 and both emitted health frames all true (cp1-rc47-verified.json). Post-upgrade dgx1\u2013dgx4 captures show all six relevant services active and one healthy router placement each; node releases intentionally unchanged. Supported zynserver runner replacement completed, archive20261004T054745Z carries the exact old network ID and v2 retirement receipt. Old bridge/routes are absent; node identity/bindings, attested runner client, policy and shared containerd PID unchanged. Fresh private runtime started; installed image build is running while the supervisor remains disabled. Evidence under state/sparkops-native-s3b-production-20261003-PWqz8bIH. 2026-10-04 05:55Z: fresh rc47 image1178b9bac629 passed installed scan; all8 doctor checks true under actual UID988/GID982+983. Supervisor enabled after those gates. Actual PR job111371419387/run37180325103 is running on zynserver-sparkops-pull-request-20261004t055513z-5118c8f2, runnerID7709. External live host+authority capture validates exact job/container ownership, resources, effective UID/caps/NNP, log-only bind, private engine and both INPUT/forwarding fences (pr374-proof-6kew2dkl/pr-3cb-). Cargo outcome and natural cleanup remain pending. 2026-10-04 06:03Z: #374 merged as9b59f3f573341d220e831a09436c6428d0d300c2 after13/13 PR checks, final independent/Astra+DeepSeek adjudication, exact source/artifact validation and actual PR natural-cleanup proof. Revert: git revert -m1 9b59f3f573341d220e831a09436c6428d0d300c2. ARM4135ca7b\u2026/x8668ba88f4\u2026 match prior VM binaries;2,853 source files verified against synthetic31838698. Main Rust run37181670267/job111375326142 succeeded; its before-capture was missed because the observer matched the workflow name against a dynamic run title. No retrospective cleanup claim; planned final main-dispatch reuse job will supply captured main cleanup. Four exact-main workflow watches now foreground; cancel/timeout/reuse remain. The pure evidence verifier corrected only docker.socket missing MainPID handling; real observations unchanged and positive cleanup plus negative changed-service/socket-PID controls pass. 2026-10-04 06:13Z: all four exact-main 9b workflows passed foreground (Rust37181670267, Secret37181670254, Runner37181670258, Security37181670253); main-9b-watch-results.json records exit0. Exact main artifacts independently validated across2,853 files and pinned toolchain; both hashes remain the VM-proven binaries (pr374-main-artifacts-vmv2lve7/validated.json). Actual cancellation run37182075356/job111376492641 reached the explicit wait step, passed live isolation/ownership capture, was canceled through GitHub and passed natural cleanup without reconciliation or deletion. Full evidence dispatch-9b-cancellation- under pr374-proof-6kew2dkl. Timeout and subsequent successful main reuse remain underway. Gate closed 2026-10-04: final evidence report. Cancellation37182075356, provider-enforced one-minute timeout37182151368 and successful subsequent main job37182324630 all have actual before/after isolation and natural cleanup proof; no cleanup/reconciliation used. Timeout API conclusion is honestly recorded cancelled with its explicit timeout annotation, not mislabeled timed_out. Final reuse artifacts validate exact9b/2,853 source files, two builds per architecture and unchanged final x86 VM binary; ARM reproduction is not ARM VM execution. All four main workflows green; allsix VM receipts final. Evidence index pr374-proof-6kew2dkl/stage5-gate-evidence.json. No Stage5 item remains; broker stays dormant, enforcement excluded. Held-branch disposition: native-s5-build-ci@bf00e4a1 and native-s5-runtime-network-retirement@f8665126 are exact stable-patch equivalents of main ancestors c9873afb and 93b330e2; no extra merge is needed. Trees remain as provenance. See 2026-10-04-sparkops-native-held-branch-disposition.md. Handoff 2026-10-04T16:29:17.647165+00:00: No open PR, implementation or live proof remains for Stage5. Core merges #363 0dc50100, #369 fadaeb21, #370 38a222fb, #374 9b59f3f5; complete gate report 2026-10-04-sparkops-native-stage5-gate.md. All native-s5 worktrees clean and heads preserved on origin. Local-only native-s5-build-ci@bf00e4a1 and native-s5-runtime-network-retirement@f8665126 were pushed for provenance; they are patch-equivalent to main c9873afb/93b330e2 and must not be merged again. Next: keep the broker dormant. Enforcement/signing custody/action redesign are separate unscheduled work, not an unfulfilled Stage5 gate. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\n6 Go node agent\nin progress; Go daemon live, unprivileged tail and installed acceptance remain; handed over 2026-10-04\ndesign, #360\n#360 froze 52 state/heartbeat cases without changing prior golden cases, replaced two narrower tests, corrected documented release_platform test environment and catalog provenance. Two Astra review axes plus DeepSeek cross-review adjudicated in 2026-10-03-sparkops-pr360-review.md; JSON bool/int/float comparison gap fixed and mutation-tested. Focused 157 +35 subtests; clean-source 87 +23; four security shards 1703/1443/2325/1754 with sole dirty-source provenance failure independently rerun clean; CLI 17/99/21/9; inventory 250/250 and pin suite passed. PR 11/11 green; merged at 71df6fb015214067b277d1fd496cbff69b93fc5b. Revert git revert -m 1 71df6fb015214067b277d1fd496cbff69b93fc5b. Main Security 37139425047 and Secret 37139425054 both passed; foreground watches exited 0. Freeze evidence /tmp/sparkops-s6-freeze-pSAumHmy; no service changed by #360. Agent implementation worktree native-s6-go-node-agent: Go scheduler/state/heartbeat/helper-work IPC/SQLite journal and fixed temporary Python observation adapter. Adapter model-readiness HTTP retained through S5, no controller/helper/work exchange in Python. No Go sudo. S1 implementation #362 includes work-release binary, ExecStart-only successor cases (old cases retained), full native provenance validation, SQLite replay/claim parity, actual fixed-adapter and Unix IPC differential tests in CI. Python integer coercion and journal-off outcome parity findings fixed; S7 cache fix merged into the branch. Final head 90bee3b passed all15 checks in foreground (Security37143519644; remaining workflows in /tmp/sparkops-pr362-root-final-watch.log), no unresolved review thread. Merged as b52518ffa01b82dce82a1a7cf92420ff8cb74b0a at18:31:44UTC; revert git revert -m 1 b52518ffa01b82dce82a1a7cf92420ff8cb74b0a. Review 2026-10-03-sparkops-pr362-review.md. All six main workflows passed in foreground: Security37144536869, Secret37144536836, Runner37144536865, Connector37144536849, Signer37144536821 and seam37144536841; Dependency Graph37144538773 also passed. Evidence /tmp/sparkops-pr362-main-watch-results.json. Official rc37 release built and assembled from b52518f on both native builders; set pin 282900fa39e28dde385ec8cd904a506643d0b41341ca217a8b1dcd601f5fd14e, result state/spire-fleet-enrollment-20260920/release-set-b52518ffa01b-v0117rc37-result.json. Installer reproduced twice per architecture: arm64 0b9a40451e1a18d254dd9d502fa08c9352f015d42605ca27a6e0fe2bbef0ab67, amd64 bba0213c0e6fd94958041f7f48aa8d8af8524115663dc29f38910558f7f54d5a. S7 owns only the two reviewed fresh x86 lab guests through retirement and the existing x86 builder for synthetic baseline/candidate packaging. Synthetic baseline controller install62ebfe5/doctor/status passed; normal node attach underway. S2 draft#365 ports secure image download/provenance and deletes1587 Python lines; additive3120caseoracle preserves oldgoldens. Local1974Python+454subtests and pinnedGo suite pass; All 12 checks passed at final S2 head 7161841; the native assurance check now executes the actual Go handler suite in the existing offline harness. Merge waits for S1 installed/live proof. Installed same-controller lab proof passed on source 5fb68c1: exact stable result bytes between Python and Go, unchanged host/work-client identity, and genuine job job_9342b5eb39aa849ceb2c9fef redelivery generation 1\u21922 with one execution and unchanged durable outcome. Evidence state/sparkops-native-s7-rehearsal-retry-20261003/s6-proof/. Official rc38 set 9bbab782829fcbeae474978cc0e1620ca63bdbc7d72cd748f7140885d9296f84 built on both native builders; rc36\u2192rc38 attested bytes independently match on both architectures (/tmp/sparkops-native-rc38-attested-artifact-comparison.json). cp1 standard upgrade completed at 20:21 UTC; independent status/doctor report canonical_healthy=true and all five health gates true. Four-node upgrade exited0, authenticated jobs e63e7edd/65551ce3/03e3596d/99586572 passed. Root independently measured the expected Go binary on every DGX, release bindings source5fb68c1, active services and healthy DeepSeek router/model discovery; evidence /tmp/sparkops-native-rc38-live-ppol90bz, /tmp/sparkops-native-rc38-fleet-upgrade.log, /tmp/sparkops-native-rc38-model-status.json. DGX1 actual live redelivery passed: job job_2cea6f8d87389b8d17cfbe12, generation1\u21922, one fixed action input, exact persisted outcome SHA256 5bfee0806768108a03d5fd48a20ceafa3851bf9a4ee09f2dd0efee3cea48dcdb, controller result/timestamps equal. Work-client PID/starttime/executable preserved and independently verified active; all scoped tokens revoked. Evidence state/sparkops-native-s6-production-proof-20261003/real-redelivery-summary.json. The S1 live hold is lifted. S2 #365 final e65e428 passed all12 checks in root foreground watch; root review confirms Python15 Unicode repr/digit/whitespace parity fixes preserve old vectors. Merged normally as af391ceff58cc0870a8264caf724054fa5d289ed at22:21:07UTC with no unresolved threads. Revert git revert -m 1 af391ceff58cc0870a8264caf724054fa5d289ed. All four main runs passed in root foreground watches: Security37158143498, Secret37158143439, Runner37158143479 and dependency graph37158144900 (/tmp/sparkops-pr365-main-watch-results.json); S3 #368 follows. Old-loop retirement #372 removes572 production Python lines and retired tests; read-only NFS #373 and credential-inspection #377 are prepared in its stack. Their first CI exposed controller/coding fixtures still calling deleted Python APIs. Repair d425019 replaces those calls with a test-only process bridge invoking the real Go Agent.Heartbeat/WorkCycle and durable journal while retaining controller authorization and receipt assertions;38 focused tests and pinned Go build/vet/tests pass. Root reviewed the repair; final stacked source ade0ce4056ca8abdb279d17f67fe597ddfb427fd is running all four Python shards plus CLI. Superseded stacked CI is canceled, not reported green. Full Stage6 remains open, including actions, benchmarks, lifecycle and the explicitly retained privileged tails. S2 live preflight on current fleet finds zero vm.image_download-capable hosts; public SPIRE admission cannot grant that action and hardened node units lack network capability for it. A supported positive image-download job cannot currently be queued. Evidence state/sparkops-native-s6-s2-proof-plan-20261003/readonly-preflight.json; the bounded post-rc41 API refusal script is 2026-10-03-native-s6-s2-live-proof.py. No manual queue, admission or unit override will manufacture proof. Native source/oracle validation is separate from this unresolved live criterion. Venv create/remove localcc9cefc deletes96production Python lines, freezes70actual-Python cases, and passes root50focused checks; review 2026-10-03-sparkops-native-venv-actions-review.md records no finding. Benchmark port is underway. rc41 allfourDGX upgrades exited0 to node3b096b68d150; authenticated jobs217a8594/132b0ec7/55cfad57/bc626e06 passed. Root independently verified each actual Go process SHA8339446ca2cdddd4c13321561ef86717856e35825d153642dfda9332db983c12, source31ea17f bindings, four active services, healthy router and DeepSeek1048576context. Evidence /tmp/sparkops-native-rc41-proof-u498rghq/summary.json and /tmp/sparkops-native-rc41-fleet-upgrade.log. This proves the installed S2 release and unaffected fleet operation, not an unavailable positive VM-image action. rc41 S2 live refusal recorded: supported bounded API probe refused vm.image_download because no DGX admission advertises it; no work job or destination mutation occurred and the scoped token was revoked. Evidence state/sparkops-native-s6-s2-proof-plan-20261003/rc41-live-refusal.json, SHA256e788ebff7252b6fe56ddd51d1b9f3f50b1fad9af11ebf1bafeb1f1beb4e00def. Successful installed image-download proof remains unmet. Local benchmark deletion head3635b937b9b1c6d36346c6ac690113a43e6b240f:491 original-Python oracle cases, four actual legacy/optimized Python\u2194Go role exchanges, native three-node cancellation/replay, full pinnedGo and1751Python+377subtests pass.620 replacedPythonruntime lines and277-line obsolete comparison harness deleted; originalprotocol/framegoldens unchanged. Separate pendingS3 fixeb40c13 adds102 actual originalping float coercions (14 pre-fix failures); propagated locally through held stack. Source evidencestate/sparkops-native-s6-stack-validation-20261003/3635b93-mpirun/summary.json; PR/liveproof stillpending. rc42 four-DGX standard upgrade passed: authenticated jobs4ba25b3b/d7a6b6ca/11797f7e/9d4ed407; node release299a75196b3b. Independent process hashes8339446c and source25daac9 bindings match on every host, four services active, router healthy with DeepSeek1048576. Serialized cp1 status/doctor all five gates true. Evidence /tmp/sparkops-native-rc42-proof-ad1d8ehb/, /tmp/sparkops-native-rc42-fleet-upgrade.log. S3 #368 merged00:55:20UTC2026-10-04 asb2f3ffec49c660a30c3e1bd81fd1b994f9398d24 after all15 exact-head checks, root source review and independently adjudicated DeepSeek review. Revertgit revert -m 1 b2f3ffec49c660a30c3e1bd81fd1b994f9398d24. Review packets 2026-10-04-sparkops-pr368-review.md and 2026-10-04-sparkops-pr368-deepseek-adjudication.md; no actionable finding. All six main watches passed: Security37166426011, Secret37166426074, Runner37166426076, seam37166426075, Signer37166426104 and Connector37166426123 (/tmp/sparkops-pr368-main-watch-results.json). Included in the required rc44 reenrollment repair release; actual authenticated native action proof remains pending. Owner scope decision,2026-10-03PDT/2026-10-04UTC: do not implement enforcement. Revised exit requires Go loop/journal/heartbeat/every unprivileged action; retain only the exact named legacy privileged Python action inventory and approved workers, with an inventory rule refusing additions and no Go node sudo. The proposal2026-10-03-sparkops-native-stage6-privileged-tail-design.md moves to separate unscheduled privilege separation alongside9. Pure action/observation ports, fixed worker routing, inventory guard and live proof still remain; no completion is inferred from this decision. rc44 dgx1 actual authenticated native memory action passed during reenrollment and standard upgrade (jobs939514b5/6b8e1d19); four-host S3 proof awaits remaining rollout. Consolidated local tranche12a89b19 removes1586 net Python runtime lines; root real FIFO probe found native progress observation could block daemon shutdown. Agent is restoring the bounded fixed-child boundary and correcting an independently demonstrated embedded bytes.Buffer ReadFrom limit bypass before publication. No affected candidate is deployed. Convergence update 2026-10-04 UTC: owner directed no new fronts/branches/worktrees, one implementation subagent,372first then existing PRs or supersession. S5/S7 implementation parked. Consolidated372 head34668420 includes373/377 and reviewed runner-capacity98d by ancestry, net1525production Python lines deleted. Independent S5 review no actionable findings;68original golden files and exact118controller/113node source records verified. Sole foreground CI watch underway. Four pure actions plus remaining selection/observation ownership remain open; current release has not deployed this tranche. Consolidated372 CI at34668420 finished13/15: Go capture accidentally depended on absence of actual containerPID9; shard4 had1989passes227subtests and a stale call to removed Python runner_inspect. Agent preparing deterministic captured-process seam plus owned live/exited process test and native queue-test bridge. Goldens remain unchanged; no merge/deploy claimed. Reviewedlocal CIrepair468e9265 is tests/docs only;605originalpruning/progress +79runnercases, actualownedlive/exitedPIDprobe, realcontroller-leasednativebridge andforgedargs pass. Ready/unpushed untilcp1upgrade ends; root reviewednofinding. CorrectoriginalJSONcount69, not68: priorfilter accidentally omitted node-privilege-resource-registry-v1/registry.json, now independentlyverifiedunchanged. Root follow-up review withdrew468e9265 test-clearance: captured-process helper coveredmap-shaped pruningjobs but missedlist-shaped progresspid25, so localpassesstilldependedonPID9absence. Agent fixingbothshapeswith explicitfrozen-rowseam assertions; current468solewatchremainsactive, no prematuremerge. DeepSeekboundedcrossreviewof468startedafterfleetrecovery. Final map/list test correction 546195881862616dec94e53f71af3caaf9324248 is published to PR372 and has one foreground CI watch. The direct captured-probe regression failed before the fix and passes afterward; all 69 original golden JSON files remain unchanged. The prior468 watch finished14/15, with only the missed progress PID fixture failing. DeepSeek supplied-source review of468 vs e77 reported no actionable findings; raw request/response and Astra adjudication are preserved in state/sparkops-native-s6-stack-validation-20261003/468e9265-pr372-deepseek-review/. Root and independent Astra reviewed the one-file546 delta with no actionable findings; exact bounded delta adjudication and hashes are appended to the existing DeepSeek packet. Origin/main remains e77df2ff,206 commits beyond the plan baseline. No new Stage6 deployment or completion is claimed. PR372 merged2026-10-04 04:01:57Z: final54619588 passed15/15 exact-head checks and independent/delta/DeepSeek review. Merge 7e9fcbd51a70c824986536eb56706bea5bf29423; revert git revert -m 1 7e9fcbd51a70c824986536eb56706bea5bf29423. Six exact-main foreground watches are running (Security37175796167, Secret37175796164, Runner37175796154, Signer37175796146, Connector37175796158, seam37175796148); do not count them green yet. Evidence under5461958-pr372-list-shape. PR373 had merged into the372 branch as468455752fecdbc177340da7550443caf3254305; PR377 is closed as superseded and its52fd458b head is an ancestor of the main merge. Runtime release/live proof of the new action tranche and remaining pure ownership are still open. All six exact-main watches for7e9fcbd5 completed successfully; 5461958-pr372-list-shape/main-watch-results.json records each exit0. This closes the372 source/CI gate, not Stage6. PR384 now published atba7d4e1f with recovery preserved and one foreground watch. 2026-10-04 merge384 main529867d7 foreground Secret Scan37177092674 and Security Gate37177092675 both success; /tmp/sparkops-pr384-main-watch-results.json. Stage6 owner privileged-tail revision remains recorded above; actual unprivileged/live gate remains open. 2026-10-04 06:37Z read-only continuation audit atmain0eefe57d: the exact41 legacy privileged +5 retained worker inventory and no-addition runtime/CI guard ARE implemented in legacy_actions.py; this corrects any earlier pending-guard wording. Eleven native actions are merged; only four pending names remain: video status/cancel and telemetry burst start/stop. Selection/work-selection, pure probe/metrics/discovery processing, finalization/shadow and fixed worker launch/recovery ownership still require port/deletion; privileged Docker observation remains explicitly at the approved legacy boundary. Held6a412c2f tree and87 immutable video outputs (SHA79acb00b080ad1efd8593bb7b06c6402341be0150185a29fa07993e35a4e30b7) preserved; matching original cli source is still currentmain. Narrow next held slice is video status/cancel after integratingmain; no new implementation resumed. S1 replay is already proven; PR372 new-action live proof and final benchmark/deletion remain. S2 download has supported refusal evidence only; positive execution is unavailable under current admission and cannot be manufactured by widening grants. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. #362 b52518ff, #365 af391cef, #368 b2f3ffec, #372 7e9fcbd5 are merged; #373 is included and #377 superseded. Eleven native actions and exact41 legacy privileged/mixed-effect plus five retained Python workers, with no-addition guards/no Go sudo, are implemented. Only new unmerged Stage6 source is preservation-only agent/native-s6-routine-actions@9115dba64025195606c05a3c6fd93fab43cb61a1, now pushed:87 actual old video observations, unchanged SHA79acb00b080ad1efd8593bb7b06c6402341be0150185a29fa07993e35a4e30b7; no native video implementation/registry pin yet. All other heldStage6 runtime heads are main ancestors and should not be replayed. Next after3b: fetch/integrate main in routine-actions, port video status/cancel then telemetry burst start/stop; finish selection/work-selection, pure probe/metrics/discovery/finalization/shadow and fixed worker launch/reconciliation ownership; delete replacements and prove installed benchmark/new-action/model-observation behavior. S1 real redelivery already passed. Positive vm.image_download live proof remains blocked by absent supported admission/network capability; rc41 refusal is not positive proof and grants must not be widened to manufacture it. Owner IAM draft noted in handoff; no action or enforcement authorization. See successor handoff for exact commands, branch dispositions and live release digests. Takeover 2026-10-04 (Claude Opus 5.5) \u2014 video status/cancel native: routine-actions worktree merged main 6ffb395c; #391 ports model.video_render.status/.cancel into closed native dispatch (go/internal/nodeagent/video_render.go) and deletes both Python handlers and pending entries (capability advertisement unchanged). The preserved 87-case oracle node-video-observation-v1/actions.json (SHA 79acb00b\u2026, from 6a412c2f) is consumed by TestVideoRenderOriginalOutcomes (results/refusals, every request line and header, state bytes); 20 URL edges and 34 raw HTTP framing edges were measured on the original Python 3.12.3 _video_runtime_context/_video_runtime_json_request. Four GPT-6 Astra rounds drove an http.client-faithful response reader (line/header limits, chunked precedence incl. 204, IncompleteRead, int() semantics, scoped-IPv6 Host, OSError subclasses); two deliberate bounds where the original was unbounded (negative chunk size, trailers) refuse at the 1 MiB limit; final review no actionable findings. Release inventories add the two Go files; client-fold controller/helper closures stay accepted as named layers. 16/16 exact-head checks at 4e976689. Merged 18:16:39Z as abd87d1947e2e8a88debf145f5b6b9c85c5f9fe7; revert git revert -m 1 abd87d1947e2e8a88debf145f5b6b9c85c5f9fe7. PENDING_NATIVE_ACTIONS is now burst start/stop only. Installed proof waits for the next release (builder capacity blocked, see 3b). Next: burst start/stop together with the shared host metric collectors (Python probe metrics), so collectors are deleted once. All 7 exact-main runs for abd87d19 passed. Host metrics slice in progress: branch agent/native-s6-host-metrics @ 92925e85 (WIP, no PR) ports collect_host_metrics and its collectors to Go behind a virtual-system seam; the frozen 81-case oracle node-host-metrics-v1/collect.json (from abd87d19; harness state/s6-host-metrics-oracle-XLdyiIRp/) passes in full and a tamper check fails as expected. Wiring, Python deletion, inventories and review remain; resume notes in state/native-takeover-VEMDbjIG/RESUME.md. Update: 4bc5edc8 wires the collector into collectObservations ahead of the probe (original 2 MiB input bound first, Python still reads a pre-metrics state copy, 4 MiB probe-response bound emulated, collector exceptions in the entry point&amp;#39;s error form), deletes collect_host_metrics/collect_gpu_metrics/collect_host_memory_metrics/telemetry gating/env_int/env_float/DEFAULT_TELEMETRY_CONFIG/advertised_local_address and their tests, registers node-host-metrics-v1 with a Python pin, and adds the files as a new inventory layer (video and client-fold layers stay accepted); synthetic fleet now drives the native collector (29 pass). Astra xhigh found 8 items (state/native-takeover-VEMDbjIG/astra-hm-review-4bc5edc8.md); the input-order one is fixed in a27a9e36 (pushed). The other seven (P1 command timeout can hang on inherited pipes; P2 uncancellable /proc,/sys reads, fsum, symlink-then-.. resolution, stderr decoding, int division overflow; P3 expanduser failure) are in host_metrics.go, whose read the auto-mode classifier denied; owner approved the read/edit. Host metrics landed: Astra rounds 2\u20134 drove 2ee3bf38, d18ed4d2, 1149b95f, 5552c4e2: a subprocess.run mirror (one deadline over both pipes and exit, kill+close on timeout, stderr decoded, -signum, start/reap bounded by cancellation), cancellable filesystem calls, shutil.which/Path.resolve/Path.expanduser (NSS via getent) ports, Python 3.12 compensated sum(), int-division OverflowError, and surrogateescape path encoding shared with model progress. Additive frozen capture node-host-metrics-v1/collect-edges-20261004.json (8 cases, same abd87d19 source, SHA e1b04747\u2026; harness copies in state/native-takeover-VEMDbjIG/{freeze_edges.py,cases_edges.py}) plus measured local-system unit tests; tampered build fails them; race-clean x3. Final Astra: only contrived P3 residuals (all-digit or &amp;#39;:&amp;#39;-home NSS-only accounts in ~user storage paths), documented in pythonPasswdHome. #392 16/16 exact-head checks at 1345c663; merged 20:04:15Z as 1705f7eb4eaa4f94fa53ba62582f5e7babe74c8c; revert git revert -m 1 1705f7eb4eaa4f94fa53ba62582f5e7babe74c8c. All 7 exact-main runs for 1705f7eb passed (Security Gate, Secret Scan, Rust broker, connector/signer/runner acceptance, seam). Installed proof rides the next release (Stage 3b rc.52). Next Stage 6 slice: telemetry burst start/stop (deletes the remaining shared collectors). Burst slice 2026-10-05: #395 ports telemetry.burst_start/_stop into closed native dispatch and the detached sampler into node-agent burst-run, replaying 189 original outcomes frozen in node-telemetry-burst-v1 (from 8dfc6a78; harness state/s6-burst-oracle-AGk04NuF/); deletes the Python handlers/sampler/upload batching/burst-only collectors and PENDING_NATIVE_ACTIONS (no unprivileged migration debt remains). Burst files move to &amp;lt;node state dir&amp;gt;/telemetry-bursts because the installed unit&amp;#39;s HOME=/nonexistent made every Python start fail after its admission upload. Live proof needs an owner-granted telemetry admission on one host (none hold it; nothing queues bursts automatically). Three Astra xhigh rounds: r1 four findings (PATH search fell back to cwd, spool names skipped fsencode, post-request selection text, zombie-blind test) fixed with an additive burst-edges-20261005.json capture (11 cases, same source); r2 two raw-bytes/text P2s (PATH, state dir) fixed by treating burst paths as Python text; r3 no actionable findings. 16/16 exact-head checks at 01286fb2; merged 08:25:45Z as 677fd1488a3993c3a02bd3e81278c88227cf9517; revert git revert -m 1 677fd1488a3993c3a02bd3e81278c88227cf9517. All 7 exact-main runs for 677fd148 passed (Secret Scan, Security Gate, Rust broker, connector/signer/runner acceptance, seam). Unprivileged migration debt is now zero; remaining Stage 6: selection/work-selection/probe/probe-finalize/shadow and fixed worker launch/reconcile ownership, installed acceptance. Selection slice 2026-10-05: #396 reads the provider expectation, work selection and heartbeat selection natively (selection.go, SelectionReader), replaying 164 real-file-tree outcomes frozen in node-selection-v1 (from 677fd148; harness state/s6-selection-oracle-FsUkoNqw/) plus an additive 2-case selection-edges-20261005.json (Python&amp;#39;s 4300-digit int() limit); deletes the fixed Python operations selection/work-selection (readers kept for retained workers and the Python installer), so a work request no longer spawns two Python processes; burst-run drops --python. A read-only live differential (installed Python operations vs the native reader on the real root-owned files) was byte-identical on dgx1\u2013dgx4 and zynserver; the cross-build for it exposed syscall.Fstatat missing on amd64 (now x/sys/unix), and the Go lane now vets amd64 and arm64. CI then exposed the daemon shutdown test&amp;#39;s dependence on installed selection (passed only on fleet hosts); the lane&amp;#39;s node-agent test binary now uses a test-only sparkops_test_selection tag to read a fixture selection (release builds carry no tags). Astra xhigh four rounds (r1: int limit, cancellable reads, change-check order; r2 clean; r3 clean; r4 P3 vet coverage fixed). 16/16 at 187cea5a; merged 09:48:24Z as 2da84639b1f65ae46444c7e9d79a3a3e3e632b71; revert git revert -m 1 2da84639b1f65ae46444c7e9d79a3a3e3e632b71. All 7 exact-main runs for 2da84639 passed. Shipped as rc.55 (release set 1df263ad\u2026, ordinary gate from rc.54: no attested client changed): cp1 deployed by the owner; fleet upgrade on all five hosts 2026-10-05 16:08\u201316:17Z (dgx1 owner-run, the rest agent-run with owner approval), each ~35 s with its SPIRE work verification job. All five: node agent active with 0 restarts on source 2da84639, router 200, heartbeats healthy, DeepSeek ready on dgx1\u20134 with containers untouched, runners active; node agent CPU fell from ~17% to ~1% of a core on dgx1 (no Python selection spawns). Evidence state/native-takeover-VEMDbjIG/readback-rc55/. Broker shadow native: #397 \u2014 the broker mode selection and shadow observation that ran as the fixed Python operation shadow before every native action are native (go/internal/nodeagent/broker_shadow.go); the Python operation and its adapter allowlist entry are deleted (Python&amp;#39;s execute path still observes the actions it executes). Oracle node-broker-shadow-v1/shadow.json (255 cases through the real entry point, exact stdout+stderr, from 2da84639) plus additive shadow-edges-20261005.json (7 failing-stderr cases: exit 120 in shadow mode). Astra xhigh four rounds (r1 locale adjudicated with host evidence \u2014 all nodes LANG=en_US.UTF-8; r2 cancellation window and fd 2 exposure under --quiet fixed with a raw write(2) and cancellable write; r3 exit-120 refusal reproduced; r4 clean). 16/16 at c49d9a46; merged 18:03:54Z as 085166d62125abe1d7fee7ef957c9b79418391a2; revert git revert -m 1 085166d62125abe1d7fee7ef957c9b79418391a2. All 7 exact-main runs for 085166d6 passed. Not yet released (next node-agent release; no attested client change). Remaining fixed Python operations: probe, probe-finalize. Heartbeat tail native: #398 \u2014 advertised capabilities (coding/UniFi policies, worker grants, video flag, canonical/legacy runner probe) and release identity (installed record custody walk, loads_unique parse) that ran as the fixed Python operation probe-finalize every heartbeat are native (go/internal/nodeagent/probe_finalize.go); the operation, merge_supported_capabilities, the runner probe and cache, runtime_release_identity and installed_release_record.py are deleted. Oracle node-probe-finalize-v1/probe-finalize.json (369 cases through the real entry point from 085166d6, harness state/s6-probe-finalize-oracle-v1K4XJ6Z/) plus additive probe-finalize-edges-20261005.json (12: coding reread budget 9991, root HOME spellings). Read-only live differential identical on dgx1\u20134 + zynserver incl. the real root-owned release identity. Astra xhigh five rounds (r1 runner pipe deadline, 4 MiB daemon output cap, Path.home, coding reread; r2 non-UTF-8 HOME, per-key reread; r3 PATH discovery resolve order (also fixes runner inspection), fixture guard; r4 discovery errors escape; r5 clean). First CI exposed the fleet runners&amp;#39; noexec HOME custody root: the lane now provides SPARKOPS_EXEC_TEST_ROOT for the 61 replayed cases that execute commands. A GitHub Actions incident (19:50Z) blocked hosted jobs; re-run after recovery: 16/16 at 17a927fe; merged 22:46:19Z as e67696573c022b0316230c5dea449ee93134fc07; revert git revert -m 1 e67696573c022b0316230c5dea449ee93134fc07. All 7 exact-main runs for e6769657 passed. Shipped as rc.56 (release set 3c37b78d\u2026, ordinary gate from rc.55): owner authorized; agent ran cut-and-upgrade-cp1.sh 23:11\u201323:14Z (dry run + upgrade exit 0, doctor 5/5, canonical_healthy, runner refresh check) and fleet upgrade dgx1 (job_d977a21a\u2026, 37.4 s), then dgx2/dgx3/dgx4 (13ccf015 \u2192 58c5ebef) and zynserver (537442020f11 \u2192 ab50e50188bc), ~35 s each with their SPIRE work verification jobs. All five: agent active, 0 restarts, bindings e6769657, router 200, no journal errors, heartbeats healthy, capabilities identical to rc.55 (zynserver&amp;#39;s 7 reported-only capabilities predate this release), DeepSeek ready on dgx1\u20134 (containers untouched); controller shows the natively reported release identity sparkpyro-node-agent-0.1.10+e67696573c02. Evidence state/native-takeover-VEMDbjIG/readback-rc56/. Model runtime discovery native: #399 \u2014 the last fixed Python operation every heartbeat ran (probe: discover_local_model_runtimes) is native (go/internal/nodeagent/model_runtime_discovery.go, plus python_urlopen.go, a port of urllib&amp;#39;s urlopen over http.client for the readiness probes); the operation and its helpers are deleted. Only the two Docker reads stay in the named legacy boundary as the fixed operation docker-observe (docker_observation.py), because they may run through sudo -n. Oracle node-model-runtime-discovery-v1/discovery.json (283 cases through the real entry point from e6769657 with stub docker/sudo/ip and a scripted HTTP server; harness state/s6-probe-oracle-rceORhZe/); the replay runs native discovery with the real docker-observe and matches 278 (5 document-shape cases are the agent&amp;#39;s own state). Read-only live differential identical on dgx1\u20134 (DeepSeek head) + zynserver. Astra xhigh five rounds (r1 64 MiB docker-observe bound, no name cap, per-address connect, ALPN; r2 Unicode 15 tables, glibc numeric ports, unstartable inspect; r3 NSS via getent; r4 getent -A; r5 docs). Deliberate bounds documented (http/https only, no proxies, ASCII hosts, 4 MiB bodies/trailers/ip output). The controller tests&amp;#39; runtime emulator now drives the native discovery through a Go test-binary entry. First CI exposed builder inventory order (fixed) and a new frontend advisory (GHSA-68fv-2mgg-jv7q) fixed separately by #400 (source-map-js 1.2.2, merged 01:45:03Z as 21773890). 16/16 at 1c11961a; merged 2026-10-06 01:58:13Z as c60dc9d279326c9dbd8414f63c18470d9fd2e5fa; revert git revert -m 1 c60dc9d279326c9dbd8414f63c18470d9fd2e5fa. All 7 exact-main runs for c60dc9d2 passed. rc.57 built (release set 62f20386\u2026) but never deployed; superseded by rc.58 (see row 7). No fixed Python operation remains on the heartbeat path except docker-observe; remaining Stage 6: installed acceptance.\n\n\n7 Go installer\nin progress; node identity owner native: #403 merged cdf2e5be 2026-10-06 (Python fleet_node_identity.py is now a declared native adapter over _node-identity; real-userland differential identical on arm64+amd64, evidence state/s7-identity-real-userland/v4-closure/; Astra xhigh r1\u2013r5, r5 clean; PR CI 16/16 at 6bcd81e0 after rooting identity test trees in the lane&amp;#39;s custody root, since fleet runners&amp;#39; /tmp is not root-sticky; exact-main 7/7 green). Controller identity store native: #406 merged 9c4f8d98 2026-10-06 (installer/control_plane_identity.py keeps only the installer lock, transaction liveness and the reserved value; validation, custody reads, the fleet access receipt, publication and all transitions run behind _controller-identity; release builds accept only the installed store and lock, and the native child must hold the caller&amp;#39;s inherited installer lock (fdinfo-verified) so a killed caller cannot let a second installer interleave; additive corpus controller-identity-store.json 575 cases frozen from cdf2e5be; root real-userland differential state/s7-controller-real-userland-v4.mEvJqm identical arm64+amd64 with the designed narrowings; Astra xhigh r1-r5, r5 clean; PR CI 15/15 + labelled SPIRE acceptances at efbfeeb5; exact-main 7/7 green). Node lock follow-up #407 merged 5725f65e 2026-10-06: node allocate-accounts/publish now run only holding fleet_node_install._locked()&amp;#39;s inherited descriptor (release path /var/lib/sparkops/fleet-node-install.lock, fdinfo-verified); evidence state/s7-identity-real-userland-v5.CQinXc (11 scenarios identical arm64+amd64, unlocked-change and killed-caller differ as designed); Astra xhigh clean; PR 15/15; exact-main 6/6 green. Shipped as rc.58 2026-10-06 (source 064dc1de, the rebased head of #404 Werkzeug 3.1.9 on main 5725f65e, so it carries #399, #400, #403, #405, #406, #407; release set 6d2e1a11\u2026, ordinary gate from rc.56; rc.57 skipped). cp1 via cut-and-upgrade-cp1.sh 09:13\u201309:16Z (dry run + upgrade exit 0, doctor 5/5, canonical_healthy, runner bindings current); fleet upgrade dgx1 (job_717a8e36\u2026, 50.5 s) then dgx2/dgx3/dgx4 (58c5ebef \u2192 3751cb43) and zynserver (ab50e501 \u2192 f144df47), ~46\u201351 s each with SPIRE work verification. All five: agent active, 0 restarts, bindings 064dc1de, router 200, no journal errors after the switch, heartbeats healthy, DeepSeek ready on dgx1\u20134 (container untouched). One old-agent truncated: stream ended inside a frame line on dgx1 at 09:15:10Z falls inside cp1&amp;#39;s own restart window. Runner lock: fleet runners attach --replace on dgx1\u20134 (rc.53 \u2192 rc.58 runner files; runner code unchanged apart from the lock), image build + Grype scan as each host&amp;#39;s runner account (werkzeug 3.1.9 in /opt/sparkops-ci-venv, fresh approvals), units started (still disabled at boot); zynserver&amp;#39;s x86 runner untouched (its lock has no Werkzeug). #404 13/13 on the new images, merged 09:35:28Z as 09dc17a1 (tree identical to 064dc1de), 6/6 exact-main runs green, Dependabot #63 fixed. Evidence state/native-takeover-VEMDbjIG/readback-rc58/. Node phase frame codec native: #408 merged 63288ac7 2026-10-06 12:07Z (tranche row 1: controller request writer and reply reader, node request reader and response/error writers behind _node-frame; fleet_ssh.phase_reply and fleet_node_protocol.run_phase retired, fleet_node_error.py and _node-error deleted; frozen corpus phase-frames.json 451 cases from 09dc17a1 replayed in Go and through the production Python paths; deliberate differences: nesting &amp;gt;512, raw surrogates, non-string key order, sorted decoded members; re-enroll now treats identity as unavailable only on NodePreservationError; native cache verified before delivery and each native call; Astra xhigh r1-r4, r4 no P1/P2; PR 16/16, exact-main 7/7). Not released (rc.58 predates it). Operator configuration reader native: #409 merged d6ba6214 2026-10-06 14:08Z (tranche row 2a: _operator-config reads operator.json as json.loads(bytes) + loads_unique and runs every original validation before the workers section with exact exception classes/messages; installer/fleet_operator_reader.py keeps custody read + workers; fleet_operator.load retired, validate/_validate_runners deleted; corpus operator-config.json 707 cases from 63288ac7 replayed in Go and through the reader; shared identity decoder gains loads_unique duplicates + bytes-path BOM fix; Astra xhigh r1-r4, r4 clean; PR 16/16, exact-main 7/7). Not released. Node trust context and admission checks native: #410 merged c264c4d0 2026-10-06 16:35Z (tranche row 2b: _node-admission runs fleet_node_protocol.validate_context (pem 4.0.0 framing incl. its dash-run matcher quirk, canonical base64, exact 44-byte Ed25519 SPKI, pins, roles) and NodeAdmissionFacts&amp;#39; post_init + validate() with exact classes/messages for any JSON value (uuid/int, urlsplit Unicode + lru_cache + NFKC via new frozen Unicode15 table, ipaddress of any JSON value); installer/fleet_node_admission.py restores refusals and fails closed; validate_context body and the dataclass checks deleted; corpus node-admission.json 819 cases from d6ba6214 (CPython 3.12.3 + cryptography 50.0.1), plus a 16,000-case random differential with 0 differences (evidence state/s7-node-admission-oracle-BNcGgx2n); documented difference: unloadable keys refuse as &amp;quot;Ed25519 public key required&amp;quot; (node refusals never cross SSH); Astra xhigh r1-r3 (r1 P2 stderr fixed, P3s fixed); PR 16/16, exact-main 7/7). Not released. Row 2c deferred into P3 2026-10-06: FleetNodeConfiguration/FleetRunnerConfiguration/FleetSpireConfiguration validate in __post_init__ and are constructed directly by many minimal-lane (no Go) tests; P3&amp;#39;s NodeInstaller port builds these configurations, so their validation moves with P3 rather than through a checked-factory adapter that P3 would delete again. Attachment journal checks native: #413 merged 9075eeb3 2026-10-06 20:24Z (tranche row 5a: _attachment runs installer/fleet_attachment.py&amp;#39;s validate_facts, load&amp;#39;s record checks, _append&amp;#39;s order/clock/expiry/payload/size checks and record bytes, and record_attested&amp;#39;s parent check; Python keeps lock, listing, custody reads, publication and mint permission; load is a declared native adapter; a success reply must be exactly the answer the request determines (verify echoes the sent bytes, attested = sha256(parent), build = canonical record Python forms from the request and its own payload deep copy); corpora from c264c4d0: attachment-journal.json 477 cases + additive attachment-journal-depth.json 240 near-limit cases (evidence state/s7-attachment-oracle-zwGtg6mA, state/s7-attachment-depth-oracle-l8ZI8Bao), replayed in Go and all 717 through the adapter and compiled installer; shared decoder fix: DuplicateKey at object depth 9989 fails &amp;quot;while getting the repr of an object&amp;quot; through the -s -m entry; documented differences: JSON-only values, 4 MiB request bound, no __cause__, extra custody reads after a refused record, datetime stamped once before the uuid draw; Gitleaks allowlist for the corpus&amp;#39;s synthetic token digest; Astra xhigh r1-r4, r4 clean; PR 16/16, exact-main 7/7 incl. the four SPIRE acceptances). Not released. Row 5b blocked 2026-10-06: the controller spire-agent unit&amp;#39;s ExecStartPost socket-custody hook (/usr/bin/python3 &amp;lt;release&amp;gt;/installer/control_plane_canonical.py, rendered by render_spire_unit) runs fleet_capability_inventory.load_profile (profile validators and the whole declaration chain) outside the installer cache, where no native installer can be selected; a Python copy for the hook would be a second verifier. Needs a guard decision first (pinned native checker for the hook, or port the hook, tranche row 6). Held local tracer agent/native-s7-capability-inventory ebb5880e (not pushed): Go profile/network/document/change checks behind _capability-profile, 707-case vector from 84a6268b (evidence state/s7-capability-profile-oracle-eOSJzkGb, plus 14,000 random differential cases, 0 differences); no adapter or deletion yet. Other row-5 candidates (control_plane_upgrade planning, worker-state transfer) depend on fleet_worker_config validators the backend also imports. Remaining: installer effects/orchestration port, official artifact reproduction, full x86+ARM native install/upgrade rehearsal, then delete the Python installer\ndesign, #361\nAstra xhigh worktree native-s7-go-installer: phase-journal/CLI/prune receipt freeze at local a7ec010, 111 focused tests +5 subtests and full installer suite passed. First tracer moves prune planning/readers into Go, preserves Python IdentityStore lock and effect executor, and packages fixed native installer under existing outer manifest digest fence. Policy sparkops-installer, outputs sparkops-installer and sparkops-installer.build.json. PR #361 head 93ea5f8 fixes native execution custody by selecting from the sealed installer cache, verifying its ancestor/root/receipt/full file closure; real offline bootstrap regression replaces original extraction and still executes pinned cached bytes, then refuses cache drift. Complete build-recipe validation and bounded regular-file retention reads added. Minimal installer environment 526 tests, focused cache/bundle/CLI 166 tests, complete shards 1618/1686/1804/2154 plus CLI, pinned Go build/vet/tests and 252/252 pin coverage pass. All 15 PR checks passed in foreground at 93ea5f8, but GitHub security comment 4174173274 blocks merge: packaging must independently reproduce the native binary instead of trusting a self-consistent supplied record. Correction c736abc now independently reproduces the binary inside packaging; real pinned arm64 proof accepts the reproduced artifact and rejects a self-consistent forgery (/tmp/sparkops-s7-real-packaging-reproduction.log). Exact review thread resolved after proof, no bypass. Final correction head c736abc passed all 15 checks in foreground; merged as 62ebfe54d17bc61fba5ddff1431c3588a254e480 at 18:13:24 UTC. Revert: git revert -m 1 62ebfe54d17bc61fba5ddff1431c3588a254e480. All six main workflows passed in foreground: Security37143385375, Secret37143385414, Runner37143385395, Connector37143385431, Signer37143385412 and seam37143385407. Evidence /tmp/sparkops-pr361-main-watch-results.json. Review/adjudication: 2026-10-03-sparkops-pr361-review.md. Official two-native-builder rc37 reproduction passed (pins recorded in Stage6); integration deployment and live proof remain. Next tracer #364 moves phase-journal verification to Go and deletes the Python chain loop; custody reader and writer remain. Review/adjudication 2026-10-03-sparkops-pr364-review.md; actual missing-member guard mutation caught. CI fixture correction f67849e passes all750 Tools tests +20subtests and all10PRchecks in rootforegroundwatch; no unresolvedreviewthreads. Mergednormally as b56ef7dce54142f52a392dee17c41f9d763b4e07 at19:23:42UTC, revert git revert -m 1 b56ef7dce54142f52a392dee17c41f9d763b4e07; Main Security 37147729513 and Secret 37147729509 passed in root foreground watches. The prior integration hold was lifted because the fresh-installation defect already requires a new source-bound candidate. Two fresh synthetic x86 controller/node VMs allocated with pre-boot pinned task SSH host keys: controller UUID 4d083f4b-867b-4c40-85e0-c7e00a26069c, node UUID 0d5805ec-4af1-4436-a8d5-ba9173601151, each2CPU/6GiB/32GiB. Only fresh fixture keys and synthetic identities are used; installed baseline62ebfe5/candidateb52518f rehearsal is underway. Task evidence under state/sparkops-native-s7-rehearsal-20261003/. Freshx86labrefuseddiagnosticcredentialcustody: currentinstallerwritesroot:1001/0640; diagnosticreaderacceptsonlylegacy1001:1001/0670, confirmedstillliveoncp1byreadonlystat. Focused PR #367 at f50f52c accepts only the canonical root:1001/0640 pair or the legacy 1001:1001/0670 pair; database custody is unchanged. Actual-publisher regression, 37 focused tests plus eight subtests and 531 installer tests pass. All 10 PR checks passed; #367 merged at 5fb68c159b3f9516636cd744e26454b40770e504 (19:43:13 UTC). Main Secret 37148914197 and Security 37148914199 both passed in root foreground watches. Review 2026-10-03-sparkops-pr367-review.md. Failed -01 guests are now fully retired after natural lease expiry; both exact UUIDs have absent domain/files/leases/ports and canonical final receipts. Corrected baseline 89310d5 differs from 62ebfe5 only by the same fix/tests. Fresh -03 controller 1f5c8045-b639-4742-90c9-ae75199d9684 and node 892e0d75-b051-4a4f-af67-e4753228e8cc use new prepinned SSH keys and fixture identities. Evidence state/sparkops-native-s7-rehearsal-retry-20261003/. Fresh corrected baseline normal node attach and authenticated memory job job_8039098f3d97dc71ae104598 passed; status and doctor both report canonical_healthy=true. The exact main 5fb68c1 rc38 candidate reproduced and assembled; fresh controller/node public upgrade passed, all five original phase records remained byte-identical, and installed S6 comparison/replay passed. Cold reboot and a new authenticated job passed on both guests; identical controller install and repeated supported fleet upgrade passed. Repeating original attach after an ordinary upgrade correctly refused the immutable prior context. Both -03 guests are now fully canonically retired after natural DHCP expiry: exact UUID/binding checks report domains, files, leases and ports absent. Final controller receipt187ea32c12fb8eb38f26db593fdeb450c4c019c2f0c7515ec84608d9232eaf73 and node receiptff109c4d11a0547592cd78cec3278c1c8d9cd435582855dea4e5294bb47f2062; final evidence index472de03b3d6cdaa4257cb77d66d5a3855b44528e531560345c6c930ccd8624f1. Earlier pending reports remain preserved. Evidence index SHA256 8062cb276894f95f63330672778237c859f2a2dc187348468cd65486e0c545f9 covers125 public evidence files. cp1 upgraded to rc38 at 20:21 UTC and all four DGX upgrades passed authenticated work. Root live binary/service/router verification passed. Renderer tracer #371, head 1e16c51, deletes185 production Python lines, freezes15 exact dynamic outputs and initial state additively, and validates actual native bytes/ordered custody; CI was canceled pending current-main integration. The next runner-render tranche6d97d23 deletes128 pure Python lines, preserves policy validation and ordered custody, and passes611 focused tests+1181subtests,7417 four-shard tests+1151subtests,763 Tools tests+20subtests and15 actual native fixtures. Root and DeepSeek found no actionable defect (2026-10-03-sparkops-native-runner-render-review.md); no PR until #371 lands. Go test-driver fix #376, head131dc75, selects the existing native architecture toolchain pin instead of always downloading ARM. Fourteen focused tests and actual full Go build/vet/tests pass on both architectures; production pins unchanged; current CI pending. No manual chmod or reader bypass. #376 integratedhead397a4af passed all10checks/14focusedtests and merged21:42:44UTC as32af1908c328df537d8e8ea8a4cdd5c04e5f1db7. Revert git revert -m 1 32af1908c328df537d8e8ea8a4cdd5c04e5f1db7; Main Security 37156065403 and Secret 37156065392 both passed in root foreground watches (/tmp/sparkops-pr376-main-watch-results.json); the initial GitHub 504 was retried, not a test failure. Remaining Python installer scope is explicitly mapped in 2026-10-03-sparkops-native-stage7-remaining-tranches.md; renderer progress does not complete Stage7. #371 finalff77f3d3 passed all15 exact-head checks in foreground and had no unresolvedthreads. Merged00:24:04UTC2026-10-04 asd03a4663c1dac88b825b2802812bf864aadb09cf; revertgit revert -m 1 d03a4663c1dac88b825b2802812bf864aadb09cf. Root reviewed exact controller inventory successor: three node-render files added, all historical complete inventories retained, partial successors refused. Full pinnedGo,660installer/backend+1168subtests and790tools+26subtests passed. All six main watches passed: Runner37164831154, Signer37164831143, seam37164831173, Connector37164831126, Security37164831175 and Secret37164831156 (/tmp/sparkops-pr371-main-watch-results.json). Held runner-render18ab825 preserves prior15cases with additive current runtime successors; SPIRE renderer e6b59b5 deletes twoPython templates,12actual producercases and790tests+1187subtests pass; root source review no finding. Their release/integrated gates remain. Local combined pure tranche2eb4846b is clean and reviewed in 2026-10-04-sparkops-native-pure-installer-tranche.md: twelve exact new Go files, prior full inventories preserved, current golden bytes unchanged and Python runner ExecStart retained. Focused419tests/969subtests plus574tests/86subtests and pinned Go checks pass. Next whole identity owner freeze6311bf6c captures418 original validation/NSS/custody/retry/fsync outcomes; no host accounts created. Publication/live gates remain. Reviewed consolidated pure tranche2eb4846b published as#383, spire-acceptance, one foreground watch active; no other held tranche pushed. PR383 historical2eb CI did not pass all gates. Local698abe7f fixes minimal-unittest compatibility, actual catalog provenance and Go-only vector pin tracing; current localf8822f54 integrates reviewed372/recovery. Root reviewed conflicts and recovery/render coexistence with no finding. Exact130-file current source inventory preserves118 predecessor and all historical inventories;313 focused tests+11subtests and2cache checks pass;174 parent golden comparisons unchanged. Source is committed and held, not published/CI-green/live. No identity/effect implementation resumed under convergence. 2026-10-04: integration3b3ca218 (tree=f8822f54; includes merged384 recovery) published to existing383. Sole foreground PR watch active; exact130-source closure/313 focused+11 subtests/174 unchanged parent vectors recorded in the tranche review. CI3b3 canonical-installer failure reproduced: misplaced cache integration test imported backend Pydantic into minimal lane. Exact-file move6974c3c7 to backend suite; no production/golden/dependency change. Fresh two-lock CI environment540 installer tests and backend2+2 subtests pass; awaiting full first-head result then retry. First integrated-head CI3b3 completed14/15; only minimal-lane test placement failed. Exact-file move6974c3c7 published; sole foreground retry watch /tmp/sparkops-pr383-6974-ci-watch.log. PR383 final6974c3c7 passed15/15 and merged as55ab071f53011f391aa12c26858e0bda895e0a64; revertgit revert -m 1 55ab071f53011f391aa12c26858e0bda895e0a64. Immediately listedmain, six exact-head foreground watches running (seam37179226945, signer37179226939, runner37179226955, connector37179226944, secret37179226947, security37179226942). Full Go installer effect/rehearsal/deletion gate stillopen. All six merged383/main55ab foreground workflows completed successfully (exit0); exactrunresults /tmp/sparkops-pr383-main-watch-results.json. 2026-10-04: installed Go pruning tracer exercised on cp1rc46 through the standard read-only plan and apply commands under its identity lock. Retainsrc45/rc46,4architecture bundles,6controller component roots; no live process/mount conflicts, external cutover archives retained. Actual output and independent scope review at state/rc47-cp1-prune-dojahvsv; reported56.77GB file removal and free80.64GB after image cleanup. This proves the pruning slice only, not the full Go installer exit. 2026-10-04 06:35Z: sole implementation worker resumed existing native-s7-node-identity at6311bf6c; local/unpublished native identity owner passes518 observations (418 original,68 installed-entry decoder,16 surrogate-byte and16 UUID integer spellings). Root found and agent corrected truncated-surrogate and Python-int UUID refusal projection gaps; originals retained. Three -s/-m-style original call paths determine the private depth diagnostic, not a universal CPython stack claim. Fixed operation set and production identity path are being wired through module-derived verified cache selection; all Python ownership/deletion/integration/CI/guest gates remain pending. Root read-only ARM prerequisite check found canonical libvirt network and capacity; no guest allocated or production mutation. Checkpoint 2026-10-04: identity owner is parked clean at 9fcba6789f4aad42fe0622ace32fb3961657d9f0 in existing native-s7-node-identity; 518 native observations and real private-CLI parity pass; last Python check is 95 tests + 71 subtests passed with two documented registry/cache-test failures. No push, current-main integration, release build or live proof is claimed. Remaining exact work is in docs/installer/native-node-identity-checkpoint.md on that branch. Implementation slot moved to the existing Stage8 cutover stack. Held-branch disposition: native-s7-lab-baseline-custody@89310d51 is an exact stable-patch equivalent of main ancestor f50f52c2; no extra merge is needed. The unfinished identity checkpoint remains separate. See 2026-10-04-sparkops-native-held-branch-disposition.md. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. Pruning #361 62ebfe54, journal #364 b56ef7dc, rendering #371 d03a4663, pure consolidation #383 55ab071f are merged; live cp1 pruning proof covers only that slice. agent/native-s7-node-identity@9fcba6789f4aad42fe0622ace32fb3961657d9f0 is clean and now pushed for preservation, two unique commits/148 behind83ad; not ready to land/deploy. Next: read docs/installer/native-node-identity-checkpoint.md, fetch/integrate main in that existing worktree, enroll exact complete ten-file native closure, fix historical registry ownership and early-retire cache test required --bundle, finish cache adversaries/actual cached-entry acceptance, then obtain effect/consumer review. 518 native observations are local evidence only. Remaining installer effects/orchestration, two-architecture reproduction, full x86+ARM install/upgrade rehearsal and Python installer deletion remain. Other Stage7 heads are merged or exact patch-equivalent; native-s7-lab-baseline-custody@89310d51 is preserved but must not be merged again. See successor handoff for exact commands, branch dispositions and live release digests. Row 5b 2026-10-06: #416 merged 58b382b7 (main green incl. SPIRE seam): fleet capability profile checks native (_capability-profile, 707-case vector frozen from 84a6268b), Python checks deleted; every controller release ships its own digest-pinned installer/native/sparkops-installer for the socket-custody hook (owner decision), validator binds the declaration to the source archive, bundle checks the staged copy. Not deployed. Next build must use the updated build-candidate-components.py (passes --native-installer) on both builders. #415 merged d12b4330: docs/frontend CI scopes, time-balanced shards, root pytest.ini (Security Gate ~17 -&amp;gt; ~6-7 min). Row 5b-ii 2026-10-07: #417 merged 747c6869 (main green incl. SPIRE seam): fleet capability declaration chain checks native (_capability-profile ops head/chain; vectors capability-chain 379 + depth 24 + depth-errors 31 frozen from 58b382b7; 13,000 random + 386 near-limit probes, 0 differences; Python keeps lock/listing/custody reads/effects). Not deployed. Row 5c 2026-10-07: #418 merged 684862c5 (main green incl. SPIRE seam): controller upgrade validators native (_controller-upgrade-plan ops release/operator/plan = release_changes, operator_change incl. the --update-workers transition, plan_changes; fleet_worker_transition.validate_change deleted); shared fleet_worker_config stays Python with captured answers/exceptions re-raised by index; passing replies bound to the documents; runner_file_effects and rollback_operator stay Python with the upgrade effects (P5). Vector controller-upgrade-plan 335 frozen from 747c6869 (Go replays 290); 12,000 random + 111 sort probes, 0 differences; Astra 3 rounds (r1 P1 forged-deletion reply fixed). Net Python grows ~110 lines (adapter) until P5. Not deployed.\n\n\n8 Go runner supervisor\ndone 2026-10-04; native supervisor deleted Python replacement and final fleet/CI/isolation gates passed\ndesign\nScope covers runner.py and its two clients, retaining accounts, broker protocols, attested client, lane priority and isolation. The prerequisite native path now has installed same-controller Python/Go parity, actual journal replay, public controller/node upgrade, cold boot and live cp1/four-DGX proof. Root authorized the S5 agent to prepare the approved thin read-only Stage8 tracer after completing its broker source gate. Production supervisor rollout remains sequenced after3b and requires actual lane/isolation/cleanup proof. The agent has frozen26 additive Python diagnostic outcomes for both profiles and begun the native read-only status/doctor tracer; no production runner mutation yet. Full6/7 and8 exit criteria remain open. Sourcecheckpointdc01d30 deletes269 original runner.py lines plus status-client bodies and packages the same-release native binary without a service switch. Root review caught GoUnicode17/PythonUnicode15 printability drift and relativePATH lookup parity; S6 owns sharedPython15 semantics and S8 will consume it. Native release reproduction, source review follow-up and live lane proof remain pending. Current source checkpoints: readonly tracer PR378 local301ba847 freezes389 original outcomes and deletes269Python lines; unpublished lifecycle cutover246b3c07 retains original Python scheduler/clients for rollback and switches only ExecStart through additive successors (18 fleet and2 standalone cases). Focused117Python+142subtests and pinnedGo pass; actual sudo cancellation probe exposed root children outliving a killed monitor, so SIGTERM forwarding and compiled bounded-cleanup proof are being corrected before publication. Postproof deletion checkpointc639b6d6 is preserved but not selected for preproof rollout. Final source/CI/native reproduction and actual lane/cleanup/isolation proof remain open. Compiled sudo cancellation defect corrected at54c20d3f: SIGTERM reaches owned monitor/root children; actual bounded compiled probe returns0.501s with all owned PID/start identities absent, versus original orphan-until-timeout behavior. Unit bytes and all prior oracles preserved; installed cancellation proof still required. Admin checkpoint2edeee04 is local/unpublished with145 native cases; postproof deletion remains withheld. ExistingPR378 localf8b0fd3092864a4917fa9ba835643172d7312a30 now integrates reviewed383/recovery (mergee356acf9 followed by actual conftest catalog pin). Root reviewed exact118\u2192130\u2192144 closure chain and refusal tests, no finding. Focused376 tests+58subtests passed with one initial uncommitted-HEAD exporter refusal; after commit exporter/catalog9tests+11subtests passed.185 parent golden comparisons unchanged; service unit/lifecycle and native Go implementation sources unchanged. Held/unpublished; final CI/reproduction/live gates remain. Other lifecycle/admin/deletion worktrees untouched. 2026-10-04 06:13Z: existing PR378 published at c54aa8da39fca28987e2f3a3ca7e472c933bb2f1, integrating merged374/main9b with byte-identical tree to revieweddbb01789. Additive51-case original-Python native network readiness oracle and producer hashes independently verified; only10 old native doctor cases superseded, all originals retained. Root and independent Astra review clear. One foreground CI watch follows this exact head; current native reproduction and installed diagnostics remain pending, and service-loop cutover stays sequenced after6/7/3b. 2026-10-04 06:25Z: PR378 merged as0eefe57d3ba34acf00c4a03d7be421427f16c764 after16/16 current CI checks and exact-current-source two-build reproduction on both standard builders. ARM30d62724\u2026/x868fd9062b\u2026 independently validated against140 source inputs/full build record; both static and builders shut off. Revert git revert -m1 0eefe57d3ba34acf00c4a03d7be421427f16c764. Seven main foreground watches underway; runtime/installed diagnostics and later lifecycle cutover remain open. Evidence pr378-c54-reproduction-ly7uh1m2 and updated PR378 review. All seven exact-main0eefe57d foreground workflows passed: Security37182580217, Secret37182580260, Runner37182580234, Signer37182580204, Connector37182580224, seam37182580216 and Rust37182580233. main-watch-results.json records exit0 for each; this closes378 source/CI/reproduction, not the installed Stage8 gate. Convergence 2026-10-04: existing clean native-s8-runner-lifecycle-cutover@54c20d3f is resumed against current main 0eefe57d; this is the pre-proof branch retaining Python lifecycle/client rollback. Held native-s8-runner-job@c639b6d6 and native-s8-runner-admin@2edeee04 are post-proof deletions and remain held until native installed jobs/cleanup are proven. All three predate #374 host INPUT effects/v2 retirement and #378 native readiness; those must survive integration. One implementation worker is active; identity work is checkpointed. Priorities are runner convergence, remaining Stage3b clients, disposition of held branches, then installer mainline. This ordering does not waive remaining Stage6/7 or installed proof gates. 2026-10-04 cutover publication: PR385, exact head 13ddb95653e914b54a35673bd18fbdbb02b6325d, now carries the binary, 18 fleet + two standalone ExecStart-only successors and preserved Python rollback. Independent review corrected mutating HTTP redirects; 49 additive real mTLS cases and the 62 original legacy cases pass. Final ARM reproduction passed twice; x86 retry follows a disk-capacity preflight refusal and exact task-owned superseded-build retirement (retained artifact hashes checked). One foreground PR CI watch is active. Source/CI/installed lifecycle/deletion gates remain open; evidence state/s8-cutover-lnxyn080/ and 2026-10-03-sparkops-native-s8-cutover-review-packet.md. PR385 first-head result: 14/16 passed; only minimal-lane pytest import and stale Python ExecStart assertion failed. Test-only d6121a8d passes 565 minimal unittest tests and ten round trips; complete runner build source is unchanged from both-architecture reproduced13ddb. One final CI retry follows; no installed cutover yet. PR385 merged 07:50:14Z: final d6121a8d passed16/16 in the foreground and merged as c25a09982c6d7cba8a4b05b68576137d8af94a55; revert git revert -m 1 c25a09982c6d7cba8a4b05b68576137d8af94a55. Immediately listed main; seven exact-merge foreground workflows are running. Signed rc48 is being built from that merge in parallel; no production change until main checks pass. Independent review 2026-10-04-sparkops-pr385-review.md; all evidence state/s8-cutover-lnxyn080/. Main proof: all seven exact-c25a0998 workflows passed in foreground (pr385-main-watch-results.json). rc48 build preflight first refused insufficient space; exact retained S8 build roots and two completed S7 x86 lab candidate outputs were hash-matched to local retained artifacts/complete bundles and retired. Retry passed both8GB capacity checks and is building; production remainsrc47. rc48 controller live 08:14Z: standard cut/upgrade from exactc25a0998 completed; independent installed manifest reports0.1.17-rc.48/c25a0998 and all five canonical health predicates true. Signed release set b21f071463eb93096cd57538feda0867fa4a4a2577e397460457bb547c81b08d; both runner artifacts match independent reproduction, all five attested runner-client hashes remain unchanged. Standard four-DGX upgrade is now running. Runner service cutover and live lane/lifecycle/deletion gates remain pending. Four-host upgrade actual result: dgx1/dgx2 upgraded to node4b7061e8df30 and authenticated SPIRE jobs job_34ce423fdf168db01351d3af/job_78fda8ed8aec8087e3d84d42 passed. dgx3/dgx4 were left unchanged by the standard refusal because their work_client attestation differs; no reenrollment attempted. Their node/client cutover remains with final Stage3b, avoiding a repeated identity change. Runner replacement is independently supported while retaining node attachment, so Stage8 proceeds without misreporting four upgraded nodes. Exact output rc48-fleet-upgrade.log retained. rc48 runner replacement defect observed: dgx1 and dgx3 installed the c25 native runner files and stopped/archived their Python supervisor, then the controller refused remote node release differs from its recorded attachment. Cause: runner-grant validation compares with immutable original attachment facts but ignores subsequent verified node-upgrade receipts. Node agents/routers remain independently healthy on all four and DeepSeek is ready. Native image preparation is underway; these two runner services remain stopped pending readiness. Existing runner-client executable hashes remain unchanged. A narrow receipt-bound installer correction is being reproduced; no controller records or SPIRE identities are hand-edited, and no completed runner attachment is claimed. Fresh image gate: dgx1/dgx3 ARM scans refuse current lock/image (fixable high OpenSSL/urllib3 and critical/high PyJWT); no approval copied and neither supervisor started. Generated lock correction changes only PyJWT2.13\u2192declared2.15 and urllib3 2.7\u21922.8; source integration pending. zynserver runner replacement completed with all five authority bindings current; canonical fresh build+scan passed image0076c60b91ec, native runtime start/proof next. dgx2/dgx4 original Python CI supervisors remain active. All application/node/router services remain healthy. Evidence in the same S8 directory. First native installed lifecycle proof: zynserver c25 binary9d6eef1e is active/enabled under unchanged UID988/GID982 and attested client71b8666f; actual unit bytes differ only in ExecStart. Fresh scanned image0076c60b91ec approved and native doctor all checks true. Actual GitHub main-lane cancellation run37189368905/job111398159179 passed exact job/authority/container/isolation proof and first natural-cleanup observation (no manual cleanup; foreground cancellation status recorded). Immutable reference plus raw captures retained in S8 evidence. Timeout, success/reuse, SIGTERM, other lanes and ARM remain pending. Reviewed candidate recovery: existing branch head698e25a1 (pushed, no new implementation branch) contains13e4eec1 receipt-bound preflight/retry correction and a separate two-package ARM lock/OpenSSL-floor change.137 focused +565 installer +39 auth/artifact/CI-env tests pass; independent reviews clear; all Go and frozen vectors unchanged. Standard signedrc49 candidate cut/upgrade starts before PR CI because exact checkout/image lock requires candidate image preparation first; this is a bootstrap ordering change, not a CI exemption or merge. Old-image ARM supervisors will be drained before publishing lock-changing CI. Native timeout run37189453362/job111398412961 has explicit one-minute timeout annotation and passed naturalcleanup. Native SIGTERM proof running; observed stop1.817s/exit143, full cleanup/restart not yet claimed. SIGTERM gate failed honestly: run37189571124/job111398760546 stopped native supervisor in1.817s/exit143 and removed local container/processes, but authority registration7772 remains removing and GitHub marks the runner offline/busy. Exact service error: runner is still finishing a job; removal deferred. Six observations failed before guarded restart; no clean-shutdown proof claimed. Root now cancels/reconciles this owned failed probe as recovery, separately from proof. Retained Python also force-removes and lacks daemon SIGTERM cleanup, so bounded graceful container shutdown is being diagnosed as an inherited product defect. Candidate rc49 stopped preflight atARM5GB&amp;lt;8GB before compilation/signing/deployment; cp1 remainsrc48, and only verified retained build outputs are eligible for capacity recovery. Failed-probe recovery: ordinary cancellation then GitHub force-cancel completed run37189571124 as cancelled at08:46:59Z. Subsequent complete GitHub inventory and read-only authority capture both show the exact runner7772 absent; restored Go service is active. No direct database change, registration bypass or manual container cleanup. This recovery is separate from\u2014and does not pass\u2014the failed SIGTERM gate. Agent is implementing bounded graceful owned-container shutdown before forced cleanup with a real delayed-report regression on the pinned ARM builder. Native reuse proof: actual Rust build run37190160698/job111400480068 completed success under c25 Go supervisor after cancellation/timeout/recovery, with foreground watch0 and naturalcleanup verified. Native main-lane success, cancellation and timeout are now evidenced; SIGTERM repair, ARM and remaining lanes still open. Exact rc47/rc48 builder build+candidate copies were retired only after local/remote complete signedbundle hashes, clean exact-source checks and root process/fd/maps/mount checks; four literal paths per builder, receipts retire-rc47-48-9xo6qe8y. Retained archives/sourcebundles/toolchains and active SIGTERM scratch were preserved. Latest recovery checkpoint: commits13e4eec1/698e25a1/55cf74c1 repair verified-upgrade runner binding, fresh ARM image dependency findings and interrupted-job reporting. Independent review clear; focused137+565+39+6 tests and pinned ARM runner tests/vet pass. No old vector changed. Standard rc49 candidate build/sign/upgrade from55cf74c1 completed09:23UTC; set789fb0a46d63521ad41cf503beb8a74620350532c6856966db02833add15b320. Both architectures reproduced twice; independent cp1 source/version and5/5 health pass, all4 unchanged Go node/router services remain healthy. DeepSeek cross-review adjudicated independently with no actionable finding. All5 runner replacements now pass. Corrected native SIGTERM run37192426376/job111407244663 passes exact live binding,15.388s stop, first-observation complete cleanup and guarded restart without manual cleanup; deliberately interrupted workflow endedfailure as recorded. Remaining fresh scans/ARM lanes, normal cancellation/timeout/reuse, foreground PR/mainCI and Stage8 deletion remain open. Review/evidence: 2026-10-04-sparkops-native-s8-cutover-recovery.md, state/s8-candidate-rc49-tx1ou3z_/. #386 now records the recovery. All5 native runner cutovers/fresh scans/doctor checks pass. Native quiet timeout37192867739 and cancellation37193018249 pass complete cleanup; actual ARM and native PR jobs111407738267/111407706011 pass success+cleanup. First PR head foregroundCI completed12pass/2fail (stale round-trip fixture and missing successor-schema enrollment); reviewed commits28fcdc75/3038d146 repair test/inventory wiring only,59+72focused pass. Final CI and merge still pending. Inconclusive concurrent probes retained without passing claims. Native legacy build37193142520/job111409380792 now passes successful actual build, exact live binding and natural cleanup. Finalhead3038d146 has13/14checks passed at09:56UTC, seam integration pending; runtime remains55cf74c1. No merge/deletion claimed. PR386 final14/14passed, watch0; merged5679c4bf8c67d546f456cb91aecd80390e05fa9c at09:57:49UTC, exactmainCI foreground. Revert source: git revert -m 1 5679c4bf8c67d546f456cb91aecd80390e05fa9c. Operational audit: dgx1service/doctor pass but claimdenied by unresolved pendingJIT from23:29UTC(job111316821507); actualdgx1execution unproved, supportedreconciliation pending. No direct authority-state mutation. Dgx1 exact supported pending-registration reconciliation succeeded(no remote runner existed); SBOM111411452840 and Go111411452821 then completed success. No restart/directDBedit. Concurrent strictcapture remainsrefused on knownsame-label GitHubassignment mismatch; not counted as fullproof. Nativemain37193819444/job111411418802 passes exactlive+naturalcleanup atworkflow5679/installed55cf. All6merge-triggeredworkflows5679passed(eachforegroundwatch0; separate manualdispatchcollector correctionretained). ARMlegacy37194212719/job111412582417 andmain37194271286/job111412750620 pass quietexactlive+success+naturalcleanup ondgx1, closingitsbindinggap. Bothprofilesall3lanessuccessproved; ARMinterruptionproofs+Pythondeletionstillpending. Installedlifecyclegate nowpassesall12cases(6perprofile): ARMcancel37194345294, timeout37194423936, SIGTERM37194532163/job111413531567(dgx2,15.383s exit143,completecleanup+guardedrestart). DeliberateSIGTERMworkflowfailure iscleanupproof,notsuccessfulbuild. Sealed installed-lifecycle-gate.json SHA48288690b9d916573d5e1e9557d2b9e31a89d8028b6dc55b3e79db0f4939a600,280hashedartifacts. DeepSeekready10:11:30UTC. SolewriterstartedPythonlifecycle/clientretirementfrom5679; nativeadministration/fullrunner.pydeletion andARM/degradedINPUTstillopen. #387, head dacfa4ff8df89dbeb63500c4b3c8e737289b2ab5, now opens the post-proof lifecycle/client retirement: 21 symbols, both clients and orphan codec deleted; current/historical packaging guarded; obsolete SSH effects retired. Local 442 focused +5 installer +2 rollout checks, inventory, scoped pins and Ruff pass. Both independent Astra reviews and adjudicated DeepSeek review clear. All149 Go source/module and135 frozen files unchanged. spire-acceptance applied; native consumer/full suites running in foreground CI. Evidence: state/s8-lifecycle-retirement-yz8ngmz2/. Native administration/full Python deletion and ARM INPUT follow-through remain. PR387 first-head foreground CI completed12/14pass; acceptance37195555049 and seam37195555052 both refuse the same deleted Python test path in check9. Repair4a209c8a enrolls immutable client pins, real native CLI tests and the complete native runner package under the existing pinned toolchain; 60 focused tests/schema/Ruff pass. No Go or frozen bytes changed. Independent repair review found a fixture-only request-counter race exposed by the new package race gate;7ae51b7f synchronizes it, second review clear. One Go test object changes; production Go and frozen vectors remain unchanged. Head7ae51b7f foregroundCI exposed an existing real-clock assumption: Windows default-target test expected elapsed0 but measured0.001. Exact injected elapsed reproduces it; a8b1af35 fixes only that test clock, all51 module tests pass and root review is clear. Head7ae finished13/14pass with both SPIRE lanes green (acceptance37196302150, seam37196302142); only the reproduced clock-test flake failed. Reviewed a8b1af35 now published for final foregroundCI; no merge claimed. Next admin baseline is sealed at state/s8-lifecycle-retirement-yz8ngmz2/admin-capture-4cl4g54n/:90 cases, manifest101cc90346ba920acf7001a0c0065fd4bae1d7169882b903f2a3909c9c664226, real current Python\u2192prebuilt native composition in six private namespaces; no host services or compiler invoked. PR387 final a8b1af35 passed14/14checks, foregroundwatch0; mergedefca101de4f7a00fb345d489f6274326e08a58fa at11:03:38UTC. Revert: git revert -m 1 efca101de4f7a00fb345d489f6274326e08a58fa. Exact-main workflows listed immediately and are watched in the foreground. New native-s8-runner-administration worktree is fast-forwarded to this merge with its own validated environment; the sole writer may implement the remaining native admin/publicCLI/consumer deletion tranche. Full Stage8 and ARM INPUT gates remain open. All five merge-triggered efca workflows passed in foreground: Security37197430412, Runner37197430435, seam37197430422, Rust37197430403, Secret37197430416. Receipt state/s8-lifecycle-retirement-yz8ngmz2/main-push-workflows/pr387-main-watch-results.json; each watch exit0. Initial monitor incorrectly required optional Dependency Graph from the preceding dependency-changing merge; only read-only monitors were restarted, no CI cancelled, correction retained. PR387 source/CI gate closed; no new production release claimed. Administration first checkpoint, 2026-10-04: exact committed e1e38d546ec6f0cffdc9e094a16a420488b50cf8 tested in the pinned ARM builder from a fresh bundle checkout; contract and runner-supervisor packages passed, command package failed two frozen parser cases (bare --, empty --policy=). No artifact published. Independent read-only review also found missing daemon-owned scanner cleanup on cancellation; fix is required before publication. Original golden captures are retained, Python-consumer deletion remains underway. Feedback, formatter patch, test output and powered-off-builder receipt: state/s8-administration-0_fkerdg/arm-checkpoint-lugfyuyh/feedback-receipt.json. Administration deletion checkpoint a3098140: final two Python files removed in the unpublished candidate; pinned ARM formatting and three Go packages pass, runner reproduced twice as a972910e5dc355b8d4fa8d03cd9b787baead4cbe86c0cbfd7025adeca87c2212. Exact-checkpoint native consumers: 366 passed +136 subtests, three standalone-install subfailures caused by the new rejecting install fixture; narrow test seam repair pending. Actual node-inspection/native-public-CLI integration passed. Scanner cleanup still pending, no production change. Receipt: state/s8-administration-0_fkerdg/arm-checkpoint-ogreg99r/feedback-receipt.json. Administration actual CLI replay (a3098140): 82 installation/public-CLI cases executed with the reproduced binary in six isolated namespaces: return codes, stdout, effects and file results match Python for all 82; only the nine retained Python traceback messages differ, with bounded native stderr captured for additive successors. Eight service-start/stop cases also match apart from individually bounded wall-clock timestamps. This is synthetic process proof, not installed fleet proof. Sealed 1,580-file manifest state/s8-administration-0_fkerdg/native-cli-capture-0o_e8lxp/manifest.json, SHA b7d79757eddb80e3389d2c6b005183a640b97e521c10b740fab9d777f76e59fe. Fresh scoped CLI readback at 11:32 UTC: four healthy DGX heartbeats, DeepSeek TP4 ready generation5; observed 10/54 capability inventory drift is the documented observation/adoption split, with supported post-cutover reconciliation recorded in state/s8-administration-0_fkerdg/capability-drift-readonly.md. Final administration review checkpoint 0eff20de: two independent Astra reviews clear; DeepSeek cross-review completed and five findings independently rejected against actual source (unresolved scanner creation returns before archive unlink; nonce failures occur before create; option-first public grammar intentionally preserves argparse abbreviations). Review receipt state/s8-administration-0_fkerdg/final-independent-review-adjudication.json. Both pinned architectures at substantive f165e658 pass tests/vet and two-build reproduction; actual old-method interruption regression fails twice because a separate daemon-owned process survives archive unlink. Only one-space test formatting failed and is corrected in 0eff20de; final-source validation pending. Scanner cancellation now owns exact ID/name/nonce/image cleanup, retaining archive with visible diagnostics on ambiguity; nine measured diagnostic and thirty effect successors added without editing any preexisting golden. Exact reviewed retirement of three completed ARM scratch checkouts restored builder capacity; receipt retire-checkpoints-q80f71jy, all retained local evidence hash-verified. No PR or deployment yet; installed administration and ARM INPUT remain open. Administration PR #388, head 0eff20de, opened with spire-acceptance: final source passes565installer,220vector/closure,368actualnativeconsumer tests+139subtests, inventory/Ruff/boundary. Final90actualCLI/service replays all match retained reference (bounded timestamp field only); manifest final-cli-replay-qjll4kdu/manifest.json SHA93cad7d6c6ebbdbc51ac5d649c8ef1a09d3155cc5102db40e4c68f3fa440d7ee. All135existingfrozenfiles verifiedunchanged. FinalARMtests/vet/format/reproductionpass; AMDtests/vet/formatpass but finalartifactbuild failed on99%-fullbuilder (1,019,445,248Bfree); capacityrecovery+buildretrypending, not countedpassed. CI watchedforeground. Productionremainsrc49. PR388 first-head CI completed15/16passed, foregroundwatch1: only shard1 failed before tests because the environment catalog pinned the old conftest.py source. Reviewed catalog-only repair 6c7388d17d617c34fbd622341cd8df9cb3753c96 updates the committed source/hash and isolation guidance; catalog10profiles22sources and830tooltests+26subtests pass. No runtime/frozenbyteschanged. Repairpushed; finalCIwatchforeground. Exact0eff AMD64two-buildretry nowpasses after reviewedretirement oftwo completed scratchtrees (free1.019\u21923.495GB), SHAe51c0c9b4580826f264c521afbf4fd76906814c3353f9832a25322e09d51a1db; ARM900ecf058bf3f098cb0c46cd4a38955451df4921b01750d928e227728e37d1e5. Bothbuilderstatesverifiedoff. Consolidatedruntimeevidence state/s8-administration-0_fkerdg/final-runtime-validation.json. Fresh12:24UTC scopedread: allfourDGX andzyn heartbeatshealthy, DeepSeekTP4readygeneration5; powered-offunifi-workerremainsexpectedstale. Installedadminproofdriverprepared, notexecuted; productionunchangedrc49. PR388 merged: final 6c7388d17d617c34fbd622341cd8df9cb3753c96 passed16/16 with foregroundwatch0, merged as ac014ba1604593862f5cb245ceaa544d0b4d77ac; revert git revert -m 1 ac014ba1604593862f5cb245ceaa544d0b4d77ac. Exact-main workflows listed immediately and watched in foreground. Reviewed retirement of six ARM and five AMD completed duplicate build roots restored8,679,751,680B /8,793,751,552B free; full retained candidate archives were independently hashed before deletion. Receipts state/s8-administration-0_fkerdg/release-duplicate-retirement-01vutaod/. Installed administration and ARM INPUT remain open; runtime remainsrc49. PR388 exact-main gate passed: all seven ac014ba push workflows completed successfully in foreground (Security37203205070, Secret37203205033, Rust37203205043, Runner37203205106, Signer37203205029, Connector37203205072, seam37203205061); main-ac014ba1-0_8lsi6w/watch-results.json. Standard rc50 build/sign is running from this exact merge (rc50-cut-w1ndt45q); no production switch yet. Fresh12:54UTC scoped read shows allfour DGX+zyn heartbeatshealthy and DeepSeekTP4 readygeneration5. rc50 signed build complete: exactac014ba release-set56819177ee376f5553454837a1fa1b0e184fad99042ff03a286250cb4a88b03b passes rc49 upgrade assembly; both packaged runner binaries match independent ARM900ecf05/AMDe51c0c9b reproduction. Standard cp1 cut-and-upgrade is running. DGX1 andzyn supervisors intentionally stopped for admin proof; old images/approvals exported and fully verified (rollback-verified-bbg6bg7i). Original helper refused its own sticky-parent backup path after export; narrow private-task reader and exact-byte receipt capture corrected only the evidence tooling, with original failures retained. No live administration success claimed yet. rc50 controller live: standard cut-and-upgrade exit0; independent installed manifest ac014ba/0.1.17-rc.50 and allfive canonical health predicates pass (rc50-cut-w1ndt45q/cp1-verified.json). Both old runner images/approvals independently copied and hash-verified locally (rollback-local-copies-xt10kyu0). Standard four-DGX node upgrade running; target runner supervisors remain intentionally stopped for admin proof. rc50 node upgrade result: standard command exit1 because dgx3/dgx4 retain their attested work_client and correctly refuse in-place change; no reenrollment attempted. DGX1/dgx2 upgraded to node6be1991dd1ce and authenticated jobs job_a57818d3dc77c40fa8c22b7d/job_7d77daf264779e6f5586bb84 passed. Exact stdout/stderr retained inrc50-cut-w1ndt45q. Remaining node/client switches stay with combinedStage3b. rc50 installed administration preflight: DGX1 canonical runner replacement completed (rc50-dgx1-replace-gqt6x4mx), retaining attested client and account; exact installed binary900ecf05 and ARM four-file recipe closure match signed ac014ba, actual unit changes only ExecStart. DGX1 and zyn supervisors remain intentionally stopped; all four node/router services and DeepSeek were healthy in rc50-fleet-readback-vp1eyg6n. Both rollback images/approvals have independently verified local copies. Two preparation assumptions were corrected in additive reviewed helper successors: Docker-save archives are root0600, and canonical installed recipes are ARM4/native6. First build preflight (rc50-dgx1-admin-8dh1w9s8) refused before any native operation because socket units omit MainPID; narrow helper correction pending. Installed admin proof is still open; no failed attempt is counted passed. DGX1 installed administration passed: all six actual cases (service-account build/successful scan; scanner failure and SIGTERM under service account and root) pass on signedrc50/ac014ba. Exact scanner/process/archive cleanup, unchanged approval on failure, expected exits0/1/143, and unchanged baseline services/model containers proved. Sealed rc50-installed-admin-sequence-ck0piyps/dgx1-administration-gate.json SHA180b743d00eb451abcb3471600543a9ce91ba45e4974a62aaa0636888d3ca36f; original preflight refusals retained separately. Doctor/service restoration and actual rc50 CI job, plus x86 administration, remain pending. Both rc50 administration profiles proved: zynserver canonical runner replacement retained its attested client, recorded exact old private-network/INPUT retirement, and changed only unit ExecStart. Allsix x86cases passed, including fresh image2dcec375 build/scan and natural cleanup for both interruption actors. Both DGX1/zyn now pass doctor and run active/enabled with independently observed exact loaded source/hash/account; restoration receipts rc50-dgx1-restore-tktfmkoh and rc50-zyn-restore-g0wxcajn. Zyn sealed administration receipt is rc50-zyn-admin-tbv4z7xb/zynserver-administration-gate.json. Foreground actual rc50 CI proofs pending; remaining three DGX supervisor binaries stayrc49 until final INPUT cutover. rc50 native CI passed: actual Rust build37207062171/job111450346744 completed success, foreground watch0, exact rc50 process/account/image/authority binding and natural cleanup verified (rc50-ready-lifecycle-v_u_cuu7/dispatch-ac014ba1-native-main-build-aff10d8a-result.json). ARM canaries37207012813(dgx2) and37207160711(dgx3) both succeeded/watch0 but ranrc49, so neither is counted as new DGX1 proof; original assignment refusals retained. Another quiet dispatch is running. rc50 administration+CI gate closed: third quiet ARM dispatch37207308236/job111451085411 ran onDGX1, completed success/watch0 and passed exact live binding/natural cleanup. Together with native37207062171, both profiles now have allsix installed administration cases and actual successfulCI; sealed rc50-administration-and-ci-gate.json SHA3b4f837378969621debbb742a4b76c0e441bff1546102486a1d28e4e5dcc449e. RemainingStage8 is reviewed ARM/degraded INPUT source6b0522c7, isolated kernel proof and final fleet cutover; not marked complete. ARM INPUT follow-through checkpoint: clean b2ad80c17e51aa6f5040fb948f2644608012e945 preserves149 historical vector files and adds146 measured successors. Independent source/capture reviews clear; root found and writer deleted28 lines of now-unreachable legacy ARM relay effects/helper. Prior3d ARM full package/vet and two-build artifact15d217 pass; 260 Python compatible-artifact checks+97subtests at6b pass, with one named node-inspection case deferred to normalCI. Final6b component build failed a Go command with innerstderr lost; cause is not established and no finalartifact is claimed. Both builders held for independently verified duplicate-output preservation/capacity recovery. Exploratory15d real-kernel VM normal/degraded/normal matrix passes, including exact positive-only fixture counts and model-like witness continuity; it is not the final b2 artifact gate. No production firewall change or Stage8 completion claimed. Builder capacity recovery completed,2026-10-04: root reverified four retained archive hashes, then verified and retired exactly seven completed roots per existing builder using reviewed literal scripts. Measured free space is9,390,305,280B x86 and9,460,285,440B ARM; both shutdowns verified. Evidence state/s3b-x86-capacity-6iiZ8WdA/root-retirement-ldkc7ton/completed.json. Signed rc49/rc50 releases, rollback exports, source bundles, shared inputs/toolchains and unrelated work remain. Final b2 ARM build and Stage3b55-case x86 trace resumed under separate builder leases; results not yet claimed. PR389 and final packet proof: #389, exactb2ad80c17e51aa6f5040fb948f2644608012e945, is open withspire-acceptance. ExactARM/AMD full runner package+CLI tests/vet/format and two-build reproduction pass; artifact74879274d05d1da55be5a34bcbb2f572637e76126ecb0dfac621ac509e2eb17b ARM,9eeeec6068836e3118f66da2857684bdfac29266a5218a8eef3092ca73d8825e AMD. Root independently verified each artifact and170source records. Exact-b2 Pythonconsumers260+97subtests pass; one native-node case is explicitlyCI-only. Precise frozen count:149originalfiles(148data+README) unchanged; only registry metadata differs outof150baselinepaths. Final real-kernel normal/degraded/normal matrix passes60TCP/UDPnegative probes, each withrejectcounterdelta1, publicDNS/TLSHTTP200 and model-like witness/daemon continuity;535evidencefiles independentlyrehashed in state/s8-arm-packet-final-u_hu4ttq/root-proof-verification.json. No rawICMP, actualGrype-in-degraded or productionfirewall claim. VMdomain/files/port removed; canonicalreceipt waitingonlyforDHCPexpiry15:33:58UTC underpacketagentcustody. InitialPRCI Gojob111459153015 failed newtestfixture AF_UNIX path-length underlongCI TMPDIR; production code unchanged, test-only correction inprogress, wholeforegroundCIwatch stillrunning. No merge/deploy claimed. PR389 initial CI complete: exact b2 head finished15/16 current checks; only Go failed because the new socket fixture exceeded Linux sun_path under CI&amp;#39;s long temporary root. Foreground watch exit1, state/s8-arm-input-evrvousg/pr389-b2-final-ci.json. Test-only successor325744a4 shortens the fixture socket root and adds a long-TMPDIR regression; pinned old-red/new-green validation is underway. No merge or deployment yet. Final b2 standalone-build scratch was archived/rehashed and retired by literal identity on both builders; receipts state/s8-arm-input-evrvousg/completed-build-retirement-kdc41uq0/root-execute-_7jjb_pn/, measured free9,390,055,424B x86 /9,459,294,208B ARM and both initially shut off before granting the focused x86 lease. PR389 merged2026-10-04: final325744a4 passed16/16 exact-head checks in foreground (watch exit0), with pinned old-fixture-red/new-fixture-green evidence. Normal merge83ad466b47d3ca895513eb160aae2087cffab090; revert git revert -m 1 83ad466b47d3ca895513eb160aae2087cffab090. Seven exact-main workflow watches are running and standardrc51 two-architecture build/sign/assembly has started; deployment remains gated on all main checks and independent artifact comparison. Evidence state/s8-arm-input-evrvousg/pr389-325-final-ci.json, pr389-merge.json, rc51-cut-rncjof9m/. Final live proof helpers are independently reviewed/sealed at state/s8-arm-live-proof-_z8oqx4y/manifest.json (58bca97c402b402b5110ce2d1e336e503e18348eac5e3f248d53ace704f802fc); no live ARM INPUT or Stage8 completion claim yet. 2026-10-04 rc51 checkpoint: #389 merge 83ad466b47d3ca895513eb160aae2087cffab090 passed 16/16 PR checks and 7/7 exact-main foreground workflows. Signed two-platform release 0.1.17-rc.51 set SHA256 d052d2e8b2653a1c72a586ffa5cc969fa1a836adc2877fbe2befac3af10b42ca; both runner binaries reproduce the tested b2 bytes, 170 source files/architecture independently checked. cp1 standard upgrade succeeded and independent five-part doctor passed. All four ARM before doctors and corrected read-only continuity baselines captured; initial optional Docker Health lookup refusal and root output-directory invocation error preserved. Evidence: state/s8-arm-input-evrvousg/rc51-cut-rncjof9m/ (main watches, release verification, cp1 verification, fleet-capture-corrected-7d9n44ys/). Node upgrade is running; runner replacement, actual ARM packet/reuse and current native-job proof remain open. rc51 installed proof (2026-10-04): all four ARM replacements/scans/ready doctors passed; unchanged containers20/21/73/11 and full shared-engine/network continuity proved in state/s8-arm-input-evrvousg/rc51-cut-rncjof9m/fleet-capture-corrected-7d9n44ys/fleet-continuity.json; DeepSeek remains ready. Zynserver replacement/build/scan/doctor passed with preserved rollback; actual Rust CI 37214736825 succeeded and natural cleanup proved. First ARM packet check 37214657087 refused an invalid helper assumption of one fabric address before probing; cancellation/cleanup passed, packet gate remains explicitly open pending both-address successor and later same-host success. Handoff 2026-10-04T16:29:17.647165+00:00: Gate closed with state/s8-final-gate-PLgAwk0z/final-gate.json, SHA256 ce12bd4b8ba0669679337b553c59a2e866d10c4790fda31ac4d8268adee83643; root independently rehashed1176 evidence files. #387 efca101d, #388 ac014ba1, #389 83ad466b are merged; last PR16/16 and exact-main7/7 passed foreground. Both profiles have real successful main/PR/legacy lanes and cancellation/timeout/SIGTERM cleanup, installed administration and source deletion. Finalrc51 ARM continuity passed allfour; native run37214736825/job111472844167 succeeded/cleaned. Corrected DGX4 packet/cancellation37215010050/job111473631917 passed publicDNS/HTTPS, gateway/both-fabric/remote denial with positive controls/counters and natural cleanup; later same-host37215958256/job111476398882 succeeded in a distinct container and cleaned. All three briefly paused idle supervisors restored; final16:19UTC checks show5 ready active/enabled runners, cp1doctor5/5, four active node/router/work clients and DeepSeekTP4ready. Packet VM fully retired including lease. Earlier refused/inconclusive observations and DeepSeek incomplete-overall-review limit remain explicit. No Stage8 PR/source/live gate remains. Next: retain evidence and keep Stage8 closed; old runner-job/admin prototypes pushed for preservation only, drop from landing queue. Separate3b dgx3/4 node identity refusal remains and is not claimed resolved. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\n9 Go controller authorities\nblocked; queue ownership and SQLite decisions outstanding; outside approved implementation\n\nneeds queue ownership decision Handoff 2026-10-04T16:29:17.647165+00:00: No open PR or native authority branch queued. Next step is an explicit decision establishing one work-queue owner and SQLite access under CGO_ENABLED=0, before replay/authority cutover design. No Stage9 fleet proof exists or is claimed. Privilege separation/Rust enforcement remain separate unscheduled work. The owner is drafting /home/meanaverage/sayhi/sparkops-iam-roles.md to replace the Stage6 legacy privileged boundary; do not act on that draft. This handover does not approve it or unblock Stage9. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\nPrivilege separation\nunscheduled; enforcement implementation not authorized\nproposal and effect inventory\nOwner separated this from Stage6 on2026-10-03PDT/2026-10-04UTC. Preserve exact legacy privileged boundary with additions refused; future signing custody, typed effects, recovery and queue ownership require separate scope decisions. No Go node sudo, broker enforcement or Stage9 writer change is authorized here.\n\n\n\n\n\n\n\nHow to read the numbers\n\n\nCount the file diffs\nSum GitHub\u2019s per-file additions and deletions for paths ending in .py and .go. Retrieve every file page. Include tests, tools, and support code; exclude other file types.\n\nKeep the scope explicit\nPR #330 establishes the native conversion program. The report includes every PR through #418. Unmerged PRs contribute only to the all-PR total. Every row matches the originating metrics table and an independent GitHub check.\n\nMeasure change volume\nA line changed in several PRs can be counted several times. These totals include rewrites and unrelated work. They do not measure final repository size or a one-to-one Python-to-Go conversion ratio.\n\n\nSparkOps Python-to-Go conversion metricsRepository \u00b7 Architecture decision \u00b7 PR metrics\n\nconst bodyRows=[...document.querySelectorAll('#pr-table tbody tr')];\nfunction filterRows(){const q=document.getElementById('search').value.toLowerCase();const state=document.getElementById('status').value;let count=0;for(const row of bodyRows){row.hidden=!(row.textContent.toLowerCase().includes(q)&amp;amp;&amp;amp;(state==='all'||row.dataset.status===state));if(!row.hidden)count++;}document.getElementById('row-count').textContent=count+' PRs shown';}\ndocument.getElementById('search').addEventListener('input',filterRows);document.getElementById('status').addEventListener('change',filterRows);\n// Wrap each numbered stage in a native accordion, preserving all source content.\nconst article=document.getElementById('roadmap-content');const headings=[...article.querySelectorAll('h1,h2,h3')].filter(h=&amp;gt;/\\bStage\\s*\\d+[a-z]?\\b/i.test(h.textContent));\nfor(const heading of headings){if(heading.closest('details'))continue;const depth=Number(heading.tagName[1]);const nodes=[];let n=heading.nextSibling;while(n&amp;amp;&amp;amp;!(n.nodeType===1&amp;amp;&amp;amp;/^H[1-3]$/.test(n.tagName)&amp;amp;&amp;amp;Number(n.tagName[1])&amp;lt;=depth)){nodes.push(n);n=n.nextSibling;}const details=document.createElement('details');const summary=document.createElement('summary');summary.textContent=heading.textContent;heading.replaceWith(details);details.append(summary,...nodes);}\nconst toggle=document.getElementById('expand-roadmap');toggle.addEventListener('click',()=&amp;gt;{const items=[...article.querySelectorAll('details')];const expand=items.some(d=&amp;gt;!d.open);items.forEach(d=&amp;gt;d.open=expand);toggle.textContent=expand?'Collapse all stages':'Expand all stages';});\n", "creation_timestamp": "2026-10-07T07:02:21.000000Z"}</description>
      <content:encoded>{"uuid": "f38d26d9-933d-4c3a-b598-5457b9e72ec6", "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/407b3dbbb68fb4b062f68fe0a085be3c", "content": "\nSparkOps Python-to-Go migration\n\n:root{--bg:#f6f5f0;--paper:#fff;--ink:#19372e;--muted:#66746d;--line:#e1e5dc;--teal:#23775e;--lime:#dfeec8;--orange:#bb5c31;--soft:#f0f4ed}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.6 -apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}a{color:var(--teal);text-decoration:none}a:hover{text-decoration:underline}button,input,select{font:inherit}.shell{max-width:1360px;margin:auto;padding:0 40px}header{border-bottom:1px solid var(--line)}.top{display:flex;align-items:center;justify-content:space-between;min-height:76px;gap:20px}.brand{font-size:19px;font-weight:750;letter-spacing:-.6px}.brand small{font-size:12px;letter-spacing:1.8px;text-transform:uppercase;margin-left:14px;color:var(--muted);font-weight:500}nav{display:flex;gap:28px;font-size:13px}nav a{color:var(--ink)}.hero{padding:70px 0 40px;display:grid;grid-template-columns:1.2fr 1fr;gap:70px;align-items:end}.eyebrow{font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--muted);font-weight:650}.hero h1{font-size:clamp(38px,5vw,68px);line-height:1.07;letter-spacing:-3px;margin:16px 0 20px;font-weight:750}.hero h1 span{color:var(--teal)}.hero p{max-width:590px;color:var(--muted);font-size:16px}.hero-meta{background:var(--ink);color:#fff;border-radius:16px;padding:28px 32px}.hero-meta a{color:#d8eab8}.hero-meta .eyebrow{color:#a8b9af}.hero-meta h2{font-size:20px;letter-spacing:-.5px;margin:10px 0 12px}.hero-meta p{font-size:13px;color:#b6c6bd;line-height:1.7;margin:0}.meta-row{margin-top:20px;display:flex;gap:8px;flex-wrap:wrap}.pill{font-size:11px;padding:5px 10px;border:1px solid #4d675d;border-radius:40px;color:#dbe7df}.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:0 0 22px}.kpi{padding:28px 30px;border:1px solid var(--line);border-radius:14px;background:var(--paper)}.kpi .value{font-size:39px;line-height:1.2;letter-spacing:-1.5px;margin:10px 0 4px;font-weight:650}.kpi .value.teal{color:var(--teal)}.kpi small{color:var(--muted)}.note{font-size:12px;color:var(--muted);margin-bottom:54px}.section{scroll-margin-top:24px;margin-bottom:54px}.section-head{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:20px}.section h2{font-size:27px;letter-spacing:-.8px;margin:0}.section-head p{margin:4px 0 0;color:var(--muted);font-size:13px}.tools{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.tools input,.tools select,.btn{border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);padding:9px 12px;font-size:12px}.tools input{width:230px}.btn{cursor:pointer}.btn:hover{background:var(--soft)}.table-wrap{border:1px solid var(--line);border-radius:12px;overflow:auto;background:#fff;max-height:680px}table{width:100%;border-collapse:collapse;min-width:1020px;font-size:12px}th,td{padding:13px 14px;text-align:right;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}thead th{background:var(--soft);color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;z-index:2;white-space:nowrap}th:first-child,td:first-child,th:nth-child(2),td:nth-child(2){text-align:left}tbody tr:hover{background:#f8faf6}.change{min-width:270px;max-width:370px;line-height:1.5;color:#43554b}.pr{font-weight:700;font-size:13px}.state{display:block;font-size:9px;color:var(--muted);margin-top:3px}.state.open{color:var(--orange)}.state.unmerged{color:#8a7072}.delta{font-weight:600}.reduction{color:var(--teal)}.growth{color:var(--teal)}tfoot td{font-weight:700;background:var(--soft);border-top:2px solid var(--line)}.table-info{font-size:11px;color:var(--muted);padding:12px 2px}.roadmap-card{background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden}.roadmap-top{padding:24px 30px;background:var(--soft);border-bottom:1px solid var(--line)}.roadmap-top p{margin:6px 0 0;color:var(--muted);font-size:12px}.stage-strip{display:flex;flex-wrap:wrap;gap:6px;margin-top:18px}.stage-strip span{background:#fff;border:1px solid var(--line);border-radius:5px;padding:5px 9px;font-size:10px;font-weight:600}.roadmap-content{padding:34px 40px;max-width:100%;overflow-wrap:anywhere}.roadmap-content&amp;gt;h1{font-size:25px;line-height:1.25;letter-spacing:-.5px;margin-top:0}.roadmap-content h2{font-size:23px;margin:32px 0 14px;line-height:1.35}.roadmap-content h3{font-size:18px;margin:28px 0 10px;line-height:1.4}.roadmap-content h4{font-size:15px;margin:24px 0 10px}.roadmap-content p,.roadmap-content li{color:#44564b;font-size:13px}.roadmap-content table{min-width:0;display:block;overflow:auto;max-width:100%;font-size:12px;margin:20px 0}.roadmap-content table th,.roadmap-content table td{text-align:left;min-width:130px;white-space:normal;vertical-align:top}.roadmap-content pre{background:#f2f4ef;padding:18px;overflow:auto;border-radius:8px;font-size:11px}.roadmap-content code{font-size:.9em;background:#f0f3eb;padding:2px 4px;border-radius:3px}.roadmap-content pre code{background:none;padding:0}.roadmap-content blockquote{border-left:3px solid #9db88b;padding-left:18px;margin:20px 0;color:var(--muted)}.roadmap-content details{border-bottom:1px solid var(--line);padding:16px 0}.roadmap-content details summary{cursor:pointer;font-size:19px;font-weight:650}.roadmap-content details summary::marker{color:var(--teal)}.method{display:grid;grid-template-columns:repeat(3,1fr);gap:28px}.method&amp;gt;div{border-top:2px solid var(--ink);padding-top:16px}.method h3{font-size:14px;margin:0 0 8px}.method p{font-size:12px;color:var(--muted);margin:0}footer{border-top:1px solid var(--line);padding:24px 0 38px;display:flex;justify-content:space-between;gap:20px;font-size:11px;color:var(--muted)}[hidden]{display:none!important}button:focus-visible,input:focus-visible,select:focus-visible,a:focus-visible,summary:focus-visible{outline:2px solid var(--teal);outline-offset:4px}@media(max-width:900px){.shell{padding:0 22px}.hero{grid-template-columns:1fr;gap:24px;padding-top:38px}.hero h1{letter-spacing:-2px}.hero-meta{padding:24px}.kpi{padding:20px}.kpi .value{font-size:31px}.section-head{align-items:start;flex-direction:column}.roadmap-content{padding:24px}.method{grid-template-columns:1fr;gap:20px}.brand small{display:none}}@media(max-width:540px){.top{align-items:center}.top nav{gap:14px;font-size:11px}.kpis{grid-template-columns:1fr;gap:10px}.kpi{display:grid;grid-template-columns:1fr 1fr;align-items:center}.kpi .eyebrow{grid-row:1/3}.kpi .value{margin:0;font-size:31px}.kpi small{grid-column:2}.tools input{width:200px}.roadmap-top{padding:20px}footer{flex-direction:column}.hero-meta h2{font-size:18px}}@media print{body{background:#fff}.shell{padding:0}.hero{padding:25px 0}.hero h1{font-size:40px}.table-wrap{max-height:none;overflow:visible}.tools,nav,.btn{display:none}.roadmap-content details{break-inside:avoid}.kpi,.hero-meta{break-inside:avoid}table{min-width:0;font-size:9px}td,th{padding:6px}}\n\n\n\nSparkOps Migration report\nMetricsRoadmapMethod\n\n\n\n\nNative component migration\nPython \u2192 Go\nA record of the conversion work across PRs #330\u2013#418, with the full stage plan, substages, and evidence.\n\nArchitecture decision 0047\nGo daemons. Rust broker.Python product plane.\nThe program moves installed security and runtime boundaries into native binaries while retaining Python for the product layer.\nPR #330\u2013#41882 pull requestsOctober 6, 2026\n\n\n\nNet Python lines\n\u22124,39328,736 added \u00b7 33,129 removed\n\nNet Go lines\n+52,10853,774 added \u00b7 1,666 removed\n\nMerged pull requests\n78 / 822 open \u00b7 2 closed without merging\nSummary covers merged PRs. These are diff-line counts, including tests and support code, rather than the repository\u2019s current line count.\n\n\n\n\nEvery pull request\nAll 82 PRs in the inclusive range. \u0394 = additions \u2212 removals.\nAll PRsMergedOpenClosed, unmerged\n\nPR / statusChangePython +Python \u2212\u0394 PythonGo +Go \u2212\u0394 Go#330MergedADR 0047: Go daemons, Rust privileged broker, Python product plane (native stage 0)180+18000\n#331Openrc.35 rollout follow-ups: model+recipe naming, fleet upgrade --all with on-demand workers776+71000\n#332MergedGolden vectors and a shared contract-bytes module for the inference routing table (native stage 1, tracer)6763+673000\n#340MergedNode agent contract vectors and shared readers, part 1 (native stage 1)928134+794000\n#341MergedSPIRE helper contract vectors and shared DSSE encoding, node agent part 2 (native stage 1)764163+601000\n#342MergedPrivileged broker modules onto the shared contract-bytes module, node agent part 3 (native stage 1)190361\u2212171000\n#343MergedCloud connector contract vectors and shared module copy (native stage 1)32764+263000\n#344MergedRunner supervisor contract vectors and shared module copy (native stage 1)21314+199000\n#345MergedInstaller contract vectors and shared module copy (native stage 1)477121+356000\n#346MergedRelease tools contract vectors and shared module copy (native stage 1)483237+246000\n#347MergedController backend contract vectors and shared module copy (native stage 1)394386+8000\n#348MergedProduct plane contract vectors and shared module copy (native stage 1)471371+100000\n#349MergedStage 1 follow-up: close the registry-to-vector loop, fixed-order writers, dsse_pae bytes805157+648000\n#350MergedStage 2: Go foundation \u2014 native module, contract package, Go CI lane53490+4441,9320+1,932\n#351MergedLifecycle plan payload through the shared encoder (stage 1 hand-off)183+15000\n#352MergedStage 3: ship the Go inference router in the node work release18310+1731,8940+1,894\n#353MergedStage 4: delete the broker v1 request contract and freeze the v2 request vectors3965,143\u22124,747000\n#354MergedStage 3: retire the Python inference server after TP4 cutover115916\u2212801240321\u221281\n#355MergedStage 3: pin UTF-32 decoder refusals000326+26\n#356MergedFreeze broker policy, resource and effect-fence contracts18483+101000\n#357MergedRemove timing and port-reuse races from router retry test000283+25\n#358MergedFreeze broker receipt and trust contracts (stage 4, PR 3)1540+154000\n#359MergedFreeze helper broker documents and close stage 42050+205000\n#360Mergedtest(agent): freeze state and heartbeat contracts before the Go port20323+180000\n#361MergedMove release pruning planning to the native installer777156+6218790+879\n#362MergedRun the fleet node loop in Go with the existing Python actions44741+4062,8663+2,863\n#363MergedAdd dormant Rust broker admission and durable replay tracer1,563137+1,426000\n#364MergedVerify node phase receipt chains with the native installer838304058+397\n#365MergedMove verified VM image downloads into the native node agent1821,572\u22121,3902,93820+2,918\n#366MergedFold controller transport into shared Go contracts with an explicit cutover gate61465+549109104+5\n#367MergedMatch fleet diagnostics to canonical bootstrap credential custody891+88000\n#368MergedPort path, memory and ping actions into the native node agent208385\u221217787832+846\n#369MergedComplete native broker custody and retire the Python core3918,673\u22128,282000\n#370MergedAdd an isolated zynserver profile for native Rust CI66470+594000\n#371MergedMove installed node rendering into the native installer181208\u2212274691+468\n#372MergedRetire Python node orchestration and port the completed native action tranche1,2821,065+2173,76672+3,694\n#373MergedRun read-only NFS inspection in the native node agent3557\u2212223171+316\n#374MergedRun native Rust gates on the isolated zynserver fleet lane92917+912000\n#375MergedAccept authenticated FQDN memory observations during fleet attach514+47000\n#376MergedSelect the native architecture SDK in the Go CI driver6913+56000\n#377UnmergedRun read-only credential inspection in the native node agent2712+153401+339\n#378MergedMove runner policy and read-only diagnostics to packaged Go600478+1222,4740+2,474\n#379MergedIsolate the Rust CI engine from host containerd927+85000\n#380MergedRecover supervisor-only runner replacement and Rust image builds1587+151000\n#381MergedFix native runner image inventory and containerd snapshot permissions1023+99000\n#382MergedFix reenrollment after later runner admission changes16721+146000\n#383MergedPort installer rendering and diagnostic verification to native consumers885567+3181,4934+1,489\n#384Mergedfix: recover terminal helper activation across releases62223+599000\n#385MergedSwitch runner services to the native lifecycle supervisor36818+3503,415146+3,269\n#386MergedRepair native runner cutover, image supply and interrupted-job cleanup33812+3262362+234\n#387MergedRetire proven Python runner lifecycle and broker clients3152,665\u22122,350103+7\n#388MergedMove remaining runner administration to Go and delete Python launcher4871,294\u22128071,9391+1,938\n#389MergedDeny ARM CI containers access to host services1592+1571,65261+1,591\n#390MergedFold remaining SPIRE clients into the shared Go contract module1,27087+1,1831,770494+1,276\n#391MergedOwn video render status and cancel in native dispatch6794\u2212271,4882+1,486\n#392MergedStage 6: native heartbeat host metrics; delete the Python collector87377\u22122903,03213+3,019\n#393MergedRender a rollback with the retained target's sealed native installer191+18000\n#394MergedShow each CI runner's state in plain words and offer only the control that changes it520+52000\n#395MergedStage 6: native telemetry burst start/stop and sampler; delete the Python851,185\u22121,1001,73338+1,695\n#396MergedStage 6: native provider selection; delete the Python selection operations7825+5382046+774\n#397MergedStage 6: native broker shadow observation; delete the Python shadow operation6234+284902+488\n#398MergedStage 6: native heartbeat tail (probe-finalize), Python deleted191608\u22124172,03775+1,962\n#399MergedStage 6: native model runtime discovery, Python probe deleted206830\u22126242,22123+2,198\n#400MergedFrontend: source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q)000000\n#401UnmergedBump werkzeug from 3.1.8 to 3.1.9 in /deploy/github-actions-runner000000\n#402OpenBump anchore/sbom-action from 0.24.2 to 0.24.3000000\n#403MergedStage 7: native installer node identity owner689446+2432,2502+2,248\n#404MergedPin Werkzeug 3.1.9 (GHSA-g6x2-hccm-hh4m)000000\n#405MergedRetire the standalone controller release installer17193\u2212176000\n#406MergedStage 7: native controller identity store6541,650\u22129962,7853+2,782\n#407MergedHold the node installation lock for native identity changes482+467824+54\n#408MergedMove the node phase frame codec to the native installer (Stage 7 row 1)936327+60999695+901\n#409MergedMove the operator configuration reader to the native installer (Stage 7 row 2a)433226+2071,3638+1,355\n#410MergedMove the node trust context and admission checks to the native installer768113+65590543+862\n#411MergedReconcile stale documentation with the current system (weekly Markdown check 2026-10-06)000000\n#412MergedRefresh architecture maps for native components, SPIRE transfer and in-place upgrade000000\n#413MergedMove the attachment journal's checks into the native installer (Stage 7 row 5a)522455+678832+881\n#414MergedKeep the documentation to what is current133+10000\n#415MergedBalance Python shards by measured time and skip unaffected jobs for frontend-only changes33343+290000\n#416MergedMove the fleet capability profile checks into the native installer1,17881+1,0977162+714\n#417MergedMove the fleet capability declaration chain checks into the native installer585131+4541,0575+1,052\n#418MergedRun the controller upgrade validators natively (Stage 7 row 5c)847295+5521,1781+1,177All 82 PRs28,84033,147\u22124,30754,1141,667+52,447\n82 PRs shown \u00b7 Totals remain for the full scope. #333\u2013#339 are issue numbers, not PRs.\n\n\n\n\nThe migration roadmap\nStages 0\u20139, plus Stage 3b.Expand all stages\n\n\nSource of truth2026-10-02-sparkops-native-migration-map.md\nSource: sayhi / reviews. Full contents preserved below; source snapshot October 6, 2026, 22:49 PDT. PR metrics retain the #418 cutoff.\nStage 0Stage 1Stage 2Stage 3Stage 3bStage 4Stage 5Stage 6Stage 7Stage 8Stage 9\n\nSparkOps native migration map: Go and Rust split\n\nPinned to meanaverage/sparkops main@01e0e849 (2026-10-02). This replaces the\nCodex &amp;quot;SparkOps Rust Migration Map&amp;quot; of the same date. Line counts are non-test\nPython at that commit. Live figures were read from dgx1 and dgx3 on 2026-10-02.\nThat pin is the analysis baseline and stays fixed; progress is recorded in the\nstage ledger, current through main@9075eeb3 (#413, 2026-10-06).\n\nThe split\n\n\n\nGo owns the daemons that talk to the network or orchestrate the host. They\nsit beside the Go SPIRE transports that are already in the trust path.\n\nRust owns one boundary: the root privileged broker and its contract crate.\n\nPython keeps the product plane and everything that is not an installed\nsecurity or runtime boundary.\n\nTypeScript keeps the console.\n\n\nReact console / CLI / MCP                      (TypeScript, Python)\n        |\n        v\nPython FastAPI product plane                   (Python: stays)\n        |\n        +-- Go SPIRE transports                (Go: exists today)\n        +-- Go controller authorities          (Go: blocked, stage 9)\n        |\n        v  typed work over the SPIRE work channel\nGo node agent                                  (Go: stage 6)\n   +-- Go inference router                     (Go: stage 3, first native daemon)\n   +-- Rust privileged broker -- fixed effects (Rust: stages 4-5, dormant)\nGo installer, Go runner supervisor             (Go: stages 7, 8)\n\n\nOne rule governs every stage: a native component replaces an ownership\nboundary and deletes the Python it replaces. A native helper beside unchanged\nPython policy code makes the trusted codebase larger.\n\nWhy Go for most of it\n\n\n\nGo is already here. Five Go modules (about 14k lines) ship today.\ntools/build_spire_controller_transport_release.py is a hermetic builder\n(pinned go1.27.1, -mod=vendor, -trimpath, CGO_ENABLED=0, arm64 and\namd64), and tools/build_spire_work_release.py already reuses it to ship\nbin/action-client to every node.\n\nThe work is orchestration. cli.py has 39 subprocess call sites and 75\ndocker references. The runner supervisor is a single-threaded 30-second poll\nloop. Go&amp;#39;s standard library covers process control, Unix sockets, peer\ncredentials, HTTP proxying and Ed25519 without third-party modules.\n\nSPIFFE lives in Go. go-spiffe is the reference library, so Go\nauthorities share types with the transports.\n\nBuilds are light. Go cross-compiles from any host. Cargo is hook-blocked\non dgx1 to dgx4 and must run on zynserver.\n\nThere is no performance pressure. dgx1&amp;#39;s router used 27 s of CPU and\n33 MB at peak over a 41-hour run. Its node agent used 12 min 45 s of CPU\n(about 0.5% of one core) and 137 MB. Stages are therefore ordered by risk and\nby how much Python they delete, not by speed.\n\n\nWhy Rust for the broker only\n\n\n\nThe broker is root-owned and its security rests on strict decoding and\nfail-closed state machines. serde rejects unknown and duplicate fields with\nlittle effort, and exhaustive enums suit the journal and recovery states.\n\nIt is the sole verifier of its own contracts, so a Rust implementation adds\nno second copy of anything. A Rust kernel embedded in Python through PyO3\nwould be a third implementation next to Python and Go, and Go cannot link it\nunder CGO_ENABLED=0. That option is out of scope.\n\nIt needs no async runtime, HTTP stack or SPIFFE library, so its dependency\nset stays small.\n\nIt is dormant: no broker unit is installed on any host, so the port has no\nproduction blast radius.\n\n\nOwner decision at the stage 5 gate: if zero Rust is preferred, the broker\nbecomes a Go binary in the stage 2 module and nothing else in this plan changes.\n\nComponent map\n\n\n\n\nComponent\nLanguage\nStage\nCurrent code\nLines\n\n\n\nContract vectors and shared Python helpers\nPython\n1\nabout 105 files with private canonical* helpers\nn/a\n\n\nGo foundation and contract package\nGo\n2\nnew go/ module\nnew\n\n\nInference router\nGo\n3\nsparkpyro_node_agent/inference_router.py\n635\n\n\nPrivileged broker\nRust\n4, 5\nprivileged_broker*.py, spire_helper_privileged_broker*, spire_helper_broker*\n12,805\n\n\nNode agent core\nGo\n6\nrest of sparkpyro-node-agent/src\nabout 29,800\n\n\nInstaller\nGo\n7\ninstaller/\n21,151\n\n\nRunner supervisor\nGo\n8\ndeploy/github-actions-runner/\n2,155\n\n\nController authorities\nGo\n9, blocked\nbackend/spire_fleet_work*.py, spire_host_binding_authority.py, spire_fleet_admission.py, spire_helper_checkin_ingress.py, spire_helper_fleet_effect.py, spire_helper_canonical_authority_ipc.py, spire_helper_live_*.py\n6,289\n\n\nRelease platform and signer\nPython\nstays\nrelease_platform/, backend/signer*.py\n5,985\n\n\nRelease build and assurance tools\nPython\nstays\ntools/build_*release*.py and siblings\n13,012\n\n\nProduct plane, CLI, MCP gateway, cloud connector, runtime-manager scaffold, labs, ML and Blender workers\nPython\nstays\nbackend/, app/, others\nrest\n\n\nSPIRE transports\nGo\nstays\nscripts/spire-*\nabout 8,200\n\n\n\nStages 3 to 9 replace about 73,000 lines of Python. Stages 0 to 3 are worth\ndoing on their own; every later stage has a gate where the owner can stop and\nthe system is still coherent.\n\nFacts every stage must respect\n\n\n\nFour canonical byte behaviours exist today. Compact sorted-key JSON is\nwritten ASCII-escaped or as raw UTF-8, and each form either rejects NaN or\nemits it: 95, 92, 20 and 14 call sites. release_platform/.../canonical.py\nuses raw UTF-8; most SPIRE code uses ASCII escapes. Signed bytes must not\nchange.\n\nGo and Rust encoders differ from Python. Go&amp;#39;s json.Marshal escapes\n&amp;lt;, &amp;gt;, &amp;amp;, U+2028 and U+2029. Go, Rust and Python format floats\ndifferently and handle integers above 2^53 and lone surrogates differently.\nThe existing Go canonicalJSON in spire-client-comparison/.../release.go\nfails closed on a mismatch.\n\nRelease closures are allowlisted. A new import can fail a closure check\nthat only runs on main (tools/build_spire_controller_authority_release.py\nwalks whole files, including lazy imports). installer/fleet_bundle_bootstrap.py\nis stdlib-only and standalone by design and keeps its own helpers.\n\nThe work authority does not own its queue. backend/spire_fleet_work.py\ncalls claim_fleet_agent_work_items, renew_fleet_agent_work_lease and\nrecord_fleet_agent_work_result in backend/portal_fleet_service.py, which\nthe FastAPI portal also uses on the same SQLite database.\n\nThe real root exposure is sudo, not the broker. Nodes in the\nlegacy_privileged posture have passwordless docker, nvme, mount,\numount and mkdir. Only five of the 54 work actions are broker-eligible;\n32 need contract redesign first (docs/security/node-privileged-broker-v0.md).\n\nThe installer imports other packages. It pulls in modules from\nsparkpyro_node_agent, backend, app and tools, so it cannot be ported\nbefore the pieces it imports have native equivalents.\n\n\nStages\n\nEach stage is one or more pull requests against meanaverage/sparkops. A stage\nis done when every exit criterion is met and the ledger below is updated.\nStages 4 and later begin with a design note that the owner approves before\ncode is written.\n\nStage 0: decision record\n\nWrite ADR 0047 (check the next free number in docs/decisions/) recording this\nsplit, the governing rule, the Go module location (default: one module in a\ntop-level go/ directory with cmd/&amp;lt;binary&amp;gt; and internal/contract), the Rust\nworkspace location (default: top-level rust/), and the vector location\n(default: contracts/vectors/).\n\nExit: ADR merged; tools/ci_change_scope.py and any path filters know the new\ndirectories.\n\nStage 1: golden vectors and one Python helper per package\n\nNo native code. This stage is the foundation for every later one.\n\n\n\nClassify every compact sorted-key json.dumps call site in installed code\n(sparkpyro-node-agent/src, installer/, backend/, app/, tools/,\ndeploy/, sparkops-cloud-connector/) as a contract (its bytes are\nhashed, signed, compared or persisted for verification) or incidental.\nscripts/ labs are out of scope.\n\nFor each contract, freeze golden vectors generated from today&amp;#39;s Python\nbehaviour: canonical bytes, digests, DSSE pre-authentication bytes and\nsignatures, and one rejection vector per failure code (duplicate keys, NaN\nand Infinity, unknown and missing fields, invalid UTF-8, oversize input,\nout-of-bounds identifiers and timestamps). Include &amp;lt;, &amp;gt;, &amp;amp;, U+2028,\nU+2029, control characters, astral characters, large integers and floats.\n\nGive each package one shared module modelled on\nrelease_platform/src/sparkops_release_platform/canonical.py, with each\nbyte behaviour as a named function. Move contract call sites to it one\npackage per pull request, and delete the private copies.\n\nRun the existing Go canonicalJSON against the vectors and record every\ndifference as an issue.\n\n\nExit: every contract has vectors in the repository and a test that pins them;\nno file in installed code defines a private canonical*, strict-decode or DSSE\nhelper outside the shared modules and the documented bootstrap exception; no\nsigned or hashed byte changed (the vectors prove it).\n\nStage 2: Go foundation\n\n\n\nCreate the Go module from the ADR. Generalise the existing Go builder so a\nsecond module builds with the same pinned toolchain, vendoring and recorded\nenvironment.\n\nWrite internal/contract: strict decoding (reject duplicate keys, unknown\nfields, non-finite numbers and trailing content), each canonical byte\nbehaviour, digests, DSSE verification, and the length-prefixed Unix-socket\nframing with peer-credential checks. First check whether the pinned\ntoolchain offers a strict JSON decoder without an experiment flag; otherwise\nwalk tokens.\n\nAdd a Go test lane to CI on the fleet runners.\n\n\nExit: internal/contract passes every stage 1 vector; the builder produces\nbyte-identical binaries on two runs for arm64 and amd64; go vet and\ngo test run in CI.\n\nOwner decisions on the exit criteria (2026-10-03, on the GPT-6 Astra review of\n#350 at 09931d5): (1) &amp;quot;every stage 1 vector&amp;quot; means every vector family whose\ncapability internal/contract owns \u2014 the canonical byte behaviours, the strict\nreading behaviours, DSSE PAE and verification, and the framing cases; the\ndocument families are read and written by the daemons that own them and are\nconsumed by Go when those daemons arrive (stage 3 onwards), each recorded in\nthe README&amp;#39;s layout table. (2) Unknown-field rejection is part of stage 2: a\ntyped strict decode (DecodeObject or equivalent) that refuses a member not in\nthe caller&amp;#39;s allowed set, with its own tests. (3) The _finish_plan hand-off is\ntaken by the stage 1 agent in a separate pull request (#351, merged as bb153c4ba). (4) The reproducibility\nartifact for this stage is the contract package&amp;#39;s own test binary; its digests\nare re-recorded at the final head of the pull request. (5) #333\u2013#339 stay open:\nthe new encoder meets their first condition; the two json.Marshal writers in\nscripts/spire-controller-transport and scripts/spire-client-comparison keep\nthem open until stage 3 folds the controller transport into go/ and rewrites\nit on internal/contract (hand-off to stage 3).\n\nHand-offs from stage 1 (2026-10-03): the vectors and their file conventions\nare specified in contracts/vectors/README.md (how *_json members are\nparsed, reject codes, tolerated cases, the four byte behaviours, the two\nreading behaviours, DSSE PAE, the fixed-member-order forms); that README is the\nport&amp;#39;s spec. The existing Go canonicalJSON differs from Python in seven\nclasses, filed as #333 to #339; resolve each (match Python, or refuse the\ninput and record it) before the encoder is called done. registry.json lists\nevery contract and its vector files; its pinned_by/exercised_in rules and\nthe CI checks (tools/contract_bytes_inventory.py check,\ntools/contract_bytes_pin_coverage.py on Security Gate shard 4) are\nPython-side and must stay green; record the Go test that consumes a vector\nfamily in the README&amp;#39;s layout table rather than in pinned_by. The fleet\nrunners&amp;#39; CI environment is the scanned venv in\ndeploy/github-actions-runner/ci-requirements.txt (no jsonschema); a Go\nlane needs only the pinned toolchain the builder fetches and digest-checks.\nBroker documents have no vectors yet (deferred to stage 4); everything else\ndoes.\n\nStage 3: inference router in Go\n\nThe first production native daemon. Specification: ADR 0045, the Python module\nand its 13 tests.\n\n\n\nImplement cmd/inference-router: the same sparkops.inference-routes/v1\ninput, the same endpoints (/v1/models, /health, /healthz, /metrics,\n/router/status, the three OpenAI POST routes), the same affinity order,\nplacement choice, retry rule, limits and log events.\n\nOne intended behaviour change: cancel the upstream request when the client\ndisconnects. The Python router only notices on its next write. Any other\ndifference needs a justification in the pull request.\n\nPort the 13 tests to Go and add a differential harness that drives both\nrouters against the same backend: streaming, chunked responses, client\ndisconnect during prefill, unreachable placement and retry, affinity,\nmetric aggregation.\n\nShip the binary in the node work release next to bin/action-client and\nswitch ExecStart in installer/fleet_node_config.py. Keep DynamicUser\nand the unit hardening. The node agent keeps parse_routes and\nwrite_routes.\n\nAfter the owner deploys with the standard fleet upgrade, verify on all four\nnodes: /health 200, max_model_len in /v1/models, aggregated metrics,\nfour simultaneous subagents split two and two across the TP2 pairs, and a\ncancelled request releasing its backend slot.\n\nDelete the Python server half of inference_router.py and its unit\nrendering in a follow-up pull request.\n\nHand-off from stage 2: the dedicated UTF-32 refusal coverage is merged in\n#355. The transport module fold and #333\u2013#339 closure move to Stage 3b under\nthe owner decision below; they are not part of this router&amp;#39;s exit.\n\n\nExit: live verification recorded in the ledger, including the executed TP2\nsplit and multi-placement metric checks; the Python server code is gone from\nmain; UTF-32 refusal coverage merged. These criteria are met.\n\nOwner scope decision, 2026-10-03: in response to the proposed separate gate,\n\u201cok well do whatever you gotta do lets get this mission accomplished 100/100\u201d\nauthorizes adopting Stage 3b and continuing the migration through Stage 8.\nStage 3 is closed with transport work explicitly deferred, not declared done.\n#333\u2013#339 remain open until Stage 3b meets their closure criteria.\n\nOwner revision to step 5 (2026-10-03): the fleet now runs one DeepSeek TP4\nplacement spanning dgx1\u20134. The owner waives the two-TP2 live checks: four\nsimultaneous subagents split two-and-two and aggregation across multiple live\nplacements. Record these as waived, not executed, not as measured passes.\nThe independently verified TP4 deployment (four native services with the\nreproduced binary, health 200, advertised context length, single-placement\nmetrics and cancellation releasing a backend slot) satisfies this stage&amp;#39;s live\ngate. Keep the automated multi-placement tests. DeepSeek stays running; no\nmodel topology change is required. This supersedes the earlier instruction to\nrecord the TP2 absence as a blocker and allows step 6 to proceed. The deletion\nand step 7 exit criteria are unchanged.\n\nSubsequent owner authorization and evidence (2026-10-03): the owner permits\nstopping DeepSeek temporarily to run two Qwen TP2 placements. The live test now\npasses: four simultaneous Qwen roles split two-and-two across dgx1+dgx2 and\ndgx3+dgx4, and all four routers correctly aggregate metrics from both placements.\nThese checks are executed and passed, superseding reliance on the waiver.\nBoth temporary Qwen placements were removed with cleanup verified. DeepSeek TP4\nwas restored and independently verified on all four routers with its original\n1,048,576-token context; see the ledger and hashed evidence manifest.\n\nHand-offs from stage 2 (2026-10-03, #350 merged as 0937f0123): the module\nis go/ (sayhi.io/sparkops/go, stdlib only) with internal/contract\n(CanonicalASCII/ASCIINan/UTF8/UTF8Nan, DecodeStrict/DecodeUnique,\nDecodeObject with allowed-field rejection, DSSEPAE/VerifyDSSEEd25519,\nSHA256Hex, WriteFrame/ReadFrame, ReadPeerCredentials/RequirePeerUID);\nits tests read the vectors and are recorded in the vectors README&amp;#39;s layout\ntable, never in pinned_by. Builds go through\ntools/build_spire_controller_transport_release.py --module &amp;lt;policy&amp;gt;: one\nmachinery, a GoModulePolicy per module (MODULE_POLICIES); the\ngo-foundation policy&amp;#39;s artifact is still the contract package&amp;#39;s test binary,\nso this stage gives cmd/inference-router a real policy (binary name,\nmanifest, two-run reproducibility on arm64 and amd64) and ships it through\ntools/build_spire_work_release.py beside bin/action-client. The Security\nGate&amp;#39;s go-contract job runs tools/run_go_contract_tests.py on the fleet\nrunners; backend/tests/test_github_actions_runner_deployment.py pins the\nnumber of fleet-lane jobs in that workflow and the fork guard, so a new lane\nupdates that test deliberately. Fleet-runner traps: /tmp and the workspace\nare noexec (extract toolchains and build caches under RUNNER_TOOL_CACHE),\nand Unix socket paths under that cache exceed the 108-byte sun_path limit\n(tests use socketpair). Go&amp;#39;s internal visibility is why step 7 folds the\ncontroller transport into go/ rather than importing across modules; its\ngo.mod/go.sum are digest-pinned by its builder policy, so that move changes\nthe policy and the pins together. The router is live on dgx1\u2013dgx4 (ADR 0045;\nHermes subagents and the owner&amp;#39;s Codex profiles route through it), so the\ndifferential harness and the live verification in step 5 are the proof, and\nthe owner runs the deploy.\n\nStep 7 preflight correction (2026-10-03, main@f38df6a4): these source\nmodules are not wholly dormant. The work-release builder compiles the live\naction-client from scripts/spire-controller-transport, and the helper-release\nbuilder compiles the live heartbeat helper from scripts/spire-client-comparison.\nThe node installer&amp;#39;s upgrade_node refuses changes to either attested executable\nbefore effects; the documented replacement procedure retires/re-enrolls the host.\nThe owner has been asked whether this work moves to a separate gate or remains\nhere with a separately planned attested-client cutover. No decision is assumed,\nand no transport source or live identity has been changed. A complete audit for\n#333\u2013#339 must also include the runner client&amp;#39;s canonical helper and connector&amp;#39;s\ndecodeCanonical: both currently use json.Marshal for contract byte comparisons,\nso moving only the two named modules would not satisfy the issues&amp;#39; global closure\ncondition. The independent UTF-32 refusal-test hand-off is PR #355.\n\nGate: owner go/no-go for the remaining stages.\n\nStage 3b: transport fold + attested-client cutover\n\nDeferred from Stage 3 by owner decision on 2026-10-03. Coordinate with Stage 6\nS1 and the next required rebuild of attested clients; do not attach an unrelated\nfleet identity replacement to the completed router rollout.\n\n\n\nInventory every installed Go contract encoder/decoder, including the action\nclient, runner client, helper comparison module and connector. Fold the\ncontroller transport into go/, rewrite owned contract operations on\ninternal/contract, and retire the comparison copy or migrate its consumers.\n\nPreserve wire bytes against the frozen vectors. Remove replaced helpers and\nmodules in the same tracer PRs; retain refused-input decisions from #333\u2013#339.\n\nDesign and rehearse the attested-client replacement: exact old/new artifact\ndigests, per-host identity registrations, supported retirement/re-enrollment\nor an explicitly implemented replacement procedure, rollback, and dependent\nheartbeat/work/runner verification. Do not weaken the normal upgrade refusal.\n\nOwner performs the planned identity/deployment cutover; independently verify\nlive node work, heartbeat and every affected CI runner lane afterward.\n\n\nExit: no installed Go code canonicalises contract documents with bare\njson.Marshal; #333\u2013#339 closure conditions satisfied and issues closed;\nreplaced modules deleted; reviewed artifact and identity cutover proven live.\nUntil then the existing attested clients keep their established paths/digests.\n\nStage 4: one broker contract (Python)\n\n\n\nWrite a surface map of the broker modules: which are contract, daemon,\nstore, journal, lab or catalog, and which the node agent imports. The\naction catalog (56 actions; this plan first said 54, the catalog test asserts\n\n\nand the shadow classifier that cli.py uses must survive.\n\n\n\nKeep the v2 execution-context contract; delete the v1 request contract and\nwhat only serves it: the v1 journal (privileged_broker_journal.py), the v1\nverifier and recovery authorization in privileged_broker_authorization.py\n(the trust-bundle types v2 imports stay), and their tests including the v1\nprocess-transport test (owner-confirmed 2026-10-03; &amp;quot;lab copies&amp;quot; in the\nfirst wording had no other referent \u2014 every broker lab module serves v2).\nUpdate docs/security/node-privileged-broker-v0.md.\n\nAdd the broker&amp;#39;s request, receipt, policy, resource-registry and\neffect-fence documents to the stage 1 vectors.\n\n\nExit: one request contract remains; vectors cover it; the shadow adapter still\npasses its tests.\n\nHand-offs from stages 1\u20133 (2026-10-03): the broker modules already write and\nread through sparkpyro_node_agent/contract_bytes.py (#342 moved nineteen of\nthem by a mechanical rewrite, keeping each module&amp;#39;s error adapter); their\ndocuments are the one contract the registry records as deferred\n(privileged-broker, 28 sites) \u2014 this stage replaces that deferral with\nvector files and pinned_by tests under the rules in\ncontracts/vectors/README.md (a site is pinned by an entry whose callable\nenters it, or names its exercising test; tools/contract_bytes_inventory.py check and tools/contract_bytes_pin_coverage.py run in CI and must stay\ngreen; frozen cases are never edited). Deleting the v1 request contract\ndeletes registered sites: remove them from the registry in the same pull\nrequest. Stage 3 runs concurrently and owns inference_router.py,\ninstaller/fleet_node_config.py, the node work release builder and go/;\ndo not edit those files here. This stage is Python only; the Rust (or Go)\nbroker is stage 5 and starts from the contract and vectors this stage leaves.\nDesign note first, approved by the owner before code.\n\nStage 5: Rust contract crate and dormant broker\n\nDesign note first: journal storage (default: an append-only hash-chained file\nmodelled on release_platform/.../journal.py, since nothing deployed depends\non the SQLite layout), the dependency allowlist, and where the Rust checks run.\n\n\n\nCreate the workspace: sparkops-contract (strict decoding, the broker&amp;#39;s\ncanonical bytes, Ed25519 verification, bounded identifiers and timestamps)\nand sparkops-brokerd (root-owned Unix socket, kernel peer credentials,\ndescriptor-relative policy, resource and trust stores, the journal, and the\nfive fixed operations as effect-free admission first).\n\nVendor dependencies and build with --locked --offline as static binaries\nfor aarch64 and x86_64 on zynserver. No async runtime.\n\nRun the stage 1 and stage 4 vectors and a differential run against the\nPython admission model over generated request, policy and resource\nsequences.\n\nRehearse in a disposable VM on zynserver. DGX hosts and production are\nforbidden targets for broker tests.\n\nDelete the Python daemon, stores and journal that the Rust broker replaces.\nThe Python node agent keeps only request construction and the catalog.\n\n\nExit: vectors and differential run pass; VM rehearsal evidence recorded;\nreplaced Python deleted. The broker stays dormant: enabling enforcement needs\nsigning custody and the action redesigns, which are separate work.\n\nStage 6: node agent core in Go\n\nDesign note (draft for the stage 3 gate, 2026-10-03):\n2026-10-03-sparkops-native-stage6-node-agent-design-note.md in this directory.\n\nDesign note first. Strangler approach: a Go cmd/node-agent takes over the\nheartbeat, poll, lease and result loop over the existing work-client socket,\nand runs unported actions through one fixed Python entry point until each\ngroup is ported. Order: loop and leases, journals and secure download, the 15\nunprivileged actions, the benchmark engine (one engine; delete both Python\nones), then model lifecycle. ML and Blender workers stay Python as fixed\nexecutables. Preserve state.json, work-item schemas, lease semantics and\nresult documents.\n\nExit (revised by the owner, 2026-10-03 PDT / 2026-10-04 UTC): the Go agent\nowns the loop, journal, heartbeat and every unprivileged action. Delete the\nreplaced Python daemon and each ported implementation. The Python action entry\npoint remains only as a named legacy privileged boundary, listing exactly\nthe actions in the measured effect inventory; add an inventory rule that refuses\nadditions. Retained workers stay Python as fixed executables. The Go node agent\ngains no sudo path. Account for remaining adapter operations explicitly; this\nexception does not exempt unprivileged heartbeat or observation work.\n\nOwner decision: \u201cdo not implement the enforcement design.\u201d The privileged-tail\nproposal is separate unscheduled privilege separation work alongside Stage9,\nnot a Stage6 prerequisite or authorization to change queue ownership. Continue\nS1\u2013S4 and the other approved work. The prior requirement to remove every\nprivileged Python handler is superseded by this exact exception; all other\nvalidation and live-proof requirements remain.\n\nStage 7: installer in Go\n\nDesign note (draft for the stage 3 gate, 2026-10-03):\n2026-10-03-sparkops-native-stage7-installer-design-note.md in this directory.\n\nDesign note first. Port pure plan, render and verify functions and compare\ntheir output bytes with Python before porting any effect. Keep CLI names,\ncheck and plan behaviour, receipts and exit codes. Keep OpenSSH as a fixed\nexecutable. Upgrades stay one standard command.\n\nExit: a full install and upgrade rehearsal on the x86 VM lab and one arm64\nhost passes with the Go installer; the Python installer is deleted.\n\nStage 8: runner supervisor in Go\n\nPort runner.py and its clients as cmd/runner-supervisor with its own\naccount and the existing broker protocols. Low value; do it only once stages 6\nand 7 have proven the path.\n\nExit: a live CI job completes on each lane; the Python supervisor is deleted.\n\nStage 9: controller authorities in Go (blocked)\n\nPrecondition: the work-queue state machine has one owner. Either extract it\nfrom portal_fleet_service.py into a module the authority owns outright, or\nleave the authorities in Python. Also decide SQLite access under\nCGO_ENABLED=0. Cut over heartbeat observation first and work lease and\nresult authority last, with recorded-envelope replay before any writer\nswitches.\n\nUnscheduled: privilege separation\n\nThe owner explicitly separated this work from the native migration on\n2026-10-03 PDT / 2026-10-04 UTC. The proposal and measured effect inventory are\nin 2026-10-03-sparkops-native-stage6-privileged-tail-design.md. No enforcement\nimplementation is authorized. Signing custody, resource/action redesign,\neffect journal/recovery and the proposed queue reservation/cancellation boundary\nneed their own decisions. Stage9 remains blocked on queue ownership; neither\nitem is silently included in the approved migration through Stage8.\n\nOvernight authorization (owner, 2026-10-03)\n\nThe owner authorizes proceeding as far as possible through stage 8 and merging\nany resulting reviewed, validated pull requests without another per-merge\nquestion. This supersedes the initial single-stage session limit and per-merge\napproval requirement for this run. Merge commits, foreground CI, frozen-byte\nrules, deletion discipline and honest stage gates still apply. Production\ndeploys remain owner-run. Independent work may proceed while another stage\nwaits for its deploy or an unresolved design decision; a pending gate is not\nreported as complete. Stage 9 remains outside scope.\n\nContinued owner authorization (2026-10-03)\n\nThe owner&amp;#39;s instruction to finish the mission follows the published Stage 5\u20138\ndesigns and the Stage 3b recommendation. Proceed with the recommended Stage 5\u20137\ndesigns and their source/merge work, preserving documented live-proof and lab\nrequirements. Stage 8 implementation still waits for Stages 6/7 proof. The\nsecurity VM procedure, agent/runner frozen-unit revisions, production deploys\nand the unresolved privileged-handler tail are not silently waived. Prepare\nconcrete reviewable decisions for those gates while completing independent work.\n\nOwner gate decision after stage 3 (2026-10-03)\n\nThe owner&amp;#39;s decision at the stage 3 gate: proceed with stages 5, 6 and 7 as\ndrafted (design notes in this directory, Astra&amp;#39;s audits included), 3b\nalongside stage 6 S1, stage 8 after 6 and 7, stage 9 still blocked. Standing\nconditions that replace per-item questions:\n\n\n\nEvery service switch (a unit&amp;#39;s ExecStart moving to a Go binary) follows\nthe router precedent: the unit&amp;#39;s rendered bytes change only in ExecStart,\nthe old fleet-node-config-v1 cases stay as superseded, the new cases are\nfrozen in the same pull request as the binary and the switch.\n\nA switch is proven on dgx1\u2013dgx4 after an owner-run (or owner-authorised)\ndeploy before the Python it replaces is deleted; the live check is recorded\nin the ledger row.\n\nThe privileged handlers and the legacy_privileged sudoers path stay\nPython until the stage 5 broker is live; no Go daemon gains a sudo path.\n\nMerges still happen one at a time on the owner&amp;#39;s word; DeepSeek cross-reviews\neach stage&amp;#39;s pull requests before the stage is called done (stage 4&amp;#39;s\n#353/#356/#358/#359 are owed that review now).\n\nGolden vectors are never edited; additions and superseded cases only.\n\n\nStanding execution authorization (owner, 2026-10-03, latest)\n\nThe owner explicitly lifts remaining per-stage and per-merge approval stops for\nStages 5, 6, 7, 3b and 8. Designs in reviews/ are approved as drafted, including\nthe bounded Stage 5 zynserver rehearsal procedure. Complete a gate, record its\nactual evidence, then continue; Stage 9 remains blocked/outside this assignment.\nThree Astra xhigh implementation agents now own Stages 5, 6 and 7; the root\ncoordinates shared changes, serial merges, deployments and verification.\n\nProduction deployment is now explicitly authorized. From this workspace use\nstate/spire-fleet-enrollment-20260920/cut-and-upgrade-cp1.sh &amp;lt;full-commit&amp;gt; &amp;lt;version&amp;gt; &amp;lt;label&amp;gt;\n(the verified location of the named standard helper), then on sparkops-cp1:\nsudo sparkops-installer fleet upgrade dgx1 dgx2 dgx3 dgx4 --known-hosts /root/sparkops-inputs/fleet-known-hosts.\nThe owner accepts fleet breakage; verify and record every node after each deploy\nand expose failures rather than treating successful command submission as proof.\nSelect a new release version/label from current release state before cutting.\n\nThis supersedes earlier owner-run-deploy and per-merge-question wording above.\nGolden cases remain immutable: dated supersession and additive successors only.\nService switches preserve every unit byte except ExecStart and ship binary,\nsuccessor vectors and switch together. The Go node agent gains no sudo path. Stage8 preserves the runner supervisor\u2019s\nexisting dedicated account and fixed Docker/firewall/install/unlink grants, as\nits approved design requires; this is not a new node-agent privilege or a generic\ncommand interface. Rust broker enforcement is still outside the approved\ndormant-broker design. Shared\nprivileged Python handlers remain under the owner\u2019s explicit revised Stage6\nexception above, with an exact inventory refusing additions. Stage6 still needs\nall unprivileged ownership, deletion, inventory and live-proof gates; approval\nof this scope revision is not completion evidence.\n\nOwner decision on stage 6&amp;#39;s privileged tail (2026-10-03)\n\nThe enforcement design in 2026-10-03-sparkops-native-stage6-privileged-tail-design.md\nis not implemented in this migration. Stage 6&amp;#39;s exit is revised: the Go agent\nowns the loop, leases, journal, heartbeat and every unprivileged action; the\nPython action entry point remains only as a named legacy privileged boundary\nlisting exactly the actions in that note&amp;#39;s effect inventory, with an inventory\nrule refusing additions; the coding, UniFi and Blender workers stay Python; no\nGo daemon gains a sudo path. The privileged-tail note becomes a separate,\nunscheduled &amp;quot;privilege separation&amp;quot; item alongside stage 9&amp;#39;s queue-ownership\ndecision. Stage 5&amp;#39;s Rust broker stays dormant.\n\nOwner handover decision (2026-10-04; received through the Claude bridge)\n\nWrap up this thread and hand the migration to a fresh Claude / Opus 5.5 thread.\nBring in-flight operations to a safe resting point; start no new implementation,\nPR, release or cutover. Preserve every native worktree&amp;#39;s source on its agent\nbranch, record exact fleet state and remaining gates, and write\n2026-10-04-sparkops-native-handoff.md. This thread ends after that handover.\nAll57 worktrees are clean and their heads remotely reachable;18 remote branches\nwere created/advanced normally, and the one existing untracked video oracle was\ncommitted unchanged for preservation. No force push or source deletion occurred.\n\nThe owner is drafting /home/meanaverage/sayhi/sparkops-iam-roles.md to replace\nthe Stage6 legacy privileged boundary. Note it only; do not act on it. The\ncurrent41-action/five-worker exception remains, with no Go sudo or broker\nenforcement. Stage9 and separate privilege separation remain outside scope.\nFinal handover evidence is under state/native-handoff-b1e_d8ba; its all-host\nreadback at16:19UTC records cp1rc51, new node/work releases on dgx1/2, unchanged\nolder node/work releases on dgx3/4 due to the exact attested-client refusal,\nfive active/ready native CI supervisors and DeepSeekTP4ready.\n\nStage ledger\n\nUpdate this table at the end of every working session. It is the only record\nof progress.\n\nMerge and revert rule (owner, 2026-10-02). Pull requests merge to main\nstage by stage; they are not stacked until the end, because releases and the\nclosure checks only exist on main and stage 3 is proven on the live fleet.\nThe owner&amp;#39;s condition is that any merge can be undone easily afterwards:\n\n\n\nEvery pull request merges as one merge commit and must be revertible with\ngit revert -m 1 &amp;lt;merge&amp;gt; on its own. Record each merge commit in the ledger.\n\nA pull request that deletes Python a running service still needs waits until\nthe native replacement is verified live (stage 3 already works this way).\n\nIf a later pull request would make an earlier one unrevertable, say so in\nthe pull request and ask the owner before merging.\n\n\n\n\n\nStage\nStatus\nPull requests\nEvidence and notes\n\n\n\n0 Decision record\ndone\n#330, merged 2026-10-02 as d3fc648b\nmain was still at 01e0e849 when the stage started, no plan fact stale. ADR 0047 is docs/decisions/0047-native-components-go-daemons-rust-broker.md. Push runs on main at d3fc648b: Security Gate 37051206294 and Secret Scan 37051206281 green; no path-filtered workflow fired. Revert: git revert -m 1 d3fc648b (nothing deployed). CI scoping: ci_change_scope.py already sends go/, rust/, contracts/vectors/ to the full gate (allowlist is docs/ only); pinned by new tests, plus CODEOWNERS and .gitignore (rust/target/). No workflow paths: filter changed on purpose: none builds from these directories yet; ADR rule is that a workflow gains the directory in the PR that makes its build consume it (stage 3 for the work release). CI: 9/9 green (Security Gate run 37049689078), Codex security review no findings, merge state CLEAN. Local: 32 change-scope tests, docs validator PASS. Traps for stage 1/2 recorded in the ADR: .gitignore ignores build/, dist/ at any depth and *.key, *.pem, *.db; release builders stage contracts/ files by name. Nothing remains.\n\n\n1 Vectors and Python helpers\ndone 2026-10-03 (11 PRs merged incl. review follow-up #349; broker document vectors deferred to stage 4)\n#332 tracer, merged 2026-10-02 as cc3f0260 (owner approved; push runs on main green: Security Gate 37056262007, Secret Scan 37056261965). #340 node agent part 1, merged 2026-10-02 as 115ef114 (owner approved; push runs on main green: Signer SPIRE acceptance, Security Gate, Secret Scan). #341 node agent part 2 (SPIRE helper), merged 2026-10-02 as 697d8bf7 (owner approved). #342 node agent part 3 (privileged broker, reconciliation), merged 2026-10-02 as 5eef4e98 (owner approved). #343 cloud connector, merged 2026-10-02 as d0b32ee (owner approved; push runs on main green: Security Gate, Secret Scan, Connector SPIRE acceptance). #344 runner supervisor client (deploy/), merged 2026-10-02 as 5b84159 (owner approved). #345 installer, merged 2026-10-02 as 8b1c214 (owner approved). #346 tools, merged 2026-10-03 (owner approved; first push failed the runner lane on the by-path engine loader, fixed). #347 backend, open, label spire-acceptance (worktree native-s1-backend). #347 backend, merged 2026-10-03 as 4685487 (owner approved). #348 app, merged 2026-10-03 as d10014f (owner approved). Review follow-up (#349, branch agent/native-s1-followup, merged 2026-10-03 as ce30aacc4, owner approved; push runs on main green: Security Gate, Secret Scan, Connector and Runner SPIRE acceptance, seam convergence): on the owner&amp;#39;s external review (seven findings): shared dsse_pae takes bytes payload types (app wrapper no longer decodes); the two model-based writers&amp;#39; non-finite cases corrected (pydantic dumps non-finite as null before the encoder, recorded); every registered site now claimed by a vector file (sites per entry or top-level) and the check enforces both directions; tools/contract_bytes_pin_coverage.py (sys.monitoring, 1.5 min) proves 226/226 sites executed by pinned_by+exercised_by tests, three CI/operator-only sites acknowledged via exercised_in; scanner widened to fixed-order compact writers (49: five ordered_* sites incl. new model-lifecycle-intent-v1, 44 incidental) and non-literal keywords; cross-package contract_bytes imports refused; surrogate probe on every site-level writer. Round 2 (same PR, 2026-10-03; DeepSeek&amp;#39;s full-series review and GPT-6 Astra&amp;#39;s assessment of it): Astra&amp;#39;s central point held \u2014 27 vector entries (14 app, 9 backend, 4 tools) pinned a test-local json.dumps, not a function in the tree. Now a registered site is pinned (a vector entry whose callable provably enters it, checked per entry under a sys.monitoring tracer) or exercised (its registry entry names the test file, lane or operator path that runs it), never neither, never both; contract-level exercised_by lists removed. Result: 189 sites pinned, 34 exercised by a named test, 3 by a lane (226 total, unchanged); 10 of the 27 substitute sites are now pinned through their own function with a probe or a fixed input (incl. SpireHelperBuildRecipe.environment_is_closed cross-linked to the frozen recipe digest and InferenceRouteStore.publish storing each frozen routing table), the rest exercised. No surviving frozen value changed (checked member by member). Inventory check also refuses a vector file that freezes nothing (Astra&amp;#39;s empty-vector demonstration) and classifies json.dumps by keywords, so ** splats, partials and JSONEncoder are found. B4: installer families gain unique_reads pinning six unique readers&amp;#39; refusals, incl. the operator-config message the installer prints, now duplicate JSON key &amp;#39;a&amp;#39; (was duplicate configuration key; #345, decision (e) below); verify_release_inputs keeps SpireHelperReleaseError(&amp;quot;signed helper build facts differ&amp;quot;) (Astra&amp;#39;s correction of DeepSeek A2), pinned with its DuplicateKey cause. A1: affinity_key keeps no default=str (body is json.loads output; Go has no such fallback), pinned by a test and recorded in the registry. The pin-coverage tool now runs on the fleet runners in Security Gate shard 4. Trap found on its first run: the fleet runners&amp;#39; CI venv has no jsonschema (the canonical-installer job&amp;#39;s minimal venv does), so an installer pin that goes through validate_control_plane_release.validate() fails closed there; the validator pin calls _preservation_checks directly. Astra&amp;#39;s corrections accepted: vectors do reach releases (the fleet installer bundle copies every source-archive member, contracts/vectors/ included; a native test context naming them is a stage 2/3 concern); C3 was a hazard, not a demonstrated miss (guard test stands); #331&amp;#39;s host-id concern is a precaution. DeepSeek&amp;#39;s .gitignore note stands as a trap: a fixture named *.key/*.pem or under build/ would be untracked (CI, not local, would then fail). Validation discrepancy: DeepSeek reported 9 failed + 2 errors in the backend suite at d10014f, Astra 1 failed (the known dgx3 node-agent-directory isolation defect); my runs match Astra. That one failure (test_fresh_granted_install_refuses_a_legacy_runner_still_in_place) was a test-isolation defect, fixed in #349 (the test now redirects node_config.STATE); local runs on installed nodes are clean from here on. Stage gate (main@d10014f): tools/contract_bytes_inventory.py check clean; 29 contracts, 28 with vectors (32 vector files, 24 pin-test modules), privileged-broker recorded deferred to stage 4; 253 registered sites (ascii 105, ascii_nan 48, utf8 19, utf8_nan 7, strict 37, unique 33, dsse_pae 4) across node agent 85, app 51, backend 45, installer 33, tools 31, connector 7, deploy 1; 7 byte-identical copies of contract_bytes.py (node agent, connector, deploy runner supervisor, installer, tools, backend, app), kept identical by backend/tests/test_contract_bytes_copies.py; 8 documented exceptions (bootstrap, guard runtime under python -I, release-set entry, candidate installer, rotation lab guest, fixed-VM receiver, two superseded spire-mvp-v1 scripts); 15 incidental sites; 0 unclassified. Every package followed freeze-then-move (vectors + pin test committed and passing against untouched code, then the move with the same vectors passing); main&amp;#39;s push runs green after every merge (Security Gate, Secret Scan, Signer/Runner/Connector acceptance, seam convergence). Exit criteria: (1) met except the broker documents (deferred by registry entry); (2) met with the eight exceptions above; (3) met by the vectors plus live-fleet reproductions on dgx1\u20134 (routes.json, 48 release records, selection.json, provider-expectation.json); (4) met by #333\u2013#339. Owner decisions taken, to confirm or overturn: (a) adapters allowed; (a2) DSSE only PAE shared, envelope rules per contract; (a3) fifth byte form (fixed member order) left with its contract; (b) broker documents to stage 4; (c) bootstrap-class scripts that run alone before a tree exists keep their helpers (eight exceptions; alternative is shipping the copy beside each, which changes their delivery closures); (d) plain-ValueError hooks replaced by the shared DuplicateKey without adapters where no handler inspects text; typed errors kept via adapters. (e) the installer&amp;#39;s operator-configuration refusal text changed under (d) and is user-visible (fleet_install.py prints str(exc)): kept and pinned as duplicate JSON key &amp;#39;&amp;lt;name&amp;gt;&amp;#39; because it names the key; restoring duplicate configuration key is a three-line adapter in fleet_operator.load if the owner prefers. Hand-offs to later stages: the Go canonicalJSON differences (#333\u2013#339) must be resolved before stage 2&amp;#39;s Go encoder is built; app/domains/capability_lifecycle/service._finish_plan used default=str (no shared hook) \u2014 discharged by #351 (merged 2026-10-03 as bb153c4ba, owner approved: shared canonical_ascii_nan, default removed after proving nothing non-JSON reached it, three plan ids frozen in the lifecycle tests, and the site pinned by a fixed-input product-plane-v1 entry on the lifecycle fixtures&amp;#39; ready Qwen plan after Astra noted the registry reserves &amp;#39;exercised&amp;#39; for sites no entry can call); fleet_attachment raises IdentityError for a repeated member in a journal record (latent bug, preserved); the signer VM&amp;#39;s SPARKOPS_SIGNER_AUTHORITY_MODE compose command and scripts/security/spire_assurance_successor.py inventory were untouched (the latter&amp;#39;s test already failed on main). Worktrees worktrees/sparkops/native-s1-* (contract-vectors, deploy, tools, backend, app) can be removed after the owner&amp;#39;s review (consult KEEP-WORKTREES.txt first). Step 4 issues: #333 to #339\nStarted from main@d3fc648b (only stage 0 since the pin; no plan fact stale). Worktree worktrees/sparkops/native-s1-contract-vectors, branch agent/native-s1-contract-vectors (head c580ec1). Backend (#347): controller-backend-v1 frozen (31 writers, 10 readers on eleven inputs; cross-links: lab heartbeat decodes the node&amp;#39;s frozen requests, deployment registry writes the frozen deployment document, portal_actions computes the frozen worker Action digests, backend and signer agree on an execution envelope); 32 modules moved onto backend/contract_bytes.py (five by the node-agent transformer); four incidental (render metadata, opencode config, runner authority journal/result prints); closures: signer service Dockerfile, Codex preview Dockerfile, controller authority MODULES; enrollment client now uses the backend copy. App (#348): product-plane-v1 frozen (37 writers, 12 readers; cross-links: routing table content digests, connector transport frames, DSSE PAE); 40 modules moved onto app/contract_bytes.py; signatures.dsse_pae keeps its bytes signature and delegates; compose_lock_v2.decode_strict shared with studio trust; four incidental incl. _finish_plan plan_id (default=str, no shared hook); closure: controller authority MODULES admits app.contract_bytes. Tools (#346, branch agent/native-s1-tools): release-tools-v1 frozen (18 writer sites on a behaviour-separating document and a non-finite one, 12 strict readers on nine inputs with refusal types and messages, helper recipe digest, node-agent builder reproduces the installed record, catalog descriptor digests on a snapshot; the validator&amp;#39;s decode pinned through validate() on a fixture release from installer/tests in the minimal env); 21 modules moved onto tools/contract_bytes.py (17 encoders, 13 hooks deleted; dual import for script/by-path modules); three more exceptions (install_development_candidate.py, spire_rotation_lab_guest.py run alone from a candidate archive; spire_helper_fixed_component_receiver_v2.py guest receiver not yet provisioned); scanner marker recorded incidental. Closures: reconciler release FILES ships the copy; docs/environments/catalog.json re-pins tools/compose_admission.py; four by-path test loaders put tools/ on sys.path. 78 files remain (app 44, backend 34). Exception list now eight; raised as a judgement call in the PR. Installer (#345, branch agent/native-s1-installer, worktree native-s1-contract-vectors): three families frozen (fleet-node-config-v1 rendered node and runner files with custody, fleet-installer-node-v1 identity, protocol, release set, restart expectation, retirement and enrollment documents, fleet-installer-control-plane-v1 nine control-plane documents, activation command digest cross-check, diagnostic reads) by a unittest module (installer tests run under unittest discover); 23 modules moved onto installer/contract_bytes.py (16 encoders, 7 hooks deleted; dual-context modules import relative-then-flat); two new exceptions with reasons in the registry: control_plane_guard_runtime.py (builder runs it with python -I, no sibling import path) and fleet_release_set.py (release-set entry run from the unverified set with the bootstrap as its only dependency; tools/tests/test_fleet_release_set.py stages exactly those two files). Refusal policy applied: typed hook errors (IdentityError, DiagnosticError) kept via three-line adapters; plain-ValueError hooks replaced by the shared DuplicateKey (handlers catch ValueError, none inspects text, no frame carries it); fleet_attachment keeps the borrowed IdentityError escape (noted as a latent bug, not fixed). Closure lists gained the copy: validator PRESERVATION_PAYLOAD + CANONICAL_PAYLOAD, builder leaf check, fleet_release_materialize.required_guards. backend/worker_enrollment_client.py read frames through the installer&amp;#39;s hook; now loads_unique from the installer copy, registered as a site until the backend copy exists. 103 files remain unclassified (app 44, backend 34, tools 25). Deploy (#344): spire-github-runner-client-v1 frozen (6 operations, 24 refused responses, 1 tolerated), deploy/github-actions-runner/contract_bytes.py copy, spire_broker_client moved; contract_bytes.py added to RUNNER_SUPERVISOR_FILES and RELEASE_FILES; deploy/spire-mvp-v1/{activate,prepare}_node.py recorded as exceptions (superseded profile kept as evidence). Connector (#343, merged d0b32ee): spire-connector-local-v1, execution-host-advertisement-v1, codespace-fixture-canary-v1 frozen; connector copy of the shared module; backend/tests/test_contract_bytes_copies.py keeps every registered copy byte-identical to the node agent&amp;#39;s. Node agent part 3 (#342, branch agent/native-s1-node-agent-broker): spire-helper-reconciliation-v2 frozen (threshold DSSE, 14 envelope and 6 review refusals); nineteen broker modules moved by a narrow mechanical rewrite (24 hooks and one DSSE encoder deleted, 19 canonical implementations now delegate behind their error adapters); broker documents recorded as deferred to stage 4 in the registry (the check requires vectors or a stated deferral); the node agent&amp;#39;s unclassified list is empty; 137 files remain (app 44, backend 35, installer 25, tools 25, connector 5, deploy 3). Node agent part 2 (#341, merged 697d8bf7): five families frozen (helper IPC check-in exchange, helper release records with DSSE-signed deployment, activation v2 records with DSSE-signed command and heartbeat selection, systemd materialization and runtime evidence, provider expectation); shared dsse_pae with dsse/pae.json; eight modules moved; 156 files left unclassified. Evidence: frozen vectors pass unchanged after the move; existing Python/Go goldens still hold; live selection.json and provider-expectation.json on dgx1 to dgx4 read and reproduced byte for byte by the moved code. Closure change: contract_bytes.py enrolled in the root-broker bundle (tools/build_spire_helper_root_broker_bundle.py PYTHON_MODULES) and as one exact additional closure in app/domains/releases/component_build_records_v2.py, following 180df0a; three historical closures still accepted. .gitleaks.toml allows three exact public test-key digests in two vector files. Node agent part 1 (#340, merged 115ef114): nine families frozen (execution journal fingerprint and outcome, signed provider prompt authority, signed VM image provenance, release record, video request digest, worker Action digest and stored UniFi plan, mpirun ring frame, lab SPIRE client request and response); shared module gained loads_strict/loads_unique with canonical-json/decode.json; ten modules moved and their private helpers deleted; registry now records readers too; 164 files left unclassified. Evidence: vectors committed before the move pass unchanged after it; all 48 node agent release records installed on dgx1 to dgx4 are read and reproduced byte for byte by the moved code. Closure change: Dockerfile.backend and packaging/control-plane/Dockerfile.app now copy contract_bytes.py beside coding_policy.py (isolation tests failed without it), hence the spire-acceptance label. Revert: git revert -m 1 &amp;lt;merge&amp;gt;. Tracer (#332): vectors for sparkops.inference-routes/v1 (12 tables with file bytes and parsed table, 23 refusals, size limit, 38 conversation keys) and for the four byte behaviours (canonical-json/encode.json, 36 inputs); node agent shared module sparkpyro_node_agent/contract_bytes.py; write_routes and affinity_key moved, inline json.dumps deleted; contracts/vectors/registry.json plus tools/contract_bytes_inventory.py check (runs in backend/tests/test_contract_bytes_inventory.py) classify every call site and refuse new private helpers. No byte changed: commit 1 pins the vectors against the untouched router, commit 2 moves the call sites and the same vectors pass; the moved writer reproduces the live routes.json on dgx3 byte for byte (cccdc584\u2026, same hash on dgx1, dgx2, dgx4). CI 10/10 green (Security Gate run 37055333707), Codex security review no findings, merge state CLEAN. Local: 4 shards, tools/tests, installer/tests pass except one test that fails on any installed node, main included (test_fleet_node_runner_attach.py::test_fresh_granted_install_refuses_a_legacy_runner_still_in_place reads /var/lib/sparkops/node-agent). Step 4 done: existing Go canonicalJSON (verbatim, go1.27.1) agrees with Python on 15 of 36 byte-behaviour cases and 11 of 12 routing-table files; the seven difference classes are #333 to #339 (HTML escapes, raw non-ASCII and DEL, U+2028/9, lone surrogates, -0 and integers above 2^53, float spelling, non-finite). Counts: 182 compact sorted-key call sites in the plan&amp;#39;s seven roots (85 ascii, 68 ascii_nan, 19 utf8, 10 utf8_nan), 82 strict-decode hooks, 5 DSSE encoders; the plan&amp;#39;s 221 included other trees. Remains: 174 files listed unclassified in the registry (app 44, node agent 37, backend 35, installer 25, tools 25, connector 5, deploy 3), one package per pull request: classify, freeze vectors per contract, add that package&amp;#39;s contract_bytes (identical copy, pinned by the same vectors), move, delete. The shared module still needs strict decoding and DSSE pre-authentication encoding with their vectors (first needed by the node agent pull request). Exit criteria 1 to 3 are met only for the routes family so far. Open decisions for the owner: (a) modules that translate a refusal into their own error code keep a small adapter around the shared call; the check forbids private implementations, not adapters. (a2) DSSE: only the pre-authentication encoding is shared; each signed contract keeps its own envelope rules, pinned by its own refusal vectors. (a3) A fifth byte form exists that the plan did not count: fixed member order (the helper IPC response and receipt preimage in spire_helper_client._ordered_json); it is frozen in vectors and left with its contract. (b) Broker document vectors are stage 4 step 3; stage 1 will move the broker helpers and record their document vectors as deferred to stage 4. Traps: docs/DEVELOPMENT.md is hash-pinned by docs/environments/catalog.json (editing it fails tools/tests/test_environment_catalog.py); Dockerfile.backend copies coding_policy.py from the node agent by name, so it must also copy contract_bytes.py once that file imports it (needs the spire-acceptance label); the root-broker bundle&amp;#39;s PYTHON_MODULES list must gain contract_bytes.py when a listed module imports it. Revert of #332: git revert -m 1 cc3f0260; later stage 1 pull requests depend on its registry and conventions, so they revert first.\n\n\n2 Go foundation\ndone 2026-10-03 (#350 merged as 0937f0123, owner approved; DeepSeek implemented, GPT-6 Astra reviewed and corrected)\n#350\nBased on main@ce30aac; corrections at 81bed6cc418b1f796fad4a3c56af65d31bc35c9d, in the separate worktree worktrees/sparkops/native-s2-fixes (the implementing agent&amp;#39;s worktree was not touched). Owner decisions of 2026-10-03 above govern the exit criteria: (1) every stage 1 vector means the families whose capabilities internal/contract owns; document-specific families gain Go consumers with their owning daemons in stage 3 onwards, recorded in the README layout table; (2) unknown-field rejection is supplied by DecodeObject; (3) _finish_plan is taken by the stage 1 agent in separate PR #351; (4) the reproducibility artifact is the package&amp;#39;s own test binary; (5) #333\u2013#339 remain open: the encoder meets their first condition, but the two bare json.Marshal writers in scripts/spire-controller-transport and scripts/spire-client-comparison keep the second unmet until stage 3 step 7 migrates or retires them. Code: stdlib-only go/ module with four canonical byte behaviours, strict and unique readers, DecodeObject(raw, allowed...), digests, DSSE PAE and Ed25519 verification, length-prefixed framing and peer credentials. DecodeObject applies strict rules and refuses unknown top-level members as unknown_field; nested objects require their own field validation. Corrections, one code commit each: e18f9e6 reads accepted decode expectations from value and requires exactly one value or refusal for every regular/tolerated expectation; the strict-1e999-returns-zero mutation now fails with got {&amp;quot;x&amp;quot;:0}, want {&amp;quot;x&amp;quot;:Infinity}, and empty expectations fail for both readers in both case groups. 8d0334b adds and tests DecodeObject and documents unknown_field. 81bed6c documents Go&amp;#39;s own defensive depth bound and tests 511/512 accepted versus 513/600 refused (invalid_json) for arrays, objects and mixed nesting under both readers, plus invalid_number and unsupported_value across all four encoders. CPython 3.12.3 accepts arrays and objects at 513 and 600: this is deliberately stricter than Python. Vectors: encode 36 \u00d7 4; decode 29 \u00d7 2 plus 5 tolerated \u00d7 2; DSSE PAE/digests/signatures; ring framing and helper request frames. No file under contracts/vectors/ changed in the corrections. Final-head reproducibility: builder ran two isolated native builds per architecture with matching digests; arm64 23aaed61472690f18ef14f26d0072f4d01ed8032e96933315e8c31b4ae95370d (5,938,308 bytes); amd64 on zynserver d7c188737a5e889e9594f8978b48785a59805156c2587fbe7682ac621e557605 (6,330,258 bytes). Both produced test binaries ran and passed. Generalisation evidence from the prior review at 09931d5: controller transport matches the pre-change ce30aac builder byte for byte, SHA-256 6811885b29bf6422912478fde167cba61d37c2db358aeafc18721bdd1f313f81 (17,360,604 bytes); artifact, recipe, dependencies, packaging, toolchain and reproducibility records equal; source closure, commit, tree and builder source record differ. Correction commits leave that builder/policy/source unchanged. Empty-cache/no-vendor allowance is only enabled by the stdlib foundation policy. Validation at 81bed6c: pinned Go 1.27.1 build/vet/test pass; tools/tests 658 passed, 20 subtests passed; inventory check exit 0; pin coverage 223/223 executed (189 pinned, 34 named-test, 3 elsewhere); packaging selection 47 passed with tools on PYTHONPATH; environment catalog 10 profiles/22 source files; local-app boundary verified. Exact Ruff command: .venv/bin/ruff check backend/tests/test_ci_change_scope.py backend/tests/test_github_actions_runner_deployment.py tools/build_spire_controller_transport_release.py tools/run_go_contract_tests.py tools/tests/test_go_module_policy.py \u2192 All checks passed!. CI: fleet Go lane retains executable tool-cache extraction, Socketpair instead of a long sun_path, the fourth-lane count pin and the Python-equivalent fork guard. CI at 81bed6c: 15/15 passed, foreground gh pr checks 350 --watch exit 0. Security Gate 37099517857 (Go job 111136167502, 12 s), Secret Scan 37099517848, runner canary 37099517879, Signer/Connector/Runner SPIRE acceptance 37099517833 / 37099517840 / 37099517842, and common seam convergence 37099517829 all passed. spire-acceptance remains. Deletion: no production code removed in this foundation stage; old Go writers are an explicit stage 3 hand-off, not a reason to close their issues. Evidence: /tmp/sparkops-s2-fixes-evidence-MsEsaIqu contains commands, logs, mutation failures and both manifests. Remains: owner merge; record merge commit, git revert -m 1 &amp;lt;merge&amp;gt;, and main push checks. No live-fleet deployment or verification is claimed.\n\n\n3 Go inference router\ndone 2026-10-03 \u2014 transport explicitly deferred to 3b\n#355 UTF-32 refusal coverage, head 69cd4da7dc59772a6a84a84a3a163714c7517089; #354 retirement, head 2c9d42677463b78f30b8d74d110c25c9356ac091; #352 tracer, head 6766df5e5464d730505816a5be544f0879b6fa2e, label spire-acceptance\nStarted from origin/main@0937f0123 (48 commits beyond 01e0e849); tracer rebased onto main@bb153c4 after #351 landed. Worktree worktrees/sparkops/native-s3-inference-router, branch agent/native-s3-inference-router. Owner decision, 2026-10-03 UTC / 2026-10-02 PDT: approve the planned router-unit revision: only ExecStart changes; preserve all DynamicUser/hardening/ordering/port/route-path bytes; show all three diffs in the PR; retain the three original node cases with dated supersession metadata and freeze three native successors; ship the vectors, unit switch and binary in one PR. Router unit bytes are regression evidence, not a digest-verified fleet contract. This resolves the initial golden-vector stop. Tracer: stdlib Go router, route/affinity vectors, HTTP and Python/Go differential tests, immediate cancellation during prefill, work-release policy/binary/build-record validation, native node publication and ExecStart. Standard upgrades stage the target work release for the router while preserving the SPIRE-attested action-client path/digest. Tests enforce all three single-line unit diffs and intact old cases. The Python publisher and server are retained pending live proof; this PR deletes the Python launch rendering. Local evidence: pinned Go build/vet/tests, race detector, 914 focused Python/tools tests + 20 subtests, 527 installer tests, Ruff, local-app boundary; final-head inventory clean and pin coverage 224/224 sites (190 pinned, 34 named-test, 3 elsewhere). Both native builders reproduced twice at 6766df5: arm64 96f36ebc2ec4a07429a5a5547722f2840d2ba82568fedad51b24116b0b47194c (10,197,984 bytes); amd64 on zynserver c713724616cd4d2d27d833be6fb121bdb51b93b8974a4f013f8dac7e0a7369f7 (10,974,516 bytes). Final manifests in /tmp/sparkops-s3-final-Cngpv6jH and zynserver /tmp/sparkops-s3-final-6BW9MUTG; first-run logs and built-binary HTTP/SIGTERM smoke in /tmp/sparkops-s3-build-8Orh8cpB. CI: final-head Security Gate 37102584797, Secret Scan 37102584780, signer/connector/runner acceptance 37102584767 / 37102584802 / 37102584812, seam convergence 37102584748, runner canary 37102584776 \u2014 all 15/15 checks passed, foreground gh pr checks 352 --watch exit 0, merge state CLEAN at 6766df5. Merge: owner explicitly approved #352 on 2026-10-03; merged reviewed head as f49a804b86e1cad9e67170d9c44618b83a5919b3 (parents bb153c4ba, 6766df5e). Revert: git revert -m 1 f49a804b86e1cad9e67170d9c44618b83a5919b3. Main push CI: all six workflows / 14 checks passed in the foreground (each gh run watch --exit-status returned 0): Security Gate 37105348622, Secret Scan 37105348604, signer/connector/runner acceptance 37105348632 / 37105348678 / 37105348769, seam convergence 37105348645. Merge tree 9a471cb43dcd9fbb754aba5770097ae72fcf5170 equals the tested PR-head tree. Full main check results and watch logs: /tmp/sparkops-s3-final-Cngpv6jH/main-ci-final.json and main-ci-*.log. Deployment: owner reports cp1 rc.36 (main@f49a804b), dgx1\u20134 node release 07a8d058 / work release 25a84c07f62cc6d8bf622650f1ee2be76dc43bff8c6a013bbb43d28b85d5e198, with authenticated SPIRE work jobs verified during the owner-run upgrades. The owner named dgx1\u20134 after --all refused the powered-off on-demand unifi-worker; that separate #331 issue is outside this stage. Independent live evidence, 2026-10-03 08:24\u201308:32 UTC: all four services active, running executable under that work release, DynamicUser=yes, and binary SHA-256 96f36ebc2ec4a07429a5a5547722f2840d2ba82568fedad51b24116b0b47194c matching the reproduced arm64 artifact; /health and /healthz 200, /v1/models advertises DeepSeek aliases with max_model_len=1048576; all four authenticated fleet heartbeats healthy. Each router reproduces all 523 stable samples from the one real SGLang backend with zero mismatches. Four sequential bounded synthetic streaming requests (one via each router) held an observed running backend slot; client closure released router inflight in 0.0061 / 0.0108 / 0.0111 / 0.0109 s and backend running/queued gauges in 0.1116 / 0.1214 / 0.1222 / 0.1224 s (sampled upper bounds). All four journals report client_closed; all remain health 200 and inflight 0 afterward. These cancel tests occurred after generated tokens, not during prefill. The first shorter diagnostic completed before a reliable cancellation observation and is retained as unproven evidence. Blocker and owner decision: the current route table and authenticated lifecycle status have one DeepSeek TP4 placement on dgx1\u20134, not two TP2 placements. Four simultaneous subagents split two-and-two, and real multi-placement metric aggregation, therefore cannot be proved. Owner explicitly answered \u201cRecord the blocker; keep DeepSeek running.\u201d No model/topology/service/deployment changes made. That initial blocker decision is superseded by the owner revision below. Evidence: /tmp/sparkops-s3-live-sZChIqr2/gate-summary.json, four service/HTTP/metric snapshots, authenticated CLI snapshots, per-node post-cancel journals, cancel-active-9myspwu5/ request timelines, and sha256-manifest.json. Owner revision, 2026-10-03: owner explicitly directs Stage 3 to proceed on DeepSeek TP4. Two-TP2 live distribution and multi-placement metric checks are waived, not executed; retain automated multi-placement coverage. The recorded TP4 evidence now meets the live gate, allowing Python retirement without changing the running model. Retirement PR #354: branch agent/native-s3-retire-python in the same focused router worktree, based on current origin/main@f49a804b. Removes 527 net production Python lines: HTTP server, balancer, affinity, metrics, health loop and entry point; retained parser/publisher function ASTs are identical. Deletes Python differential launcher; native conformance coverage retains prefill cancellation, streaming, retry, HTTP affinity and multi-placement metrics. Frozen vectors are unchanged. Registry retired_sites preserves the removed affinity name in frozen provenance; inventory rejects surviving definitions, live registrations and undocumented/unclaimed retirements. Local: 2,287 tests + 669 subtests (one skipped), 527 installer tests, 65 inventory/vector regression tests, pinned Go build/vet/test and race, node-agent wheel/sdist build, Ruff and boundary; inventory clean, pin coverage 223/223 (189 pinned, 34 named-test, three elsewhere). Evidence /tmp/sparkops-s3-retire-fE21wn7f. #354 CI: all 11/11 triggered checks passed at 2c9d426, foreground gh pr checks 354 --watch exit 0, merge state CLEAN. Security Gate 37111840668, Secret Scan 37111840697, runner canary 37111840681. Label spire-acceptance set; these paths do not select the separate SPIRE acceptance workflows. Final check records in /tmp/sparkops-s3-retire-fE21wn7f/pr-354-final-checks.json. #354 merge: owner approved; merged 2026-10-03 as f38df6a4c582b6cb9d688519bab5ca9aca43df0c (parents f49a804b, 2c9d426). Revert: git revert -m 1 f38df6a4c582b6cb9d688519bab5ca9aca43df0c. #354 main CI: Security Gate 37112624933 and Secret Scan 37112624932 passed, all 10/10 checks green; both foreground watches exited 0. Full check records and watch logs in /tmp/sparkops-s3-retire-fE21wn7f/main-ci-final.json, main-security.log and main-secret.log. The Python server is gone from main. Main is now 57 commits beyond the original 01e0e849 pin. Step 7 fact correction: despite the dormant/lab names, tools/build_spire_work_release.py::_go_binaries builds the live action-client from the controller transport module, and tools/build_spire_helper_release.py::MODULE_RELATIVE selects the comparison module for the live heartbeat helper. installer/fleet_node_install.py::upgrade_node refuses changed work-client/helper/SPIRE-agent digests before effects. The standard upgrade therefore cannot deploy their module migration; the documented attested replacement path is retirement/re-enrollment (docs/installer/spire-fleet-user-flow.md). No transport code or production state changed. Asked the owner whether to move this work and #333\u2013#339 to a separate gate or keep a separately planned attested-client cutover in Stage 3; decision pending. UTF-32 follow-up #355: independent regression coverage committed on agent/native-s3-decoder-refusals: 18 cases across strict/unique readers, UTF-8 BOM and UTF-16/32 byte orders with/without BOM. Replaces the old narrow strict-only check; production code and all golden bytes unchanged. Each literal was independently decoded to the expected JSON document with its named Python codec. Pinned Go 1.27.1 build/vet/all tests and focused 18-case run passed. #355 CI: all 10/10 checks passed at 69cd4da, foreground gh pr checks 355 --watch exited 0, merge state CLEAN. Security Gate 37112878225, Secret Scan 37112878174. Evidence /tmp/sparkops-s3-decoder-ntFk8nOk/refusals.log, pr-ci.log and pr-final-checks.json. #355 merge: blanket owner authorization received; merged as e8c7ee6606f6fd844f4b0dd3cb766c2c43d82706. Revert: git revert -m 1 e8c7ee6606f6fd844f4b0dd3cb766c2c43d82706. Main Security Gate 37115913626 and Secret Scan 37115913645 both passed; foreground watches exited 0. Remains: controller transport/comparison migration with #333\u2013#339 closure and a supported attested-client cutover. Stage exit criteria remain unmet pending that transport work. Owner subsequently authorized work through stage 8. Owner authorization, 2026-10-03 (subsequent): explicitly permits taking DeepSeek V4.1 down to test two Qwen TP2 placements and router balancing. Temporary test uses the supported Flash-Next TP2 profile on dgx1+dgx2 and dgx3+dgx4 through scoped sparkops --session model lifecycle operations, followed by restoration of DeepSeek TP4 on all four nodes. Before-state, catalog and plans saved in /tmp/sparkops-s3-tp2-aui186_0; stop and restoration plans executable, initial Qwen plans correctly refused while DeepSeek occupies the complete TP4 topology. Live TP2 evidence pending; the earlier waiver is historical, not a measured pass. This permission does not authorize #355 merge or resolve transport step 7. TP2 live proof, 2026-10-03: user-authorized DeepSeek stop op-ba596beb819007f54104bfcd completed with cleanup verified; Flash-Next TP2 operations op-1a3b25f4c361b028f96880ca (dgx1+dgx2, generation 11) and op-28f2eff18084fca373eb5dbb (dgx3+dgx4, generation 12) both semantically ready. All four native routers retain the reproduced arm64 binary and DynamicUser, health/healthz 200, two healthy placements, and max_model_len=644732. Four Qwen role workers through dgx3&amp;#39;s router all succeeded with overlapping request windows; router inflight and both real vLLM running-request gauges simultaneously measured [2,2]; exactly four body-affinity routing events split two per placement, all HTTP 200 on first attempt. Every router correctly aggregates 502 stable samples shared by both backends (418 nonzero), zero mismatches. Evidence /tmp/sparkops-s3-tp2-aui186_0: tp2-verification-summary.json, roles-results.json, roles-samples.json, roles-routed-events.json, metrics-checks.json, all raw backend/router scrapes and four service inspections. These two previously waived checks are now executed and passed. Qwen stops op-c689a0ff00b6282331fefe0c and op-1bd904362bb8845ea606e7a2 both succeeded with absence and cleanup verified. Restoration verified: DeepSeek TP4 operation op-7d22c3151a4251ac336927c3 succeeded at 2026-10-03T10:05:18.963711Z; semantic readiness and original endpoint http://10.10.10.101:8888/v1 verified at binding generation 5. Only DeepSeek remains bound, all four fleet heartbeats healthy, all four native routers active with the reproduced binary and DynamicUser, health/healthz 200, one healthy placement, and max_model_len=1048576. Each restored router reproduces 400 stable real-backend metric samples with zero mismatches. Four TP2 request windows overlapped for 10.249 seconds. Final proof and restoration records: /tmp/sparkops-s3-tp2-aui186_0/gate-summary.json, restored/inspection-summary.json, restored-models.json, restored-fleet.json, restore-deepseek.json, and sha256-manifest.json. Stage 3 step 5 is now fully evidenced; #355 main checks subsequently passed as recorded above. Transport migration/issue-closure scope remains pending. No further production change is required for this TP2 test. CI reliability follow-up #357: #356 exposed premature slot inspection in TestUnreachableRetriesButHTTPErrorDoesNot; 1,000 local repetitions reproduced. Waiting on ServeHTTP completion exposed ephemeral-port reuse/self-proxy under stress; fixed the target test with one deterministic dial refusal and a real HTTP responding backend. Assert one refusal, one HTTP 500, unchanged body and zero slots after handler completion. Pinned Go build/vet/full tests, 3,000 repetitions and 100 race repetitions passed; separate Standards/Spec reviews clear. PR #357, head 45fe8d5, 10/10 CI passed; merged as f6a2722a060ce5aadab4ff567794a7d574156500. Main Security Gate 37118892924 and Secret Scan 37118892928 both passed in foreground. Revert: git revert -m 1 f6a2722a060ce5aadab4ff567794a7d574156500; production/router vectors unchanged. Evidence /tmp/sparkops-s3-completion-LtgogzfX. Final fleet recheck, 2026-10-03 11:47 UTC: only DeepSeek TP4 remains, ready generation 5 with max_model_len=1048576, all four heartbeats healthy and a fresh semantic probe passed. Scoped CLI evidence and hashes: /tmp/sparkops-native-overnight-final-baOg29ND.\n\n\n3b Transport fold + attested-client cutover\ndone 2026-10-05 \u2014 rc.53 (38fa5ba7) on cp1 and attested clients cut over on dgx1\u20134 + zynserver; #333\u2013#339 closed\n#366, #390; #333\u2013#339 remain open\nOwner accepted the separate gate on 2026-10-03 after the router live checks and retirement passed. Includes action/helper/runner clients and connector canonical comparison audit; supported identity replacement, rollback and live proof remain required. Initial transport/action-client/rotation-probe source fold, merged with current main at local b6507d4, is in worktrees/sparkops/native-s3b-transport-fold, design 2026-10-03-sparkops-native-s3b-transport-design.md. Shared canonical bytes, strict decoding, framing and Unix credentials replace private implementations; pinned Go build/vet/tests, 86 focused packaging/record/lab tests, 677 tools tests +20 subtests, Ruff, contract inventory and local-app boundary pass locally. Full Python shards passed 1754/1538/1904/2034 tests plus isolated CLI suites (evidence /tmp/sparkops-3b-shards-8h3suh8j); intentional skipped/xfailed cases remain reported in their logs. Invalid UTF-8/lone-surrogate/deep-nesting config refusal documented; old vectors unchanged. Historical build inventories remain accepted; the new inventory is distinct. Merged-main validation also passed the actual pinned Go CI driver including isolated Python adapter/prune tests and four Python shards1720/1642/1948/1970 plusCLI (evidence /tmp/sparkops-3b-merged-shards-kr__j8u7, /tmp/sparkops-3b-merged-go-lane.log). Draft PR366 at 7a9c4a1 includes explicit pinned cutover planning, the exact 67-file native closure after #364, and corrected transport-lane package selection; ordinary upgrade refusal preserved. Tools762+20subtests and33 focused cutover/release-set tests pass; review 2026-10-03-sparkops-pr366-review.md records corrected artifact reference validation. Corrected measurer verified rc36/rc37 attested node/runner bytes identical on botharchitectures (/tmp/sparkops-native-rc37-attested-artifact-comparison.json). Pinned native arm64 transport/action-client tests and unsigned component reproduction passed; all 15 PR366 checks passed at7a9c4a1 (Security37147918794). Exact records in /tmp/sparkops-s3b-native-arm-records.jsonl; x86 reproduction and cutover rehearsal remain. No live identity changed. Comparison/helper, runner and connector audit, final combined source closure, cutover rehearsal and live verification remain. Exact transport tracer head is474ad94; both older7a native reproductions passed, and the exact B474 syntheticrc40 source/core/components/package and independent native installer reproduction now pass on the x86 builder. A remains actual rc38 source5fb68c1 under fresh fixture keys; both official builders are released to root. B archive935d1838859fc3b114d691a496a3626cadd3634aff17111c60351fb076ddb7b4, manifestbb39735cab71fa2deb966de8d723fe64f1755f9c371902ef7786ed81a67b74ea. Fresh04 guests are not yet allocated; verified artifact comparison precedes allocation. Audit of remaining installed helper/runner/connector/signer modules is in 2026-10-03-sparkops-native-s3b-contract-surface-audit.md; first transport tracer alone does not close333\u2013339. Fresh04 A5fb baseline initially refused activation after publishingready; direct read-only readiness then passed with allphase/identityhashes unchanged. Identical publicattachretry passed, preserving the original refusal and unproven cause. A jobs82dd6a0b/8b142914 passed. B474 publiccontrollerupgrade/status/doctor passed. Ordinary fleetupgrade --check correctly refused changed work-client attestation; before/after phase receipts, node identity, heartbeatselection, processPIDs, authhead and registrations were byte-identical. Actual04 rehearsal now passed A5fb\u2192B474\u2192A plus cold boot, ordinary-upgrade refusal and idempotent reenrollment. A supplemental B\u2192A cycle captured fresh independent routes files and exact authenticated controller/node job outcomes. Stablehost/workloadIDs/UIDs are preserved across authorization revisions1/3/5/7/9; old parents are absent/unselected. Final A installation6f305f59-fe88-42a1-98b3-7d6a8876a11a and job934204e4d0943640a8aba07d passed. Report state/sparkops-native-s3b-rehearsal-20261003/rehearsal-report.json SHA700935a3a69caf1770d9a898760447a3f5711a3c54bd7f0a12fac16701ebbd45 binds227 evidence files. Exact04 domains/files/ports are absent; final canonical receipts await natural DHCP lease expiry. Initial activation refusal and invalid combined rollback/check attempt remain recorded honestly. No production cutover or full3b pass is claimed; current-main source integration/reproduction comes next. Final379-integrated tracer2ef208366462d1030722b75f416780a50ad8c101 passed all15PRchecks in foreground (/tmp/sparkops-pr366-ci-watch-2ef-current.log). Native Go inputs equal independently reproduced0bc2b33, but executable hashes differ from474 because main added Unicode15 source; supplemental exact-current05rehearsal is prepared under state/sparkops-native-s3b-current-rehearsal-20261003, approved procedure 2026-10-03-sparkops-native-s3b-current-node-rehearsal.md. No merge or production cutover before that proof. The04rehearsal guests are fully retired after natural lease expiry: controller13cadf5a4e7c9ef245911cf0b3093a54aca7cff12399051718ea404175879303, nodec4ecfb31bb86ea3af1189485869009c3ed489bb13e374d501554407294a5b378; domains/files/ports/leases absent. Final index state/sparkops-native-s3b-rehearsal-20261003/rehearsal-retirement-final.json SHAbe00aa32792b40edc84976f556ec7c0914f9e1687e2d79a15c4b35438ec1c668 binds the unchanged original report. Current branch integrated unrelated #380 as91b2d5e387eae1804104cbec9927955448cd0256; Go, native builder inputs and node installation effect source are byte-identical to rehearsed2ef.847 integration tests+20subtests pass; newCIwatch running.05 exact artifact archiveb333483c7e19dfc36c28598d3f6725a65232768c8e42d8640d0111246f64da4b, manifest474eddcc6bb419555423f35b6c406963fb8c75c921ff239dba8ded4769ff15d0 (exact verified manifest remains in task report), actual actioncb1a9232/transport5c2db7e9 match independent reproduction.05 A install/attach/health/job passed; normal B upgrade refused changed attested client before effects; supported reenrollment underway. Current supplemental05 exact-native rehearsal passes A\u2192B\u2192A with old/new current binary hashes, supported controller upgrade/rollback and node reenrollment, ordinary refusal without effects, coldboot, four authenticated jobs, stable accounts/host/workload IDs and repeated convergence. Root verified175 evidence hashes against report319e9ceb94d8a0d220c67a25ab401287accba9a90e6066d4dd88040164a74711 instate/sparkops-native-s3b-current-rehearsal-20261003/. Domains/files/ports absent; lease expiry00:31:34/35UTC pending under agent custody. PR366 final e5531b48 all15 checks passed foreground;91b2 CI import failure corrected with isolated by-path regression; native/rehearsed effect inputs unchanged. #366 merged00:09:16UTC2026-10-04 as9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871; revertgit revert -m 1 9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871. Final head72cb91cd integrates381;56focused+62subtests passed, all15 PR checks passed rootforeground, no unresolvedthreads. Main six workflows+dependencygraph watched; rc43nativebuild started atfixedmerge. Production baseline records allfourDGX andzynserver identities/accounts/runningclienthashes and controllerauth/SPIRE inventory atstate/sparkops-native-s3b-production-20261003-PWqz8bIH/. No production3b identity changed yet. zyn also needs action-client reenrollment; runnerreplacement alone would leaveitsoldworkclient. #366 all main workflows and dependency graph passed foreground (/tmp/sparkops-pr366-main-watch-results.json). Standardrc43 build initially stopped on x86 disk guard; two hash-matched redundant retired-lab candidate copies were removed after owner-agent release, preserving full local archives. Next attempt exposed stale operational test setup: shared-module installer tests require vendoring. Operational driver now invokes source-owned tools.run_go_contract_tests; full pinned Go build/vet/all tests passed on both native builders, component packaging continues. No product byte or test was waived. rc43 preparation, 2026-10-04 00:33 UTC: both pinned native builders passed the complete source-owned Go driver and reproduced the rehearsed action-client/transport pins. The ordinary assembler correctly refused with exit3 because only work_client changes on both platforms. Independently measured explicit plan e52775f8091d58ced93570c5a1ab0d0b60000d734024493eb68b4a475b436f1f binds rc42 set e76ac957..., source 9bcab813..., ARM manifest 3b8c26e2..., x86 manifest 7aaf3ba6..., and immutable rehearsal report 319e9ceb...; explicit assembly is underway. 05 rehearsal is fully retired: final index c2e822be40799b2e354b698097d3f4204cbe30711d72c9f4daa2cd3202557975, controller receipt 816ad56810ac27c6cc4c2114d6e2a519116b302b151a531d0885cc322c7a2797, node receipt 594c1a92f1c107113ddbdd61b79e4cea4b15ec8782b3c021f899a23441e0f7c6; all175 original evidence files rehashed, report unchanged. Signed rc43 set aa62b3bb32e0e936224737ca77fd549f8d86603eefbe6fbb8e1844b49b5d2d4e assembled; archive b4b7d7fcce3415de5fafb37ff317f29c9d3f479b1d7224ebaf7e419fa42b4f0e. Standard cp1 upgrade completed00:46:09UTC; independent source observation and sequential status/doctor both canonical_healthy=true. Production evidence directory state/sparkops-native-s3b-production-20261003-PWqz8bIH/. dgx1 re-enrollment refused before retirement at reenroll_check: recorded/node contexts are identical but current admission adds runners=true from a later verified grant. Comparison against the rc43 controller pre-reenrollment observation confirms all registrations/authorizations and dgx1 identity/release/six active services/model container unchanged. Evidence context-difference-dgx1.json, controller-refused-dgx1.json, refused-rc43-dgx1.json. Fleet remains on rc42 node software; zyn remains on its older node release. A narrow controller-side retained-context observation fix is in progress in fix-reenroll-retained-context; strict node context equality remains required. Production cutover/live gate is pending that fix and a new signed release. PR382 retained-context repair merged at01:08:17UTC2026-10-04 ase77df2ff00a70458b0629afe504ef4eb8e9fc9cf, after all10 exact-head checks passed; no unresolved review threads. #382, review2026-10-04-sparkops-reenroll-retained-context-review.md; revertgit revert -m 1 e77df2ff00a70458b0629afe504ef4eb8e9fc9cf. Custody-checked historical context is used only for the read-only observation; current admission still governs the replacement, and node context equality is unchanged. Both main foreground watches passed: Security37167091438 and Secret37167091473; evidence/tmp/sparkops-pr382-main-watch-results.json. rc44 two-architecture signed build is underway, batching already-green #371 and #368; cp1 remains rc43, DGX nodes rc42, no node reenrollment has completed. rc44 set78bd417effcbbffec95740369e4c53567246da2a16f2c2506546a9fe19021055 built/signed frome77df2f on both native builders. Measured rc42\u219244 cutover plan069e4c3fd78149b2fdb3910208319e9639207b5b682afcf0c73df080b94181cf confirms only action-client changes; exact action/transport bytes equal the05 rehearsal and installed five-host helper/action/SPIRE baselines match expected previous pins. ARM manifeste6ad676316364e0c76968a7cb76bf7df5822b1e9723c7649911b526a23b69157, x86c471d62b09b3595d44938130be2dbe3ad87e2ec377eaa1a4419a24bf439e8610. Evidencestate/sparkops-native-s3b-production-20261003-PWqz8bIH/rc44-measurement.json. Standard cp1 upgrade started01:24UTC; live node cutover remains pending. rc44 standard cp1 deployment completed01:26:59UTC; independent serialized status/doctor each report canonical_healthy=true, and measured installed source is e77df2f. Evidencecontroller-status-rc44.stdout, controller-doctor-rc44.stdout, controller-rc44-controller.json in the production directory; standard deploy log/tmp/sparkops-native-rc44-deploy.log. First supported dgx1 reenroll started after idle-runner verification; no success assumed before completion. rc44 first production cutover verified on dgx1 at01:31:30UTC2026-10-04: stable host/account/model state preserved, old SPIRE parent retired, new parent4e93c3f9 and installationd323be8f selected, action-clientf734dac2 runs from recorded work release, helper authorization revision3. Authenticated attach job939514b5 and subsequent standard upgrade job6b8e1d19 passed; exact runner UID/path/hash selectors and installed doctor passed before reactivation. dgx2 initially refused before effects because its original known-hosts pin3bbfc6b2 differs from the later four-host file27a328a4. Controller entries/auth and all six process start identities remained unchanged. Restored the exact original188 public bytes from the first two unchanged lines, SHA matching the immutable request, into a new root0600 input; no trust record or guard changed. Retrying supported reenrollment with preserved failed evidence. DGX3/4 and zyn supplied known-hosts files independently match their original pins. Evidence filenames verified-rc44-dgx1-dgx1.json, verified-runner-rc44-dgx1-dgx1.json, dgx2-pinned-known-hosts-restoration.json under the production directory. Remaining four-component fold plan is reviewed in 2026-10-04-sparkops-native-s3b-remaining-fold-plan.md; local source work authorized, installed cutover remains separate. dgx2 retry reached new installatione8271163/new agentadb6197a, then failed helper activation at01:49:57UTC. Actual provider events are admitted\u2192rollback_started\u2192drop_in_restored\u2192helper_inactive\u2192selected_state_removed\u2192provider_legacy\u2192rolled_back; no candidate_started or semantic health event. Exact original exception is discarded by the current product adapter, so a startup race is unproven. Partial observation partial-rc44-dgx2.json proves model container and accounts unchanged, SPIRE active, helper/node/work/router stopped; dgx2 router is unavailable. Failed attempt retains its original signed activation expiry02:48:55UTC. Supported resume may reuse this terminally rolled-back command before expiry; no state/authority/pin edits made to bypass it. Root pauses remaining hosts and prepares a passive installed observer and supported recovery. Follow-up routers on dgx1/3/4 now report HTTP503, zero placements and empty model catalog (router-outage-rc44-dgx2-*.json); running model containers alone do not prove availability. dgx2 node-heartbeat outage is the leading explanation for TP4 withdrawal, not yet independently proven. Confirmed source regression reproduces actual signed provider terminal rollback while controller still offers resume before expiry; source note 2026-10-04-sparkops-helper-activation-refusal-source-note.md, red log/tmp/s7-reenroll-completed-rollback-red.log. No speculative startup correction or authority bypass. 2026-10-04 02:32Z: reviewed completed-rollback correction f092000e cannot yet recover the old rc44 attempt through a newer release: existing cross-release guard refuses a fresh attachment under the prior release before marker observation. Same-release natural expiry at 02:48:55Z is being checked as the supported recovery path. Do not bypass the release/identity guard. Exact e77 same-release expiry path now has executable source proof: 2026-10-04-test-e77-expired-rollback-successor.py passed, unchanged prior plan/request retained and separately named retirement/successor selected only after expiry. One guarded live script recover-dgx2-rc44-expired.py is prepared for after 02:48:55Z; no early retry or altered clock. Recovery update 2026-10-04 UTC: rc45 source98d4f528 deployed on cp1 at02:54:21Z; release set eaa63dac52cc99e5b16b351a34ad2770368b76ed0687065960dffe4b5f737e2c reproduced on both pinned builders. Installed zynserver and dgx1 runner doctors report ready; zyn supervisor enabled/active, actual fleet CI resumed. PR384 all13checks passed in sole foreground watch exit0 (/tmp/sparkops-pr384-checks-watch.log); merge held for owner convergence order372first. Earlier same-release dgx2 successor7f4beccf-1de3-4a6a-87b6-2112fd6f054f failed activation02:50:39Z. Passive observer and actual installed read-only parser both identify duplicate inode0 rows from unrelated X11 sockets in /proc/net/unix. Reviewed source b3df670f excludes zero from descriptor identities; duplicate positive inode and zero helper-listener refusals remain,39tests55subtests pass. DeepSeek remains unavailable; no fleet recovery success claimed. The newer-release recovery guard also requires a durable correction:226focused tests now prove a separate terminal-rollback successor without rewriting the failed plan; independent review pending. Evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/. Recovery source8c5836b2 independently reviewed;230focused tests plus43terminal tests after review correction, all historical goldens preserved. ExistingPR384 fast-forwarded to this head for incident repair; its prior13greenchecks apply only to98d, new sole watch /tmp/sparkops-pr384-recovery-checks-watch.log pending. rc46 official two-builder build underway after x86 diskguard stopped initial attempt. Reviewed exact generated candidate-e77df2ff00a7/build-e77df2ff00a7 removed on x86, source and no-process-use checked, signed rc44 archive retained locally;8.46GB free. Detail 2026-10-04-sparkops-terminal-activation-recovery.md. rc46source8c5836b2 built/reproduced/signed successfully on botharchitectures; setc970a8c70c5a44067e2e00c1c92dc7701b179069f7dd9b059fbda15400efbf7b, ARMmanifest5a405fbacc436efc716dabeb767f2b84cfb69ebdcc241e1976f8832348060ce6, x86manifestca7f4ca5426779bba5dd5b15d12391a3cd0af2c7e2dbc26a49a90c0e54fc344b. Normalupgrade-fromrc45 gatepassed (attestedbytesunchanged). Standardcp1upgrade running. PR3848c CI12/13 passed; shard2\u2019s36failures were one test-mock lifetime leak, reproduced with2modules and fixed atlocalfad34c70 (89pass), tests-only, unpushed. Built8c productionfilesunchanged; nextproductionrelease mustcontainrepair. No recoveryclaimed yet. Standardrc46cp1upgrade completed03:35:38Z (doctor/status/runnerrefreshpassed), supported one-shot dgx2terminalrecovery nowrunning from exactretained024930operation. Evidence rc46-helper-recovery-controller-upgrade.log and rc46-dgx2-recovery-driver.log. LIVE RECOVERY PASSED03:38:34Z: rc46supportedreenroll plusstandarddgx2upgrade completed; newinstallationd801be5c-5e05-4ff1-80c3-0e2e1ab0eaac, node released6f11c2666b9, source8c5836b2, authorizationrev7. Authenticatedmemoryjobs57a79f7f4a66fc8ceeb88c2e and3d90c00c32c17aff081688f5passed. Independentproof verifiesnewparent/unchangedstableowner,NSS,modelcontainer, measuredactionclientf734dac2, oldandfailedparentregistrationsabsent. Installedfixedobserver SHA32df65ea11e362238414ee03bffb419be4cb8c11c695da18ebf4bc01693d2fa1 returned9healthy observations with noerrors. All4routershealth200/onehealthyplacement andDeepSeek1048576models; actualdgx3routerstream200,DONE,2contentchars,stop,0.306s at03:39:30Z. Authenticatedlifecycle read reportsDeepSeekready withfreshsemantic toolcallproof. One earlycapture503beforefreshroutepublicationpreserved. Evidence verified-rc46-dgx2-terminal-recovery-dgx2.json, router-after-rc46-dgx1..4.json, router-stream-after-rc46.json, installed-helper-observer-after-rc46.jsonl. Runnerinstalledbutdisabledasdesigned; doctor/enablepending. dgx3/4attestedcutoversandfourremainingclientfoldstillopen. dgx2installedrunnerdoctor all7checks andbothrepositoryproviders ready; enabled/startedcanonicalsupervisor afterbindingproof (runner-doctor-rc46-dgx2.json, runner-enabled-rc46-dgx2.log). FleetCIcapacityfullyrestored; actualRustworkflow remainsopen. PR384 local test-only follow-up fad34c700b98473c082cacc0b1fb6b8ca97e4d32 fixes a fixture-owned provider mock teardown leak: the two-module regression reproduced36 failures before the fix and passed89 tests afterward. It changes no production source from live rc46/8c5836b2. Root reviewed the narrow correction; publication waits for PR372 under the convergence order. Recovery PR384 integrated published head ba7d4e1f75b5b466d21c77cf98a8fc7311af43bf includes merged372 and test-only provider-mock repairfad34c70. Both vector-README additions preserved;223 focused integration tests, inventory/boundary checks and69 unchanged original JSON goldens pass. One foreground watch /tmp/sparkops-pr384-integrated-checks-watch.log is active. rc46/8c remains the measured deployed source; no new live action-tranche proof is inferred from this integration. PR384 exactba7d4e1f finished11/11 checks successfully in the sole foreground watch; exact-head snapshot /tmp/sparkops-pr384-integrated-ci-final.json. Final DeepSeek review raised a possible short-history indexing issue; root traced native fixed-order/hole-refusing journal validation, which makes the alleged activation-prepared short history unreachable. Independent final adjudication is finishing before merge; no merge claimed yet. PR384 merged2026-10-04 04:28:22Z: 529867d769b832faf72f1970972defb05ea23882; revert git revert -m 1 529867d769b832faf72f1970972defb05ea23882. Finalheadba7d4e1f passed11/11; final DeepSeek/Astra adjudication has no actionable finding (state/sparkops-pr384-final-review-9tq61vlw/adjudication.md). Root independently confirmed the native journal prevents the alleged short activation-prepared history. Main Security37177092675 and Secret37177092674 are under foreground watch; result pending. This merge preserves the recovery already measured live inrc46 and merged372 source; it is not a new deployment. WIP preservation 2026-10-04: remaining helper/runner/connector/signer fold is now committed and pushed as 9291274aeb8dcfb8686ce0eb021762b71581fca7 on agent/native-s3b-remaining-clients; clean tree, no PR or release readiness claimed. All 45 original Go files have counterparts (33 byte-identical, 12 changed), with 72 preserved outcomes and 18 explicit successors. Missing pin harness, builder/inventory/validator/workflow consumers, focused passing tests, reproduction and supported live identity cutover remain; see the branch checkpoint note. Original source/capture hashes were verified. Read-only integration preparation2026-10-04 saved in state/s3b-readonly-preparation-xzxn9zi5/: all72 preserved capture/source hashes verified; missing pin harness and stale closures/workflow filters enumerated. Generic-map lone-surrogate response handling is an unexecuted compatibility concern requiring original-producer regression before acceptance. Final combined release should use one supported reenrollment per affected host, because reenrollment already republishes granted runner identity. Source remains clean; no implementation or cutover claimed. Remaining-client preparation resumed locally: exactmainac014ba integrated at2b52ba06 preserving all59 current registry families plus the Stage3b family; clean checkpoint91798caa49945ab65f7d7ef6f17aa532230969e8 adds the missing immutable pin verifier/consumer enrollment and a55-input raw-response differential harness.28 focused checks, registry inventory/Ruff and correctly configured239/239 pin coverage pass. All original72captures/53producer-file hashes remain intact. Actual original/candidate Go trace refused its preflight at887,623,680B free before scratch/copy/compiler invocation; capacity recovery is being prepared, so surrogate/numeric compatibility remains unmeasured. No wire implementation change, push/CI or live identity cutover in this continuation. Executed raw55compatibility trace: originale77df2ff/candidate91798caa usedidentical pinnedGo1.27.1 harness andunchangedtrackedsource;24observationsidentical,31different. Four lone-surrogate composedresponse widenings andfournumeric narrowings are real; synthetic typed-struct post-processing errors are separatelyclassified. Originalreport49f4dd38ff460de6f12440da36ef6db42b368fdace561ceb587ecbfb3153418d remainsfrozen; adjudication state/s3b-raw-trace-retry-xo9z2w23/adjudication.md. Wire/decoder/golden outcomes remainunchanged pendingexplicit boundarydisposition; independentbuild/packagingclosurework resumes locally againstStage8b2. Completedtracescratch retiredbyrootafterfullunique-bytepreservation, exactidentity/no-referencechecks; x86free9,389,723,648B/off beforefinalStage8build. Noattestedclientcutover. Raw-response scope adjudication: root plus independent Astra read-only review found the minimal repair already authorized by Stage2 match-Python-or-refuse and approved3b case-by-case new refusals. Keep conservative numeric intersection and document four new refusals; restore map lone-surrogate refusal without changing shared canonical semantics; compose additive Unicode/response evidence from preserved originals. state/s3b-wire-decision-yd7fuu_t/scope-adjudication-20261004.md. This is an implementation disposition, not a new owner decision or a passed wire gate. Packaging checkpoint8df77bbb passes465Python checks plus64subtests; root independently verifies224shared module files and exact230controller/230runner/232helper closures. Native execution/finalCI/cutover remain pending. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. #366 merge 9bcab813f4e0539ff2d60d5fe20f8a28fa5e7871 is already in main. Remaining four-client fold is clean and pushed as agent/native-s3b-remaining-clients@b7fb3a1ada3cb17febc95dd24073075e41d8d066 (current83ad integrated; final docs only after tested670). Native155 top-level+316 subtests, permanent41-case consumer, vet/gofmt and final long-GOTMPDIR old-red/new-green3/3 passed; four isolated interop drivers explicitly skipped. Root/independent source reviews recorded. Next: recheck head/base, review prepared state/s3b-pr-preparation-azvev3ht/body.md, obtain remaining cross-review, open labelled PR, watch exact PR/main CI, then reproduce both architectures, rehearse exact-artifact identity forward/rollback, and perform the supported combined attested cutover. X86 free2.69GB blocks full release until reviewed capacity recovery. dgx3/4 normal node upgrades still refuse changed attested action-client bytes; do not bypass. Actual heartbeat/work/affected CI lanes and signer/connector proof remain owed. #333\u2013#339 freshly confirmed open; close only after live gate. Historical native-s3b-transport-fold@72cb91cd is fully merged. No new PR/release/cutover started at handover. See successor handoff for exact commands, branch dispositions and live release digests. Takeover 2026-10-04 (Claude Opus 5.5): fresh readback at 16:36Z matched the handoff exactly (state/native-takeover-VEMDbjIG/final-health/). #390 opened from b7fb3a1a with spire-acceptance; first CI failed the fleet Go lane (moved connector/signer socket fixtures exceeded sockaddr_un under the lane&amp;#39;s hermetic HOME) and Gitleaks (three filename digests in the fold provenance). GPT-6 Astra xhigh cross-review found one real widening: the typed runner request decoder kept number literals, so local requests admitted 1.0, -0.0, 1e-07 and 2^53+1; plus under-documented helper/signer refusals. Fix cc75927f applies the legacy numeric intersection to request bodies (json.Number too), gives the connector/signer fixtures a private spc-* custody root via their existing SPARKOPS_CUSTODY_TEST_ROOT, adds an exact filename+digest Gitleaks exception, a signer GET/GET duplicate test and docs; pinned Go1.27.1 ARM64 connector old-red/new-green, runner/connector/signer/vet/gofmt, 70 focused Python tests and assurance verify passed; Astra re-review: no actionable findings. All 16 PR checks passed in one foreground watch at cc75927f, including the four isolated composition drivers in their acceptance lanes. Merged 17:04:26Z as 6ffb395c922aa23239695b13236b9ee459e5b81b; revert git revert -m 1 6ffb395c922aa23239695b13236b9ee459e5b81b. All 8 exact-main runs (Security Gate, Secret Scan, Rust build, connector/signer/runner acceptance, seam convergence, dependency graph) passed. Deployment scope (state/native-takeover-VEMDbjIG/s3b-deployment-scope.md): no connector unit/container on any host, so no live connector cutover; signer helper rides the cp1 control-plane upgrade; helper+runner client change on dgx1-4 and zynserver; dgx3/4 also still need the #366 action-client transition. Blocked on builder capacity: x86 builder 2.69 GB and ARM builder 5.41 GB free versus the 8 GB release guard; both hold ~100/61 old sparkops/cp release image sets. Literal retirement plan keeping 0.1.17-rc.46..51 (state/s3b-x86-capacity-ng7g8fXJ/retire-plan.json) was denied by the auto-mode classifier and awaits owner approval; nothing removed, both builders shut off. Disk growth 2026-10-04 (owner: grow VM disks 3\u20134x, no TrueNAS zvol change): x86 builder qcow2 64\u2192256 GiB, guest / now 202.4 GB free (24% used), zynserver keeps \u226536% free worst case; ARM builder unchanged (dgx1 / only 16.1% free) and the 3x resize was denied by the auto-mode classifier (&amp;quot;Interfere With Workloads&amp;quot;, dgx1 serves DeepSeek), so ARM still has 5.4 GB and every release remains blocked. Evidence state/builder-disk-double-gBLMQd/. Owner then approved ARM 3x: qcow2 64\u2192192 GiB, guest / 138.5 GB free (31%), dgx1 worst case ~175 GB free. Builder capacity is no longer a blocker. Both builders shut off. Next: build rc.52 candidates from main 1705f7eb (helper state/native-takeover-VEMDbjIG/build-cutover-candidates.sh, build+sign without assembly), lab-rehearse A=rc.51 83ad466b \u2192 B on fresh x86 lab guests (harness template state/sparkops-native-s3b-current-rehearsal-20261003/plan/, procedure reviews/2026-10-03-sparkops-native-s3b-current-node-rehearsal.md, readiness steps 4\u20137), then cutover plan + assembly, cp1 upgrade, per-host reenroll. rc.52 (2026-10-04): official candidates from 1705f7eb signed on both builders (x86 16c9e956\u2026, ARM 14b4facd\u2026), unassembled pending the cutover plan; changed attested set vs rc.51 = heartbeat_helper + runner_client. Lab rehearsal state/sparkops-native-s3b-cutover-rehearsal-20261004/ (fresh -06 x86 pair): lab A/B attested bytes equal production rc.51 pins and the official rc.52 candidate; baseline A job, ordinary-upgrade refusal (no effects) and forward reenroll onto B with stable identities and a fresh authenticated job passed; repeat reenroll converged and the cold cycle passed, but the return leg found a release defect: upgrade control-plane --rollback refused &amp;quot;immutable installer cache drifted&amp;quot; (since 325d1366 the installed release rendered the rollback target with its own sealed cache). Fixed by #393, merged 38fa5ba73c5fb842dd79804e6a1d04ffd07e431f; rc.52 abandoned unpublished, -06 pair retired. rc.53 (2026-10-04): official candidates from 38fa5ba7; full rehearsal repeated on a fresh -07 pair (state/sparkops-native-s3b-cutover-rehearsal-20261004b/) and passed end to end, including the controller rollback rc.53\u2192rc.51 (report sha e378b274\u2026, 190 evidence files; pair retired). Cutover plan pin 5c14eabd\u2026 (changed: heartbeat_helper + runner_client on both platforms); release set release-set-38fa5ba73c5f-v0117rc53 sha 89e97db7\u2026 assembled through the cutover gate. cp1 on rc.53 since 2026-10-05 00:36Z (doctor healthy; read-back of dgx1\u20134 node services, five runner doctors, heartbeats and DeepSeek readiness passed). Per-host cutover 2026-10-05: fleet reenroll dgx1 00:40Z, dgx2 01:21Z (recorded known-hosts native-rc44-dgx2-pinned-lo58oegh/known-hosts), dgx3 01:59Z, dgx4 02:38Z, zynserver 03:03Z (native-rust-known-hosts); each: memory diagnostic over SPIRE, helper/runner client equal the cutover plan (ARM 941735b4/e494afd8, x86 065356f0/d15c4b88), work client f734dac2/cb1a9232 (dgx3/dgx4/zynserver completed the #366 move), spire-agent unchanged, DeepSeek TP4 untouched, router healthy, and a CI job on the new runner client (security-gate reruns of run 37243905936; zynserver native Rust run 37230688271). capabilities adopt --check: no blockers, +44 reported capabilities per host (pre-existing frozen-capability drift); owner approved and it was applied 2026-10-05 ~06:10Z: dgx1\u20134 record 54, zynserver 47 (7 admission-controlled refused), recheck shows nothing left to add. #333\u2013#339 closed. Findings: (1) reenroll leaves the new runner unit stopped and disabled (console Start needed; disabled at boot on all five hosts); (2) zynserver&amp;#39;s runner replacement emptied the native-rust private engine \u2014 image rebuilt+rescanned (d7828864\u2026); (3) console runner Inspect shows nothing and nothing marks a stopped runner. Installer part (per the ADR 0047 hold, goes into the Stage 7 Go installer, not Python): fleet reenroll must carry the retired runner unit&amp;#39;s recorded active/enabled state (05-node-retire.done.json units) to the new install \u2014 enable at install, queue ci.github_actions.runner_start via the controller-local admin session after refresh_runner_authority \u2014 and keep the approved native-rust image across the node retirement (save/load the approval&amp;#39;s exact image ID instead of archiving /var/lib/sparkops/native-rust-docker; dockerd sets that root to 0710 vs rendered 0700). Product PR #394 (merged 8dfc6a78): private-engine images; runners page shows state and a real details view; shipped as rc.54 (release set 60d10012\u2026, ordinary assembly from rc.53), owner deployed cp1 2026-10-05 07:22Z, doctor all five gates true, heartbeats healthy, DeepSeek ready dgx1\u20134 (state/native-takeover-VEMDbjIG/readback-rc54/). Deploys were run by the owner (classifier blocks the agent). Runner replacement cannot be rehearsed on x86 lab (release runner policy is ARM64-only except hostname zynserver); production runner --replace goes one host first with a CI job proof. #333\u2013#339 remain open until the live gate.\n\n\n4 One broker contract\ndone 2026-10-03\n#353, #356, #358, #359\nOwner-approved design: reviews/2026-10-02-sparkops-native-s4-broker-contract-design.md; five scope decisions recorded 2026-10-03: retain the 56-action catalog and shadow classifier, delete v1 request/verifier/recovery/journal and its process harness, retain all v2 labs, freeze every deferred helper site in four PRs, and add an exact current root closure while preserving historical ones. Started from bb153c4 (52 commits after 01e0e849); the plan&amp;#39;s 54-action and v1-only-lab assumptions were corrected before code. Deletion/exit: only the core v2 execution-context request/admission remains. V1 request/admission symbols, verifier/recovery, privileged_broker_journal.py, v1 process/journal tests and unused v1 resource-context helpers are gone. Security surface map/docs updated; catalog and CLI shadow adapter pass. The separate fixed-operation helper protocol remains and is frozen. Vectors: 15 new files across request, policy, resources, effect fence, receipt, trust and helper families. Zero deferred or unclassified entries; inventory clean. Runtime coverage 250/250 (216 vector-pinned, 34 named-test; 3 exercised elsewhere). Stage 4 changed no pre-existing golden case. Final helper family has 176 unique cases/177 tests, including 24 closure refusals, six document kinds, observed response/drop-in, stable authority digest, real admission/start/success/failure/indeterminate event chains and server refusal bytes. Receipt vectors include approval-limited validity; isolated mutations dropping approval digest/expiry, ignoring observation request ID, including observation time in stable authority or breaking journal links fail. Both independent review axes clear (2026-10-03-sparkops-pr353-review.md, 2026-10-03-sparkops-pr358-review.md, 2026-10-03-sparkops-pr359-review.md). Final local: 1662/1778/1535/2201 tests in the four shards, plus CLI 19/72/44/10; 177 focused final helper vector tests; tools 677 passed + 20 subtests; Ruff, inventory, pin coverage, secret scan, boundary and v1-definition audit pass. Merges and main proof: #353=813a4220204ea99180eae5ecf593c05d0eda75e3 (Security 37117037065,Secret 37117037062,runner 37117037063,seam 37117037068 green); #356=dde1d56c20636e9a6688640a7ad9cbd0740f7a8c (Security 37119502908,Secret 37119502902 green); #358=ca21297ed0de0ebfe88f12bf9fe6313fb96b4fdf (Security 37120629375,Secret 37120629344 green); #359=25dd44601753d692109250f16b3faa0527a6595b (Security 37121648652,Secret 37121648704 green). Every PR&amp;#39;s final checks passed before merge, and every main workflow was watched in the foreground; final PR Security 37120941249,Secret 37120941291,canary37120941253 all green at 811e64b. Revert a PR with git revert -m 1 &amp;lt;its merge SHA&amp;gt;. Evidence roots /tmp/sparkops-s4-review-y0plQBOI, /tmp/sparkops-s4-policy-4Bw71FYq, /tmp/sparkops-s4-receipts-AxiXebsv, /tmp/sparkops-s4-helper-Bn9bJKSs. Earlier incomplete/cancelled runs are not counted as passes; review corrections and synthetic-key false positives were resolved before final checks. Remains for this stage: nothing. Broker activation remains outside this migration stage; Stage 5 starts only after its design/lab gates. DeepSeek review closed 2026-10-03: all four PRs reviewed; exact-base #353 rerun; Astra source adjudication and 487 focused tests passed. 2026-10-03-sparkops-stage4-deepseek-adjudication.md records each finding/disposition; no golden changed. Work-deadline-minimum coverage handed to Stage 5 before receipt retirement.\n\n\n5 Rust broker\ndone 2026-10-04; dormant Rust broker and real Rust CI lifecycle proved\ndesign, VM procedure\nStanding owner authorization above supersedes prior VM-pending wording. Astra xhigh implementation in worktrees/sparkops/native-s5-rust-broker: Rust workspace, typed request/admission, Ed25519 verification, descriptor-relative stores and append/fsync journal under test. Rust 1.90.0 verified and installed only in task-owned /tmp/sparkops-native-s5-JHR6fz5G/toolchain on zynserver; two musl targets. No production enforcement enabled. Laterdeterministicjournaltestexposed same-lengthbyteedits survivingmetadata-onlycheckswithinonefilesystemtick; tracerfix ce426d7 retains/comparesboundedvalidatedbytes beforeoperations. Native23groups+compilefail/Clippy pass; finalartifactreproductionandfreshVMrepetitionrequired. Earlier6aVMpassdoesnotprovefixedbytes. Approved isolated zynserver VM UUID dade8a5b-c248-472e-adef-ed33df881718 completed 19 adversarial cases using reproduced amd64 binary; exact-UUID shutdown and retirement removed the guest and instance files. First VM fully retired after natural lease expiry; final receipt cfcb05d776a20a9f449293ab91af71e3ff32aae02340c81517073bd0eeed958e in /tmp/sparkops-native-s5-vm-f46da3c/retirement-final.json. First tracer local f46da3c passes 353 Python tests +57 subtests, 21 Rust groups/Clippy and 238 generated differential cases. Independent review found malformed Unicode hex and sliding socket deadlines; both fixed with composed signed admission, real peer-credential IPC/restart/replay/conflict coverage and separate new internal journal vectors. Complete vendoring validated after restoring 17 upstream checksum-bound public test PEMs; all 46 dependencies have zero OSV advisories at the recorded audit. Source/vendor/toolchain integrity now checked before and after Cargo. Committed f46da3c static binaries reproduced twice: amd64 dc0b00f4704ec2eec26e9c3f2f2fe111ffe576238cdaa563dbf3a5726aee61ef, arm64 1663ed95483a0f81a82d7c61dc1e303c33f838b30b67a80735fab10e750d1cec; final reviewed head 6a2f6af reproduced twice per architecture: amd64 c268213129e4d9b9db0055a71cc47f6bc8da1be0a209c5aaada1c76a18377e72, arm64 bac3d82b971502a6e477e4959ca856bbe2c839fe3cd29b4bc1bf62a251cd170c (/tmp/sparkops-native-s5-build-6a2f6af). New VM UUID 6c286b47-61cc-48a0-8332-e6745b2638b5 passed all19 cases against final6a2f6af amd64binary, evidence /tmp/sparkops-native-s5-vm-6a2f6af; domain/files/ports removed with no remaining broker processes or mounts. VM2 retirement is now complete: final receipt 7c0f059ca4f81b177fd014e148ad1f178c9a86c3031b57a7a864b21c6be05007. VM3 cb01633 lease receipt remains pending until20:26:13UTC. Review 2026-10-03-sparkops-pr363-review.md. Tracer #363 merged at 0dc50100d87d5e9682e1d8c2adcba63e5c3eedcf (20:03:09 UTC), final head2161b6f passed all11checks with no review threads. Final-source reproduction is byte-identical to the20-case VM artifacts. Main Secret37150128356 and Security37150128397 both passed in root foreground watches. VM proof /tmp/sparkops-native-s5-vm-f46da3c; first run correctly refused incomplete vendor closure and is not a pass. Final tracer cb01633 reproduced twice per architecture and passed 20/20 cases in fresh isolated VM e02506bc-6d5a-40f0-820e-7b9bab5a82a8, including the equal-timestamp journal edit refusal; evidence /tmp/sparkops-native-s5-build-cb01633 and /tmp/sparkops-native-s5-vm-cb01633. Final CI and exact retirement receipts remain. Widening checkpoint e8e34cd has 34 native tests, two compile-fail checks and 303 generated admission comparisons. Full widening and Python deletion remain. Fleet CI still lacks a confined zynserver build channel; internet-only one-job isolation is not weakened. Concrete x86 one-job design in 2026-10-03-sparkops-native-rust-ci-lane-design.md; Owner explicitly approved the narrow CI-container Cargo exception on 2026-10-03. Root PR #370, head cad4edc, adds the exact zynserver profile, a canonical dedicated engine and the shared pinned build entry; all13 current PR checks passed and it merged as 38a222fb0d50a9ad6a619aaa870a182417a1060e at20:32:55UTC. Main Security37151937928, Secret37151937929, Runner37151937954 and seam37151937930 all passed in root foreground watches (/tmp/sparkops-pr370-main-watch-results.json). Official rc39 reproduced on both native builders, set pin 328138b3669c8a92052b0d91fe3caf6fb728562ea2fd0214859bc136503fa481, and the standard cp1 upgrade completed at20:53UTC. Independent status and doctor both report canonical_healthy=true with all five health gates true. Standard dgx1\u2013dgx4 upgrade exited0, each authenticated diagnostic passed (jobs b1111e0e/117ba34e/064e93d6/0365d950). Root independently measured the unchanged Go binary and source38a222f bindings, active node/work/router/SPIRE services and healthy DeepSeek discovery on all four (/tmp/sparkops-native-rc39-live-ngf001xl). The authorized cp1-to-zynserver SSH channel is pinned and verified; only the existing public key crossed hosts (/tmp/sparkops-native-rust-ssh-5b2t_pon/preparation.json). The exact hardened zynserver admission is host_spire_0677dead8099a0c01091d3d4 with only runner controls and memory diagnostic; creation token was revoked. Canonical attachment is underway, evidence state/sparkops-native-rust-ci-20261003/. Independent review reproduced and closed the engine-stop retirement recovery defect. Local evidence: 265 focused tests +129 subtests, 531 installer tests, four Python shards and CLI suites, with the sole concurrent-edit source check rerun clean; Tools/clean-source/recovery suite 816 +32 subtests. Actual image scan, enrolled runner and Rust PR/main execution remain required. Root diagnosed reduced CI capacity: DGX1/3/4 had exact pending JIT registrations (DGX3 since September30; DGX1/4 during rc40 upgrade). Installed provider status was ready on allhosts, but pending rows intentionally fenced new claims. No matching GitHub runners or job containers existed. The documented installed-authority reconcile-registration command cleared only those three exact records; all reported github_runner_removed=false. Independent observation then found one real job container on each DGX (/tmp/sparkops-native-runner-reconciliation-20261003.json, /tmp/sparkops-native-runners-after-reconciliation.json). No trust rule or database row was hand-edited. Interactive Rust remains one SSH command; no job host credential or private-network exception is permitted. Widening/deletion PR #369, final head 8438c24, passed all11 current checks in root foreground watch and merged at20:56:33UTC as fadaeb21d124d0a9177163defa18bc39fb56121f; no unresolved review threads. Revert git revert -m 1 fadaeb21d124d0a9177163defa18bc39fb56121f. It deletes8753 replaced Python lines; shared SPIRE helper evidence and production helper stay. Final36 native tests, two compile-fail groups, fmt/clippy, and two static builds per architecture pass; exact binaries match the31/31-case final VM proof. Main Secret37153336975 and Security37153336976 both passed in root foreground watches (/tmp/sparkops-pr369-main-watch-results.json). VM4 and5 are now fully retired (receipts82315d9f and d143d78f); all six Stage5 guests are now fully canonically retired. VM6 final receipt SHA2567f7fa211653a259d57c8ead2054abbcd83f9634f02bd88a74cd773382c26b505 confirms its exact UUID15b38dd1-1677-40fe-9d5a-3b33868f1862 has absent domain/files/leases/ports/processes; /tmp/sparkops-native-s5-vm-85dcc7f/retirement-final.json and /tmp/sparkops-native-s5-retirements.json preserve allsix final results. Rust workflow draft #374 is queued for the native lane. zynserver canonical attach exposed a verifier defect: actual authenticated native diagnostic job54cbdf4e succeeded, but kernel FQDN zynserver.sayhi.internal differs from its admitted short name. Root narrow fix #375, head2face96, preserves signed result bytes and exact identity checks; two original failing real-queue regressions now pass,81 focused tests+8subtests and532 installer tests pass. No old golden changed. #375 final2face96 passed all10 checks in root foreground watch and merged21:28:58UTC as f13d9866b427cf2a59e44669da94b4d57daf5ffa; revert git revert -m 1 f13d9866b427cf2a59e44669da94b4d57daf5ffa. Main Secret37155253937 and Security37155253944 both passed in root foreground watches; /tmp/sparkops-pr375-main-watch-results.json records completed conclusions. Standard rc40f13d986 two-native-builder build, signing and upgrade compatibility gate passed; release-set pin13ad2e1439f2362b4c2c285540613959d571aeacaafe401a6410403beaf25256, ARM manifest2ae6359c1c7df465c0bbe0f7951bc9cc5d54eed11958336523888506fe2ab71c, x86manifest a0b9c26ed3342c57af8a37c9f6eeb6abb0cee5fd5b089ac10cdfe5650e5beef8. Result state/spire-fleet-enrollment-20260920/release-set-f13d9866b427-v0117rc40-result.json. Standard cp1 upgrade completed21:49:51UTC; independent status confirms0.1.17-rc.40 and independent doctor reports canonical_healthy=true/allfive health gates true. Evidence /tmp/sparkops-native-rc40-cp1-status.json, /tmp/sparkops-native-rc40-cp1-doctor-retry.json, /tmp/sparkops-native-rc40-deploy.log. The first concurrent doctor correctly refused the held identity lock; serial retry passed, with original stderr retained. Supported zynserver reenroll now runs with its original identityfile/knownhosts (/tmp/sparkops-native-rust-reenroll-rc40.log). All four DGX upgrades exited 0 with fresh authenticated jobs 69031322/188e68a4/2bff704f/b3311e5d. Independent process executable hashes, f13d986 source bindings, active node/work/router/SPIRE units, healthy placement and DeepSeek 1048576-token model discovery passed on every node (/tmp/sparkops-native-rc40-live-30ldcd_8). Canonical zynserver reenrollment completed with authenticated FQDN job job_20d571764fe972599abfd0f7 and current runner authority bindings. The runner remains disabled. Starting its new private Docker engine exposed a defect: Docker 29.8.1 auto-selected the host containerd socket and listed four unrelated cached images. No build/job ran; root stopped only the new engine, preserved shared containerd/default-Docker state and verified both lab guests remained reachable. Source fix #379, head f8f7427, adds an explicit separate containerd service/configuration/socket and canonical retirement before enabling CI. Root/Astra independent review found no confirmed defect; 533 installer tests, 125 integration tests, 83 focused tests+48subtests passed. Actual host config parse, systemd validation and file-access trace passed, proving no shared containerd config read. CI and installed runtime proof remain pending. Evidence /tmp/sparkops-native-rust-engine-containerd-inspection.txt, /tmp/sparkops-native-rust-engine-stopped.json. Recovery requires a standard newer release and supported re-enrollment, preserving prior records but creating a successor node/parent identity. No runner was enabled; CI image/enrollment/execution remain open. Independent post-refusal cp1 doctor still reports canonical_healthy=true with all five gates true, and explicitly warns that zynserver is runner-admitted but not yet bound; /tmp/sparkops-native-rust-partial-cp1-doctor.json. PR379 passed all12 checks in root foreground watch atb74f4ca, no review threads, and merged22:38:19UTC as31ea17f86ac7be614ff568dc8bf49d20ea6e92dd. Revert git revert -m 1 31ea17f86ac7be614ff568dc8bf49d20ea6e92dd. All three main runs passed in root foreground watches: Security37159117417, Secret37159117438 and Runner37159117432 (/tmp/sparkops-pr379-main-watch-results.json); official rc41 build uses both native builders. Installed private-runtime verification and actual Rust PR/main/cancel/timeout jobs remain open. Official rc41 source31ea17f reproduced and signed on both native builders; ordinary upgrade compatibility passed. Release set4327727b4ab87bf399021e7b36243ec2db749008c57822759da7d9724f7f8343, ARMmanifest2f41c5ce6b9968ebe996c6664cfde76639e74373712626a0652152c65ef5e573, x86manifestc6da8305c9a911795f8b02e7f32320e741ea77c389622c0e9f2c6f61acd5bc91. Standardcp1 upgrade completed22:56:20UTC with canonicalhealth; four-node upgrade underway (/tmp/sparkops-native-rc41-fleet-upgrade.log). A concurrent status read was correctly refused by the upgrade identity lock; serial independent post-upgrade status/doctor remain pending. rc41 live follow-up, 23:10 UTC: serialized cp1 status and doctor are canonical healthy; all five health entries pass. Supported zyn fleet runners attach --replace installed the new31ea private-runtime files, then refused recorded runner attachment differs: the client registration is unchanged but the supervisor measurement changed. Runner remains disabled. Root is preparing a durable same-registration record-retention/retry fix on agent/native-s5-runner-record-recovery. Private Docker/containerd start succeeds with distinct sockets/PIDs/data and zero pre-existing images/containers; default Docker stays stopped. Canonical trusted-image build exposed a second source defect (network bridge not found with private engine bridge disabled); no CI job was enabled. Logs /tmp/sparkops-native-rust-runner-replace-rc41.log, /tmp/sparkops-native-rust-private-runtime-first-start.log, /tmp/sparkops-native-rust-private-image-build.log. #380 merged23:21:50UTC as25daac9abf666aaa17d710d2f02eb244d143d8d5; revertgit revert -m 1 25daac9abf666aaa17d710d2f02eb244d143d8d5. Same-registration attachment recovery plus fixed native supply-image build networking; no golden/service/job-network changes. Independent Astra standards/spec review found no actionable issues. 151focused+50subtests,533installer,773tools+20subtests and all local Python shards passed. Foreground PR watch exited0:12 current successful checks, one superseded canceled same-head acceptance retained. Main watches and standardrc42 build running. Corrected exact build argv succeeded on zyn; image scan running, supervisor still disabled. Review2026-10-03-sparkops-pr380-review.md. #380 main Runner37161536232, Secret37161536210 and Security37161536203 all passed foreground watches (/tmp/sparkops-pr380-main-watch-results.json). Native image first build succeeded, but canonical scan refused leftover upstream Alpine Node20.20.2/24.18.0; a confined non-root smoke also found rootfs/0700 while descendants0755. S5 agent is fixing only the native image (remove unused Alpine runtimes, publish traversable container root); no job enabled and no scanner bypass. rc41 main CI live job inventory independently confirms successful jobs on dgx1,dgx2,dgx3,dgx4 (/tmp/sparkops-native-rc41-main-runner-job-proof.jsonl). rc42 standard deployment completed23:41:28UTC from25daac9; set e76ac9573c3950c2fbc5f77ca222f70f14b7fe4647c9a451b7efa05e4681f82f. Canonical native image probe under Docker0077/containerd0022 passed nonroot build/run and canonical scan; image SHA1a395d54345c0a243be33228115b44410c9d1d54e47145b94e567e9e39c3f4ee. PR381 preserves all historical vectors and adds containerd-only0022 successor; installed runner replacement/lane proof still pending. #381 merged23:56:21UTC as112d8d98db1eecfec8d68823e3fd8db0399333f9; revertgit revert -m 1 112d8d98db1eecfec8d68823e3fd8db0399333f9. All12 final-head checks green, root28tests+47subtests and golden-member comparison passed. Source removes unused Alpine Node runtimes, adds actual nonroot image build guard and changes only private containerd UMask0022. Root review2026-10-03-sparkops-pr381-review.md; actual full candidate image/scanner proof retained. Main Runner37163344597/Security37163344520/Secret37163344535 watches running; installed replacement and Rust lane still pending. #381 main Runner37163344597,Security37163344520,Secret37163344535 all passed foreground (/tmp/sparkops-pr381-main-watch-results.json). rc44 supported runner-only replacement on zynserver completed01:58:54UTC using installed e77 files, preserving exact node identity/release/helper selection/all five running PID-start identities. Installed containerd UMask0022 and Docker0077 run on distinct private sockets; defaultDocker stays inactive and hostcontainerdPID1639 unchanged. Canonical installed image build passed; scanner then refused public-network timeout. Exact archived old private networkDB SHAa0bed4d755be25680e8c8b3364c1210773368036ec22fcc7afbff85d713be57f proved orphan bridgebr-d887108ce16b ownership. Both old/new bridges routed172.30.250.0/28; kernel selectedold. Reviewed literal cleanup proved oldbridgeempty, engineidle, root-custodied retirementrecord/currentnetwork distinct, removed onlyoldbridge and its exact staleMASQUERADE rule, and verified allfilterrules unchanged/route selectsnewbridgebr-6326019ebd7d. Canonical scan retry is running; durable retirement cleanup is being fixed separately. Evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/runner-replace-rc44-zyn.log, runner-image-build-rc44-zyn.log, retired-rust-bridge-cleanup.log. Docker itself sets private data rootroot:root0710 at startup (no other access); original0700 observation assumption corrected, no chmod or policy widening. Actual Rust CI remains open. 2026-10-04 02:30Z live recovery finding: canonical zyn runner image 2701389fcb6c9dd899d4fb2d306ad69c2dc76b4d73ef158dfa537169918ac855 scan passed after exact retired bridge cleanup. Runner provider requests then failed on zyn and dgx1. A bounded socket trace proved requests reach runner authority; read-only installed-code validation of its observation DB proved five hosts violate the obsolete four-host projection ceiling (authority admits 64). No database edits. Capacity correction 98d4f528 shares the existing 64-host bound, preserving record/custody/64KiB gates; 86 focused tests +7 subtests pass, including real service/SQLite/publication for five hosts and repeat dgx1. Reviewed recovery release is being prepared before fleet CI can run; no green merge claimed. Recovery PR #384, exact head 98d4f528359c548d7a44fdbf48f9679119c7ed90, spire-acceptance; one foreground watch /tmp/sparkops-pr384-checks-watch.log (installer/docs pass, fleet checks queued behind outage). Independent review 2026-10-04-sparkops-recovery-independent-review.md found no issue. rc45 is capacity-only; rollback correction stays a separate local checkpoint. Initial build refused x86 &amp;lt;8GB free; reviewed literal cleanup removed archived rc43 generated candidate-9bcab813f4e0 and interrupted-candidate-9bcab813f4e0-001657, retaining release archive/current rc44. Retry runs both pinned builders; controller activation intentionally follows same-rc44 dgx2 recovery. Current recovery outcome: rc45 capacity fix (exactsource98d4f528) deployed02:54:21Z; installed zyn/dgx1doctors allready, zynsupervisor enabled/active and actualfleetCIrestored. Initial384head98d all13checks passed; PR384 nowextends to8c5836b2 for separately reviewed dgx2terminalactivation repair and has a new watch, so priorgreen is not finalhead proof. Rustworkflow374 remains unpublished local0d31771b pending372-first convergence; no CargoCI execution claimed. Native networkretirement sourcef8665126 is reviewed/held,73tests16subtests passed, actualnewcleanupgate outstanding. S5implementation parked; readonlyreviews of372and8c are clear. ExistingPR374 is now local950f2abcf52144d64196dfad46526a03084cd03d, integrating merged372/384; its diff remains the130-line native Rust workflow and four operator-doc lines. Workflow bytes unchanged from reviewedfabf16c8. Final DeepSeek/Astra review has no actionable finding; five model allegations were source-adjudicated in state/sparkops-native-rust-ci-20261003/pr374-fabf16c8-review/adjudication.md. Fresh installed zynserver doctor passed all7 checks, providerready and supervisoractive at e77 runner source; evidence state/sparkops-native-rust-ci-20261003/acceptance-gz2pfqgt/doctor-before-pr374.json. Actual PR/main Cargo and success/cancel/timeout cleanup remain pending; PR publication follows384 main green. 2026-10-04 04:41Z actual PR374 head950f2abc run37177712285 job111363720357 FAILED before Cargo: CapEff0/NoNewPrivs1 and checkout boundary passed; TCP10.10.10.20:22 refused but zyn host-local10.10.10.10:22 connected. Host read confirms six DOCKER-USER private rejects but no runner INPUT guard; doctor readiness was insufficient. Evidence /home/meanaverage/sayhi/state/sparkops-native-rust-ci-20261003/pr374-host-input-failure-n8v7_24b; exact workflow refusal stays unchanged. Native bridge-scoped INPUT/doctor correction in existing374 underway; no isolation/build/cleanup pass claimed. Existing374 final localce12feee integrates native INPUT fixfd7b71d9, reviewednetworkretirementf866 as93b330e2, exactrulecleanup0b78fe9c, inactiveorphanrefusal46d80281 and validbasefixturece12. Root+independentAstra review clear; runner60+52subtests and retirement81+19subtests pass; final5fencecases pass. No golden/policy/grant/unit edits. Standard rc47 cut-and-upgrade started from this reviewed source while native lane remains safelyheld; evidence state/sparkops-native-s3b-production-20261003-PWqz8bIH/rc47-rust-isolation-cut.log. Live boundary/Cargo/cleanup remain pending. Reviewedce12 folded merged383 cleanly ascfb90631; runtime/retirement/workflowbytesunchanged and novectordelta; postmerge93tests+19subtests pass. Publishedcfb90631, Rust run37179357178 queuedunderheldlane; solePRwatch64975. rc47 initialbuilddiskrefusal clearedbyverifiedarchived-outputretirement state/rc47-reviewed-builder-retirement-7_gcrx8v; standardretryrunning (rc47-rust-isolation-cut-retry1.log). 2026-10-04 05:36Z continuation: #374 head3cb0d2d6 fixes the two broader-CI failures (strict-reader inventory entries and an engine-state test adapter); 126focused tests+19subtests pass, and entered_sites proves both new registry entries through their declared retirement test module. No production or frozen-case bytes changed from reviewedce12. Supersededcfb CI remains recorded failed; one foreground watch now follows3cb. rc47 is built/signed (set3155610a28c1caa33d27e4ecabbbe901e991557fe7e307adbd1803917ab85050), shipped and in standard control-plane preflight. Shipment initially refused disk pressure; only /root/sets/e77df2ff00a7 was removed after signed-archive/hash, process and service-reference checks, with unchanged installed identity and free space5.56\u21928.01GB (state/rc47-staging-retirement-4hyfmsyp). Installed release pruning was inspected only, not applied. Native Rust supervisor remains held until canonical replacement, fresh image scan and actual CI isolation/cleanup proof. 05:42Z retention result; exact3cb CI now12green checks with native Rust queued; narrow independent review clear. rc47 upgrade dry-run also refused5.0GiB&amp;lt;5.3GiB before mutation. Supported sparkops-installer releases prune then succeeded after independent retention review and live process/mount audit: keepsrc45/rc46, all historical attachment records, remote node installations and locally retained signedrc42/44/45/46 sets. Evidence state/rc47-cp1-prune-dojahvsv; free5.33\u219280.64GB; no conflicting running process or mount among5containers. Standardrc47 retry3 now running. 2026-10-04 05:48Z: standard rc47 upgrade completed on cp1; independent doctor/status command exits0 and both emitted health frames all true (cp1-rc47-verified.json). Post-upgrade dgx1\u2013dgx4 captures show all six relevant services active and one healthy router placement each; node releases intentionally unchanged. Supported zynserver runner replacement completed, archive20261004T054745Z carries the exact old network ID and v2 retirement receipt. Old bridge/routes are absent; node identity/bindings, attested runner client, policy and shared containerd PID unchanged. Fresh private runtime started; installed image build is running while the supervisor remains disabled. Evidence under state/sparkops-native-s3b-production-20261003-PWqz8bIH. 2026-10-04 05:55Z: fresh rc47 image1178b9bac629 passed installed scan; all8 doctor checks true under actual UID988/GID982+983. Supervisor enabled after those gates. Actual PR job111371419387/run37180325103 is running on zynserver-sparkops-pull-request-20261004t055513z-5118c8f2, runnerID7709. External live host+authority capture validates exact job/container ownership, resources, effective UID/caps/NNP, log-only bind, private engine and both INPUT/forwarding fences (pr374-proof-6kew2dkl/pr-3cb-). Cargo outcome and natural cleanup remain pending. 2026-10-04 06:03Z: #374 merged as9b59f3f573341d220e831a09436c6428d0d300c2 after13/13 PR checks, final independent/Astra+DeepSeek adjudication, exact source/artifact validation and actual PR natural-cleanup proof. Revert: git revert -m1 9b59f3f573341d220e831a09436c6428d0d300c2. ARM4135ca7b\u2026/x8668ba88f4\u2026 match prior VM binaries;2,853 source files verified against synthetic31838698. Main Rust run37181670267/job111375326142 succeeded; its before-capture was missed because the observer matched the workflow name against a dynamic run title. No retrospective cleanup claim; planned final main-dispatch reuse job will supply captured main cleanup. Four exact-main workflow watches now foreground; cancel/timeout/reuse remain. The pure evidence verifier corrected only docker.socket missing MainPID handling; real observations unchanged and positive cleanup plus negative changed-service/socket-PID controls pass. 2026-10-04 06:13Z: all four exact-main 9b workflows passed foreground (Rust37181670267, Secret37181670254, Runner37181670258, Security37181670253); main-9b-watch-results.json records exit0. Exact main artifacts independently validated across2,853 files and pinned toolchain; both hashes remain the VM-proven binaries (pr374-main-artifacts-vmv2lve7/validated.json). Actual cancellation run37182075356/job111376492641 reached the explicit wait step, passed live isolation/ownership capture, was canceled through GitHub and passed natural cleanup without reconciliation or deletion. Full evidence dispatch-9b-cancellation- under pr374-proof-6kew2dkl. Timeout and subsequent successful main reuse remain underway. Gate closed 2026-10-04: final evidence report. Cancellation37182075356, provider-enforced one-minute timeout37182151368 and successful subsequent main job37182324630 all have actual before/after isolation and natural cleanup proof; no cleanup/reconciliation used. Timeout API conclusion is honestly recorded cancelled with its explicit timeout annotation, not mislabeled timed_out. Final reuse artifacts validate exact9b/2,853 source files, two builds per architecture and unchanged final x86 VM binary; ARM reproduction is not ARM VM execution. All four main workflows green; allsix VM receipts final. Evidence index pr374-proof-6kew2dkl/stage5-gate-evidence.json. No Stage5 item remains; broker stays dormant, enforcement excluded. Held-branch disposition: native-s5-build-ci@bf00e4a1 and native-s5-runtime-network-retirement@f8665126 are exact stable-patch equivalents of main ancestors c9873afb and 93b330e2; no extra merge is needed. Trees remain as provenance. See 2026-10-04-sparkops-native-held-branch-disposition.md. Handoff 2026-10-04T16:29:17.647165+00:00: No open PR, implementation or live proof remains for Stage5. Core merges #363 0dc50100, #369 fadaeb21, #370 38a222fb, #374 9b59f3f5; complete gate report 2026-10-04-sparkops-native-stage5-gate.md. All native-s5 worktrees clean and heads preserved on origin. Local-only native-s5-build-ci@bf00e4a1 and native-s5-runtime-network-retirement@f8665126 were pushed for provenance; they are patch-equivalent to main c9873afb/93b330e2 and must not be merged again. Next: keep the broker dormant. Enforcement/signing custody/action redesign are separate unscheduled work, not an unfulfilled Stage5 gate. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\n6 Go node agent\nin progress; Go daemon live, unprivileged tail and installed acceptance remain; handed over 2026-10-04\ndesign, #360\n#360 froze 52 state/heartbeat cases without changing prior golden cases, replaced two narrower tests, corrected documented release_platform test environment and catalog provenance. Two Astra review axes plus DeepSeek cross-review adjudicated in 2026-10-03-sparkops-pr360-review.md; JSON bool/int/float comparison gap fixed and mutation-tested. Focused 157 +35 subtests; clean-source 87 +23; four security shards 1703/1443/2325/1754 with sole dirty-source provenance failure independently rerun clean; CLI 17/99/21/9; inventory 250/250 and pin suite passed. PR 11/11 green; merged at 71df6fb015214067b277d1fd496cbff69b93fc5b. Revert git revert -m 1 71df6fb015214067b277d1fd496cbff69b93fc5b. Main Security 37139425047 and Secret 37139425054 both passed; foreground watches exited 0. Freeze evidence /tmp/sparkops-s6-freeze-pSAumHmy; no service changed by #360. Agent implementation worktree native-s6-go-node-agent: Go scheduler/state/heartbeat/helper-work IPC/SQLite journal and fixed temporary Python observation adapter. Adapter model-readiness HTTP retained through S5, no controller/helper/work exchange in Python. No Go sudo. S1 implementation #362 includes work-release binary, ExecStart-only successor cases (old cases retained), full native provenance validation, SQLite replay/claim parity, actual fixed-adapter and Unix IPC differential tests in CI. Python integer coercion and journal-off outcome parity findings fixed; S7 cache fix merged into the branch. Final head 90bee3b passed all15 checks in foreground (Security37143519644; remaining workflows in /tmp/sparkops-pr362-root-final-watch.log), no unresolved review thread. Merged as b52518ffa01b82dce82a1a7cf92420ff8cb74b0a at18:31:44UTC; revert git revert -m 1 b52518ffa01b82dce82a1a7cf92420ff8cb74b0a. Review 2026-10-03-sparkops-pr362-review.md. All six main workflows passed in foreground: Security37144536869, Secret37144536836, Runner37144536865, Connector37144536849, Signer37144536821 and seam37144536841; Dependency Graph37144538773 also passed. Evidence /tmp/sparkops-pr362-main-watch-results.json. Official rc37 release built and assembled from b52518f on both native builders; set pin 282900fa39e28dde385ec8cd904a506643d0b41341ca217a8b1dcd601f5fd14e, result state/spire-fleet-enrollment-20260920/release-set-b52518ffa01b-v0117rc37-result.json. Installer reproduced twice per architecture: arm64 0b9a40451e1a18d254dd9d502fa08c9352f015d42605ca27a6e0fe2bbef0ab67, amd64 bba0213c0e6fd94958041f7f48aa8d8af8524115663dc29f38910558f7f54d5a. S7 owns only the two reviewed fresh x86 lab guests through retirement and the existing x86 builder for synthetic baseline/candidate packaging. Synthetic baseline controller install62ebfe5/doctor/status passed; normal node attach underway. S2 draft#365 ports secure image download/provenance and deletes1587 Python lines; additive3120caseoracle preserves oldgoldens. Local1974Python+454subtests and pinnedGo suite pass; All 12 checks passed at final S2 head 7161841; the native assurance check now executes the actual Go handler suite in the existing offline harness. Merge waits for S1 installed/live proof. Installed same-controller lab proof passed on source 5fb68c1: exact stable result bytes between Python and Go, unchanged host/work-client identity, and genuine job job_9342b5eb39aa849ceb2c9fef redelivery generation 1\u21922 with one execution and unchanged durable outcome. Evidence state/sparkops-native-s7-rehearsal-retry-20261003/s6-proof/. Official rc38 set 9bbab782829fcbeae474978cc0e1620ca63bdbc7d72cd748f7140885d9296f84 built on both native builders; rc36\u2192rc38 attested bytes independently match on both architectures (/tmp/sparkops-native-rc38-attested-artifact-comparison.json). cp1 standard upgrade completed at 20:21 UTC; independent status/doctor report canonical_healthy=true and all five health gates true. Four-node upgrade exited0, authenticated jobs e63e7edd/65551ce3/03e3596d/99586572 passed. Root independently measured the expected Go binary on every DGX, release bindings source5fb68c1, active services and healthy DeepSeek router/model discovery; evidence /tmp/sparkops-native-rc38-live-ppol90bz, /tmp/sparkops-native-rc38-fleet-upgrade.log, /tmp/sparkops-native-rc38-model-status.json. DGX1 actual live redelivery passed: job job_2cea6f8d87389b8d17cfbe12, generation1\u21922, one fixed action input, exact persisted outcome SHA256 5bfee0806768108a03d5fd48a20ceafa3851bf9a4ee09f2dd0efee3cea48dcdb, controller result/timestamps equal. Work-client PID/starttime/executable preserved and independently verified active; all scoped tokens revoked. Evidence state/sparkops-native-s6-production-proof-20261003/real-redelivery-summary.json. The S1 live hold is lifted. S2 #365 final e65e428 passed all12 checks in root foreground watch; root review confirms Python15 Unicode repr/digit/whitespace parity fixes preserve old vectors. Merged normally as af391ceff58cc0870a8264caf724054fa5d289ed at22:21:07UTC with no unresolved threads. Revert git revert -m 1 af391ceff58cc0870a8264caf724054fa5d289ed. All four main runs passed in root foreground watches: Security37158143498, Secret37158143439, Runner37158143479 and dependency graph37158144900 (/tmp/sparkops-pr365-main-watch-results.json); S3 #368 follows. Old-loop retirement #372 removes572 production Python lines and retired tests; read-only NFS #373 and credential-inspection #377 are prepared in its stack. Their first CI exposed controller/coding fixtures still calling deleted Python APIs. Repair d425019 replaces those calls with a test-only process bridge invoking the real Go Agent.Heartbeat/WorkCycle and durable journal while retaining controller authorization and receipt assertions;38 focused tests and pinned Go build/vet/tests pass. Root reviewed the repair; final stacked source ade0ce4056ca8abdb279d17f67fe597ddfb427fd is running all four Python shards plus CLI. Superseded stacked CI is canceled, not reported green. Full Stage6 remains open, including actions, benchmarks, lifecycle and the explicitly retained privileged tails. S2 live preflight on current fleet finds zero vm.image_download-capable hosts; public SPIRE admission cannot grant that action and hardened node units lack network capability for it. A supported positive image-download job cannot currently be queued. Evidence state/sparkops-native-s6-s2-proof-plan-20261003/readonly-preflight.json; the bounded post-rc41 API refusal script is 2026-10-03-native-s6-s2-live-proof.py. No manual queue, admission or unit override will manufacture proof. Native source/oracle validation is separate from this unresolved live criterion. Venv create/remove localcc9cefc deletes96production Python lines, freezes70actual-Python cases, and passes root50focused checks; review 2026-10-03-sparkops-native-venv-actions-review.md records no finding. Benchmark port is underway. rc41 allfourDGX upgrades exited0 to node3b096b68d150; authenticated jobs217a8594/132b0ec7/55cfad57/bc626e06 passed. Root independently verified each actual Go process SHA8339446ca2cdddd4c13321561ef86717856e35825d153642dfda9332db983c12, source31ea17f bindings, four active services, healthy router and DeepSeek1048576context. Evidence /tmp/sparkops-native-rc41-proof-u498rghq/summary.json and /tmp/sparkops-native-rc41-fleet-upgrade.log. This proves the installed S2 release and unaffected fleet operation, not an unavailable positive VM-image action. rc41 S2 live refusal recorded: supported bounded API probe refused vm.image_download because no DGX admission advertises it; no work job or destination mutation occurred and the scoped token was revoked. Evidence state/sparkops-native-s6-s2-proof-plan-20261003/rc41-live-refusal.json, SHA256e788ebff7252b6fe56ddd51d1b9f3f50b1fad9af11ebf1bafeb1f1beb4e00def. Successful installed image-download proof remains unmet. Local benchmark deletion head3635b937b9b1c6d36346c6ac690113a43e6b240f:491 original-Python oracle cases, four actual legacy/optimized Python\u2194Go role exchanges, native three-node cancellation/replay, full pinnedGo and1751Python+377subtests pass.620 replacedPythonruntime lines and277-line obsolete comparison harness deleted; originalprotocol/framegoldens unchanged. Separate pendingS3 fixeb40c13 adds102 actual originalping float coercions (14 pre-fix failures); propagated locally through held stack. Source evidencestate/sparkops-native-s6-stack-validation-20261003/3635b93-mpirun/summary.json; PR/liveproof stillpending. rc42 four-DGX standard upgrade passed: authenticated jobs4ba25b3b/d7a6b6ca/11797f7e/9d4ed407; node release299a75196b3b. Independent process hashes8339446c and source25daac9 bindings match on every host, four services active, router healthy with DeepSeek1048576. Serialized cp1 status/doctor all five gates true. Evidence /tmp/sparkops-native-rc42-proof-ad1d8ehb/, /tmp/sparkops-native-rc42-fleet-upgrade.log. S3 #368 merged00:55:20UTC2026-10-04 asb2f3ffec49c660a30c3e1bd81fd1b994f9398d24 after all15 exact-head checks, root source review and independently adjudicated DeepSeek review. Revertgit revert -m 1 b2f3ffec49c660a30c3e1bd81fd1b994f9398d24. Review packets 2026-10-04-sparkops-pr368-review.md and 2026-10-04-sparkops-pr368-deepseek-adjudication.md; no actionable finding. All six main watches passed: Security37166426011, Secret37166426074, Runner37166426076, seam37166426075, Signer37166426104 and Connector37166426123 (/tmp/sparkops-pr368-main-watch-results.json). Included in the required rc44 reenrollment repair release; actual authenticated native action proof remains pending. Owner scope decision,2026-10-03PDT/2026-10-04UTC: do not implement enforcement. Revised exit requires Go loop/journal/heartbeat/every unprivileged action; retain only the exact named legacy privileged Python action inventory and approved workers, with an inventory rule refusing additions and no Go node sudo. The proposal2026-10-03-sparkops-native-stage6-privileged-tail-design.md moves to separate unscheduled privilege separation alongside9. Pure action/observation ports, fixed worker routing, inventory guard and live proof still remain; no completion is inferred from this decision. rc44 dgx1 actual authenticated native memory action passed during reenrollment and standard upgrade (jobs939514b5/6b8e1d19); four-host S3 proof awaits remaining rollout. Consolidated local tranche12a89b19 removes1586 net Python runtime lines; root real FIFO probe found native progress observation could block daemon shutdown. Agent is restoring the bounded fixed-child boundary and correcting an independently demonstrated embedded bytes.Buffer ReadFrom limit bypass before publication. No affected candidate is deployed. Convergence update 2026-10-04 UTC: owner directed no new fronts/branches/worktrees, one implementation subagent,372first then existing PRs or supersession. S5/S7 implementation parked. Consolidated372 head34668420 includes373/377 and reviewed runner-capacity98d by ancestry, net1525production Python lines deleted. Independent S5 review no actionable findings;68original golden files and exact118controller/113node source records verified. Sole foreground CI watch underway. Four pure actions plus remaining selection/observation ownership remain open; current release has not deployed this tranche. Consolidated372 CI at34668420 finished13/15: Go capture accidentally depended on absence of actual containerPID9; shard4 had1989passes227subtests and a stale call to removed Python runner_inspect. Agent preparing deterministic captured-process seam plus owned live/exited process test and native queue-test bridge. Goldens remain unchanged; no merge/deploy claimed. Reviewedlocal CIrepair468e9265 is tests/docs only;605originalpruning/progress +79runnercases, actualownedlive/exitedPIDprobe, realcontroller-leasednativebridge andforgedargs pass. Ready/unpushed untilcp1upgrade ends; root reviewednofinding. CorrectoriginalJSONcount69, not68: priorfilter accidentally omitted node-privilege-resource-registry-v1/registry.json, now independentlyverifiedunchanged. Root follow-up review withdrew468e9265 test-clearance: captured-process helper coveredmap-shaped pruningjobs but missedlist-shaped progresspid25, so localpassesstilldependedonPID9absence. Agent fixingbothshapeswith explicitfrozen-rowseam assertions; current468solewatchremainsactive, no prematuremerge. DeepSeekboundedcrossreviewof468startedafterfleetrecovery. Final map/list test correction 546195881862616dec94e53f71af3caaf9324248 is published to PR372 and has one foreground CI watch. The direct captured-probe regression failed before the fix and passes afterward; all 69 original golden JSON files remain unchanged. The prior468 watch finished14/15, with only the missed progress PID fixture failing. DeepSeek supplied-source review of468 vs e77 reported no actionable findings; raw request/response and Astra adjudication are preserved in state/sparkops-native-s6-stack-validation-20261003/468e9265-pr372-deepseek-review/. Root and independent Astra reviewed the one-file546 delta with no actionable findings; exact bounded delta adjudication and hashes are appended to the existing DeepSeek packet. Origin/main remains e77df2ff,206 commits beyond the plan baseline. No new Stage6 deployment or completion is claimed. PR372 merged2026-10-04 04:01:57Z: final54619588 passed15/15 exact-head checks and independent/delta/DeepSeek review. Merge 7e9fcbd51a70c824986536eb56706bea5bf29423; revert git revert -m 1 7e9fcbd51a70c824986536eb56706bea5bf29423. Six exact-main foreground watches are running (Security37175796167, Secret37175796164, Runner37175796154, Signer37175796146, Connector37175796158, seam37175796148); do not count them green yet. Evidence under5461958-pr372-list-shape. PR373 had merged into the372 branch as468455752fecdbc177340da7550443caf3254305; PR377 is closed as superseded and its52fd458b head is an ancestor of the main merge. Runtime release/live proof of the new action tranche and remaining pure ownership are still open. All six exact-main watches for7e9fcbd5 completed successfully; 5461958-pr372-list-shape/main-watch-results.json records each exit0. This closes the372 source/CI gate, not Stage6. PR384 now published atba7d4e1f with recovery preserved and one foreground watch. 2026-10-04 merge384 main529867d7 foreground Secret Scan37177092674 and Security Gate37177092675 both success; /tmp/sparkops-pr384-main-watch-results.json. Stage6 owner privileged-tail revision remains recorded above; actual unprivileged/live gate remains open. 2026-10-04 06:37Z read-only continuation audit atmain0eefe57d: the exact41 legacy privileged +5 retained worker inventory and no-addition runtime/CI guard ARE implemented in legacy_actions.py; this corrects any earlier pending-guard wording. Eleven native actions are merged; only four pending names remain: video status/cancel and telemetry burst start/stop. Selection/work-selection, pure probe/metrics/discovery processing, finalization/shadow and fixed worker launch/recovery ownership still require port/deletion; privileged Docker observation remains explicitly at the approved legacy boundary. Held6a412c2f tree and87 immutable video outputs (SHA79acb00b080ad1efd8593bb7b06c6402341be0150185a29fa07993e35a4e30b7) preserved; matching original cli source is still currentmain. Narrow next held slice is video status/cancel after integratingmain; no new implementation resumed. S1 replay is already proven; PR372 new-action live proof and final benchmark/deletion remain. S2 download has supported refusal evidence only; positive execution is unavailable under current admission and cannot be manufactured by widening grants. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. #362 b52518ff, #365 af391cef, #368 b2f3ffec, #372 7e9fcbd5 are merged; #373 is included and #377 superseded. Eleven native actions and exact41 legacy privileged/mixed-effect plus five retained Python workers, with no-addition guards/no Go sudo, are implemented. Only new unmerged Stage6 source is preservation-only agent/native-s6-routine-actions@9115dba64025195606c05a3c6fd93fab43cb61a1, now pushed:87 actual old video observations, unchanged SHA79acb00b080ad1efd8593bb7b06c6402341be0150185a29fa07993e35a4e30b7; no native video implementation/registry pin yet. All other heldStage6 runtime heads are main ancestors and should not be replayed. Next after3b: fetch/integrate main in routine-actions, port video status/cancel then telemetry burst start/stop; finish selection/work-selection, pure probe/metrics/discovery/finalization/shadow and fixed worker launch/reconciliation ownership; delete replacements and prove installed benchmark/new-action/model-observation behavior. S1 real redelivery already passed. Positive vm.image_download live proof remains blocked by absent supported admission/network capability; rc41 refusal is not positive proof and grants must not be widened to manufacture it. Owner IAM draft noted in handoff; no action or enforcement authorization. See successor handoff for exact commands, branch dispositions and live release digests. Takeover 2026-10-04 (Claude Opus 5.5) \u2014 video status/cancel native: routine-actions worktree merged main 6ffb395c; #391 ports model.video_render.status/.cancel into closed native dispatch (go/internal/nodeagent/video_render.go) and deletes both Python handlers and pending entries (capability advertisement unchanged). The preserved 87-case oracle node-video-observation-v1/actions.json (SHA 79acb00b\u2026, from 6a412c2f) is consumed by TestVideoRenderOriginalOutcomes (results/refusals, every request line and header, state bytes); 20 URL edges and 34 raw HTTP framing edges were measured on the original Python 3.12.3 _video_runtime_context/_video_runtime_json_request. Four GPT-6 Astra rounds drove an http.client-faithful response reader (line/header limits, chunked precedence incl. 204, IncompleteRead, int() semantics, scoped-IPv6 Host, OSError subclasses); two deliberate bounds where the original was unbounded (negative chunk size, trailers) refuse at the 1 MiB limit; final review no actionable findings. Release inventories add the two Go files; client-fold controller/helper closures stay accepted as named layers. 16/16 exact-head checks at 4e976689. Merged 18:16:39Z as abd87d1947e2e8a88debf145f5b6b9c85c5f9fe7; revert git revert -m 1 abd87d1947e2e8a88debf145f5b6b9c85c5f9fe7. PENDING_NATIVE_ACTIONS is now burst start/stop only. Installed proof waits for the next release (builder capacity blocked, see 3b). Next: burst start/stop together with the shared host metric collectors (Python probe metrics), so collectors are deleted once. All 7 exact-main runs for abd87d19 passed. Host metrics slice in progress: branch agent/native-s6-host-metrics @ 92925e85 (WIP, no PR) ports collect_host_metrics and its collectors to Go behind a virtual-system seam; the frozen 81-case oracle node-host-metrics-v1/collect.json (from abd87d19; harness state/s6-host-metrics-oracle-XLdyiIRp/) passes in full and a tamper check fails as expected. Wiring, Python deletion, inventories and review remain; resume notes in state/native-takeover-VEMDbjIG/RESUME.md. Update: 4bc5edc8 wires the collector into collectObservations ahead of the probe (original 2 MiB input bound first, Python still reads a pre-metrics state copy, 4 MiB probe-response bound emulated, collector exceptions in the entry point&amp;#39;s error form), deletes collect_host_metrics/collect_gpu_metrics/collect_host_memory_metrics/telemetry gating/env_int/env_float/DEFAULT_TELEMETRY_CONFIG/advertised_local_address and their tests, registers node-host-metrics-v1 with a Python pin, and adds the files as a new inventory layer (video and client-fold layers stay accepted); synthetic fleet now drives the native collector (29 pass). Astra xhigh found 8 items (state/native-takeover-VEMDbjIG/astra-hm-review-4bc5edc8.md); the input-order one is fixed in a27a9e36 (pushed). The other seven (P1 command timeout can hang on inherited pipes; P2 uncancellable /proc,/sys reads, fsum, symlink-then-.. resolution, stderr decoding, int division overflow; P3 expanduser failure) are in host_metrics.go, whose read the auto-mode classifier denied; owner approved the read/edit. Host metrics landed: Astra rounds 2\u20134 drove 2ee3bf38, d18ed4d2, 1149b95f, 5552c4e2: a subprocess.run mirror (one deadline over both pipes and exit, kill+close on timeout, stderr decoded, -signum, start/reap bounded by cancellation), cancellable filesystem calls, shutil.which/Path.resolve/Path.expanduser (NSS via getent) ports, Python 3.12 compensated sum(), int-division OverflowError, and surrogateescape path encoding shared with model progress. Additive frozen capture node-host-metrics-v1/collect-edges-20261004.json (8 cases, same abd87d19 source, SHA e1b04747\u2026; harness copies in state/native-takeover-VEMDbjIG/{freeze_edges.py,cases_edges.py}) plus measured local-system unit tests; tampered build fails them; race-clean x3. Final Astra: only contrived P3 residuals (all-digit or &amp;#39;:&amp;#39;-home NSS-only accounts in ~user storage paths), documented in pythonPasswdHome. #392 16/16 exact-head checks at 1345c663; merged 20:04:15Z as 1705f7eb4eaa4f94fa53ba62582f5e7babe74c8c; revert git revert -m 1 1705f7eb4eaa4f94fa53ba62582f5e7babe74c8c. All 7 exact-main runs for 1705f7eb passed (Security Gate, Secret Scan, Rust broker, connector/signer/runner acceptance, seam). Installed proof rides the next release (Stage 3b rc.52). Next Stage 6 slice: telemetry burst start/stop (deletes the remaining shared collectors). Burst slice 2026-10-05: #395 ports telemetry.burst_start/_stop into closed native dispatch and the detached sampler into node-agent burst-run, replaying 189 original outcomes frozen in node-telemetry-burst-v1 (from 8dfc6a78; harness state/s6-burst-oracle-AGk04NuF/); deletes the Python handlers/sampler/upload batching/burst-only collectors and PENDING_NATIVE_ACTIONS (no unprivileged migration debt remains). Burst files move to &amp;lt;node state dir&amp;gt;/telemetry-bursts because the installed unit&amp;#39;s HOME=/nonexistent made every Python start fail after its admission upload. Live proof needs an owner-granted telemetry admission on one host (none hold it; nothing queues bursts automatically). Three Astra xhigh rounds: r1 four findings (PATH search fell back to cwd, spool names skipped fsencode, post-request selection text, zombie-blind test) fixed with an additive burst-edges-20261005.json capture (11 cases, same source); r2 two raw-bytes/text P2s (PATH, state dir) fixed by treating burst paths as Python text; r3 no actionable findings. 16/16 exact-head checks at 01286fb2; merged 08:25:45Z as 677fd1488a3993c3a02bd3e81278c88227cf9517; revert git revert -m 1 677fd1488a3993c3a02bd3e81278c88227cf9517. All 7 exact-main runs for 677fd148 passed (Secret Scan, Security Gate, Rust broker, connector/signer/runner acceptance, seam). Unprivileged migration debt is now zero; remaining Stage 6: selection/work-selection/probe/probe-finalize/shadow and fixed worker launch/reconcile ownership, installed acceptance. Selection slice 2026-10-05: #396 reads the provider expectation, work selection and heartbeat selection natively (selection.go, SelectionReader), replaying 164 real-file-tree outcomes frozen in node-selection-v1 (from 677fd148; harness state/s6-selection-oracle-FsUkoNqw/) plus an additive 2-case selection-edges-20261005.json (Python&amp;#39;s 4300-digit int() limit); deletes the fixed Python operations selection/work-selection (readers kept for retained workers and the Python installer), so a work request no longer spawns two Python processes; burst-run drops --python. A read-only live differential (installed Python operations vs the native reader on the real root-owned files) was byte-identical on dgx1\u2013dgx4 and zynserver; the cross-build for it exposed syscall.Fstatat missing on amd64 (now x/sys/unix), and the Go lane now vets amd64 and arm64. CI then exposed the daemon shutdown test&amp;#39;s dependence on installed selection (passed only on fleet hosts); the lane&amp;#39;s node-agent test binary now uses a test-only sparkops_test_selection tag to read a fixture selection (release builds carry no tags). Astra xhigh four rounds (r1: int limit, cancellable reads, change-check order; r2 clean; r3 clean; r4 P3 vet coverage fixed). 16/16 at 187cea5a; merged 09:48:24Z as 2da84639b1f65ae46444c7e9d79a3a3e3e632b71; revert git revert -m 1 2da84639b1f65ae46444c7e9d79a3a3e3e632b71. All 7 exact-main runs for 2da84639 passed. Shipped as rc.55 (release set 1df263ad\u2026, ordinary gate from rc.54: no attested client changed): cp1 deployed by the owner; fleet upgrade on all five hosts 2026-10-05 16:08\u201316:17Z (dgx1 owner-run, the rest agent-run with owner approval), each ~35 s with its SPIRE work verification job. All five: node agent active with 0 restarts on source 2da84639, router 200, heartbeats healthy, DeepSeek ready on dgx1\u20134 with containers untouched, runners active; node agent CPU fell from ~17% to ~1% of a core on dgx1 (no Python selection spawns). Evidence state/native-takeover-VEMDbjIG/readback-rc55/. Broker shadow native: #397 \u2014 the broker mode selection and shadow observation that ran as the fixed Python operation shadow before every native action are native (go/internal/nodeagent/broker_shadow.go); the Python operation and its adapter allowlist entry are deleted (Python&amp;#39;s execute path still observes the actions it executes). Oracle node-broker-shadow-v1/shadow.json (255 cases through the real entry point, exact stdout+stderr, from 2da84639) plus additive shadow-edges-20261005.json (7 failing-stderr cases: exit 120 in shadow mode). Astra xhigh four rounds (r1 locale adjudicated with host evidence \u2014 all nodes LANG=en_US.UTF-8; r2 cancellation window and fd 2 exposure under --quiet fixed with a raw write(2) and cancellable write; r3 exit-120 refusal reproduced; r4 clean). 16/16 at c49d9a46; merged 18:03:54Z as 085166d62125abe1d7fee7ef957c9b79418391a2; revert git revert -m 1 085166d62125abe1d7fee7ef957c9b79418391a2. All 7 exact-main runs for 085166d6 passed. Not yet released (next node-agent release; no attested client change). Remaining fixed Python operations: probe, probe-finalize. Heartbeat tail native: #398 \u2014 advertised capabilities (coding/UniFi policies, worker grants, video flag, canonical/legacy runner probe) and release identity (installed record custody walk, loads_unique parse) that ran as the fixed Python operation probe-finalize every heartbeat are native (go/internal/nodeagent/probe_finalize.go); the operation, merge_supported_capabilities, the runner probe and cache, runtime_release_identity and installed_release_record.py are deleted. Oracle node-probe-finalize-v1/probe-finalize.json (369 cases through the real entry point from 085166d6, harness state/s6-probe-finalize-oracle-v1K4XJ6Z/) plus additive probe-finalize-edges-20261005.json (12: coding reread budget 9991, root HOME spellings). Read-only live differential identical on dgx1\u20134 + zynserver incl. the real root-owned release identity. Astra xhigh five rounds (r1 runner pipe deadline, 4 MiB daemon output cap, Path.home, coding reread; r2 non-UTF-8 HOME, per-key reread; r3 PATH discovery resolve order (also fixes runner inspection), fixture guard; r4 discovery errors escape; r5 clean). First CI exposed the fleet runners&amp;#39; noexec HOME custody root: the lane now provides SPARKOPS_EXEC_TEST_ROOT for the 61 replayed cases that execute commands. A GitHub Actions incident (19:50Z) blocked hosted jobs; re-run after recovery: 16/16 at 17a927fe; merged 22:46:19Z as e67696573c022b0316230c5dea449ee93134fc07; revert git revert -m 1 e67696573c022b0316230c5dea449ee93134fc07. All 7 exact-main runs for e6769657 passed. Shipped as rc.56 (release set 3c37b78d\u2026, ordinary gate from rc.55): owner authorized; agent ran cut-and-upgrade-cp1.sh 23:11\u201323:14Z (dry run + upgrade exit 0, doctor 5/5, canonical_healthy, runner refresh check) and fleet upgrade dgx1 (job_d977a21a\u2026, 37.4 s), then dgx2/dgx3/dgx4 (13ccf015 \u2192 58c5ebef) and zynserver (537442020f11 \u2192 ab50e50188bc), ~35 s each with their SPIRE work verification jobs. All five: agent active, 0 restarts, bindings e6769657, router 200, no journal errors, heartbeats healthy, capabilities identical to rc.55 (zynserver&amp;#39;s 7 reported-only capabilities predate this release), DeepSeek ready on dgx1\u20134 (containers untouched); controller shows the natively reported release identity sparkpyro-node-agent-0.1.10+e67696573c02. Evidence state/native-takeover-VEMDbjIG/readback-rc56/. Model runtime discovery native: #399 \u2014 the last fixed Python operation every heartbeat ran (probe: discover_local_model_runtimes) is native (go/internal/nodeagent/model_runtime_discovery.go, plus python_urlopen.go, a port of urllib&amp;#39;s urlopen over http.client for the readiness probes); the operation and its helpers are deleted. Only the two Docker reads stay in the named legacy boundary as the fixed operation docker-observe (docker_observation.py), because they may run through sudo -n. Oracle node-model-runtime-discovery-v1/discovery.json (283 cases through the real entry point from e6769657 with stub docker/sudo/ip and a scripted HTTP server; harness state/s6-probe-oracle-rceORhZe/); the replay runs native discovery with the real docker-observe and matches 278 (5 document-shape cases are the agent&amp;#39;s own state). Read-only live differential identical on dgx1\u20134 (DeepSeek head) + zynserver. Astra xhigh five rounds (r1 64 MiB docker-observe bound, no name cap, per-address connect, ALPN; r2 Unicode 15 tables, glibc numeric ports, unstartable inspect; r3 NSS via getent; r4 getent -A; r5 docs). Deliberate bounds documented (http/https only, no proxies, ASCII hosts, 4 MiB bodies/trailers/ip output). The controller tests&amp;#39; runtime emulator now drives the native discovery through a Go test-binary entry. First CI exposed builder inventory order (fixed) and a new frontend advisory (GHSA-68fv-2mgg-jv7q) fixed separately by #400 (source-map-js 1.2.2, merged 01:45:03Z as 21773890). 16/16 at 1c11961a; merged 2026-10-06 01:58:13Z as c60dc9d279326c9dbd8414f63c18470d9fd2e5fa; revert git revert -m 1 c60dc9d279326c9dbd8414f63c18470d9fd2e5fa. All 7 exact-main runs for c60dc9d2 passed. rc.57 built (release set 62f20386\u2026) but never deployed; superseded by rc.58 (see row 7). No fixed Python operation remains on the heartbeat path except docker-observe; remaining Stage 6: installed acceptance.\n\n\n7 Go installer\nin progress; node identity owner native: #403 merged cdf2e5be 2026-10-06 (Python fleet_node_identity.py is now a declared native adapter over _node-identity; real-userland differential identical on arm64+amd64, evidence state/s7-identity-real-userland/v4-closure/; Astra xhigh r1\u2013r5, r5 clean; PR CI 16/16 at 6bcd81e0 after rooting identity test trees in the lane&amp;#39;s custody root, since fleet runners&amp;#39; /tmp is not root-sticky; exact-main 7/7 green). Controller identity store native: #406 merged 9c4f8d98 2026-10-06 (installer/control_plane_identity.py keeps only the installer lock, transaction liveness and the reserved value; validation, custody reads, the fleet access receipt, publication and all transitions run behind _controller-identity; release builds accept only the installed store and lock, and the native child must hold the caller&amp;#39;s inherited installer lock (fdinfo-verified) so a killed caller cannot let a second installer interleave; additive corpus controller-identity-store.json 575 cases frozen from cdf2e5be; root real-userland differential state/s7-controller-real-userland-v4.mEvJqm identical arm64+amd64 with the designed narrowings; Astra xhigh r1-r5, r5 clean; PR CI 15/15 + labelled SPIRE acceptances at efbfeeb5; exact-main 7/7 green). Node lock follow-up #407 merged 5725f65e 2026-10-06: node allocate-accounts/publish now run only holding fleet_node_install._locked()&amp;#39;s inherited descriptor (release path /var/lib/sparkops/fleet-node-install.lock, fdinfo-verified); evidence state/s7-identity-real-userland-v5.CQinXc (11 scenarios identical arm64+amd64, unlocked-change and killed-caller differ as designed); Astra xhigh clean; PR 15/15; exact-main 6/6 green. Shipped as rc.58 2026-10-06 (source 064dc1de, the rebased head of #404 Werkzeug 3.1.9 on main 5725f65e, so it carries #399, #400, #403, #405, #406, #407; release set 6d2e1a11\u2026, ordinary gate from rc.56; rc.57 skipped). cp1 via cut-and-upgrade-cp1.sh 09:13\u201309:16Z (dry run + upgrade exit 0, doctor 5/5, canonical_healthy, runner bindings current); fleet upgrade dgx1 (job_717a8e36\u2026, 50.5 s) then dgx2/dgx3/dgx4 (58c5ebef \u2192 3751cb43) and zynserver (ab50e501 \u2192 f144df47), ~46\u201351 s each with SPIRE work verification. All five: agent active, 0 restarts, bindings 064dc1de, router 200, no journal errors after the switch, heartbeats healthy, DeepSeek ready on dgx1\u20134 (container untouched). One old-agent truncated: stream ended inside a frame line on dgx1 at 09:15:10Z falls inside cp1&amp;#39;s own restart window. Runner lock: fleet runners attach --replace on dgx1\u20134 (rc.53 \u2192 rc.58 runner files; runner code unchanged apart from the lock), image build + Grype scan as each host&amp;#39;s runner account (werkzeug 3.1.9 in /opt/sparkops-ci-venv, fresh approvals), units started (still disabled at boot); zynserver&amp;#39;s x86 runner untouched (its lock has no Werkzeug). #404 13/13 on the new images, merged 09:35:28Z as 09dc17a1 (tree identical to 064dc1de), 6/6 exact-main runs green, Dependabot #63 fixed. Evidence state/native-takeover-VEMDbjIG/readback-rc58/. Node phase frame codec native: #408 merged 63288ac7 2026-10-06 12:07Z (tranche row 1: controller request writer and reply reader, node request reader and response/error writers behind _node-frame; fleet_ssh.phase_reply and fleet_node_protocol.run_phase retired, fleet_node_error.py and _node-error deleted; frozen corpus phase-frames.json 451 cases from 09dc17a1 replayed in Go and through the production Python paths; deliberate differences: nesting &amp;gt;512, raw surrogates, non-string key order, sorted decoded members; re-enroll now treats identity as unavailable only on NodePreservationError; native cache verified before delivery and each native call; Astra xhigh r1-r4, r4 no P1/P2; PR 16/16, exact-main 7/7). Not released (rc.58 predates it). Operator configuration reader native: #409 merged d6ba6214 2026-10-06 14:08Z (tranche row 2a: _operator-config reads operator.json as json.loads(bytes) + loads_unique and runs every original validation before the workers section with exact exception classes/messages; installer/fleet_operator_reader.py keeps custody read + workers; fleet_operator.load retired, validate/_validate_runners deleted; corpus operator-config.json 707 cases from 63288ac7 replayed in Go and through the reader; shared identity decoder gains loads_unique duplicates + bytes-path BOM fix; Astra xhigh r1-r4, r4 clean; PR 16/16, exact-main 7/7). Not released. Node trust context and admission checks native: #410 merged c264c4d0 2026-10-06 16:35Z (tranche row 2b: _node-admission runs fleet_node_protocol.validate_context (pem 4.0.0 framing incl. its dash-run matcher quirk, canonical base64, exact 44-byte Ed25519 SPKI, pins, roles) and NodeAdmissionFacts&amp;#39; post_init + validate() with exact classes/messages for any JSON value (uuid/int, urlsplit Unicode + lru_cache + NFKC via new frozen Unicode15 table, ipaddress of any JSON value); installer/fleet_node_admission.py restores refusals and fails closed; validate_context body and the dataclass checks deleted; corpus node-admission.json 819 cases from d6ba6214 (CPython 3.12.3 + cryptography 50.0.1), plus a 16,000-case random differential with 0 differences (evidence state/s7-node-admission-oracle-BNcGgx2n); documented difference: unloadable keys refuse as &amp;quot;Ed25519 public key required&amp;quot; (node refusals never cross SSH); Astra xhigh r1-r3 (r1 P2 stderr fixed, P3s fixed); PR 16/16, exact-main 7/7). Not released. Row 2c deferred into P3 2026-10-06: FleetNodeConfiguration/FleetRunnerConfiguration/FleetSpireConfiguration validate in __post_init__ and are constructed directly by many minimal-lane (no Go) tests; P3&amp;#39;s NodeInstaller port builds these configurations, so their validation moves with P3 rather than through a checked-factory adapter that P3 would delete again. Attachment journal checks native: #413 merged 9075eeb3 2026-10-06 20:24Z (tranche row 5a: _attachment runs installer/fleet_attachment.py&amp;#39;s validate_facts, load&amp;#39;s record checks, _append&amp;#39;s order/clock/expiry/payload/size checks and record bytes, and record_attested&amp;#39;s parent check; Python keeps lock, listing, custody reads, publication and mint permission; load is a declared native adapter; a success reply must be exactly the answer the request determines (verify echoes the sent bytes, attested = sha256(parent), build = canonical record Python forms from the request and its own payload deep copy); corpora from c264c4d0: attachment-journal.json 477 cases + additive attachment-journal-depth.json 240 near-limit cases (evidence state/s7-attachment-oracle-zwGtg6mA, state/s7-attachment-depth-oracle-l8ZI8Bao), replayed in Go and all 717 through the adapter and compiled installer; shared decoder fix: DuplicateKey at object depth 9989 fails &amp;quot;while getting the repr of an object&amp;quot; through the -s -m entry; documented differences: JSON-only values, 4 MiB request bound, no __cause__, extra custody reads after a refused record, datetime stamped once before the uuid draw; Gitleaks allowlist for the corpus&amp;#39;s synthetic token digest; Astra xhigh r1-r4, r4 clean; PR 16/16, exact-main 7/7 incl. the four SPIRE acceptances). Not released. Row 5b blocked 2026-10-06: the controller spire-agent unit&amp;#39;s ExecStartPost socket-custody hook (/usr/bin/python3 &amp;lt;release&amp;gt;/installer/control_plane_canonical.py, rendered by render_spire_unit) runs fleet_capability_inventory.load_profile (profile validators and the whole declaration chain) outside the installer cache, where no native installer can be selected; a Python copy for the hook would be a second verifier. Needs a guard decision first (pinned native checker for the hook, or port the hook, tranche row 6). Held local tracer agent/native-s7-capability-inventory ebb5880e (not pushed): Go profile/network/document/change checks behind _capability-profile, 707-case vector from 84a6268b (evidence state/s7-capability-profile-oracle-eOSJzkGb, plus 14,000 random differential cases, 0 differences); no adapter or deletion yet. Other row-5 candidates (control_plane_upgrade planning, worker-state transfer) depend on fleet_worker_config validators the backend also imports. Remaining: installer effects/orchestration port, official artifact reproduction, full x86+ARM native install/upgrade rehearsal, then delete the Python installer\ndesign, #361\nAstra xhigh worktree native-s7-go-installer: phase-journal/CLI/prune receipt freeze at local a7ec010, 111 focused tests +5 subtests and full installer suite passed. First tracer moves prune planning/readers into Go, preserves Python IdentityStore lock and effect executor, and packages fixed native installer under existing outer manifest digest fence. Policy sparkops-installer, outputs sparkops-installer and sparkops-installer.build.json. PR #361 head 93ea5f8 fixes native execution custody by selecting from the sealed installer cache, verifying its ancestor/root/receipt/full file closure; real offline bootstrap regression replaces original extraction and still executes pinned cached bytes, then refuses cache drift. Complete build-recipe validation and bounded regular-file retention reads added. Minimal installer environment 526 tests, focused cache/bundle/CLI 166 tests, complete shards 1618/1686/1804/2154 plus CLI, pinned Go build/vet/tests and 252/252 pin coverage pass. All 15 PR checks passed in foreground at 93ea5f8, but GitHub security comment 4174173274 blocks merge: packaging must independently reproduce the native binary instead of trusting a self-consistent supplied record. Correction c736abc now independently reproduces the binary inside packaging; real pinned arm64 proof accepts the reproduced artifact and rejects a self-consistent forgery (/tmp/sparkops-s7-real-packaging-reproduction.log). Exact review thread resolved after proof, no bypass. Final correction head c736abc passed all 15 checks in foreground; merged as 62ebfe54d17bc61fba5ddff1431c3588a254e480 at 18:13:24 UTC. Revert: git revert -m 1 62ebfe54d17bc61fba5ddff1431c3588a254e480. All six main workflows passed in foreground: Security37143385375, Secret37143385414, Runner37143385395, Connector37143385431, Signer37143385412 and seam37143385407. Evidence /tmp/sparkops-pr361-main-watch-results.json. Review/adjudication: 2026-10-03-sparkops-pr361-review.md. Official two-native-builder rc37 reproduction passed (pins recorded in Stage6); integration deployment and live proof remain. Next tracer #364 moves phase-journal verification to Go and deletes the Python chain loop; custody reader and writer remain. Review/adjudication 2026-10-03-sparkops-pr364-review.md; actual missing-member guard mutation caught. CI fixture correction f67849e passes all750 Tools tests +20subtests and all10PRchecks in rootforegroundwatch; no unresolvedreviewthreads. Mergednormally as b56ef7dce54142f52a392dee17c41f9d763b4e07 at19:23:42UTC, revert git revert -m 1 b56ef7dce54142f52a392dee17c41f9d763b4e07; Main Security 37147729513 and Secret 37147729509 passed in root foreground watches. The prior integration hold was lifted because the fresh-installation defect already requires a new source-bound candidate. Two fresh synthetic x86 controller/node VMs allocated with pre-boot pinned task SSH host keys: controller UUID 4d083f4b-867b-4c40-85e0-c7e00a26069c, node UUID 0d5805ec-4af1-4436-a8d5-ba9173601151, each2CPU/6GiB/32GiB. Only fresh fixture keys and synthetic identities are used; installed baseline62ebfe5/candidateb52518f rehearsal is underway. Task evidence under state/sparkops-native-s7-rehearsal-20261003/. Freshx86labrefuseddiagnosticcredentialcustody: currentinstallerwritesroot:1001/0640; diagnosticreaderacceptsonlylegacy1001:1001/0670, confirmedstillliveoncp1byreadonlystat. Focused PR #367 at f50f52c accepts only the canonical root:1001/0640 pair or the legacy 1001:1001/0670 pair; database custody is unchanged. Actual-publisher regression, 37 focused tests plus eight subtests and 531 installer tests pass. All 10 PR checks passed; #367 merged at 5fb68c159b3f9516636cd744e26454b40770e504 (19:43:13 UTC). Main Secret 37148914197 and Security 37148914199 both passed in root foreground watches. Review 2026-10-03-sparkops-pr367-review.md. Failed -01 guests are now fully retired after natural lease expiry; both exact UUIDs have absent domain/files/leases/ports and canonical final receipts. Corrected baseline 89310d5 differs from 62ebfe5 only by the same fix/tests. Fresh -03 controller 1f5c8045-b639-4742-90c9-ae75199d9684 and node 892e0d75-b051-4a4f-af67-e4753228e8cc use new prepinned SSH keys and fixture identities. Evidence state/sparkops-native-s7-rehearsal-retry-20261003/. Fresh corrected baseline normal node attach and authenticated memory job job_8039098f3d97dc71ae104598 passed; status and doctor both report canonical_healthy=true. The exact main 5fb68c1 rc38 candidate reproduced and assembled; fresh controller/node public upgrade passed, all five original phase records remained byte-identical, and installed S6 comparison/replay passed. Cold reboot and a new authenticated job passed on both guests; identical controller install and repeated supported fleet upgrade passed. Repeating original attach after an ordinary upgrade correctly refused the immutable prior context. Both -03 guests are now fully canonically retired after natural DHCP expiry: exact UUID/binding checks report domains, files, leases and ports absent. Final controller receipt187ea32c12fb8eb38f26db593fdeb450c4c019c2f0c7515ec84608d9232eaf73 and node receiptff109c4d11a0547592cd78cec3278c1c8d9cd435582855dea4e5294bb47f2062; final evidence index472de03b3d6cdaa4257cb77d66d5a3855b44528e531560345c6c930ccd8624f1. Earlier pending reports remain preserved. Evidence index SHA256 8062cb276894f95f63330672778237c859f2a2dc187348468cd65486e0c545f9 covers125 public evidence files. cp1 upgraded to rc38 at 20:21 UTC and all four DGX upgrades passed authenticated work. Root live binary/service/router verification passed. Renderer tracer #371, head 1e16c51, deletes185 production Python lines, freezes15 exact dynamic outputs and initial state additively, and validates actual native bytes/ordered custody; CI was canceled pending current-main integration. The next runner-render tranche6d97d23 deletes128 pure Python lines, preserves policy validation and ordered custody, and passes611 focused tests+1181subtests,7417 four-shard tests+1151subtests,763 Tools tests+20subtests and15 actual native fixtures. Root and DeepSeek found no actionable defect (2026-10-03-sparkops-native-runner-render-review.md); no PR until #371 lands. Go test-driver fix #376, head131dc75, selects the existing native architecture toolchain pin instead of always downloading ARM. Fourteen focused tests and actual full Go build/vet/tests pass on both architectures; production pins unchanged; current CI pending. No manual chmod or reader bypass. #376 integratedhead397a4af passed all10checks/14focusedtests and merged21:42:44UTC as32af1908c328df537d8e8ea8a4cdd5c04e5f1db7. Revert git revert -m 1 32af1908c328df537d8e8ea8a4cdd5c04e5f1db7; Main Security 37156065403 and Secret 37156065392 both passed in root foreground watches (/tmp/sparkops-pr376-main-watch-results.json); the initial GitHub 504 was retried, not a test failure. Remaining Python installer scope is explicitly mapped in 2026-10-03-sparkops-native-stage7-remaining-tranches.md; renderer progress does not complete Stage7. #371 finalff77f3d3 passed all15 exact-head checks in foreground and had no unresolvedthreads. Merged00:24:04UTC2026-10-04 asd03a4663c1dac88b825b2802812bf864aadb09cf; revertgit revert -m 1 d03a4663c1dac88b825b2802812bf864aadb09cf. Root reviewed exact controller inventory successor: three node-render files added, all historical complete inventories retained, partial successors refused. Full pinnedGo,660installer/backend+1168subtests and790tools+26subtests passed. All six main watches passed: Runner37164831154, Signer37164831143, seam37164831173, Connector37164831126, Security37164831175 and Secret37164831156 (/tmp/sparkops-pr371-main-watch-results.json). Held runner-render18ab825 preserves prior15cases with additive current runtime successors; SPIRE renderer e6b59b5 deletes twoPython templates,12actual producercases and790tests+1187subtests pass; root source review no finding. Their release/integrated gates remain. Local combined pure tranche2eb4846b is clean and reviewed in 2026-10-04-sparkops-native-pure-installer-tranche.md: twelve exact new Go files, prior full inventories preserved, current golden bytes unchanged and Python runner ExecStart retained. Focused419tests/969subtests plus574tests/86subtests and pinned Go checks pass. Next whole identity owner freeze6311bf6c captures418 original validation/NSS/custody/retry/fsync outcomes; no host accounts created. Publication/live gates remain. Reviewed consolidated pure tranche2eb4846b published as#383, spire-acceptance, one foreground watch active; no other held tranche pushed. PR383 historical2eb CI did not pass all gates. Local698abe7f fixes minimal-unittest compatibility, actual catalog provenance and Go-only vector pin tracing; current localf8822f54 integrates reviewed372/recovery. Root reviewed conflicts and recovery/render coexistence with no finding. Exact130-file current source inventory preserves118 predecessor and all historical inventories;313 focused tests+11subtests and2cache checks pass;174 parent golden comparisons unchanged. Source is committed and held, not published/CI-green/live. No identity/effect implementation resumed under convergence. 2026-10-04: integration3b3ca218 (tree=f8822f54; includes merged384 recovery) published to existing383. Sole foreground PR watch active; exact130-source closure/313 focused+11 subtests/174 unchanged parent vectors recorded in the tranche review. CI3b3 canonical-installer failure reproduced: misplaced cache integration test imported backend Pydantic into minimal lane. Exact-file move6974c3c7 to backend suite; no production/golden/dependency change. Fresh two-lock CI environment540 installer tests and backend2+2 subtests pass; awaiting full first-head result then retry. First integrated-head CI3b3 completed14/15; only minimal-lane test placement failed. Exact-file move6974c3c7 published; sole foreground retry watch /tmp/sparkops-pr383-6974-ci-watch.log. PR383 final6974c3c7 passed15/15 and merged as55ab071f53011f391aa12c26858e0bda895e0a64; revertgit revert -m 1 55ab071f53011f391aa12c26858e0bda895e0a64. Immediately listedmain, six exact-head foreground watches running (seam37179226945, signer37179226939, runner37179226955, connector37179226944, secret37179226947, security37179226942). Full Go installer effect/rehearsal/deletion gate stillopen. All six merged383/main55ab foreground workflows completed successfully (exit0); exactrunresults /tmp/sparkops-pr383-main-watch-results.json. 2026-10-04: installed Go pruning tracer exercised on cp1rc46 through the standard read-only plan and apply commands under its identity lock. Retainsrc45/rc46,4architecture bundles,6controller component roots; no live process/mount conflicts, external cutover archives retained. Actual output and independent scope review at state/rc47-cp1-prune-dojahvsv; reported56.77GB file removal and free80.64GB after image cleanup. This proves the pruning slice only, not the full Go installer exit. 2026-10-04 06:35Z: sole implementation worker resumed existing native-s7-node-identity at6311bf6c; local/unpublished native identity owner passes518 observations (418 original,68 installed-entry decoder,16 surrogate-byte and16 UUID integer spellings). Root found and agent corrected truncated-surrogate and Python-int UUID refusal projection gaps; originals retained. Three -s/-m-style original call paths determine the private depth diagnostic, not a universal CPython stack claim. Fixed operation set and production identity path are being wired through module-derived verified cache selection; all Python ownership/deletion/integration/CI/guest gates remain pending. Root read-only ARM prerequisite check found canonical libvirt network and capacity; no guest allocated or production mutation. Checkpoint 2026-10-04: identity owner is parked clean at 9fcba6789f4aad42fe0622ace32fb3961657d9f0 in existing native-s7-node-identity; 518 native observations and real private-CLI parity pass; last Python check is 95 tests + 71 subtests passed with two documented registry/cache-test failures. No push, current-main integration, release build or live proof is claimed. Remaining exact work is in docs/installer/native-node-identity-checkpoint.md on that branch. Implementation slot moved to the existing Stage8 cutover stack. Held-branch disposition: native-s7-lab-baseline-custody@89310d51 is an exact stable-patch equivalent of main ancestor f50f52c2; no extra merge is needed. The unfinished identity checkpoint remains separate. See 2026-10-04-sparkops-native-held-branch-disposition.md. Handoff 2026-10-04T16:29:17.647165+00:00: No open native PR. Pruning #361 62ebfe54, journal #364 b56ef7dc, rendering #371 d03a4663, pure consolidation #383 55ab071f are merged; live cp1 pruning proof covers only that slice. agent/native-s7-node-identity@9fcba6789f4aad42fe0622ace32fb3961657d9f0 is clean and now pushed for preservation, two unique commits/148 behind83ad; not ready to land/deploy. Next: read docs/installer/native-node-identity-checkpoint.md, fetch/integrate main in that existing worktree, enroll exact complete ten-file native closure, fix historical registry ownership and early-retire cache test required --bundle, finish cache adversaries/actual cached-entry acceptance, then obtain effect/consumer review. 518 native observations are local evidence only. Remaining installer effects/orchestration, two-architecture reproduction, full x86+ARM install/upgrade rehearsal and Python installer deletion remain. Other Stage7 heads are merged or exact patch-equivalent; native-s7-lab-baseline-custody@89310d51 is preserved but must not be merged again. See successor handoff for exact commands, branch dispositions and live release digests. Row 5b 2026-10-06: #416 merged 58b382b7 (main green incl. SPIRE seam): fleet capability profile checks native (_capability-profile, 707-case vector frozen from 84a6268b), Python checks deleted; every controller release ships its own digest-pinned installer/native/sparkops-installer for the socket-custody hook (owner decision), validator binds the declaration to the source archive, bundle checks the staged copy. Not deployed. Next build must use the updated build-candidate-components.py (passes --native-installer) on both builders. #415 merged d12b4330: docs/frontend CI scopes, time-balanced shards, root pytest.ini (Security Gate ~17 -&amp;gt; ~6-7 min). Row 5b-ii 2026-10-07: #417 merged 747c6869 (main green incl. SPIRE seam): fleet capability declaration chain checks native (_capability-profile ops head/chain; vectors capability-chain 379 + depth 24 + depth-errors 31 frozen from 58b382b7; 13,000 random + 386 near-limit probes, 0 differences; Python keeps lock/listing/custody reads/effects). Not deployed. Row 5c 2026-10-07: #418 merged 684862c5 (main green incl. SPIRE seam): controller upgrade validators native (_controller-upgrade-plan ops release/operator/plan = release_changes, operator_change incl. the --update-workers transition, plan_changes; fleet_worker_transition.validate_change deleted); shared fleet_worker_config stays Python with captured answers/exceptions re-raised by index; passing replies bound to the documents; runner_file_effects and rollback_operator stay Python with the upgrade effects (P5). Vector controller-upgrade-plan 335 frozen from 747c6869 (Go replays 290); 12,000 random + 111 sort probes, 0 differences; Astra 3 rounds (r1 P1 forged-deletion reply fixed). Net Python grows ~110 lines (adapter) until P5. Not deployed.\n\n\n8 Go runner supervisor\ndone 2026-10-04; native supervisor deleted Python replacement and final fleet/CI/isolation gates passed\ndesign\nScope covers runner.py and its two clients, retaining accounts, broker protocols, attested client, lane priority and isolation. The prerequisite native path now has installed same-controller Python/Go parity, actual journal replay, public controller/node upgrade, cold boot and live cp1/four-DGX proof. Root authorized the S5 agent to prepare the approved thin read-only Stage8 tracer after completing its broker source gate. Production supervisor rollout remains sequenced after3b and requires actual lane/isolation/cleanup proof. The agent has frozen26 additive Python diagnostic outcomes for both profiles and begun the native read-only status/doctor tracer; no production runner mutation yet. Full6/7 and8 exit criteria remain open. Sourcecheckpointdc01d30 deletes269 original runner.py lines plus status-client bodies and packages the same-release native binary without a service switch. Root review caught GoUnicode17/PythonUnicode15 printability drift and relativePATH lookup parity; S6 owns sharedPython15 semantics and S8 will consume it. Native release reproduction, source review follow-up and live lane proof remain pending. Current source checkpoints: readonly tracer PR378 local301ba847 freezes389 original outcomes and deletes269Python lines; unpublished lifecycle cutover246b3c07 retains original Python scheduler/clients for rollback and switches only ExecStart through additive successors (18 fleet and2 standalone cases). Focused117Python+142subtests and pinnedGo pass; actual sudo cancellation probe exposed root children outliving a killed monitor, so SIGTERM forwarding and compiled bounded-cleanup proof are being corrected before publication. Postproof deletion checkpointc639b6d6 is preserved but not selected for preproof rollout. Final source/CI/native reproduction and actual lane/cleanup/isolation proof remain open. Compiled sudo cancellation defect corrected at54c20d3f: SIGTERM reaches owned monitor/root children; actual bounded compiled probe returns0.501s with all owned PID/start identities absent, versus original orphan-until-timeout behavior. Unit bytes and all prior oracles preserved; installed cancellation proof still required. Admin checkpoint2edeee04 is local/unpublished with145 native cases; postproof deletion remains withheld. ExistingPR378 localf8b0fd3092864a4917fa9ba835643172d7312a30 now integrates reviewed383/recovery (mergee356acf9 followed by actual conftest catalog pin). Root reviewed exact118\u2192130\u2192144 closure chain and refusal tests, no finding. Focused376 tests+58subtests passed with one initial uncommitted-HEAD exporter refusal; after commit exporter/catalog9tests+11subtests passed.185 parent golden comparisons unchanged; service unit/lifecycle and native Go implementation sources unchanged. Held/unpublished; final CI/reproduction/live gates remain. Other lifecycle/admin/deletion worktrees untouched. 2026-10-04 06:13Z: existing PR378 published at c54aa8da39fca28987e2f3a3ca7e472c933bb2f1, integrating merged374/main9b with byte-identical tree to revieweddbb01789. Additive51-case original-Python native network readiness oracle and producer hashes independently verified; only10 old native doctor cases superseded, all originals retained. Root and independent Astra review clear. One foreground CI watch follows this exact head; current native reproduction and installed diagnostics remain pending, and service-loop cutover stays sequenced after6/7/3b. 2026-10-04 06:25Z: PR378 merged as0eefe57d3ba34acf00c4a03d7be421427f16c764 after16/16 current CI checks and exact-current-source two-build reproduction on both standard builders. ARM30d62724\u2026/x868fd9062b\u2026 independently validated against140 source inputs/full build record; both static and builders shut off. Revert git revert -m1 0eefe57d3ba34acf00c4a03d7be421427f16c764. Seven main foreground watches underway; runtime/installed diagnostics and later lifecycle cutover remain open. Evidence pr378-c54-reproduction-ly7uh1m2 and updated PR378 review. All seven exact-main0eefe57d foreground workflows passed: Security37182580217, Secret37182580260, Runner37182580234, Signer37182580204, Connector37182580224, seam37182580216 and Rust37182580233. main-watch-results.json records exit0 for each; this closes378 source/CI/reproduction, not the installed Stage8 gate. Convergence 2026-10-04: existing clean native-s8-runner-lifecycle-cutover@54c20d3f is resumed against current main 0eefe57d; this is the pre-proof branch retaining Python lifecycle/client rollback. Held native-s8-runner-job@c639b6d6 and native-s8-runner-admin@2edeee04 are post-proof deletions and remain held until native installed jobs/cleanup are proven. All three predate #374 host INPUT effects/v2 retirement and #378 native readiness; those must survive integration. One implementation worker is active; identity work is checkpointed. Priorities are runner convergence, remaining Stage3b clients, disposition of held branches, then installer mainline. This ordering does not waive remaining Stage6/7 or installed proof gates. 2026-10-04 cutover publication: PR385, exact head 13ddb95653e914b54a35673bd18fbdbb02b6325d, now carries the binary, 18 fleet + two standalone ExecStart-only successors and preserved Python rollback. Independent review corrected mutating HTTP redirects; 49 additive real mTLS cases and the 62 original legacy cases pass. Final ARM reproduction passed twice; x86 retry follows a disk-capacity preflight refusal and exact task-owned superseded-build retirement (retained artifact hashes checked). One foreground PR CI watch is active. Source/CI/installed lifecycle/deletion gates remain open; evidence state/s8-cutover-lnxyn080/ and 2026-10-03-sparkops-native-s8-cutover-review-packet.md. PR385 first-head result: 14/16 passed; only minimal-lane pytest import and stale Python ExecStart assertion failed. Test-only d6121a8d passes 565 minimal unittest tests and ten round trips; complete runner build source is unchanged from both-architecture reproduced13ddb. One final CI retry follows; no installed cutover yet. PR385 merged 07:50:14Z: final d6121a8d passed16/16 in the foreground and merged as c25a09982c6d7cba8a4b05b68576137d8af94a55; revert git revert -m 1 c25a09982c6d7cba8a4b05b68576137d8af94a55. Immediately listed main; seven exact-merge foreground workflows are running. Signed rc48 is being built from that merge in parallel; no production change until main checks pass. Independent review 2026-10-04-sparkops-pr385-review.md; all evidence state/s8-cutover-lnxyn080/. Main proof: all seven exact-c25a0998 workflows passed in foreground (pr385-main-watch-results.json). rc48 build preflight first refused insufficient space; exact retained S8 build roots and two completed S7 x86 lab candidate outputs were hash-matched to local retained artifacts/complete bundles and retired. Retry passed both8GB capacity checks and is building; production remainsrc47. rc48 controller live 08:14Z: standard cut/upgrade from exactc25a0998 completed; independent installed manifest reports0.1.17-rc.48/c25a0998 and all five canonical health predicates true. Signed release set b21f071463eb93096cd57538feda0867fa4a4a2577e397460457bb547c81b08d; both runner artifacts match independent reproduction, all five attested runner-client hashes remain unchanged. Standard four-DGX upgrade is now running. Runner service cutover and live lane/lifecycle/deletion gates remain pending. Four-host upgrade actual result: dgx1/dgx2 upgraded to node4b7061e8df30 and authenticated SPIRE jobs job_34ce423fdf168db01351d3af/job_78fda8ed8aec8087e3d84d42 passed. dgx3/dgx4 were left unchanged by the standard refusal because their work_client attestation differs; no reenrollment attempted. Their node/client cutover remains with final Stage3b, avoiding a repeated identity change. Runner replacement is independently supported while retaining node attachment, so Stage8 proceeds without misreporting four upgraded nodes. Exact output rc48-fleet-upgrade.log retained. rc48 runner replacement defect observed: dgx1 and dgx3 installed the c25 native runner files and stopped/archived their Python supervisor, then the controller refused remote node release differs from its recorded attachment. Cause: runner-grant validation compares with immutable original attachment facts but ignores subsequent verified node-upgrade receipts. Node agents/routers remain independently healthy on all four and DeepSeek is ready. Native image preparation is underway; these two runner services remain stopped pending readiness. Existing runner-client executable hashes remain unchanged. A narrow receipt-bound installer correction is being reproduced; no controller records or SPIRE identities are hand-edited, and no completed runner attachment is claimed. Fresh image gate: dgx1/dgx3 ARM scans refuse current lock/image (fixable high OpenSSL/urllib3 and critical/high PyJWT); no approval copied and neither supervisor started. Generated lock correction changes only PyJWT2.13\u2192declared2.15 and urllib3 2.7\u21922.8; source integration pending. zynserver runner replacement completed with all five authority bindings current; canonical fresh build+scan passed image0076c60b91ec, native runtime start/proof next. dgx2/dgx4 original Python CI supervisors remain active. All application/node/router services remain healthy. Evidence in the same S8 directory. First native installed lifecycle proof: zynserver c25 binary9d6eef1e is active/enabled under unchanged UID988/GID982 and attested client71b8666f; actual unit bytes differ only in ExecStart. Fresh scanned image0076c60b91ec approved and native doctor all checks true. Actual GitHub main-lane cancellation run37189368905/job111398159179 passed exact job/authority/container/isolation proof and first natural-cleanup observation (no manual cleanup; foreground cancellation status recorded). Immutable reference plus raw captures retained in S8 evidence. Timeout, success/reuse, SIGTERM, other lanes and ARM remain pending. Reviewed candidate recovery: existing branch head698e25a1 (pushed, no new implementation branch) contains13e4eec1 receipt-bound preflight/retry correction and a separate two-package ARM lock/OpenSSL-floor change.137 focused +565 installer +39 auth/artifact/CI-env tests pass; independent reviews clear; all Go and frozen vectors unchanged. Standard signedrc49 candidate cut/upgrade starts before PR CI because exact checkout/image lock requires candidate image preparation first; this is a bootstrap ordering change, not a CI exemption or merge. Old-image ARM supervisors will be drained before publishing lock-changing CI. Native timeout run37189453362/job111398412961 has explicit one-minute timeout annotation and passed naturalcleanup. Native SIGTERM proof running; observed stop1.817s/exit143, full cleanup/restart not yet claimed. SIGTERM gate failed honestly: run37189571124/job111398760546 stopped native supervisor in1.817s/exit143 and removed local container/processes, but authority registration7772 remains removing and GitHub marks the runner offline/busy. Exact service error: runner is still finishing a job; removal deferred. Six observations failed before guarded restart; no clean-shutdown proof claimed. Root now cancels/reconciles this owned failed probe as recovery, separately from proof. Retained Python also force-removes and lacks daemon SIGTERM cleanup, so bounded graceful container shutdown is being diagnosed as an inherited product defect. Candidate rc49 stopped preflight atARM5GB&amp;lt;8GB before compilation/signing/deployment; cp1 remainsrc48, and only verified retained build outputs are eligible for capacity recovery. Failed-probe recovery: ordinary cancellation then GitHub force-cancel completed run37189571124 as cancelled at08:46:59Z. Subsequent complete GitHub inventory and read-only authority capture both show the exact runner7772 absent; restored Go service is active. No direct database change, registration bypass or manual container cleanup. This recovery is separate from\u2014and does not pass\u2014the failed SIGTERM gate. Agent is implementing bounded graceful owned-container shutdown before forced cleanup with a real delayed-report regression on the pinned ARM builder. Native reuse proof: actual Rust build run37190160698/job111400480068 completed success under c25 Go supervisor after cancellation/timeout/recovery, with foreground watch0 and naturalcleanup verified. Native main-lane success, cancellation and timeout are now evidenced; SIGTERM repair, ARM and remaining lanes still open. Exact rc47/rc48 builder build+candidate copies were retired only after local/remote complete signedbundle hashes, clean exact-source checks and root process/fd/maps/mount checks; four literal paths per builder, receipts retire-rc47-48-9xo6qe8y. Retained archives/sourcebundles/toolchains and active SIGTERM scratch were preserved. Latest recovery checkpoint: commits13e4eec1/698e25a1/55cf74c1 repair verified-upgrade runner binding, fresh ARM image dependency findings and interrupted-job reporting. Independent review clear; focused137+565+39+6 tests and pinned ARM runner tests/vet pass. No old vector changed. Standard rc49 candidate build/sign/upgrade from55cf74c1 completed09:23UTC; set789fb0a46d63521ad41cf503beb8a74620350532c6856966db02833add15b320. Both architectures reproduced twice; independent cp1 source/version and5/5 health pass, all4 unchanged Go node/router services remain healthy. DeepSeek cross-review adjudicated independently with no actionable finding. All5 runner replacements now pass. Corrected native SIGTERM run37192426376/job111407244663 passes exact live binding,15.388s stop, first-observation complete cleanup and guarded restart without manual cleanup; deliberately interrupted workflow endedfailure as recorded. Remaining fresh scans/ARM lanes, normal cancellation/timeout/reuse, foreground PR/mainCI and Stage8 deletion remain open. Review/evidence: 2026-10-04-sparkops-native-s8-cutover-recovery.md, state/s8-candidate-rc49-tx1ou3z_/. #386 now records the recovery. All5 native runner cutovers/fresh scans/doctor checks pass. Native quiet timeout37192867739 and cancellation37193018249 pass complete cleanup; actual ARM and native PR jobs111407738267/111407706011 pass success+cleanup. First PR head foregroundCI completed12pass/2fail (stale round-trip fixture and missing successor-schema enrollment); reviewed commits28fcdc75/3038d146 repair test/inventory wiring only,59+72focused pass. Final CI and merge still pending. Inconclusive concurrent probes retained without passing claims. Native legacy build37193142520/job111409380792 now passes successful actual build, exact live binding and natural cleanup. Finalhead3038d146 has13/14checks passed at09:56UTC, seam integration pending; runtime remains55cf74c1. No merge/deletion claimed. PR386 final14/14passed, watch0; merged5679c4bf8c67d546f456cb91aecd80390e05fa9c at09:57:49UTC, exactmainCI foreground. Revert source: git revert -m 1 5679c4bf8c67d546f456cb91aecd80390e05fa9c. Operational audit: dgx1service/doctor pass but claimdenied by unresolved pendingJIT from23:29UTC(job111316821507); actualdgx1execution unproved, supportedreconciliation pending. No direct authority-state mutation. Dgx1 exact supported pending-registration reconciliation succeeded(no remote runner existed); SBOM111411452840 and Go111411452821 then completed success. No restart/directDBedit. Concurrent strictcapture remainsrefused on knownsame-label GitHubassignment mismatch; not counted as fullproof. Nativemain37193819444/job111411418802 passes exactlive+naturalcleanup atworkflow5679/installed55cf. All6merge-triggeredworkflows5679passed(eachforegroundwatch0; separate manualdispatchcollector correctionretained). ARMlegacy37194212719/job111412582417 andmain37194271286/job111412750620 pass quietexactlive+success+naturalcleanup ondgx1, closingitsbindinggap. Bothprofilesall3lanessuccessproved; ARMinterruptionproofs+Pythondeletionstillpending. Installedlifecyclegate nowpassesall12cases(6perprofile): ARMcancel37194345294, timeout37194423936, SIGTERM37194532163/job111413531567(dgx2,15.383s exit143,completecleanup+guardedrestart). DeliberateSIGTERMworkflowfailure iscleanupproof,notsuccessfulbuild. Sealed installed-lifecycle-gate.json SHA48288690b9d916573d5e1e9557d2b9e31a89d8028b6dc55b3e79db0f4939a600,280hashedartifacts. DeepSeekready10:11:30UTC. SolewriterstartedPythonlifecycle/clientretirementfrom5679; nativeadministration/fullrunner.pydeletion andARM/degradedINPUTstillopen. #387, head dacfa4ff8df89dbeb63500c4b3c8e737289b2ab5, now opens the post-proof lifecycle/client retirement: 21 symbols, both clients and orphan codec deleted; current/historical packaging guarded; obsolete SSH effects retired. Local 442 focused +5 installer +2 rollout checks, inventory, scoped pins and Ruff pass. Both independent Astra reviews and adjudicated DeepSeek review clear. All149 Go source/module and135 frozen files unchanged. spire-acceptance applied; native consumer/full suites running in foreground CI. Evidence: state/s8-lifecycle-retirement-yz8ngmz2/. Native administration/full Python deletion and ARM INPUT follow-through remain. PR387 first-head foreground CI completed12/14pass; acceptance37195555049 and seam37195555052 both refuse the same deleted Python test path in check9. Repair4a209c8a enrolls immutable client pins, real native CLI tests and the complete native runner package under the existing pinned toolchain; 60 focused tests/schema/Ruff pass. No Go or frozen bytes changed. Independent repair review found a fixture-only request-counter race exposed by the new package race gate;7ae51b7f synchronizes it, second review clear. One Go test object changes; production Go and frozen vectors remain unchanged. Head7ae51b7f foregroundCI exposed an existing real-clock assumption: Windows default-target test expected elapsed0 but measured0.001. Exact injected elapsed reproduces it; a8b1af35 fixes only that test clock, all51 module tests pass and root review is clear. Head7ae finished13/14pass with both SPIRE lanes green (acceptance37196302150, seam37196302142); only the reproduced clock-test flake failed. Reviewed a8b1af35 now published for final foregroundCI; no merge claimed. Next admin baseline is sealed at state/s8-lifecycle-retirement-yz8ngmz2/admin-capture-4cl4g54n/:90 cases, manifest101cc90346ba920acf7001a0c0065fd4bae1d7169882b903f2a3909c9c664226, real current Python\u2192prebuilt native composition in six private namespaces; no host services or compiler invoked. PR387 final a8b1af35 passed14/14checks, foregroundwatch0; mergedefca101de4f7a00fb345d489f6274326e08a58fa at11:03:38UTC. Revert: git revert -m 1 efca101de4f7a00fb345d489f6274326e08a58fa. Exact-main workflows listed immediately and are watched in the foreground. New native-s8-runner-administration worktree is fast-forwarded to this merge with its own validated environment; the sole writer may implement the remaining native admin/publicCLI/consumer deletion tranche. Full Stage8 and ARM INPUT gates remain open. All five merge-triggered efca workflows passed in foreground: Security37197430412, Runner37197430435, seam37197430422, Rust37197430403, Secret37197430416. Receipt state/s8-lifecycle-retirement-yz8ngmz2/main-push-workflows/pr387-main-watch-results.json; each watch exit0. Initial monitor incorrectly required optional Dependency Graph from the preceding dependency-changing merge; only read-only monitors were restarted, no CI cancelled, correction retained. PR387 source/CI gate closed; no new production release claimed. Administration first checkpoint, 2026-10-04: exact committed e1e38d546ec6f0cffdc9e094a16a420488b50cf8 tested in the pinned ARM builder from a fresh bundle checkout; contract and runner-supervisor packages passed, command package failed two frozen parser cases (bare --, empty --policy=). No artifact published. Independent read-only review also found missing daemon-owned scanner cleanup on cancellation; fix is required before publication. Original golden captures are retained, Python-consumer deletion remains underway. Feedback, formatter patch, test output and powered-off-builder receipt: state/s8-administration-0_fkerdg/arm-checkpoint-lugfyuyh/feedback-receipt.json. Administration deletion checkpoint a3098140: final two Python files removed in the unpublished candidate; pinned ARM formatting and three Go packages pass, runner reproduced twice as a972910e5dc355b8d4fa8d03cd9b787baead4cbe86c0cbfd7025adeca87c2212. Exact-checkpoint native consumers: 366 passed +136 subtests, three standalone-install subfailures caused by the new rejecting install fixture; narrow test seam repair pending. Actual node-inspection/native-public-CLI integration passed. Scanner cleanup still pending, no production change. Receipt: state/s8-administration-0_fkerdg/arm-checkpoint-ogreg99r/feedback-receipt.json. Administration actual CLI replay (a3098140): 82 installation/public-CLI cases executed with the reproduced binary in six isolated namespaces: return codes, stdout, effects and file results match Python for all 82; only the nine retained Python traceback messages differ, with bounded native stderr captured for additive successors. Eight service-start/stop cases also match apart from individually bounded wall-clock timestamps. This is synthetic process proof, not installed fleet proof. Sealed 1,580-file manifest state/s8-administration-0_fkerdg/native-cli-capture-0o_e8lxp/manifest.json, SHA b7d79757eddb80e3389d2c6b005183a640b97e521c10b740fab9d777f76e59fe. Fresh scoped CLI readback at 11:32 UTC: four healthy DGX heartbeats, DeepSeek TP4 ready generation5; observed 10/54 capability inventory drift is the documented observation/adoption split, with supported post-cutover reconciliation recorded in state/s8-administration-0_fkerdg/capability-drift-readonly.md. Final administration review checkpoint 0eff20de: two independent Astra reviews clear; DeepSeek cross-review completed and five findings independently rejected against actual source (unresolved scanner creation returns before archive unlink; nonce failures occur before create; option-first public grammar intentionally preserves argparse abbreviations). Review receipt state/s8-administration-0_fkerdg/final-independent-review-adjudication.json. Both pinned architectures at substantive f165e658 pass tests/vet and two-build reproduction; actual old-method interruption regression fails twice because a separate daemon-owned process survives archive unlink. Only one-space test formatting failed and is corrected in 0eff20de; final-source validation pending. Scanner cancellation now owns exact ID/name/nonce/image cleanup, retaining archive with visible diagnostics on ambiguity; nine measured diagnostic and thirty effect successors added without editing any preexisting golden. Exact reviewed retirement of three completed ARM scratch checkouts restored builder capacity; receipt retire-checkpoints-q80f71jy, all retained local evidence hash-verified. No PR or deployment yet; installed administration and ARM INPUT remain open. Administration PR #388, head 0eff20de, opened with spire-acceptance: final source passes565installer,220vector/closure,368actualnativeconsumer tests+139subtests, inventory/Ruff/boundary. Final90actualCLI/service replays all match retained reference (bounded timestamp field only); manifest final-cli-replay-qjll4kdu/manifest.json SHA93cad7d6c6ebbdbc51ac5d649c8ef1a09d3155cc5102db40e4c68f3fa440d7ee. All135existingfrozenfiles verifiedunchanged. FinalARMtests/vet/format/reproductionpass; AMDtests/vet/formatpass but finalartifactbuild failed on99%-fullbuilder (1,019,445,248Bfree); capacityrecovery+buildretrypending, not countedpassed. CI watchedforeground. Productionremainsrc49. PR388 first-head CI completed15/16passed, foregroundwatch1: only shard1 failed before tests because the environment catalog pinned the old conftest.py source. Reviewed catalog-only repair 6c7388d17d617c34fbd622341cd8df9cb3753c96 updates the committed source/hash and isolation guidance; catalog10profiles22sources and830tooltests+26subtests pass. No runtime/frozenbyteschanged. Repairpushed; finalCIwatchforeground. Exact0eff AMD64two-buildretry nowpasses after reviewedretirement oftwo completed scratchtrees (free1.019\u21923.495GB), SHAe51c0c9b4580826f264c521afbf4fd76906814c3353f9832a25322e09d51a1db; ARM900ecf058bf3f098cb0c46cd4a38955451df4921b01750d928e227728e37d1e5. Bothbuilderstatesverifiedoff. Consolidatedruntimeevidence state/s8-administration-0_fkerdg/final-runtime-validation.json. Fresh12:24UTC scopedread: allfourDGX andzyn heartbeatshealthy, DeepSeekTP4readygeneration5; powered-offunifi-workerremainsexpectedstale. Installedadminproofdriverprepared, notexecuted; productionunchangedrc49. PR388 merged: final 6c7388d17d617c34fbd622341cd8df9cb3753c96 passed16/16 with foregroundwatch0, merged as ac014ba1604593862f5cb245ceaa544d0b4d77ac; revert git revert -m 1 ac014ba1604593862f5cb245ceaa544d0b4d77ac. Exact-main workflows listed immediately and watched in foreground. Reviewed retirement of six ARM and five AMD completed duplicate build roots restored8,679,751,680B /8,793,751,552B free; full retained candidate archives were independently hashed before deletion. Receipts state/s8-administration-0_fkerdg/release-duplicate-retirement-01vutaod/. Installed administration and ARM INPUT remain open; runtime remainsrc49. PR388 exact-main gate passed: all seven ac014ba push workflows completed successfully in foreground (Security37203205070, Secret37203205033, Rust37203205043, Runner37203205106, Signer37203205029, Connector37203205072, seam37203205061); main-ac014ba1-0_8lsi6w/watch-results.json. Standard rc50 build/sign is running from this exact merge (rc50-cut-w1ndt45q); no production switch yet. Fresh12:54UTC scoped read shows allfour DGX+zyn heartbeatshealthy and DeepSeekTP4 readygeneration5. rc50 signed build complete: exactac014ba release-set56819177ee376f5553454837a1fa1b0e184fad99042ff03a286250cb4a88b03b passes rc49 upgrade assembly; both packaged runner binaries match independent ARM900ecf05/AMDe51c0c9b reproduction. Standard cp1 cut-and-upgrade is running. DGX1 andzyn supervisors intentionally stopped for admin proof; old images/approvals exported and fully verified (rollback-verified-bbg6bg7i). Original helper refused its own sticky-parent backup path after export; narrow private-task reader and exact-byte receipt capture corrected only the evidence tooling, with original failures retained. No live administration success claimed yet. rc50 controller live: standard cut-and-upgrade exit0; independent installed manifest ac014ba/0.1.17-rc.50 and allfive canonical health predicates pass (rc50-cut-w1ndt45q/cp1-verified.json). Both old runner images/approvals independently copied and hash-verified locally (rollback-local-copies-xt10kyu0). Standard four-DGX node upgrade running; target runner supervisors remain intentionally stopped for admin proof. rc50 node upgrade result: standard command exit1 because dgx3/dgx4 retain their attested work_client and correctly refuse in-place change; no reenrollment attempted. DGX1/dgx2 upgraded to node6be1991dd1ce and authenticated jobs job_a57818d3dc77c40fa8c22b7d/job_7d77daf264779e6f5586bb84 passed. Exact stdout/stderr retained inrc50-cut-w1ndt45q. Remaining node/client switches stay with combinedStage3b. rc50 installed administration preflight: DGX1 canonical runner replacement completed (rc50-dgx1-replace-gqt6x4mx), retaining attested client and account; exact installed binary900ecf05 and ARM four-file recipe closure match signed ac014ba, actual unit changes only ExecStart. DGX1 and zyn supervisors remain intentionally stopped; all four node/router services and DeepSeek were healthy in rc50-fleet-readback-vp1eyg6n. Both rollback images/approvals have independently verified local copies. Two preparation assumptions were corrected in additive reviewed helper successors: Docker-save archives are root0600, and canonical installed recipes are ARM4/native6. First build preflight (rc50-dgx1-admin-8dh1w9s8) refused before any native operation because socket units omit MainPID; narrow helper correction pending. Installed admin proof is still open; no failed attempt is counted passed. DGX1 installed administration passed: all six actual cases (service-account build/successful scan; scanner failure and SIGTERM under service account and root) pass on signedrc50/ac014ba. Exact scanner/process/archive cleanup, unchanged approval on failure, expected exits0/1/143, and unchanged baseline services/model containers proved. Sealed rc50-installed-admin-sequence-ck0piyps/dgx1-administration-gate.json SHA180b743d00eb451abcb3471600543a9ce91ba45e4974a62aaa0636888d3ca36f; original preflight refusals retained separately. Doctor/service restoration and actual rc50 CI job, plus x86 administration, remain pending. Both rc50 administration profiles proved: zynserver canonical runner replacement retained its attested client, recorded exact old private-network/INPUT retirement, and changed only unit ExecStart. Allsix x86cases passed, including fresh image2dcec375 build/scan and natural cleanup for both interruption actors. Both DGX1/zyn now pass doctor and run active/enabled with independently observed exact loaded source/hash/account; restoration receipts rc50-dgx1-restore-tktfmkoh and rc50-zyn-restore-g0wxcajn. Zyn sealed administration receipt is rc50-zyn-admin-tbv4z7xb/zynserver-administration-gate.json. Foreground actual rc50 CI proofs pending; remaining three DGX supervisor binaries stayrc49 until final INPUT cutover. rc50 native CI passed: actual Rust build37207062171/job111450346744 completed success, foreground watch0, exact rc50 process/account/image/authority binding and natural cleanup verified (rc50-ready-lifecycle-v_u_cuu7/dispatch-ac014ba1-native-main-build-aff10d8a-result.json). ARM canaries37207012813(dgx2) and37207160711(dgx3) both succeeded/watch0 but ranrc49, so neither is counted as new DGX1 proof; original assignment refusals retained. Another quiet dispatch is running. rc50 administration+CI gate closed: third quiet ARM dispatch37207308236/job111451085411 ran onDGX1, completed success/watch0 and passed exact live binding/natural cleanup. Together with native37207062171, both profiles now have allsix installed administration cases and actual successfulCI; sealed rc50-administration-and-ci-gate.json SHA3b4f837378969621debbb742a4b76c0e441bff1546102486a1d28e4e5dcc449e. RemainingStage8 is reviewed ARM/degraded INPUT source6b0522c7, isolated kernel proof and final fleet cutover; not marked complete. ARM INPUT follow-through checkpoint: clean b2ad80c17e51aa6f5040fb948f2644608012e945 preserves149 historical vector files and adds146 measured successors. Independent source/capture reviews clear; root found and writer deleted28 lines of now-unreachable legacy ARM relay effects/helper. Prior3d ARM full package/vet and two-build artifact15d217 pass; 260 Python compatible-artifact checks+97subtests at6b pass, with one named node-inspection case deferred to normalCI. Final6b component build failed a Go command with innerstderr lost; cause is not established and no finalartifact is claimed. Both builders held for independently verified duplicate-output preservation/capacity recovery. Exploratory15d real-kernel VM normal/degraded/normal matrix passes, including exact positive-only fixture counts and model-like witness continuity; it is not the final b2 artifact gate. No production firewall change or Stage8 completion claimed. Builder capacity recovery completed,2026-10-04: root reverified four retained archive hashes, then verified and retired exactly seven completed roots per existing builder using reviewed literal scripts. Measured free space is9,390,305,280B x86 and9,460,285,440B ARM; both shutdowns verified. Evidence state/s3b-x86-capacity-6iiZ8WdA/root-retirement-ldkc7ton/completed.json. Signed rc49/rc50 releases, rollback exports, source bundles, shared inputs/toolchains and unrelated work remain. Final b2 ARM build and Stage3b55-case x86 trace resumed under separate builder leases; results not yet claimed. PR389 and final packet proof: #389, exactb2ad80c17e51aa6f5040fb948f2644608012e945, is open withspire-acceptance. ExactARM/AMD full runner package+CLI tests/vet/format and two-build reproduction pass; artifact74879274d05d1da55be5a34bcbb2f572637e76126ecb0dfac621ac509e2eb17b ARM,9eeeec6068836e3118f66da2857684bdfac29266a5218a8eef3092ca73d8825e AMD. Root independently verified each artifact and170source records. Exact-b2 Pythonconsumers260+97subtests pass; one native-node case is explicitlyCI-only. Precise frozen count:149originalfiles(148data+README) unchanged; only registry metadata differs outof150baselinepaths. Final real-kernel normal/degraded/normal matrix passes60TCP/UDPnegative probes, each withrejectcounterdelta1, publicDNS/TLSHTTP200 and model-like witness/daemon continuity;535evidencefiles independentlyrehashed in state/s8-arm-packet-final-u_hu4ttq/root-proof-verification.json. No rawICMP, actualGrype-in-degraded or productionfirewall claim. VMdomain/files/port removed; canonicalreceipt waitingonlyforDHCPexpiry15:33:58UTC underpacketagentcustody. InitialPRCI Gojob111459153015 failed newtestfixture AF_UNIX path-length underlongCI TMPDIR; production code unchanged, test-only correction inprogress, wholeforegroundCIwatch stillrunning. No merge/deploy claimed. PR389 initial CI complete: exact b2 head finished15/16 current checks; only Go failed because the new socket fixture exceeded Linux sun_path under CI&amp;#39;s long temporary root. Foreground watch exit1, state/s8-arm-input-evrvousg/pr389-b2-final-ci.json. Test-only successor325744a4 shortens the fixture socket root and adds a long-TMPDIR regression; pinned old-red/new-green validation is underway. No merge or deployment yet. Final b2 standalone-build scratch was archived/rehashed and retired by literal identity on both builders; receipts state/s8-arm-input-evrvousg/completed-build-retirement-kdc41uq0/root-execute-_7jjb_pn/, measured free9,390,055,424B x86 /9,459,294,208B ARM and both initially shut off before granting the focused x86 lease. PR389 merged2026-10-04: final325744a4 passed16/16 exact-head checks in foreground (watch exit0), with pinned old-fixture-red/new-fixture-green evidence. Normal merge83ad466b47d3ca895513eb160aae2087cffab090; revert git revert -m 1 83ad466b47d3ca895513eb160aae2087cffab090. Seven exact-main workflow watches are running and standardrc51 two-architecture build/sign/assembly has started; deployment remains gated on all main checks and independent artifact comparison. Evidence state/s8-arm-input-evrvousg/pr389-325-final-ci.json, pr389-merge.json, rc51-cut-rncjof9m/. Final live proof helpers are independently reviewed/sealed at state/s8-arm-live-proof-_z8oqx4y/manifest.json (58bca97c402b402b5110ce2d1e336e503e18348eac5e3f248d53ace704f802fc); no live ARM INPUT or Stage8 completion claim yet. 2026-10-04 rc51 checkpoint: #389 merge 83ad466b47d3ca895513eb160aae2087cffab090 passed 16/16 PR checks and 7/7 exact-main foreground workflows. Signed two-platform release 0.1.17-rc.51 set SHA256 d052d2e8b2653a1c72a586ffa5cc969fa1a836adc2877fbe2befac3af10b42ca; both runner binaries reproduce the tested b2 bytes, 170 source files/architecture independently checked. cp1 standard upgrade succeeded and independent five-part doctor passed. All four ARM before doctors and corrected read-only continuity baselines captured; initial optional Docker Health lookup refusal and root output-directory invocation error preserved. Evidence: state/s8-arm-input-evrvousg/rc51-cut-rncjof9m/ (main watches, release verification, cp1 verification, fleet-capture-corrected-7d9n44ys/). Node upgrade is running; runner replacement, actual ARM packet/reuse and current native-job proof remain open. rc51 installed proof (2026-10-04): all four ARM replacements/scans/ready doctors passed; unchanged containers20/21/73/11 and full shared-engine/network continuity proved in state/s8-arm-input-evrvousg/rc51-cut-rncjof9m/fleet-capture-corrected-7d9n44ys/fleet-continuity.json; DeepSeek remains ready. Zynserver replacement/build/scan/doctor passed with preserved rollback; actual Rust CI 37214736825 succeeded and natural cleanup proved. First ARM packet check 37214657087 refused an invalid helper assumption of one fabric address before probing; cancellation/cleanup passed, packet gate remains explicitly open pending both-address successor and later same-host success. Handoff 2026-10-04T16:29:17.647165+00:00: Gate closed with state/s8-final-gate-PLgAwk0z/final-gate.json, SHA256 ce12bd4b8ba0669679337b553c59a2e866d10c4790fda31ac4d8268adee83643; root independently rehashed1176 evidence files. #387 efca101d, #388 ac014ba1, #389 83ad466b are merged; last PR16/16 and exact-main7/7 passed foreground. Both profiles have real successful main/PR/legacy lanes and cancellation/timeout/SIGTERM cleanup, installed administration and source deletion. Finalrc51 ARM continuity passed allfour; native run37214736825/job111472844167 succeeded/cleaned. Corrected DGX4 packet/cancellation37215010050/job111473631917 passed publicDNS/HTTPS, gateway/both-fabric/remote denial with positive controls/counters and natural cleanup; later same-host37215958256/job111476398882 succeeded in a distinct container and cleaned. All three briefly paused idle supervisors restored; final16:19UTC checks show5 ready active/enabled runners, cp1doctor5/5, four active node/router/work clients and DeepSeekTP4ready. Packet VM fully retired including lease. Earlier refused/inconclusive observations and DeepSeek incomplete-overall-review limit remain explicit. No Stage8 PR/source/live gate remains. Next: retain evidence and keep Stage8 closed; old runner-job/admin prototypes pushed for preservation only, drop from landing queue. Separate3b dgx3/4 node identity refusal remains and is not claimed resolved. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\n9 Go controller authorities\nblocked; queue ownership and SQLite decisions outstanding; outside approved implementation\n\nneeds queue ownership decision Handoff 2026-10-04T16:29:17.647165+00:00: No open PR or native authority branch queued. Next step is an explicit decision establishing one work-queue owner and SQLite access under CGO_ENABLED=0, before replay/authority cutover design. No Stage9 fleet proof exists or is claimed. Privilege separation/Rust enforcement remain separate unscheduled work. The owner is drafting /home/meanaverage/sayhi/sparkops-iam-roles.md to replace the Stage6 legacy privileged boundary; do not act on that draft. This handover does not approve it or unblock Stage9. See successor handoff for exact commands, branch dispositions and live release digests.\n\n\nPrivilege separation\nunscheduled; enforcement implementation not authorized\nproposal and effect inventory\nOwner separated this from Stage6 on2026-10-03PDT/2026-10-04UTC. Preserve exact legacy privileged boundary with additions refused; future signing custody, typed effects, recovery and queue ownership require separate scope decisions. No Go node sudo, broker enforcement or Stage9 writer change is authorized here.\n\n\n\n\n\n\n\nHow to read the numbers\n\n\nCount the file diffs\nSum GitHub\u2019s per-file additions and deletions for paths ending in .py and .go. Retrieve every file page. Include tests, tools, and support code; exclude other file types.\n\nKeep the scope explicit\nPR #330 establishes the native conversion program. The report includes every PR through #418. Unmerged PRs contribute only to the all-PR total. Every row matches the originating metrics table and an independent GitHub check.\n\nMeasure change volume\nA line changed in several PRs can be counted several times. These totals include rewrites and unrelated work. They do not measure final repository size or a one-to-one Python-to-Go conversion ratio.\n\n\nSparkOps Python-to-Go conversion metricsRepository \u00b7 Architecture decision \u00b7 PR metrics\n\nconst bodyRows=[...document.querySelectorAll('#pr-table tbody tr')];\nfunction filterRows(){const q=document.getElementById('search').value.toLowerCase();const state=document.getElementById('status').value;let count=0;for(const row of bodyRows){row.hidden=!(row.textContent.toLowerCase().includes(q)&amp;amp;&amp;amp;(state==='all'||row.dataset.status===state));if(!row.hidden)count++;}document.getElementById('row-count').textContent=count+' PRs shown';}\ndocument.getElementById('search').addEventListener('input',filterRows);document.getElementById('status').addEventListener('change',filterRows);\n// Wrap each numbered stage in a native accordion, preserving all source content.\nconst article=document.getElementById('roadmap-content');const headings=[...article.querySelectorAll('h1,h2,h3')].filter(h=&amp;gt;/\\bStage\\s*\\d+[a-z]?\\b/i.test(h.textContent));\nfor(const heading of headings){if(heading.closest('details'))continue;const depth=Number(heading.tagName[1]);const nodes=[];let n=heading.nextSibling;while(n&amp;amp;&amp;amp;!(n.nodeType===1&amp;amp;&amp;amp;/^H[1-3]$/.test(n.tagName)&amp;amp;&amp;amp;Number(n.tagName[1])&amp;lt;=depth)){nodes.push(n);n=n.nextSibling;}const details=document.createElement('details');const summary=document.createElement('summary');summary.textContent=heading.textContent;heading.replaceWith(details);details.append(summary,...nodes);}\nconst toggle=document.getElementById('expand-roadmap');toggle.addEventListener('click',()=&amp;gt;{const items=[...article.querySelectorAll('details')];const expand=items.some(d=&amp;gt;!d.open);items.forEach(d=&amp;gt;d.open=expand);toggle.textContent=expand?'Collapse all stages':'Expand all stages';});\n", "creation_timestamp": "2026-10-07T07:02:21.000000Z"}</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/sighting/f38d26d9-933d-4c3a-b598-5457b9e72ec6/export</guid>
      <pubDate>Wed, 07 Oct 2026 07:02:21 +0000</pubDate>
    </item>
    <item>
      <title>e5fdbc3a-c69f-4b0b-9274-756ae2d46960</title>
      <link>https://vulnerability.circl.lu/sighting/e5fdbc3a-c69f-4b0b-9274-756ae2d46960/export</link>
      <description>{"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;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"}</description>
      <content:encoded>{"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;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"}</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/sighting/e5fdbc3a-c69f-4b0b-9274-756ae2d46960/export</guid>
      <pubDate>Wed, 07 Oct 2026 06:08:43 +0000</pubDate>
    </item>
    <item>
      <title>41dc0573-d722-4eb6-aaeb-df13529bc92b</title>
      <link>https://vulnerability.circl.lu/sighting/41dc0573-d722-4eb6-aaeb-df13529bc92b/export</link>
      <description>{"uuid": "41dc0573-d722-4eb6-aaeb-df13529bc92b", "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/alon710/dd727aeefbf8e03d9753ad1590f5bf38", "content": "# CVE-2026-102598: CVE-2026-102598: Remote Denial of Service via NTFS Alternate Data Stream Bypass in Werkzeug safe_join\n\n&amp;gt; **CVSS Score:** 6.3\n&amp;gt; **Published:** 2026-10-05\n&amp;gt; **Full Report:** https://cvereports.com/reports/CVE-2026-102598\n\n## Summary\nCVE-2026-102598 is a security bypass and Denial of Service (DoS) vulnerability in the Werkzeug WSGI web application library. In versions prior to 3.1.9, the library's safe_join function fails to sanitize Windows reserved device names containing an empty NTFS Alternate Data Stream (ADS) marker (such as NUL:). This allows remote, unauthenticated attackers to trigger indefinite thread-blocking operations on Windows hosts, resulting in application-wide resource exhaustion.\n\n## TL;DR\nA validation bypass in Werkzeug's safe_join utility on Windows systems allows attackers to bypass reserved device checks using empty NTFS Alternate Data Stream markers, causing server worker threads to block indefinitely and triggering a Denial of Service.\n\n## Exploit Status: POC\n\n## Technical Details\n\n- **CWE ID**: CWE-67\n- **Attack Vector**: Network (AV:N)\n- **CVSS v4.0**: 6.3 (Medium)\n- **EPSS Score**: 0.00368 (28.41% Percentile)\n- **Impact**: Denial of Service (DoS) via thread exhaustion\n- **Exploit Status**: PoC / Public details available\n- **CISA KEV Status**: Not listed\n\n## Affected Systems\n\n- Werkzeug WSGI web application library running on Microsoft Windows with NTFS filesystem\n- **Werkzeug**: &amp;lt; 3.1.9 (Fixed in: `3.1.9`)\n\n## Mitigation\n\n- Upgrade Werkzeug to version 3.1.9 or later to natively block special device names with Alternate Data Streams.\n- Deploy Web Application Firewall (WAF) rules to block request paths containing colons (:) in user input parameters.\n- Implement custom input validation at the application level to reject DOS device names and alternate data stream syntaxes.\n- Migrate Python deployments from Windows servers to Linux/Unix based containers to avoid Windows-specific path issues.\n\n**Remediation Steps:**\n1. Inspect requirements.txt or Pipfile for Werkzeug version specifications.\n2. Execute: pip install --upgrade werkzeug&amp;gt;=3.1.9\n3. Verify all testing suites pass, especially custom file-serving routes.\n4. Redeploy the application to the production Windows environment.\n\n## References\n\n- [GHSA-g6x2-hccm-hh4m: Security Advisory](https://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m)\n- [Werkzeug 3.1.9 Release Notes](https://github.com/pallets/werkzeug/releases/tag/3.1.9)\n- [NVD - CVE-2026-102598](https://nvd.nist.gov/vuln/detail/CVE-2026-102598)\n- [CVE.org - CVE-2026-102598](https://www.cve.org/CVERecord?id=CVE-2026-102598)\n\n\n---\n*Generated by [CVEReports](https://cvereports.com/reports/CVE-2026-102598) - Automated Vulnerability Intelligence*", "creation_timestamp": "2026-10-06T00:30:32.000000Z"}</description>
      <content:encoded>{"uuid": "41dc0573-d722-4eb6-aaeb-df13529bc92b", "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/alon710/dd727aeefbf8e03d9753ad1590f5bf38", "content": "# CVE-2026-102598: CVE-2026-102598: Remote Denial of Service via NTFS Alternate Data Stream Bypass in Werkzeug safe_join\n\n&amp;gt; **CVSS Score:** 6.3\n&amp;gt; **Published:** 2026-10-05\n&amp;gt; **Full Report:** https://cvereports.com/reports/CVE-2026-102598\n\n## Summary\nCVE-2026-102598 is a security bypass and Denial of Service (DoS) vulnerability in the Werkzeug WSGI web application library. In versions prior to 3.1.9, the library's safe_join function fails to sanitize Windows reserved device names containing an empty NTFS Alternate Data Stream (ADS) marker (such as NUL:). This allows remote, unauthenticated attackers to trigger indefinite thread-blocking operations on Windows hosts, resulting in application-wide resource exhaustion.\n\n## TL;DR\nA validation bypass in Werkzeug's safe_join utility on Windows systems allows attackers to bypass reserved device checks using empty NTFS Alternate Data Stream markers, causing server worker threads to block indefinitely and triggering a Denial of Service.\n\n## Exploit Status: POC\n\n## Technical Details\n\n- **CWE ID**: CWE-67\n- **Attack Vector**: Network (AV:N)\n- **CVSS v4.0**: 6.3 (Medium)\n- **EPSS Score**: 0.00368 (28.41% Percentile)\n- **Impact**: Denial of Service (DoS) via thread exhaustion\n- **Exploit Status**: PoC / Public details available\n- **CISA KEV Status**: Not listed\n\n## Affected Systems\n\n- Werkzeug WSGI web application library running on Microsoft Windows with NTFS filesystem\n- **Werkzeug**: &amp;lt; 3.1.9 (Fixed in: `3.1.9`)\n\n## Mitigation\n\n- Upgrade Werkzeug to version 3.1.9 or later to natively block special device names with Alternate Data Streams.\n- Deploy Web Application Firewall (WAF) rules to block request paths containing colons (:) in user input parameters.\n- Implement custom input validation at the application level to reject DOS device names and alternate data stream syntaxes.\n- Migrate Python deployments from Windows servers to Linux/Unix based containers to avoid Windows-specific path issues.\n\n**Remediation Steps:**\n1. Inspect requirements.txt or Pipfile for Werkzeug version specifications.\n2. Execute: pip install --upgrade werkzeug&amp;gt;=3.1.9\n3. Verify all testing suites pass, especially custom file-serving routes.\n4. Redeploy the application to the production Windows environment.\n\n## References\n\n- [GHSA-g6x2-hccm-hh4m: Security Advisory](https://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m)\n- [Werkzeug 3.1.9 Release Notes](https://github.com/pallets/werkzeug/releases/tag/3.1.9)\n- [NVD - CVE-2026-102598](https://nvd.nist.gov/vuln/detail/CVE-2026-102598)\n- [CVE.org - CVE-2026-102598](https://www.cve.org/CVERecord?id=CVE-2026-102598)\n\n\n---\n*Generated by [CVEReports](https://cvereports.com/reports/CVE-2026-102598) - Automated Vulnerability Intelligence*", "creation_timestamp": "2026-10-06T00:30:32.000000Z"}</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/sighting/41dc0573-d722-4eb6-aaeb-df13529bc92b/export</guid>
      <pubDate>Tue, 06 Oct 2026 00:30:32 +0000</pubDate>
    </item>
  </channel>
</rss>
