Skip to content
StatusQuickstartDocsArchitectureDesign Run locally
Docs / Reference / Support

SwiftOS Support Guide

This guide describes how to collect evidence, classify a problem, and report a SwiftOS issue in a way that another maintainer or operator can reproduce. It is the support companion to TROUBLESHOOTING.md and OBSERVABILITY_GUIDE.md: use Troubleshooting to diagnose a known failure, Observability to understand available signals, and this guide when you need to hand off a clear report.

SwiftOS is early product software. A useful support report should distinguish current design limits from regressions, include the exact repository revision, and attach the serial or test output that proves the failure. For choosing and reading focused gates, see TESTING_GUIDE.md.

For common product and support questions before opening a report, see FAQ.md.

Support Scope

Current supported support targets:

Area Supported evidence path
Direct QEMU boot Installation Guide profile plus ./tests/boot_test.sh
UEFI QEMU boot Installation Guide profile plus UEFI_BOOT=disk ./tests/uefi_boot_test.sh
Serial console login ./tests/console_login_test.sh
Native commands command-specific tests from COMMAND_REFERENCE.md, starting with ./tests/swift_coreutils_test.sh
Networking workflows Networking Guide profiles plus ./tests/tcp_echo_test.sh, ./tests/udp_echo_test.sh, and ./tests/httpd_test.sh
Package payload overlay make package-overlay-test
Package-store activation make package-store-test
Local package install make package-local-install-test
Signed repository install make package-repo-install-test
Static-host ports fixture make package-static-host-repo-install-test
Hosted package URL fixture make ports-hosted-url-verify-test, make package-static-host-dns-repo-install-test
Base-image A/B update store ./tests/ab_stage_test.sh, ./tests/ab_activate_test.sh, ./tests/ab_confirm_test.sh, ./tests/ab_rollback_test.sh
Kernel-image A/B ESP slots ./tests/uefi_kernel_ab_test.sh, ./tests/uefi_kstage_test.sh, ./tests/uefi_kactivate_test.sh, ./tests/uefi_kattempt_test.sh, ./tests/uefi_kconfirm_test.sh, ./tests/uefi_krollback_test.sh
LLM local and serving inference paths ./tests/llm_run_test.sh, ./tests/llm_serve_test.sh
Driver-service/device-authority smoke (-smp 4) make c5-device-authority-test or aggregate make c5-test
SMP readiness milestone-specific SMP targets from RISK_REMEDIATION_ROADMAP.md, starting with make s1-test and the aggregate S5 gate make s5-test

Current non-support targets:

  • Linux binary compatibility.
  • Docker or OCI compatibility.
  • Persistent writable root filesystem behavior.
  • Production TLS trust decisions from tlsget.
  • General x86-64, Raspberry Pi, or PC hardware boot.
  • Target-side package remove, upgrade, rollback, and version-constraint solving transactions.
  • Public hosted package channels outside the checked local fixtures.

For the full compatibility matrix, see COMPATIBILITY_GUIDE.md.

First Response Checklist

Run these commands before opening a report unless the failure prevents them:

git status --short --branch
git log -1 --oneline
make tools-check
make build

Then run the narrowest acceptance test that proves the failing path:

Failure area First test
Direct boot ./tests/boot_test.sh
Base image or VFS ./tests/vfs_disk_test.sh
Disk exec path ./tests/disk_exec_test.sh
Login ./tests/console_login_test.sh
Capability denial ./tests/cap_enforce_test.sh
Core commands ./tests/swift_coreutils_test.sh
tmpfs mutation ./tests/swift_fileops_test.sh
HTTP server ./tests/httpd_test.sh
LLM serving ./tests/llm_serve_test.sh
Package payload overlay make package-overlay-test
Package-store activation make package-store-test
Local package install make package-local-install-test
Signed repository install make package-repo-install-test
Static-host ports fixture make package-static-host-repo-install-test
Hosted package URL fixture make ports-hosted-url-verify-test, make package-static-host-dns-repo-install-test
Base-image A/B update store ./tests/ab_stage_test.sh, then ./tests/ab_rollback_test.sh if rollback is involved
Kernel-image A/B ESP slots ./tests/uefi_kernel_ab_test.sh, then ./tests/uefi_kstage_test.sh, ./tests/uefi_kactivate_test.sh, ./tests/uefi_kattempt_test.sh, ./tests/uefi_kconfirm_test.sh, or ./tests/uefi_krollback_test.sh for runtime staging, boot-state persistence, confirmation, and rollback
UEFI boot UEFI_BOOT=disk ./tests/uefi_boot_test.sh
Driver-service/device-authority smoke (-smp 4) make c5-device-authority-test or aggregate make c5-test
SMP readiness make s1-test, make s5-test, or the active milestone target

If the narrow test passes, record that too. It narrows the problem and prevents the next person from retesting the wrong layer.

Choose A Support Bundle

Pick the smallest bundle that proves the failing path. Every bundle should include git-status.txt, git-head.txt, tools-check.txt, the exact command that failed, and the first failing line.

Case Add these logs Add this proof
Build or toolchain failure support/build.txt, support/tools-check.txt make tools-check, then the failing make target
Direct boot failure support/boot-test.txt, support/serial.log when manual ./tests/boot_test.sh
UEFI boot failure support/disk-build.txt, support/uefi-boot-test.txt UEFI_BOOT=disk ./tests/uefi_boot_test.sh
Login or capability failure support/console-login-test.txt, guest id transcript ./tests/console_login_test.sh, ./tests/cap_enforce_test.sh
Filesystem or tmpfs failure support/vfs-disk-test.txt, command transcript ./tests/vfs_disk_test.sh, ./tests/swift_fileops_test.sh
Network service failure Service test output, host curl or nc output, serial readiness marker Focused network test from Networking Guide
AI serving failure support/llm-serve-test.txt, /health, /completion, /metrics output ./tests/llm_serve_test.sh
Package install or repository failure Package fixture output and /bin/pkg transcript Matching package test from Package Guide
Base-image A/B update failure Stage, activate, confirm, rollback test logs as applicable ./tests/ab_stage_test.sh, ./tests/ab_activate_test.sh, ./tests/ab_confirm_test.sh, ./tests/ab_rollback_test.sh
Kernel-slot update failure ESP build output, loader log, kernel-state context if available Matching uefi_k* test from Update And Rollback Guide
Driver-service/device-authority failure C5 test output and markers around drvsvc: make c5-device-authority-test
Documentation mismatch make docs-test output and the exact guide section git diff --check, make docs-test

Example support bundle for a networking issue:

mkdir -p support
git status --short --branch >support/git-status.txt
git log -1 --oneline >support/git-head.txt
make tools-check >support/tools-check.txt 2>&1
./tests/httpd_test.sh >support/httpd-test.txt 2>&1

If the issue was reproduced manually, add the host client output:

curl -v http://127.0.0.1:8080/ >support/curl-httpd.txt 2>&1

Minimum Report Template

Use this template for bugs, regressions, and failed validation runs.

Title:
  Short symptom, command, and area.

Revision:
  git log -1 --oneline
  git status --short --branch

Host tools:
  make tools-check

What I ran:
  exact make command, test script, or QEMU command

Expected:
  what the guide or acceptance test says should happen

Actual:
  exact failure line, exit code, panic line, timeout, or wrong output

Evidence attached:
  serial log or test output
  relevant host command output
  guest command transcript, if manual

Reproducibility:
  always / intermittent / once
  number of reruns

Local changes:
  unrelated dirty files, config overrides, environment variables, or patches

Do not summarize away the first failing line. Include the exact line and the nearby context.

Collect A Support Bundle

For a general build or boot issue, collect:

mkdir -p support
git status --short --branch >support/git-status.txt
git log -1 --oneline >support/git-head.txt
make tools-check >support/tools-check.txt 2>&1
make build >support/build.txt 2>&1
./tests/boot_test.sh >support/boot-test.txt 2>&1

If the failing path is networked, collect the specific network test too:

./tests/httpd_test.sh >support/httpd-test.txt 2>&1
./tests/llm_serve_test.sh >support/llm-serve-test.txt 2>&1

If the failing path is UEFI:

make disk base-image >support/disk-build.txt 2>&1
UEFI_BOOT=disk ./tests/uefi_boot_test.sh >support/uefi-boot-test.txt 2>&1

If the failure is intermittent, run the same narrow test three times and record all outputs separately:

for n in 1 2 3; do
  ./tests/boot_test.sh >"support/boot-test-$n.txt" 2>&1 || break
done

Do not include generated build directories unless a maintainer asks for a specific artifact. Text logs are the first-line support artifact.

Serial Log Capture

Most product evidence comes from the serial console. For a manual direct boot, capture QEMU output:

make build base-image build/virt.dtb

qemu-system-aarch64 -M virt -cpu cortex-a72 -m 256M -nographic -no-reboot \
  -global virtio-mmio.force-legacy=false \
  -device loader,file=build/virt.dtb,addr=0x4FF00000,force-raw=on \
  -drive file=build/base.img,format=raw,if=none,id=swosbase,readonly=on \
  -device virtio-blk-device,drive=swosbase \
  -kernel build/kernel.elf >support/serial.log 2>&1

Exit QEMU serial with Ctrl-A X.

For network services, include the host client output and the serial log:

curl -v http://127.0.0.1:8080/ >support/curl-httpd.txt 2>&1
curl -v http://127.0.0.1:8080/health >support/curl-llmd-health.txt 2>&1

Important Log Markers

These markers help locate the failing subsystem.

Marker Meaning
M9 OK: hardware discovered from device tree Platform discovery succeeded
M11c: read-only base mounted from disk Base filesystem mounted
M11d: exec loaded from disk User program loaded through VFS
swift-os login: Console login reached
Welcome to swift-os Authentication succeeded
httpd: listening on 8080 Static HTTP server is ready
llmd: serving on 8080 LLM HTTP server is ready
llmd: generation 2 rejected (model size/sha256 mismatch) Deliberately corrupt model generation was rejected
llmd: bundle stories15M generation 1 verified (ed25519+sha256) Signed model fallback selected generation 1
llmd: served LLM request completed and metrics were logged
C5a OK: restartable driver service recovered over IPC C5a pseudo driver service restarted and recovered
C5b OK: opaque device handle transferred and released C5b device grant moved to the service and reclaimed
C5c OK: device discovery manifest matched pseudo input Headless fallback registry metadata was discovered and matched before claiming
C5c OK: virtio-input device grant discovered and matched Focused C5c gate discovered and matched the virtio-input device grant
C5d OK: virtio input discovery metadata surfaced Focused C5d gate surfaced virtio-input discovery metadata without granting MMIO authority
C5e OK: device authority withheld until explicit handoff Focused C5e gate proved future MMIO/IRQ/DMA authority bits remain clear
pkghello: hello from package overlay Package overlay was visible and executable
LOG-EXPORT-BEGIN Kernel log serialization smoke path ran
panic Fatal kernel path; include surrounding register/log lines

When reporting a panic, include the first panic line and at least 80 lines before and after it if available.

Severity Levels

Severity Use for Examples
S0 blocker Cannot build or boot the primary QEMU path make build fails on a clean tree; boot_test cannot reach early markers
S1 critical Primary workflow regression with a narrow repro login broken; base image cannot mount; package overlay no longer executes
S2 major Shipped command or documented workflow fails llmd endpoint fails; coreutils test regresses; DNS test fails
S3 minor Documentation mismatch, confusing diagnostics, non-primary smoke typo in guide; missing troubleshooting note; framebuffer smoke instability
S4 roadmap Valid request outside current support scope Linux ABI request; persistent writable root; Docker compatibility

Use the lowest severity that still captures the user impact. If in doubt, pick S2 and include the evidence.

Known Design Limits To Mention

Avoid filing these as regressions unless the behavior changed from a documented acceptance path.

Limit Current expected behavior
Writes to /etc or /bin Fail because the base image is read-only
/tmp persistence Data is lost on reboot
guest reading files Fails because guest has spawn-only authority
user creating sockets Fails because user lacks capNet
Linux binaries Do not run
Dynamic linking Not supported
tlsget trust TLS runtime smoke only; no production certificate verification
Package remove, upgrade, rollback, version-constraint solving Not implemented; local file install and signed repository install with name-based dependencies are supported fixtures
General x86-64 boot Not supported

Area-Specific Evidence

Build And Toolchain

Attach:

make tools-check
make build

If the failure mentions newlib or busybox:

test -f sysroot/aarch64-elf/include/stdio.h
test -f build/busybox.elf

Boot And Firmware

Attach:

./tests/boot_test.sh
UEFI_BOOT=disk ./tests/uefi_boot_test.sh

For firmware issues, include:

make -n disk-run

Filesystem

Attach:

./tests/vfs_disk_test.sh
./tests/disk_exec_test.sh
./tests/swift_fileops_test.sh

Mention whether the path is in the read-only base image, /tmp, or a package overlay.

Accounts And Capabilities

Attach:

./tests/console_login_test.sh
./tests/cap_enforce_test.sh

From an interactive guest, include:

id

Networking

Attach the exact QEMU network command and the narrow test:

./tests/virtio_net_test.sh
./tests/httpd_test.sh
./tests/tcp_echo_test.sh
./tests/udp_echo_test.sh
./tests/tcp_connect_test.sh
./tests/dns_test.sh

If host ports were overridden, record the environment variable:

HTTPD_HOST_PORT=18080 ./tests/httpd_test.sh
LLMD_HOST_PORT=18081 ./tests/llm_serve_test.sh

AI Hosting

Attach:

make model
./tests/llm_run_test.sh
./tests/llm_serve_test.sh

For /bin/llmd, include:

curl -v http://127.0.0.1:8080/health
curl -v -X POST --data "Once upon a time" http://127.0.0.1:8080/completion
curl -v http://127.0.0.1:8080/metrics

Package Overlays And Stores

Attach:

make package-fixture
make package-overlay-test
make package-store-test
make package-local-install-test
make package-repo-install-test
make package-static-host-repo-install-test
make ports-hosted-url-verify-test
make package-static-host-dns-repo-install-test
make c5-device-authority-test

Mention whether the guest saw /usr/bin/pkghello, whether pkg list reported pkghello-1.0.0_1, and whether the repository flow printed pkg: catalog updated. For the static-host ports fixture, mention whether pkg install lua and pkg install zlib succeeded, whether Lua printed 42, whether the minigzip round trip printed static-host-ok, and whether the hosted-URL path used an IP literal or DNS hostname.

SMP Readiness

Attach:

make s1-test
SMP_CPUS=4 ./tests/smp_boot_test.sh

If the issue is CPU-count-specific, record the SMP_CPUS value and whether a custom SMP_DTB was used.

Redaction And Privacy

Current seeded credentials are public test credentials and may appear in logs:

Login Password
root swordfish
user swordfish
guest guest

Before sharing logs from a custom image, redact:

  • private package repository URLs;
  • non-public model prompts or generated output;
  • locally added passwords or keys;
  • host paths that should not be disclosed;
  • future package signing keys or tokens.

Do not redact the actual failure marker, command line, or revision. Those are usually required for diagnosis.

Support Handoff Checklist

Before handing the issue to another person, confirm:

  1. The report names the exact command or workflow.
  2. The current git log -1 --oneline is included.
  3. Dirty local files are listed with git status --short --branch.
  4. make tools-check output is included for build or QEMU issues.
  5. A narrow acceptance test was run, or the report explains why it could not be run.
  6. The serial log or test output includes the first failing line.
  7. The report says whether the failure repeats.
  8. Known design limits were checked against COMPATIBILITY_GUIDE.md.

Edit this page on GitHub