mirror of
https://github.com/nestriness/nestri.git
synced 2026-09-19 17:25:19 +03:00
The run used to end by asking someone to copy a line and paste it "wherever you
got this from". That is not a loop, it is a hope. At a few hundred people in one
quiet channel, with one shot and no chance to say "please run it again, we made
a mistake", the drop-off between seeing output and pasting it somewhere is
where the whole exercise dies.
So the run now ends with a link, a plain-English list of what the link
contains, and Enter to open it. No account, no form, no mail client, no
assumption about being logged into anything.
· Query parameters, not an encoded blob. A blob would be shorter and would
let us send more; it would also mean the person clicking cannot read what
they are sending, which is the one thing this program has going for it.
· It carries more than the clipboard line did, because nobody has to eyeball
it in a chat window: every requirement check individually rather than only
the aggregate verdict -- which single requirement stops people is the thing
worth knowing -- plus the full latency triple, the 24-hour launch
histogram, and the five largest titles.
· `--submit-url` points it at a local worker; `--no-open` prints only.
· The clipboard line stays as the offline path: a headless host, a machine
with no browser, or somebody who would rather not click a link we wrote.
Three corrections
1. Steam consent now defaults to yes. This is a questionnaire and the person
running it knows that; defaulting to no framed our own instrument as
something to be wary of, and the yes/no still asks.
2. The virglrenderer check is gone. It could only ever report "present,
patch state unknown" -- a row incapable of passing -- and the box now
carries its own virglrenderer and Mesa inside the image it runs in, so the
host's copies are not on the path. It was telling prospective hosts their
machine was wrong when it was not.
3. The roadmap question -- cloud, or reach my own machine from anywhere -- is
now question one, of everybody. It was going to be a channel poll, and the
channel is no longer the only way in. It is asked first because a
respondent who quits after one question should have answered that one.
Two collisions found while wiring it up: the `gpu` check id overwrote the GPU
model parameter (last-writer-wins in a query string is a silent loss), so check
ids are prefixed `ck_`; and both renderers now take the assembled report rather
than seven positional arguments that had to be kept in step by hand.
163 lines
4.1 KiB
JSON
163 lines
4.1 KiB
JSON
{
|
|
"nesdoctor": "0.1.0",
|
|
"sys": {
|
|
"os": "linux",
|
|
"arch": "x86_64",
|
|
"release": "CachyOS",
|
|
"kernel": "7.1.8-1-cachyos",
|
|
"cpu_model": "AMD Ryzen 5 7530U with Radeon Graphics",
|
|
"cpu_threads": 12,
|
|
"ram_gib": 13.496604919433594,
|
|
"gpus": [
|
|
{
|
|
"name": "AMD Barcelo",
|
|
"vendor": "AMD",
|
|
"render_node": "/dev/dri/renderD128"
|
|
}
|
|
],
|
|
"disks": [
|
|
{
|
|
"mount": "/",
|
|
"fs": "btrfs",
|
|
"source": "/dev/nvme0n1p2",
|
|
"free_gib": 90.39772033691406
|
|
},
|
|
{
|
|
"mount": "/tmp",
|
|
"fs": "tmpfs",
|
|
"source": "tmpfs",
|
|
"free_gib": 3.8342933654785156
|
|
}
|
|
],
|
|
"uptime_hours": 12.97486111111111,
|
|
"powered_hours_per_day": null,
|
|
"powered_span_days": 2.0136990167476854
|
|
},
|
|
"host": {
|
|
"checks": [
|
|
{
|
|
"id": "kvm",
|
|
"what": "/dev/kvm present and openable",
|
|
"state": "pass",
|
|
"detail": "yes",
|
|
"blocking": true
|
|
},
|
|
{
|
|
"id": "gpu",
|
|
"what": "an AMD or Intel GPU with a DRM render node",
|
|
"state": "pass",
|
|
"detail": "AMD Barcelo at /dev/dri/renderD128",
|
|
"blocking": true
|
|
},
|
|
{
|
|
"id": "vkvideo",
|
|
"what": "VK_KHR_video_encode_queue plus a codec extension",
|
|
"state": "pass",
|
|
"detail": "extensions present. Note: presence is not proof — a working extension list with a broken path has happened here before, so this row is a necessary and not a sufficient condition.",
|
|
"blocking": true
|
|
},
|
|
{
|
|
"id": "virgl",
|
|
"what": "libvirglrenderer with DRM native context, patched",
|
|
"state": "unknown",
|
|
"detail": "libvirglrenderer.so.1.11.0 found. Whether it carries the native-context patches cannot be told from outside — the contract calls this the requirement most likely to be silently wrong, so we report presence only.",
|
|
"blocking": false
|
|
},
|
|
{
|
|
"id": "content-store",
|
|
"what": "a ZFS pool for game datasets",
|
|
"state": "fail",
|
|
"detail": "no ZFS mount found. One dataset per game, cloned per player, is the whole of the content store — no other filesystem gives clones and send/recv.",
|
|
"blocking": false
|
|
},
|
|
{
|
|
"id": "box-store",
|
|
"what": "ext4 or xfs, not /, for box images (O_DIRECT)",
|
|
"state": "fail",
|
|
"detail": "none found. A box image must be openable O_DIRECT or the box has no storage bound at all — ZFS ignores the flag, and a warm page cache let a capped guest read at 13.3 GB/s against a 20 MB/s cap. Games are hundreds of GiB, so / is not an option either.",
|
|
"blocking": false
|
|
},
|
|
{
|
|
"id": "cgroup-io",
|
|
"what": "the io cgroup controller available",
|
|
"state": "pass",
|
|
"detail": "present at the root",
|
|
"blocking": false
|
|
},
|
|
{
|
|
"id": "virtiofsd",
|
|
"what": "virtiofsd, for shared directories into the guest",
|
|
"state": "pass",
|
|
"detail": "/usr/bin/virtiofsd",
|
|
"blocking": false
|
|
}
|
|
],
|
|
"could_host": true,
|
|
"unknowns": 0
|
|
},
|
|
"net": {
|
|
"idle_rtt_ms": null,
|
|
"loaded_rtt_ms": null,
|
|
"loaded_rtt_p95_ms": null,
|
|
"bloat_ms": null,
|
|
"upstream_mbps": null,
|
|
"grade": null,
|
|
"note": "skipped with --no-net"
|
|
},
|
|
"steam": {
|
|
"found": true,
|
|
"roots": [
|
|
"/home/wanjohiryan/.steam/steam",
|
|
"/home/wanjohiryan/.local/share/Steam"
|
|
],
|
|
"titles": 1,
|
|
"bytes_on_disk": 45003193272,
|
|
"largest": [
|
|
[
|
|
"Control Ultimate Edition",
|
|
45003193272
|
|
]
|
|
],
|
|
"launch_hours": [
|
|
8,
|
|
4,
|
|
2,
|
|
8,
|
|
0,
|
|
4,
|
|
0,
|
|
4,
|
|
2,
|
|
0,
|
|
0,
|
|
0,
|
|
4,
|
|
6,
|
|
2,
|
|
0,
|
|
8,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
8,
|
|
6,
|
|
0
|
|
],
|
|
"launch_samples": 74,
|
|
"peak_window": [
|
|
20,
|
|
3
|
|
]
|
|
},
|
|
"answers": {
|
|
"role": "play",
|
|
"share_for": null,
|
|
"pays_today": "1-9",
|
|
"other_linux": null,
|
|
"steam_consent": true,
|
|
"asked": 2
|
|
},
|
|
"verdict": "unknown",
|
|
"region_hint": null
|
|
} |