Skip to content

feat(local-ai): route RTX Spark unified-memory SKUs through NVIDIA's fixed recipe table - #1520

Open
karkarl wants to merge 12 commits into
mainfrom
maintainer/rtx-spark-recipes-main
Open

karkarl wants to merge 12 commits into
mainfrom
maintainer/rtx-spark-recipes-main

Conversation

@karkarl

@karkarl karkarl commented Sep 25, 2026

Copy link
Copy Markdown
Collaborator

Closes #1496

Supersedes #1497. This maintainer replacement preserves the contributor's 12-commit RTX Spark change stack without force-pushing the external contributor branch. The original fork branch is contributor-owned and did not expose push permission to this maintainer session.

The replacement is rebased onto origin/main at 5a595352, which includes PR #1515 commit 7d92747e. git range-diff reports all 12 original commits as patch-equivalent (=) from original head 24ff075a to replacement head 7e519933.

What changed

  • Detect RTX Spark from the driver-reported GPU name and route default selection through NVIDIA's fixed SKU recipe table.
  • Carry DFlash draft assets through catalog selection, download verification, schema-5 manifests, reconciliation, and llama-server launch.
  • Keep non-Spark discrete GPU selection and schema-4 receipt behavior compatible.
  • Upgrade the managed llama-server runtime to b11026.

Required proof pools

  • windows-wsl-dgx-blackwell: applicable. The original patch-equivalent stack has physical RTX Spark and RTX 5090 proof linked below. Current replacement-head physical rerun is blocked because Crabbox is not installed on the maintainer host. Mocked detection is not being presented as hardware proof.
  • windows-winui-interactive: applicable. The original patch-equivalent stack has live WinUI evidence linked below. Current replacement-head interactive recapture is blocked on this non-DGX maintainer host.

Validation

Current replacement head 7e519933:

  • ./build.ps1: passed, all projects built.
  • dotnet test ./tests/OpenClaw.Shared.Tests/OpenClaw.Shared.Tests.csproj --no-restore: 4,130 passed, 0 failed, 32 skipped.
  • dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-restore: 3,119 passed, 0 failed, 0 skipped. OPENCLAW_TRAY_DATA_DIR was isolated.
  • Focused LocalInferenceQualificationTests: 59 passed, 0 failed. Covers CUDA GPU facts, RTX Spark detection, fixed recipe routing, mixed hosts, and generic GPU fallback.
  • Focused LocalAiInstallRecoveryTests|LocalAiPortHandoffTests: 51 passed, 0 failed, 1 cross-volume test skipped. Covers setup, repair, runtime upgrade, additional assets, and port handoff.
  • Focused LocalAiManifestMigrationTests|LocalAiPortLifecycleTests: 113 passed, 0 failed, 1 cross-volume test skipped. Covers schema migration, verified runtime launch, restart, and endpoint lifecycle.
  • git diff --check origin/main...HEAD: passed.
  • Rubber-duck closeout: no blocking correctness, compatibility, install, upgrade, runtime, or security findings. It noted one optional positive-path preset assertion gap and one stale-comment suggestion; neither changes runtime behavior.
  • Structured autoreview was invoked but failed closed before model execution because its secret-like-content scanner flags LocalInferenceSelector.cs in both old and new diff content. No scanner bypass or truncated review was used.

Real behavior proof

This replacement contains no patch changes relative to #1497. The rebase-only equivalence is proven by git range-diff, with all 12 commits matched as =.

Physical and interactive evidence for the patch-equivalent original stack:

Not verified / blocked

A physical DGX/RTX Spark rerun at replacement head 7e519933 was not available from this session because no Crabbox executable or approved static DGX host is configured. The linked hardware evidence is from patch-equivalent pre-rebase heads, not claimed as a new current-head hardware run. GitHub CI on the replacement PR remains the exact-head remote validation source.

Adds GpuInfo.IsRtxSpark, additive only. Groundwork for routing RTX
Spark's unified-memory SKUs through a fixed recipe table instead of
the generic capacity fit-test.
RTX Spark's total CUDA-visible memory identifies the physical memory
SKU, not usable capacity the way it does on a discrete GPU, so the
generic priority/fit-test default pick doesn't apply. Adds:

- SpeculativeDecodingMode.None/DraftDFlash and an optional separate
  draft checkpoint (LocalModelRunRecipe.DraftWeights), needed because
  DFlash uses an independently pinned draft GGUF rather than an
  embedded MTP draft layer.
- Three RTX Spark catalog recipes: Qwen3.6-35B-A3B IQ4_XS (48GB SKU),
  and Qwen3.8-27B Q4_K_M with DFlash n=7 (128GB SKU default). The
  64GB-SKU recipe reuses the existing default model's
  ctx-131072-q8_0 profile -- no new catalog entry needed.
- RtxSparkInferenceSelector, a fixed SKU-to-recipe table keyed off
  GpuVisibleMemoryBytes (empirically verified against a real 48GB
  RTX Spark unit). Wired into LocalInferenceSelector.Select only for
  the no-requested-model default path; explicit model requests and
  every non-Spark GPU keep using the untouched generic fit-test.
- GetRequiredMemoryBytes/GetDraftKvCacheMemoryBytes now account for a
  DFlash recipe's separate draft weights and skip draft KV entirely
  for SpeculativeDecodingMode.None.
BuildPreset hardcoded spec-type = draft-mtp unconditionally. Branches
on LocalModelRunRecipe.SpeculativeDecoding so DraftDFlash recipes
emit spec-type = draft-dflash plus spec-draft-model, and None emits
no spec-* lines at all.

DraftDFlash still requires a resolved draftModelPath; that path isn't
threaded from the install manifest yet (the DFlash draft checkpoint
isn't acquired/verified through HuggingFaceModelInstaller in this
change), so BuildPreset fails closed with InvalidDataException rather
than silently omitting the draft model. Follow-up work.
Adds SKU-boundary coverage for the new RtxSparkInferenceSelector
(32/48/64/128GB) and a case proving a non-Spark GPU with Spark-sized
memory still takes the generic path.

Evaluate_RoutesRuntimeByArchitectureWithoutGpuSkuPairing used "NVIDIA
RTX Spark N1X" as an arbitrary placeholder name to prove GPU name
doesn't affect runtime routing. That's no longer SKU-irrelevant now
that RTX Spark has real SKU routing, so the fixture GPU name is
swapped to a generic dGPU.
LocalModelCatalog.AdditionalArtifacts() gives every acquirer, manifest, and
launch path a single fixed ordering for a recipe's non-primary pinned
artifacts. Today that is the DFlash draft checkpoint.

GetRequiredMemoryBytes now includes the draft checkpoint's weights, so a
DFlash recipe does not under-report the memory it needs during qualification.
b10655 (CUDA 13.3 on x64) predates DFlash draft-decoding support and
the 96GB recipe's validated build. Bumping to b11026 puts both x64 and
arm64 on CUDA 13.4 and covers every RTX Spark recipe with one pinned
runtime, matching the existing single-global-pin design instead of
adding per-recipe runtime routing.
…sets

Extends LocalAiInstallManifest with AdditionalModelAssets/
AdditionalModelPaths (schema 5) so a recipe's DFlash draft checkpoint
or extra split-GGUF shards can be recorded and re-verified alongside
the primary weights receipt in the same Hugging Face hub cache.
Schema 4 manifests are untouched -- the new fields are empty and
absent from JSON unless a recipe actually pins additional assets.

Each additional-asset receipt derives its own repository/revision from
its own SourceUrl (not the primary ModelId) since the DFlash draft
checkpoint is pinned from a different HF repo than the primary weights.

Adds LocalAiInstallManifest.UsesHubCache so schema 4 and schema 5 are
treated identically everywhere the manifest previously branched only
on the exact HubCacheReceiptSchemaVersion value.

AdditionalModelAssets/AdditionalModelPaths are left at their unset
ImmutableArray default (not .Empty) so JsonIgnoreCondition.WhenWritingDefault
actually omits them for schema-3/4 manifests -- .Empty is a distinct,
non-default array instance the condition never matches, so writing it
would have added new fields to every existing schema-4 receipt and
broken older app builds' strict unknown-field rejection. UsesHubCache
is marked [JsonIgnore] for the same reason: it's a derived read helper,
not part of the persisted contract. ResolveAndValidate normalizes the
unset default to .Empty immediately after load so every in-memory
reader keeps using ordinary IsEmpty/Length calls safely.
Adds HuggingFaceModelInstaller.InstallAdditionalAssetAsync, mirroring
InstallAsync's resumable-download/verify/promote flow for a recipe's
non-primary pinned artifacts (DFlash draft checkpoint, extra
split-GGUF shards). Deliberately duplicated rather than refactored
out of InstallAsync to avoid any risk to that heavily-tested primary
weights path; the one thing it omits is the legacy app-owned
compatibility copy, since every recipe using an additional asset is
new since the hub cache became the primary store.
…ncile

AcquireLocalAiModelStep now downloads/verifies a recipe's additional
assets (via LocalModelCatalog.AdditionalArtifacts) right after its
primary weights, records the results on SetupContext, and rolls the
context field back on failure -- the hub-cache artifacts themselves
survive rollback the same way the primary weights' do, since there is
no legacy copy to delete. PersistLocalAiManifestStep writes them into
a schema-5 manifest (schema 4 unchanged for recipes with none), and
leaves the two new manifest fields at their unset default rather than
an explicitly-built empty array when there is nothing to add, so a
plain schema-4 install keeps omitting them from JSON.

LocalAiInstallReconciler gains VerifyAdditionalAssetAsync so a reused
install re-verifies a recipe's additional assets against the hub
cache, not just its primary weights, before treating the install as
still valid. LocalAiReconcileResult now also carries the additional
asset installs it just verified, reconstructed from the manifest's own
already-verified receipts: recovery for a broken runtime (model and
additional assets still valid) previously left SetupContext's
additional-install list empty because AcquireLocalAiModelStep's reuse
skip never re-runs acquisition, which made PersistLocalAiManifestStep
hard-fail on the very installs this series adds an acquisition step
for. The setup review consent screen now also lists every additional
artifact (a DFlash draft checkpoint, or extra split-GGUF shards) as
its own download line instead of only the primary weights.
…unch preset

BuildCore resolves the DFlash draft checkpoint and passes it to BuildPreset, so
spec-draft-model is finally emitted for real. ValidateArtifactReceipts also checks
additional-asset receipts against the catalog, as it already does for the primary
weights and runtime artifacts.

The path handed to llama-server is the handle-resolved physical path from the same
verification that opened the file, not the persisted snapshot path. The hub cache
hands out a handle-resolved path precisely so a snapshot-link replacement cannot
change the file identity a native reader finally opens, which is how the primary
model is already bound; the draft checkpoint now gets the same guarantee instead of
re-deriving its path from its receipt.

LlamaServerRuntimeService's schema checks use LocalAiInstallManifest.UsesHubCache so
schema-5 installs are treated as hub-cache-backed, matching schema 4, instead of
falling into the legacy schema-3 branch.
A recipe's pinned weights are not everything it downloads or loads: a DFlash
recipe also pulls a separate draft checkpoint, and llama-server loads both.
Ranking, the post-launch GPU-load sanity check, and the user-facing size
disclosure all read the primary weights alone, so a DFlash recipe understated
its footprint and the setup review omitted the draft checkpoint entirely.

Adds LocalModelCatalog.TotalDownloadSizeBytes (weights plus draft checkpoint)
and switches SelectDefaultModelAndProfile's tie-break and fallback,
LocalAiGpuVerification's minimum-load-delta check, and the setup UI's model
picker and detail text to use it.

SelectDefaultModelAndProfile also excludes priority-0, explicit-alternative
models from the generic default and fallback pool, so a model reachable only
through a specific SKU can never win the generic pick as the catalog grows.
…are incomplete

An RTX Spark GPU whose CUDA memory couldn't be read reads as 0 bytes,
which the fixed SKU table treated as a legitimately-too-small SKU
(NotRecommendedForSku) instead of the real problem: unreadable
capacity. Select() now only takes the Spark SKU-routing branch when
the Spark GPU's facts are actually complete, so an incomplete-facts
Spark GPU falls through to the generic path and gets correctly
diagnosed as HardwareFactsIncomplete, same as any other GPU.

Also bumps LocalAiPortHandoffTests' Spark fixture from an arbitrary
~24GiB (a pre-SKU-routing placeholder, now below the smallest 32GB
tier) to a real 48GB SKU's measured cuMemGetInfo total, so it again
resolves to the 24GB recipe instead of "not recommended."
@clawsweeper

clawsweeper Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@karkarl karkarl added the status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. label Sep 25, 2026
@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 25, 2026
@clawsweeper

clawsweeper Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Codex review: blocked before merge. Reviewed September 25, 2026, 7:48 PM ET / 23:48 UTC (Revision 3).

ClawSweeper review

What this changes

The branch selects fixed Local AI recipes for RTX Spark memory tiers, downloads and verifies DFlash draft assets, records them in installation receipts, updates setup and tray behavior, and upgrades the managed llama-server runtime.

Merge readiness

⛔ Blocked before merge - 5 items remain

This PR still adds RTX Spark behavior absent from current main. Real-device evidence supports the 48 GB and x64 paths, but a fresh 32 GB Spark receives an inaccurate unavailable message. The 64/128 GB rollout and older-build recovery from schema 5 also need an explicit landing decision.

Priority: P2
Reviewed head: 7e519933a3444ee0bfa45cffb723568b1c0f45c1
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Strong real-device traces and focused tests support the core path, while the source-proven UX finding and unresolved rollout contract limit readiness.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): Linked physical 48 GB Spark production-setup traces show draft acquisition, schema-5 receipt, native serving, and generated tokens; native x64 traces show b11026 install and schema-4 upgrade. The PR and maintainer describe the replacement stack as patch-equivalent, though the original head was unavailable locally for an independent range-diff and the linked screenshot could not be inspected here. Existing-state upgrade compatibility is supported by the schema-4 traces; 64/128 GB native behavior and older-build rollback remain separate merge risks.
Patch quality 🦐 gold shrimp (3/6) 1 actionable review finding remain.

Verification

Check Result Evidence
Real behavior Verified Sufficient (terminal): Linked physical 48 GB Spark production-setup traces show draft acquisition, schema-5 receipt, native serving, and generated tokens; native x64 traces show b11026 install and schema-4 upgrade. The PR and maintainer describe the replacement stack as patch-equivalent, though the original head was unavailable locally for an independent range-diff and the linked screenshot could not be inspected here. Existing-state upgrade compatibility is supported by the schema-4 traces; 64/128 GB native behavior and older-build rollback remain separate merge risks.
Evidence reviewed 13 items Introduced patch: The pinned main-to-head delta changes 25 files, including SKU selection, asset acquisition, receipts, runtime launch, UI, and tests.
Still needed: Current main selects the generic catalog default and has no RTX Spark selector; the latest release also uses the generic selector.
Release check: The v2026.9.4 selector still takes the generic default path.
Findings 1 actionable finding [P2] Explain the 32 GB no-default result in setup and tray
Security None None.

How this fits together

Local AI setup reads GPU facts and selects a pinned model recipe before downloading assets and starting a local inference server. The installation receipt and server state then feed setup and tray availability displays.

flowchart LR
 A[GPU and memory facts] --> B[SKU or generic selection]
 B --> C[Pinned model recipe]
 C --> D[Download and verify assets]
 D --> E[Installation receipt]
 E --> F[Local inference server]
 B --> G[Setup and tray availability]
 F --> G
Loading

Decision needed

Question Recommendation
Should the unverified 64/128 GB Spark defaults and schema-5 older-build rollback limit ship in this release, or should those paths be staged? Stage higher tiers: Land the verified tier after the copy fix, and defer 64/128 GB defaults and schema-5 DFlash installs until hardware and recovery proof is available.

Why: Physical proof covers 48 GB Spark and x64 discrete hardware, while the new receipt format is unreadable by older builds; selecting a rollout and rollback contract requires product ownership.

Before merge

  • Explain the 32 GB no-default result in setup and tray (P2) - For a fresh lone 32 GB Spark, this new return value reaches diagnostics without a matching reason kind and becomes Unknown. Both views then say Local AI requirements could not be verified even though the no-default result is intentional and GPU facts are complete. Add a dedicated localized reason and update the tray test that currently expects Unknown. This finding remains from the previous review of this same head.
  • Resolve merge risk (P1) - The PR enables automatic 64 GB and 128 GB Spark recipes, but the linked native proof exercises a 48 GB Spark and a discrete RTX 5090; higher-tier native load and availability remain unverified.
  • Resolve merge risk (P1) - A new DFlash install writes schema 5, which older builds reject. Rolling back the app could leave Local AI unavailable until the user updates or repairs it, and the recovery contract is not yet stated.
  • Complete next step (P2) - Fix the 32 GB unavailable message in both views and obtain an owner decision on 64/128 GB rollout and schema-5 older-build recovery.
  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.

Findings

  • [P2] Explain the 32 GB no-default result in setup and tray — src/OpenClaw.Shared/Inference/Catalog/LocalInferenceSelector.cs:130-131
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Code and test delta production +1,237/-81 lines; tests +897/-14 lines The production growth spans selection, asset acquisition, receipts, runtime launch, and UI, with substantial focused test coverage.

Merge-risk options

Maintainer options:

  1. Stage the unproven tiers (recommended)
    Keep automatic defaults to the hardware-proven scope until 64/128 GB native behavior and schema-5 recovery are demonstrated.
  2. Own the rollout limit
    Approve all tier defaults and document the older-build schema-5 rejection with a user-accessible recovery route.

Technical review

Best possible solution:

Keep the approved 32 GB no-default policy, display its real reason in setup and tray, and stage higher-tier defaults until native proof and a clear in-product schema-5 recovery path are ready.

Do we have a high-confidence way to reproduce the issue?

Yes, the fresh lone-32 GB Spark path is clear in source: selection returns NotRecommendedForSku, diagnostics map it to Unknown, and a tray test asserts that result. This read-only review did not execute the app.

Is this the best way to solve the issue?

Not yet. The fixed recipe and verified asset paths are well supported for the exercised hardware, but the 32 GB message needs a dedicated reason and the higher-tier rollout and rollback contract need owner approval.

Full review comments:

  • [P2] Explain the 32 GB no-default result in setup and tray — src/OpenClaw.Shared/Inference/Catalog/LocalInferenceSelector.cs:130-131
    For a fresh lone 32 GB Spark, this new return value reaches diagnostics without a matching reason kind and becomes Unknown. Both views then say Local AI requirements could not be verified even though the no-default result is intentional and GPU facts are complete. Add a dedicated localized reason and update the tray test that currently expects Unknown. This finding remains from the previous review of this same head.
    Confidence: 0.98

Overall correctness: patch is incorrect
Overall confidence: 0.91

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 5a59535216ee.

Labels

Label changes:

No label changes.

Label justifications:

  • P2: The feature has strong bounded proof but a source-proven 32 GB UX defect and rollout decisions with limited blast radius.
  • merge-risk: 🚨 compatibility: DFlash installs persist schema 5, which older app builds reject on rollback.
  • merge-risk: 🚨 availability: Automatic 64/128 GB recipes could fail native loading on hardware tiers absent from the linked device proof.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (terminal): Linked physical 48 GB Spark production-setup traces show draft acquisition, schema-5 receipt, native serving, and generated tokens; native x64 traces show b11026 install and schema-4 upgrade. The PR and maintainer describe the replacement stack as patch-equivalent, though the original head was unavailable locally for an independent range-diff and the linked screenshot could not be inspected here. Existing-state upgrade compatibility is supported by the schema-4 traces; 64/128 GB native behavior and older-build rollback remain separate merge risks.
  • proof: sufficient: Contributor real behavior proof is sufficient. Linked physical 48 GB Spark production-setup traces show draft acquisition, schema-5 receipt, native serving, and generated tokens; native x64 traces show b11026 install and schema-4 upgrade. The PR and maintainer describe the replacement stack as patch-equivalent, though the original head was unavailable locally for an independent range-diff and the linked screenshot could not be inspected here. Existing-state upgrade compatibility is supported by the schema-4 traces; 64/128 GB native behavior and older-build rollback remain separate merge risks.

Evidence

What I checked:

Likely related people:

  • shanselman: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • joelagnel: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Map the 32 GB no-default result to accurate localized setup and tray copy and update its regression test.
  • Record an owner decision on 64/128 GB rollout and older-build schema-5 recovery.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (2 earlier review cycles)
  • reviewed 2026-09-25T23:16:41.637Z sha 7e51993 :: needs maintainer review before merge. :: none
  • reviewed 2026-09-25T23:30:51.376Z sha 7e51993 :: blocked before merge. :: [P2] Explain the 32 GB no-default outcome in setup and tray

@karkarl karkarl added status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. and removed status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. labels Sep 25, 2026
@clawsweeper clawsweeper Bot added merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 25, 2026
@karkarl

karkarl commented Sep 25, 2026

Copy link
Copy Markdown
Collaborator Author

CI rerun triage at 7e519933

The failed jobs from run 36200170563 were rerun once. No source changes were made because the remaining failures are not introduced by this branch.

  • Tray, setup, and integration tests: passed on attempt 2: job 108288560411. The attempt-1 MCP startup timeout did not reproduce. The exact integration lane also passes locally: OPENCLAW_RUN_INTEGRATION=1 .\scripts\Invoke-CiTest.ps1 -Project tests\OpenClaw.Tray.IntegrationTests -ResultsDirectory TestResults\TrayIntegrationLocal -TrxFileName OpenClaw.Tray.IntegrationTests.trx -Runtime win-x64 (50 passed, 2 explicitly skipped).
  • Setup and connect E2E: still fails during shared fixture setup before Local AI coverage runs: job 108288560306. Root error: StateDatabaseCoordinatorContentionError, then GATEWAY_RESTART_PREPARATION_REFUSED while recording the serving Gateway restart intent. Result: 17 passed, 23 fixture-cascade failures, 6 skipped. The same failure is present on the merged fix(setup): retry guarded restart after reload owner handoff #1515 commit 7d92747e: main job 108160895596.
  • Network recovery E2E: still fails both tests during the same shared fixture initialization: job 108288560432. Current main 5a595352 fails identically: main job 108202771935.
  • CI Gate: job 108290453985 is the aggregate consequence of those two baseline E2E failures.

Classification: the tray failure was transient and passed on rerun. Setup/connect and network recovery are current-main Gateway lifecycle infrastructure blockers, not RTX Spark recipe regressions. The replacement branch remains patch-equivalent to #1497 and contains current main including #1515. No merge performed.

@karkarl karkarl removed the status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. label Sep 25, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Local AI: route RTX Spark unified-memory SKUs through NVIDIA's fixed recipe table

2 participants