Skip to content

audit batch 2026-10-24: composed CI for 13 PRs (do not merge) - #8083

Closed
Lightheartdevs wants to merge 44 commits into
mainfrom
audit/batch-20261024a
Closed

Lightheartdevs wants to merge 44 commits into
mainfrom
audit/batch-20261024a

Conversation

@Lightheartdevs

Copy link
Copy Markdown
Collaborator

Do not merge. This draft runs CI on current main plus 13 audited PRs merged together. Each PR will be squash-merged on its own afterwards, so contributors keep the credit. This draft is then closed.

Base: main 7e9d2ed62. Each head is pinned to the SHA it was reviewed at:

PR head what it fixes
#7922 7faa8e9 refuse a NextN GGUF the host's llama.cpp cannot load (fleet #7519; can be overridden)
#7711 698f3e1 header-read timeout wording + help link (fleet #7598)
#8078 c2575f5 ods restart no longer waits 300 s for a disabled Hermes
#7636 ac90ca7 CLI path arguments resolve from the caller's directory (backups no longer land in the install tree)
#7990 a9d3caf host agent finds stopped containers for logs/restart
#7854 c141a38 Windows repair voice survives a curl timeout on PowerShell 5.1
#7873 144747f real-signal host-agent shutdown regression test (#1600)
#8037 409ab8a ods restore --list reads compressed backup manifests
#8026 5e99a63 uninstall removes only ODS's OpenCode entries
#8027 4e1e466 installer rerun keeps the last KEY= assignment
#8040 2fd4517 installer rerun keeps ROCm/oneAPI overrides
#7667 e407b73 NVIDIA detection on headless hosts without nvidia_drm
#7579 0c92b7f Windows installer rerun keeps owner .env settings

All 13 merge into main without textual conflicts.

🤖 Generated with Claude Code

IronicRayquaza and others added 30 commits October 10, 2026 01:28
#7531 made the Linux installer carry N8N_API_KEY, HF_TOKEN,
LLAMA_ARC_IMAGE and the AUDIO_TTS_* keys across its .env rewrite. On
Windows, New-ODSEnv still replaces .env with its template and reuses only
keys that template writes, so a rerun dropped them. The n8n key cannot be
shown again by n8n and has to be recreated.

Carry the same named keys from the previous .env, keeping their last
assignment line exactly as written. Key names match case-sensitively. A
key the template writes keeps the template's value.

tests/test-windows-owner-env-carry.ps1 runs the real generator twice,
checks the list matches Linux's ODS_OWNER_ENV_KEYS, and fails if the
generator starts writing a listed key. It runs in the PowerShell workflow
on Ubuntu and Windows (PowerShell 7 and Windows PowerShell).

Fixes #7578

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream added ODS_MODEL_PROFILES to the Linux owner keys (#7584). The
Windows list must match it, or the parity check in
test-windows-owner-env-carry.ps1 fails and a Windows rerun drops an
owner's ODS_MODEL_PROFILES=enabled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ods-cli changes into INSTALL_DIR before using paths the user typed, so
relative paths pointed inside the install. `ods remote-provider ...
--api-key-file ./key.txt` (and the SSH key / known_hosts files) failed with
"file not found", `ods doctor --report ./r.json` wrote silently into the
install directory, and `ods backup -o ./backups` put the backup on the same
disk it was meant to leave. Capture the caller's directory at startup and
resolve these arguments against it; absolute paths are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r tests

The doctor fresh-report harness evals cmd_doctor alone, so _caller_path
was undefined and the report path came out empty; load the helper too.
The backup arg-passing check grepped for a literal $@, which no longer
appears once -o/--output is rewritten into backup_args; check the
ods-backup.sh invocation forwards either.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ot loaded

Headless servers running the proprietary driver without nvidia-drm.ko have
no /sys/class/drm card for the GPU, so detect_gpu ignored a working
nvidia-smi and fell back to CPU. Also accept a 0x10de PCI device with a
display class (0x03xxxx, incl. 3D controller 0x0302), keeping the #917
guard against stray nvidia-smi on AMD-only hosts, and warn when nvidia-smi
lists GPUs with no NVIDIA PCI/DRM device.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dware profiler

Apply the same rule as detect_gpu() to ods-preflight.sh detect_backend()
and scripts/detect-hardware.sh detect_nvidia(): when no NVIDIA DRM card
exists (nvidia_drm not loaded), accept a 0x10de PCI device with display
class 0x03xxxx. ODS_PCI_SYS overrides the PCI sysfs root for tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#7748 added DISABLE_UPDATE_CHECK to Linux's ODS_OWNER_ENV_KEYS, so the
parity check in test-windows-owner-env-carry.ps1 failed against current
main and a Windows rerun would drop an owner's update-check opt-out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds before llama.cpp's generic NextN loader (b9014, still shipped for
CPU, AMD, Intel, Apple and native Windows) read `<arch>.nextn_predict_layers`
only for a few architectures. A Qwen3.5-format file with a NextN/MTP block
passes the architecture check, downloads, and then llama-server fails to
load it (#7914).

generate-llama-architectures.py now also reads src/llama-model.cpp at each
pinned tag and records `nextnLoader` (the generic `hparams.n_layer_nextn`):
b9014 false, b11429 true. The Hugging Face preflight gate adds an
overridable `runtime_nextn_unsupported` refusal for a chat GGUF whose header
has NextN layers on a build without that loader; the import reuses the
cached header, so it enforces the same verdict, and the Models page offers
"import anyway" for it like the other runtime refusals.
mypy's func-returns-value flags list.append inside the lambda; match the
neighbouring import tests.
- Replace misleading 'download' timeout message with 'reading the model file\'s header timed out' in hf_gguf_header.py

- Update PreflightSummary in HuggingFaceModelBrowser.jsx to instruct the user to close and reopen the list only on transient failures, and append HelpLink for Discord support

- Add unit test in test_hf_gguf_header.py for range read timeout message

- Add component tests in HuggingFacePreflight.test.jsx for transient recovery notice and permanent failure cases
_resolve_container_name listed containers with `docker ps`, which shows
only running ones. Once a service whose container is not ods-<id> exited
(Open WebUI is ods-webui), the lookup fell back to ods-open-webui: the
logs view said "Container is not running." instead of the crash output,
and Restart answered "no such container". List with -a.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 06 read the previous .env with `grep -m1`, the first KEY= line,
while Compose and every other ODS reader use the last. The generated
.env already has an empty OPENAI_API_KEY= line, so an owner who follows
the FAQ and adds their key at the end gets a working cloud route, until
the next installer rerun rewrites .env from the empty first copy and
drops theirs. A secret rotated the same way reverts to its old value.

Read the last assignment in _env_get and _env_get_preserve_empty.
The installer merges its llama-server provider into an owner's existing
~/.config/opencode/opencode.json and keeps their other providers, MCP
servers and agents. Uninstall, even with --keep-data, then deleted the
whole file whenever it mentioned llama-server, taking the owner's API
keys and settings with it. A JSONC file was deleted the same way.

Remove only what ODS added (its provider and the model, small_model and
agent models that point at it), keep the file's mode, and delete a file
only when nothing else is left. A file jq cannot parse is kept with a
notice to edit it by hand. The config.json copy the installer writes is
cleaned the same way instead of being left pointing at a removed server.
…cess-shutdown-20261021

# Conflicts:
#	ods/tests/ci-suite.txt
roshangupta00750 and others added 14 commits October 24, 2026 18:55
…started stack

ods disable hermes stops the container but leaves it in place, and a
stopped container keeps its last health status (unhealthy). A full
ods restart then found the container, waited the whole 300 s readiness
timeout, tried to recreate a service the stack no longer has
(no such service: hermes) and exited 1.

Wait for Hermes only when its Compose file is among the files the restart
used.
@Lightheartdevs

Copy link
Copy Markdown
Collaborator Author

Composed CI for the 13 PRs was green (the only red check was commit-identities, from #7990's placeholder-email commits; squash-merged). All 13 are now merged; main 7ca5882 equals this tested tree plus #8076.

@Lightheartdevs
Lightheartdevs deleted the audit/batch-20261024a branch October 24, 2026 18:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants