Cohesix root shell and cohsh — user guide
Choose your interface
Use the root shell to bring up a Queen, check its hardware and network,
and recover when a host connection is unavailable. Use cohsh on your Mac or
Linux host to inspect the Queen, retain logs, submit authorised work, upload
telemetry and run repeatable checks.
Setting up a Queen? Start with Bring up and check the Queen, then Connect cohsh and Test the connection. Already connected? Go to Do useful work.
This guide describes the current source interfaces, not a promise that an older
release implements every option. Keep the target image, host binaries and
selected generated configuration together. Check the running image’s help
and the installed binary’s --help. Historical fixture credentials are not
valid deployment credentials; see release migration.
Find what you need
| Task | Go to |
|---|---|
| Open serial, choose network settings and check startup | Queen bring-up |
| Connect directly or through an existing gateway | Connect cohsh |
| Check health without intentionally changing workloads | Connection checks |
| Inspect state, save logs or append an operator note | State and logs |
| Upload a local telemetry file | Telemetry upload |
| Start, observe and stop a Worker | Worker requests |
| Make a production Queen control request safely | Strict intents |
| Cordon, drain or resume a Queen | Lifecycle control |
| Validate and run a command batch | Scripts |
| Look up a command, option or failure | Command reference, CLI options, Troubleshooting |
| Interpret low-level Pi counters | Advanced diagnostic reference |
Know which prompt you are using
| Where you type | What it is | Example |
|---|---|---|
Your host terminal, before launching cohsh |
Bash, zsh or another host shell | "$COH_BIN/cohsh" --transport tcp ... |
Cohesix boot menu or the advanced U-Boot shell |
Pi bootloader, before Cohesix starts | Choose the network and boot option |
cohesix> |
The target’s root console, through serial or an admitted local USB keyboard | netstats |
coh> |
The host-side cohsh application |
cat /proc/lifecycle/state |
Commands below omit the prompt so they can be copied. Each procedure says where
to enter them. Bash examples run on the host, from the installation or
repository root. Shell variables such as COH_BIN are conveniences for these
examples; they do not expand inside cohsh or .coh files. Set COH_BIN and
the relevant connection variables again in each new host terminal.
Neither Cohesix console is a POSIX shell. There is no cd, sudo, package
manager, shell pipeline, command substitution or general-purpose program
launcher at cohesix> or coh>. Namespace paths are absolute. The host’s
out/operator/queen-log.txt and the Queen’s /log/queen.log are different
files on different machines.
Bring up and check the Queen
1. Prepare the target and capture serial
Start with an image built and staged for the actual target. Image construction, SD-card flashing, readback and boot identity are covered by Hardware bring-up. Do not reflash a working installation merely to change its network settings.
For a Pi, connect the serial adapter described by that hardware setup and identify its actual host device. Only one terminal or capture program may own that device. On the Mac host, this example captures a new boot:
RUN_ID="$(date -u +%Y%m%dT%H%M%SZ)"
SERIAL_DEVICE="/dev/cu.usbserial-0001" # Replace with your verified device.
EVIDENCE_DIR="$PWD/out/pi4-proof/$RUN_ID"
umask 077
mkdir -p "$EVIDENCE_DIR"
minicom -D "$SERIAL_DEVICE" -b 115200 -o \
-C "$EVIDENCE_DIR/pi4-serial.log"
Use 115200 baud, 8 data bits, no parity, one stop bit and no flow control. Start capture before powering on when retaining boot evidence. Do not open another serial client while minicom is running. Logs and packet captures can contain sensitive deployment information; review them before sharing.
For an already running QEMU Queen, use the serial console in its launcher
terminal. Host TCP normally connects to the launcher’s forwarded address and
port, rather than the guest’s internal address. The separate cohsh --transport
qemu mode is a diagnostic boot/log transport, not the normal live shell.
2. Choose the Pi’s network settings
The staged Pi image stops at the Cohesix boot menu. Its first option says whether saved settings or the selected manifest’s defaults are active.
For first setup, choose Change network settings, then Automatic (DHCP) or Manual (static IPv4) and Ethernet (wired) or Wi-Fi (wireless). Manual setup collects the address, subnet prefix length and optional gateway. Review the result, then choose Boot once without saving for a temporary check or Save settings and restart to retain it. After restart, select the boot option with the saved settings.
The default image uses USB keyboard input for the boot menu. A visible menu
on serial does not mean serial keystrokes are its selected input. Wi-Fi name
and password entry requires the local USB keyboard and HDMI display; the
bootloader deliberately refuses serial-only password entry. Do not type a PSK
into minicom, a captured command or shell history. When local input is
unavailable, follow the private cohesix.env editing procedure in
First-boot network policy.
Network choices do not provision console tokens or ticket signing keys. Those must match the selected image’s deployment configuration. Do not reset saved settings as a first response to an authentication error.
3. Check the root console
Wait for cohesix>. On the target serial console, enter these commands
one at a time, waiting for each response to finish before sending the next:
help
ping
bi
caps
mem
smp
netstats
| Check | What to look for | What it does not establish |
|---|---|---|
help, ping |
A complete response and a responsive console | USB keyboard or TCP readiness |
bi |
BootInfo and generated-profile identity appropriate to this image | Media readback or another boot’s identity |
caps, mem |
Bounded capability and memory summaries, without a reported fault | A stress-test pass |
smp |
Userspace activity and assigned runtime/driver observations | Kernel CPU utilisation or performance acceptance |
netstats |
The selected active driver, address/listener state and current counters | Successful host authentication |
Record the actual address and port reported for this boot. The examples
below use 192.168.10.50:31337; change them to match your Queen. In Wi-Fi mode,
profile_backend=bcmgenet-v5 with active_driver=cyw43 is not by itself a
mismatch: one describes the profile and the other the selected physical path.
netstats is diagnostic, not a non-interfering performance sampler. The Pi
direct-GENET implementation can perform a bounded causal owner refresh. Do not
mix repeated diagnostic commands into a timed benchmark.
While an authenticated TCP response owns the output stream, a competing
physical help, netstats or namespace read may return
reason=busy detail=network-response-pending. Wait for that response to finish
before retrying the refused read. A physical ping remains available: its
PONG, terminal and prompt complete independently of the TCP stream’s END.
Neither surface’s response may leave the other, or queued HDMI output,
permanently waiting for progress it prevents.
A serial prompt does not prove the local USB/HDMI seat is ready. The Pi HDMI
prompt is withheld until keyboard command admission and display readiness are
established. For a local-seat check, type a real command on the USB keyboard
and confirm its echo and response. Use usb status from serial to inspect the
result; startup history alone is not current input proof.
4. Escalate only the relevant diagnostic
| Symptom | Commands at cohesix> |
Interpretation |
|---|---|---|
| Keyboard or display not ready | usb status, then usb diag |
Separate USB input progress from HDMI completion; inspect the reported blocker. |
| Wi-Fi did not become usable | wifi diag, then wifi dump-state |
Start with the first failing gate. Later not-reached gates are not independent failures. |
| Runtime assignment or scheduling looks wrong | caps mcs, smp mcs |
Distinguish generated assignments, kernel facts and copied runtime observations. |
| A TCP session stalls | netstats, smp poll-time on a supported Pi image |
Retain its generation/connection before a new connection replaces the snapshot. |
| Need recent cache operations | cachelog 9 |
A bounded diagnostic snapshot, not a health verdict. |
These are profile-gated commands. usb enable-kbd and usb probe-kbd are
active operations, not passive inspection. Legacy wifi retry,
wifi load-fw and wifi probe-ht return an ownership refusal on the linked
runtime; they are not recovery procedures. Use the reported blocker and
Failure modes, rather than repeatedly issuing them.
Connect cohsh
Select the matching host binary
From an extracted Mac or Linux host bundle root:
./scripts/setup_environment.sh --check
export COH_BIN="$PWD/bin"
"$COH_BIN/cohsh" --help
For a new installation, run ./scripts/setup_environment.sh first as described
in Quickstart; it can install host dependencies. A Pi image
bundle alone does not provide your Mac’s host executables.
From an already built source checkout root, use this instead:
export COH_BIN="$PWD/out/cohesix/host-tools"
"$COH_BIN/cohsh" --help
Source developers can substitute cargo run -p cohsh -- for
"$COH_BIN/cohsh". That builds the current Cargo feature selection; it does not
make an old target match a new host binary. Use the selected generated policy,
and remain in the installation root so relative configuration and local file
paths resolve correctly.
Direct TCP: one shell owns the connection
Use this when operating the Queen with one host process. Quit a direct SwarmUI, bridge, mount or other shell first. Do not leave a gateway connected while starting a competing direct client. Serial remains an independent operator surface and can stay open.
Obtain the console credential provisioned for this image. In host Bash, select its existing private file and the address verified above:
export COH_AUTH_TOKEN_REF="file:$HOME/.config/cohesix/queen-console.token"
export COH_TARGET_HOST="192.168.10.50"
export COH_TARGET_PORT="31337"
unset COHSH_TCP_HOST COHSH_TCP_PORT
"$COH_BIN/cohsh" --transport tcp \
--tcp-host "$COH_TARGET_HOST" --tcp-port "$COH_TARGET_PORT" \
--role queen
The credential file must already contain the deployment token; setting its
path does not create or discover a token. Restrict access to the file. An
env:NAME reference is also supported. Do not substitute a published fixture,
bootstrap or changeme.
For a local QEMU instance, set COH_TARGET_HOST=127.0.0.1 and use its forwarded
port. The explicit unset avoids inherited COHSH_TCP_* overrides; see
Credential and environment precedence.
A successful start reports an attached Queen session and displays coh>.
Interactive auto-attachment also attempts a bounded Queen log tail. The prompt
alone is not proof of attachment: a failed connection can leave a detached
shell. Run ping to confirm.
Without --role, the shell starts detached. At coh>, use attach queen.
To change attachment, use detach, then attach <role> [ticket]. detach
closes the current transport session but keeps the shell open; quit exits.
Worker attachments require a valid role-matching ticket with a subject.
REST: use the gateway that already owns TCP
For simultaneous shell, UI and automation work, start one hive-gateway using
Host tools: connect and verify. Select its
Pi or QEMU runtime profile correctly. The gateway, not cohsh, owns the
Queen’s TCP connection.
In another host terminal, set COH_BIN again and connect:
export COH_REST_URL="http://127.0.0.1:8080"
"$COH_BIN/cohsh" --transport rest --rest-url "$COH_REST_URL" --role queen
Read operations inherit the gateway’s upstream scope. REST writes additionally need both the gateway request-authentication token and a delegated caller ticket. Load their values privately before starting a write-capable shell:
: "${COH_REST_AUTH_TOKEN:?load the gateway request-authentication token}"
: "${COH_REST_TICKET:?load a valid delegated caller ticket}"
export COH_REST_AUTH_TOKEN COH_REST_TICKET
"$COH_BIN/cohsh" --transport rest --rest-url "$COH_REST_URL" --role queen
The ticket needs an unexpired lifetime, subject and write scope covering the
actual destination. Permission to write /log does not permit a production
intent at /queen/intents/ctl. The gateway verifies the caller ticket and
intersects it with its upstream authority; --role queen does not grant
unrestricted access. The current REST attachment selector accepts only Queen.
Keep gateway HTTP on loopback or behind an approved authenticated tunnel/TLS
boundary. Neither this console transport nor the gateway supplies TLS itself.
On a Jetson, 127.0.0.1 refers to that Jetson, not your Mac.
Test the connection
Start with a small read-only check
At coh>, run:
ping
ls /
ls /proc
cat /proc/lifecycle/state
cat /proc/authority
tail /log/queen.log 16
Confirm that every operation completes, the namespace is readable under the
intended role, and the lifecycle and authority fields match your deployment.
Read the returned state; an OK CAT acknowledgement does not mean the value
was ONLINE. A policy refusal is different from an unavailable transport.
If an optional path is absent, inspect the selected profile and source version rather than treating it as an empty value. Do not continue into mutation tests until attachment, lifecycle and policy are understood.
Run and finish the network self-test
Use direct TCP cohsh for the authenticated network exercise. At coh>:
nettest
Record the positive run_generation from
OK NETTEST detail=started run_generation=.... That line means started, not
passed. Keep the same connection open, allow the bounded 15-second test window
to finish, exercise it with ping, then read netstats:
ping
netstats
Require a terminal verdict for that same run generation, with
running=false. pass and peer-assisted-pass identify different supported
test paths; read their component fields. running, none, a failed verdict
or a different run is not a pass. With an isolated console-network child,
peer-assisted success depends on post-admission response drain, TX and later
RX/TCP progress for the matching authenticated connection. Its UDP echo field
can truthfully be false. ICMP reachability is a separate check.
Do not translate this wait into WAIT 15000 in a .coh file: its local wait
limit is 2000 ms. A serial-only nettest admission cannot substitute for the
required authenticated peer interaction.
Run the installed self-tests deliberately
First inspect what this image publishes at coh>:
ls /proc/tests
cat /proc/tests/selftest_negative.coh
cat /proc/tests/selftest_quick.coh
Then run the reduced-mutation quick check:
test --mode quick --no-mutate
--no-mutate is not a universal read-only sandbox. It skips spawn, kill
and Worker telemetry tails in the installed scripts, plus their associated
assertions. It still runs negative tests, including attempted writes that are
expected to be refused. Review installed scripts before using this mode on a
working deployment. Use the earlier explicit read-only commands when even
attempted writes are inappropriate.
| Mode | Selected script, after selftest_negative.coh |
Use |
|---|---|---|
quick (default) |
/proc/tests/selftest_quick.coh |
Small installed regression sequence |
full |
/proc/tests/selftest_full.coh |
Broader sequence; inspect mutations first |
smp |
/proc/tests/selftest_smp.coh |
Installed SMP-specific checks |
For an authorised test environment, examples are test --mode full --timeout
120 and test --mode smp --no-mutate. The default timeout is 30 seconds;
accepted values are 1–120 seconds. A timeout is a failed check, not a reason to
raise every retry setting.
Human output reports selftest PASS or selftest FAIL and the first failed
check. --json emits a single-line report object with ok, mode,
elapsed_ms, checks and schema version. Other shell output can surround
that JSON line; do not treat the whole stdout stream as one JSON document.
Automation must require ok=true and a successful script exit.
Internal scripts may close their session. cohsh attempts to restore the
previous attachment afterwards, preserving outer script response bookkeeping;
a failed restoration is reported. Verify attachment before continuing work.
These are operational checks, not release acceptance. A QEMU result does not qualify a physical Pi, and mock success qualifies neither. For milestone or release claims use the staged, provenance-bound Test plan.
Do useful work
Inspect state and save logs
At coh>, browse before assuming a path or object exists:
ls /queen
ls /shard
cat /proc/lifecycle/state
cat /proc/authority
log
tail /log/queen.log 16
cat /log/queen.log
log is a convenience for the newest 64 retained Queen log records.
tail <path> [lines] returns a finite snapshot, not tail -f; explicit
counts are 1–256. Reissue a bounded tail when needed. cat /log/queen.log
also includes the retained trusted boot-audit reserve in sequence order.
Neither operation promises logs that have already been evicted.
To save the retained log, create a directory in host Bash before starting the shell:
mkdir -p out/operator
Then, at coh>:
log dump out/operator/queen-log.txt
This creates a local .txt file, containing log payload rather than wire
OK/END framing. The parent directory must exist, and an existing destination
is refused. Use a new filename for each capture. log dump
out/operator/queen-log.txt --force explicitly replaces an existing capture.
A failed or incomplete target read is not a complete log export.
Append an operator note
This intentionally changes the Queen log. Use a Queen attachment with the
necessary write authority; through REST, also supply a ticket scoped to /log.
At coh>:
echo operator-check: serial-and-host-readback-complete > /log/queen.log
tail /log/queen.log 4
Confirm the note is present in returned data. The > is cohsh command syntax,
not host redirection, and the operation appends rather than truncates.
One outer pair of quotes may surround the text, but this is not shell quoting:
there is no variable expansion, and a literal > inside the payload is not
supported by this parser. Newline, carriage return and NUL payloads are refused.
The equivalent serial-console write is path-first:
echo /log/queen.log operator-check: serial-note
It remains subject to the physical console’s role and write policy. Do not
paste the cohsh spelling into serial or the serial spelling into cohsh.
Upload a telemetry file
Use this to retain a bounded host observation under a device identifier, not to copy arbitrary files into a general-purpose target filesystem. In host Bash, create a small example file (explicitly labelled as an operator observation):
mkdir -p out/operator
printf '%s\n' '{"source":"operator","event":"connectivity-check-complete"}' \
> out/operator/queen-check.ndjson
At coh>, using authorised telemetry write access:
telemetry push out/operator/queen-check.ndjson --device operator-check
ls /queen/telemetry/operator-check/seg
The acknowledgement reports seg_id, record count, encoded bytes, original
source bytes and mode=inline|reference. Read the segment named in that
acknowledgement. For example, only when the returned ID is seg-000001:
cat /queen/telemetry/operator-check/seg/seg-000001
The source must be non-empty. Supported extensions are .txt and .log
(text/plain), .json (application/json), .ndjson
(application/x-ndjson) and .csv (text/csv). Local paths in these commands
must not contain whitespace; cohsh is not a general shell argument parser.
Small, bounded UTF-8 content uses inline cohsh-telemetry-push/v1 records.
Binary input or content exceeding the inline envelope budget uses
coh-ref-c/v1 chunk references. Reference mode uploads offsets, lengths and
hashes, not the referenced file bytes. Retain the unchanged source file under
your content-retention policy. The generated limits also cap reference size,
entry count and per-device retention; repeated uploads can evict older segments.
Submit and observe Worker requests
A Worker request manages a declared Cohesix control-plane task. It does not install Linux, launch an arbitrary application or execute CUDA inside the Queen. GPU discovery, actual GPU programs and PEFT tooling remain host-side; follow Host tools for those workflows.
First inspect /proc/authority and /proc/lifecycle/state. The convenience
commands below write compatibility /queen/ctl. They do not automatically
construct a strict intent. Production profiles that disable the compatibility
path require the next procedure instead.
In a compatibility-enabled test deployment, at coh>:
spawn heartbeat ticks=100 ttl_s=120 ops=500
ls /shard
Read the returned control outcome and discover the published Worker through
its shard directory. Do not assume the next Worker has a particular ID.
For a concrete illustration, when the selected eight-bit shard layout publishes
worker-1, its canonical shard is 13:
ls /shard/13/worker
cat /shard/13/worker/worker-1/telemetry
Substitute the actual published label and ID in your session. The canonical
shape is /shard/<label>/worker/<id>/telemetry. /worker/<id>/telemetry is only
a compatibility alias when the selected manifest enables it.
An accepted control append is admission, not READY. Inspect the structured Worker observation and keep these axes separate:
| Field | What it establishes |
|---|---|
| Declaration | Whether that role is executable or model-only in the selected profile |
| Lifecycle | queued, starting, ready, closing, faulted, terminal or absence |
| Artifact | Whether the declared artifact is missing, verified or mismatched |
| Receipt | Whether a runtime receipt is pending, confirmed, rejected, stale or absent |
| Execution proof | none, host-model, qemu or fresh-pi; not interchangeable |
Once the specific test Worker has been identified, kill worker-1 submits its
termination request in a compatibility deployment. Replace that ID; never kill
a guessed Worker. Observe its subsequent state or removal. Termination admission
is not proof that teardown has finished.
Other accepted convenience forms are:
spawn gpu gpu_id=GPU-0 mem_mb=4096 streams=2 ttl_s=120 priority=1 budget_ttl_s=180 budget_ops=500
spawn lora
GPU-0 is illustrative: use a GPU identifier actually published for the
selected deployment and a resource request its policy permits. These commands
are not evidence that a GPU exists or that training has run.
| Role selectors | Required key=value arguments |
Optional arguments |
|---|---|---|
heartbeat, worker, worker-heartbeat |
ticks |
ttl_s, ops |
gpu, worker-gpu |
gpu_id, mem_mb, streams, ttl_s |
priority, budget_ttl_s, budget_ops |
lora, worker-lora |
None | None |
Unknown or duplicate keys are rejected. spawn bus and spawn worker-bus
return a model-only refusal without a control write. Role availability and
capacity remain generated-profile decisions.
ls /shard is a bounded view of up to 64 active shard labels, not a complete
large-fleet index. Complete discovery enumerates the generated shard address
space and reads each shard’s Worker directory, as SwarmUI and the benchmark
harness do. Empty shards do not imply failed discovery; a failed read or
malformed/misplaced Worker record does.
Submit a production Queen intent
Use /queen/intents/ctl when strict intents are required. An envelope contains
schema, id, idempotency_key, issued_unix_ms, the selected writer_epoch
and cmd as a JSON string containing the existing command object. A nested
JSON object in cmd is not the same format.
Before proceeding, confirm the selected epoch with cat /proc/authority,
confirm that a new heartbeat Worker is appropriate, and obtain write authority
for /queen/intents/ctl. This procedure deliberately creates one request. It
does not bypass lifecycle, policy approval, ticket or capacity checks.
In host Bash, enter the verified epoch and create a saved command file once. Python supplies the current issue time and new identifiers; exclusive file creation prevents accidentally replacing a request whose outcome is unknown:
mkdir -p out/operator
umask 077
read -r -p 'Writer epoch reported by this Queen: ' COH_WRITER_EPOCH
export COH_WRITER_EPOCH
python3 - <<'PY'
import json
import os
from pathlib import Path
import time
import uuid
raw_epoch = os.environ['COH_WRITER_EPOCH']
if not raw_epoch.isascii() or not raw_epoch.isdecimal():
raise SystemExit('Writer epoch must be the unsigned integer read from /proc/authority')
epoch = int(raw_epoch)
if not 0 <= epoch <= (1 << 64) - 1:
raise SystemExit('Writer epoch is outside the unsigned 64-bit range')
intent = {
'schema': 'queen-intent/v1',
'id': 'heartbeat-' + uuid.uuid4().hex,
'idempotency_key': uuid.uuid4().hex,
'issued_unix_ms': time.time_ns() // 1_000_000,
'writer_epoch': epoch,
'cmd': json.dumps({'spawn': 'heartbeat', 'ticks': 100}, separators=(',', ':')),
}
payload = json.dumps(intent, separators=(',', ':'))
if len(payload.encode('utf-8')) > 2048:
raise SystemExit('Intent exceeds the console echo payload bound')
path = Path('out/operator/spawn-heartbeat.coh')
with path.open('x', encoding='utf-8') as stream:
stream.write('# Author: Lukas Bower\n')
stream.write('# Copyright 2026 Lukas Bower\n')
stream.write('# SPDX-License-Identifier: Apache-2.0\n')
stream.write('# Purpose: Submit one retained, explicitly identified heartbeat request.\n')
stream.write('echo ' + payload + ' > /queen/intents/ctl\nEXPECT OK\nquit\n')
print('Created', path, 'with intent id', intent['id'])
PY
"$COH_BIN/cohsh" --check out/operator/spawn-heartbeat.coh
Inspect the saved file locally. Then, with the direct interactive client closed and the correct console credential still selected, execute it from host Bash:
"$COH_BIN/cohsh" --transport tcp \
--tcp-host "$COH_TARGET_HOST" --tcp-port "$COH_TARGET_PORT" \
--role queen --script out/operator/spawn-heartbeat.coh
For an existing gateway, use --transport rest --rest-url "$COH_REST_URL"
instead of the TCP options, with the request-auth token and appropriately
scoped delegated ticket loaded. Do not run both alternatives.
After successful submission, reconnect and inspect /proc/queen/dedupe, the
Queen log and the actual Worker observation. The dedupe view is bounded; an
entry missing from its recent list is not proof that no effect occurred.
An interrupted write has an unknown outcome, not an automatic failure. Reconcile the retained outcome before retrying. An authorised strict retry must reuse the exact saved request, including both identifiers, issue time, epoch and command bytes. Do not rerun the generator to manufacture a new identity. Exact duplicates return the retained outcome; changed fields under the same identity produce an idempotency conflict. Dedupe capacity is bounded, and its authority lifetime does not survive a VM restart as a durable promise. Do not reboot to clear it and resubmit. Full details are in M27a authority.
The same envelope mechanism can carry an existing kill, bind or mount
Queen command object. It is not a universal wrapper for every control file:
use each namespace’s own documented payload contract.
Control the Queen lifecycle
These commands change node state and can affect ongoing work. First read the
state at coh>:
cat /proc/lifecycle/state
For a Queen currently ONLINE or DEGRADED, an authorised maintenance sequence
begins:
lifecycle cordon
cat /proc/lifecycle/state
Only after confirming DRAINING, request lifecycle drain and inspect the
state again. Resume only when maintenance and workload policy permit it:
lifecycle resume, followed by another state read. Do not paste all transitions
blindly into a live fleet.
| Command | Client-side state check | Important distinction |
|---|---|---|
lifecycle cordon |
ONLINE or DEGRADED |
Maintenance admission control, not a hardware shutdown |
lifecycle drain |
DRAINING |
State and workload progress still need observation |
lifecycle resume |
Not already ONLINE |
Server policy can still refuse |
lifecycle quiesce |
ONLINE, DEGRADED or DRAINING |
A lifecycle transition, not a platform reboot |
lifecycle reset |
Not already BOOTING |
Resets lifecycle state; does not reboot the Pi |
cohsh writes the lifecycle control namespace, not a shell command on the host.
The server remains authoritative for every transition. Use reboot only for an
intentional platform restart, with Queen authority and a supported backend,
after retaining evidence and considering work in progress.
.coh scripts
A .coh file is a deterministic sequence of cohsh commands and assertions.
It has no variables, substitutions, branching, loops, includes, macros or
runtime downloads. One command per line; blank lines are ignored. # begins
a comment, including inline comments, so do not put a literal # in a payload
that must survive script parsing. Use host tooling to prepare concrete files.
Create, check and run a health script
In host Bash:
mkdir -p out/operator
cat > out/operator/health.coh <<'COH'
# Author: Lukas Bower
# Copyright 2026 Lukas Bower
# SPDX-License-Identifier: Apache-2.0
# Purpose: Check attachment and read bounded Queen state without workload writes.
ping
EXPECT OK
ls /proc
EXPECT OK
cat /proc/lifecycle/state
EXPECT OK
cat /proc/authority
EXPECT OK
tail /log/queen.log 16
EXPECT OK
quit
COH
"$COH_BIN/cohsh" --check out/operator/health.coh
--check reads local policy and validates script structure without connecting
to a target. It does not prove that a path exists, credentials are valid,
commands are authorised or the target will accept a payload.
Close any direct interactive owner, then run the file in host Bash:
"$COH_BIN/cohsh" --transport tcp \
--tcp-host "$COH_TARGET_HOST" --tcp-port "$COH_TARGET_PORT" \
--role queen --script out/operator/health.coh
Retain a transcript without losing the command’s failure status:
set -o pipefail
"$COH_BIN/cohsh" --transport tcp \
--tcp-host "$COH_TARGET_HOST" --tcp-port "$COH_TARGET_PORT" \
--role queen --script out/operator/health.coh \
2>&1 | tee out/operator/health-transcript.txt
This pipeline is host Bash, not .coh syntax. Choose a new transcript
filename when preserving an earlier run. A script stops on an unexpected
command, transport or assertion failure and exits non-zero. Failure details
include the source line, last command, response source and bounded history.
Use the right assertion
| Statement | Meaning |
|---|---|
EXPECT OK |
Recorded response begins with OK |
EXPECT ERR |
Recorded response begins with ERR |
EXPECT SUBSTR <text> |
Case-sensitive substring in the recorded response |
EXPECT NOT <text> |
Case-sensitive substring absent from the recorded response |
WAIT <ms> |
Local delay of at most 2000 ms; no target command |
WAIT <ms> TAIL <path> SUBSTR <text> |
Poll completed authenticated tail data for a substring, for at most the bounded polling interval |
The recorded response normally prefers a transport acknowledgement over later
payload output. Therefore cat /proc/lifecycle/state followed by EXPECT OK
checks that the read succeeded; it does not assert state=ONLINE.
To assert returned data, use the read-condition form. For a deployment expected
to be online, this is a .coh fragment:
WAIT 2000 TAIL /proc/lifecycle/state SUBSTR state=ONLINE
EXPECT OK
After asynchronous Worker admission, wait on the existing /log/queen.log path
for that Worker’s WORKER_TASK_READY record before reading its sharded telemetry
path. The Worker path can return invalid-path before construction, and a
refusal stops the wait immediately. The condition is checked against completed
data, not merely an ACK; the wait never repeats a mutation. Each read retains
its own transport response timeout, so 2000 ms is not an override of network
timeouts. The synchronous host model emits the same role marker with
mode=host-model after creating its Worker namespace; that marker is mock
readiness, not target Worker evidence.
A deliberate negative test may place EXPECT ERR immediately after the command
whose refusal is expected. Do not use it to hide an unexpected production write
failure. Scripts contain at most 256 non-empty statements. Generated scripts,
such as boot_v0.coh, must be regenerated rather
than edited manually.
Automate a self-test
In a test environment where the installed negative checks are appropriate,
create a file whose command is test --mode quick --no-mutate --json and run
it with --script and an explicit attached role, just like health.coh.
Inspect the report’s ok field as well as process exit status. In interactive
mode a printed failure report does not by itself make the eventual shell exit
status a failed test run. Prefer --script for automation.
Retain a live trace or rehearse offline
To record the read-only health script against the live target, close another direct owner and run in host Bash:
"$COH_BIN/cohsh" --transport tcp \
--tcp-host "$COH_TARGET_HOST" --tcp-port "$COH_TARGET_PORT" \
--role queen --script out/operator/health.coh \
--record-trace out/operator/health.trace
Live recording supports TCP and REST. Add --trace-target-id,
--trace-session-id, --trace-manifest-sha256 and --trace-image-sha256 only
with values known for the captured target; unspecified identity remains
unknown, not inferred proof. Captures are bounded by generated size and duration
limits. Incomplete capture is an error, not a complete trace.
Replay that live capture offline, without reconnecting to the Queen:
"$COH_BIN/cohsh" --replay-trace out/operator/health.trace
For an isolated in-process rehearsal instead:
"$COH_BIN/cohsh" --transport mock --role queen
Mock state exists only in that cohsh process. A separate mock tool or a later
process does not see its Workers or notes. Legacy fixture replay and mock GPU
seeding also depend on compiled features. Neither replay nor mock is fresh
hardware evidence. See Operator evidence for capture,
inspection, attestation and evidence-pack contracts.
Command reference
Use help for a concise index and man <command> for the complete installed
manual, including all arguments, examples, limits, authority and recovery.
man ls includes the namespace tree; man spawn explains each Worker role,
resource argument and readiness check; man authority gives the production
strict-intent procedure. man lists all topics. login resolves to attach.
From the host terminal, cohsh --man spawn works without credentials,
configuration or a running Queen. cohsh --man lists topics, and
cohsh --man spawn | less uses the host’s pager. At coh>, type man spawn.
Unknown topics and extra arguments are errors and send no target request.
SwarmUI reads the same manuals; its own help describes its smaller command
surface and gates, including its raw-JSON spawn syntax. The physical root
console provides concise help; detailed manuals run on the host.
Root console
Run help on the active image for profile availability. These commands are
entered at cohesix>, not in host Bash.
| Command | Action and boundary |
|---|---|
help |
Active image’s console inventory |
ping |
Root-console liveness |
bi |
BootInfo summary and source-labelled [bi:v2] records |
caps, caps mcs |
Capability summary or bounded MCS authority/object counts |
mem |
RAM/device untyped-memory summary |
smp, smp activity |
Equivalent bounded userspace activity reports |
smp mcs |
Generated and live MCS topology, plus supported retained Pi diagnostics |
smp poll-time |
Pi root elapsed-time, Yield and receive observations; unsupported elsewhere |
smp dump |
Debug-only raw kernel scheduler dump; unavailable after linked-UART cutover |
cachelog [n] |
Bounded recent cache-operation snapshot |
nettest, netstats |
Network-test admission and separately observed terminal result/state |
attach <role> [ticket] |
Select an authorised role for namespace operations |
ls <path>, cat <path>, tail <path> [lines] |
Bounded namespace operations, subject to role/profile |
log |
Retained Queen log tail |
echo <path> <payload> |
Path-first append, subject to write policy |
spawn <payload>, kill <worker> |
Raw compatibility shortcuts; production refuses these |
reboot |
Queen-authorised platform restart when a backend is available |
quit |
Event-pump session termination; early bootstrap reports unsupported |
Root test directs you to host cohsh; it is not the host self-test runner.
Pi-only usb and wifi families are described in the bring-up and advanced
sections. Arbitrary-memory hexdump is disabled in production/release policy;
a separately enabled debug profile permits only bounded immutable root-code
inspection. It is not a normal operator command.
cohsh interactive commands
Enter these at coh> or as command lines in a .coh file. Support of a
forwarded diagnostic still depends on the selected transport and target.
| Command | Purpose |
|---|---|
man [command] |
Complete local manual or topic index; also cohsh --man [command] before connecting |
help |
Local shell inventory; not the target’s raw HELP response |
attach <role> [ticket], login ... |
Attach; roles are Queen, worker-heartbeat (alias worker), worker-gpu, worker-bus, worker-lora |
detach, quit |
Close attachment and stay in the shell, or close and exit |
ping |
Check the active attachment |
bi, caps [mcs], smp [activity\|mcs\|poll-time\|dump] |
Forward supported root diagnostics |
ls <path>, cat <path> |
List or read one absolute namespace path |
tail <path> [lines], log |
Finite bounded tail; not a background follower |
log dump <file.txt> [--force] |
Save Queen log payload on the host |
echo <text> > <path> |
Append a single line; not filesystem truncation |
spawn <role> <key=value>..., kill <id> |
Compatibility Queen requests; no automatic strict envelope |
bind <src> <dst>, mount <service> <path> |
Compatibility namespace-control requests through /queen/ctl; not host mount commands |
lifecycle <cordon\|drain\|resume\|quiesce\|reset> |
Validated lifecycle control request |
telemetry push <src> --device <id> |
Upload local telemetry content or reference records |
test [--mode quick\|full\|smp] [--json] [--timeout <s>] [--no-mutate] |
Installed self-test runner |
nettest, netstats, reboot |
Supported console operations; reboot requires Queen authority |
tcp-diag [port] |
TCP connection diagnostics, not authentication proof |
pool bench <options> |
Mutating host session-pool benchmark; use the benchmark workflow, not as a first health check |
Durable CUDA recipe composition is available through the external coh
plan/apply/watch/explain/verify/recover commands with --recipe; see
Recoverable CUDA recipes. The shared
cohsh/SwarmUI manuals explain this host-only boundary. These options do not
change root-console or .coh grammar.
mem, cachelog, usb, wifi and hexdump are not dispatched by the current
host cohsh command handler. Use the physical root console for them, even
though some appear in the compiler-generated shared grammar below. Shared
parser vocabulary and host CLI implementation are not identical inventories.
The qemu transport launches staged artifacts and rejects writes; use TCP or
REST for actual namespace work. REST is a bounded gateway projection, not an
arbitrary raw-console relay. A locally listed diagnostic can be unsupported
by that transport; use direct TCP when it is free, or serial, rather than
assuming a locally displayed help item guarantees a REST operation.
Input limits
The shared console currently bounds a complete command line to 2304 bytes, an
absolute path to 96 bytes, a ticket to 224 bytes and an echo payload to 2048
bytes. Raw console spawn JSON has a separate 192-byte bound; this is not the
strict-intent envelope limit. Namespace walks are bounded to eight components,
and selected namespace/profile policy can impose smaller limits. Keep payloads
on one line and allow for the newline appended by cohsh.
A general msize=8192 transport budget does not enlarge the console’s smaller
path, line or payload bounds. Split work using the owning interface’s supported
segmentation, not invented continuation syntax.
Response and session rules
Target acknowledgements use OK <VERB> and typed ERR <VERB> details.
The acknowledgement is emitted before any payload. Bounded refusal and
truncation records use reason=<busy|quota|cut|policy> where applicable;
inspect that reason before selecting recovery or retry behavior.
Streaming LS, CAT and TAIL responses complete with END. cohsh handles
the transport framing and labels acknowledgements [console]; it also prints
local status and payload lines. Do not send a plain terminal/netcat session to
the framed TCP endpoint and expect serial behaviour.
A refusal normally has no side effect unless its owning interface says otherwise. An absent response is not a refusal. Batches containing writes are not replayable merely because a connection failed part-way through them. Retry/backoff policy never grants authority to duplicate an uncertain mutation.
TCP quit is complete only after exact OK QUIT, client write-half close and
peer EOF on that same connection. Missing ACK, extra post-terminal frames,
timeout or missing EOF fails script mode; QUIT is not retried on a replacement
connection. Do not interpret the host process disappearing as proof of a clean
remote close.
CLI options and credentials
Use cohsh --help for compiled options. Most sessions need only transport,
endpoint, role and a privately supplied credential.
| Option group | Options |
|---|---|
| Connection | --transport tcp\|rest\|mock\|qemu, --tcp-host, --tcp-port, --rest-url |
| Attachment | --role, --ticket |
| Authentication | --auth-token, --rest-auth-token; prefer private environment/reference sources to literal secrets in arguments |
| Automation | --script FILE, --check FILE (mutually exclusive) |
| Diagnostics | -v / --verbose, --tcp-debug |
| Selected policy | --policy FILE |
| Response/retry policy | --retry-max-attempts, --retry-backoff-ms, --retry-ceiling-ms, --retry-timeout-ms, --rest-response-timeout-ms |
| Pool/heartbeat policy | --pool-control-sessions, --pool-telemetry-sessions, --heartbeat-interval-ms |
| Trace | --record-trace FILE, --replay-trace FILE, optional capture identity/hash fields |
| Diagnostic QEMU boot | --qemu-bin, --qemu-out-dir, --qemu-gic-version, repeated --qemu-arg |
| Mock GPU namespace | --mock-seed-gpu when the required features are compiled |
| Ticket issuer tooling | --mint-ticket, --ticket-subject, --ticket-config, --ticket-secret, --ticket-write-scope, --ticket-ttl-s, --ticket-ops |
Ticket minting is an issuer operation requiring the correct signing material;
it is not how an ordinary user bypasses missing access. It requires --role
and conflicts with an input ticket, script/check and trace modes. Worker
subjects are required; delegated write tickets additionally need a subject,
scope and bounded lifetime. Follow Authority and
Host tools authentication.
Credential and environment precedence
| Setting | Resolution order or implementation caveat |
|---|---|
| TCP credential | --auth-token, then COH_AUTH_TOKEN_REF, COH_AUTH_TOKEN, COHSH_AUTH_TOKEN |
| TCP host | COHSH_TCP_HOST replaces a parsed host equal to 127.0.0.1, including that explicitly supplied value |
| TCP port | A valid numeric COHSH_TCP_PORT overrides the parsed port, including an explicit flag |
| REST URL | --rest-url, COHSH_REST_URL, COH_REST_URL, HIVE_GATEWAY_URL |
| REST request token | --rest-auth-token, COHSH_REST_AUTH_TOKEN, COH_REST_AUTH_TOKEN, HIVE_GATEWAY_REQUEST_AUTH_TOKEN |
| REST caller ticket | Explicit attachment ticket or COH_REST_TICKET; reattachment replaces the binding |
| Policy file | --policy, COHSH_POLICY, installation default |
| Ticket signing source | --ticket-secret, COHSH_TICKET_SECRET, then selected ticket config |
| Ticket config | --ticket-config, COHSH_TICKET_CONFIG, configs/root_task.toml |
TCP credential references are exactly env:NAME or file:/absolute/path.
A selected reference that cannot be read or validated fails without falling
back to a different credential. Reads are bounded to 4096 bytes; empty,
malformed, placeholder and whitespace/control-containing live token values are
refused. File sources are reread on new authentication for rotation.
Pool, retry and heartbeat overrides also have corresponding COHSH_*
environment forms (for example COHSH_RETRY_TIMEOUT_MS); explicit flags take
precedence for those numeric settings. Do not infer that rule for TCP port,
whose implementation behaves differently as shown above.
REST filesystem response windows compose 5000 ms queue admission, the larger
of the gateway control/telemetry response bounds, and 5000 ms delivery grace.
The canonical 120000/120000 ms gateway profile therefore needs a 130000 ms
client envelope. --rest-response-timeout-ms precedes
COHSH_REST_RESPONSE_TIMEOUT_MS; the selected window cannot be smaller than
the composed gateway envelope. This is not a retry allowance and does not
change the separate connection, metadata or body-transfer bounds.
Troubleshooting
| What you see | First useful check | Next action |
|---|---|---|
No cohesix> after power-on |
Is output still firmware/U-Boot, or has the root task started? | Retain the first blocker and boot identity; use the hardware runbook. A Pi splash screen is not a Cohesix boot. |
| Boot menu visible but serial typing does nothing | Selected menu input; default is USB | Use the local USB keyboard. Do not send Wi-Fi secrets through serial. |
| Serial text appears but commands are garbled or lost | Correct device, line settings, competing owner, paste rate | Use one owner and paced single commands. Root queue-drop zero does not exclude child/FIFO loss. |
| HDMI prompt missing while serial works | usb status, display blocker and actual USB key response |
Distinguish input admission from display health; preserve serial access. |
coh> appears but ping says not attached |
Earlier attach error | Correct the endpoint/credentials, then attach queen; the prompt itself is local. |
| TCP connection refused or times out | Actual boot address, port, network/listener state and current console owner | Stop competing direct clients; inspect serial netstats before changing retry limits. |
tcp-diag succeeds but attach fails |
TCP is reachable; authentication and role are still unproven | Check the exact selected secret source and ticket policy, not just the socket. |
| Token missing/invalid despite another token variable being set | Precedence and selected env:/file: source |
Repair that source. It intentionally does not fall back. Never print the token to debug it. |
| Connection goes to the wrong port/localhost | Inherited COHSH_TCP_HOST / COHSH_TCP_PORT |
Clear stale overrides and restart with the intended endpoint. |
| REST reads work, writes fail | Request-auth token, caller ticket, TTL, subject, scope, mount and quotas | Supply both authentication layers; --role queen alone is insufficient. |
spawn, kill, bind or mount refused in production |
/proc/authority, compatibility policy |
Use an authorised strict intent for the existing Queen command object. |
OK after spawn but no usable Worker |
Published structured Worker observation | Inspect lifecycle/artifact/receipt/proof independently; do not manufacture READY from admission. |
| Worker path is missing | Actual shard label, ID, profile and enabled aliases | Discover the canonical path; do not assume /worker or a guessed sequential ID. |
nettest says started but there is no pass |
Same connection/run generation and terminal netstats verdict |
Complete the required peer interaction; another run’s result cannot satisfy this one. |
test --no-mutate still attempts writes |
Installed negative script | This mode is selective skipping, not a read-only security boundary. Use explicit reads when necessary. |
EXPECT SUBSTR misses text visibly printed by cat |
Recorded response source | Use WAIT ... TAIL ... SUBSTR ... for a data condition, not an ACK-text assertion. |
log dump fails |
.txt suffix, parent directory and existing destination |
Create the host directory; use a new filename or intentional --force. |
Telemetry reports mode=reference |
Encoded inline budget/source format | Retain original bytes; only reference records were uploaded. |
| Timeout or disconnect during a mutation | Retained request, logs, dedupe/result state | Treat outcome as unknown. Reconcile before any retry; never give the same work a fresh identity automatically. |
Unexpected busy, quota, cut or policy |
Exact typed detail and relevant lifecycle/ticket/budget | Fix the specific cause. Larger client retries cannot widen target authority. |
Capture the failing command, complete bounded response, target image/profile, boot/connection identity and relevant serial context. Keep credentials out of reports. Preserve the first fault before rebooting or opening another TCP connection that replaces latest-session evidence.
Advanced diagnostic reference
The following expandable sections retain field interpretation for incident and driver analysis. They are not a required reading path for ordinary shell work. Use the matching image’s records; unavailable, stale and unobserved values are not zero-valued proof. Detailed driver contracts are in DRIVERS.md, external schemas in INTERFACES.md, and acceptance requirements in TEST_PLAN.md.
Activity, USB and local-seat readiness
smp and smp activity are equivalent. Selected driver snapshots use seven
bounded [smp] driver v=1 part=<turn|outcome|sched|retry|cache|traffic|role>
rows, each fitting the 256-byte console line ABI. They do not replace the
complete 1024-byte DRIVER_TASK_COUNTER provenance record. A missing selected
driver projection is missing evidence, not permission to substitute another.
serial_rx_drop and serial_rx_backpressure describe the root serial queue,
not the isolated serial runtime queue or mini-UART FIFO. Per-core USB rates
seatPoll_s, kbdB_s, seat_drop_s, seat_no_reply_s belong to the USB core;
hdmiB_s and hdmi_drop_s belong to the display core. Display drops are not
keyboard drops, and neither driver’s rates are duplicated onto the other.
The Pi startup banner and bounded elapsed counter do not gate boot readiness.
The isolated display runtime owns rendering. The HDMI interactive prompt is
released only after USB command input is admitted, the display is healthy and
Cohesix console ready is queued before the prompt. A later passive
[drivers] USB console ready record does not control that order. Loss of
readiness retracts the prompt/ready banner while retaining the typed suffix;
fresh readiness is required to restore them. Serial can be ready earlier.
usb status, usb dump-state and usb diag inspect retained state.
usb diag also arms a post-command liveness observation without polling the
device. Its ten-gate history is not current keyboard proof. After a real USB
key, a one-shot pass requires linked HID-byte, parser-acceptance, parser-drain
and echo counters to advance without a new drop. usb enable-kbd and
usb probe-kbd may change polling or advance a retained probe slice. An
attached probe result requires its live service turn to finish; a cached
ready latch with pending work remains keyboard-unavailable continuation=pending.
HDMI queue state and the display owner’s completion receipt are separate.
No boot framebuffer reports state=unavailable,
blocker=framebuffer-not-admitted, receipt=none,
next_action=reboot-with-display-connected. Counters without a registered
owner report state=unproven, blocker=driver-task-owner-unproven and
receipt=none. A ready receipt needs framebuffer, registered owner, completed
turn, no outstanding turn and healthy retry state.
Mapped USB and HDMI runtimes expose usb: command_frontier (request/command/
completion sequence, lease phase, issued/admission, capability generation,
producers/sends), usb: command_wait (notification binding, cap generation,
prompted slice, absent/wait/ack state and exact request/slice match), and
usb: command_progress (validity, sequence, phase and auxiliary value).
domain distinguishes usb-runtime from hdmi-display. These are snapshots,
not timeout or readiness verdicts.
Every passive USB response begins with this adjacent atomic pair:
USB_OLDGOOD_RETAINED v=1 task=<u32> token=0x<8hex> link_epoch=<u32> link_token=0x<8hex> epoch=<u32> seq=<u32> mask=0x<8hex> topology=0x<8hex> input_gen=<u32> commit=<u32> source=<linked-runtime-hid|none>
USB_OLDGOOD_CURRENT contracts=usb-local-seat+pcie-root owners=<driver-owned|missing>+<driver-owned|missing> descriptors=<sealed|missing>+<sealed|missing> command_ready=<yes|no> proof_gate=<0|14> blocker=<none|receipt-missing|usb-owner-missing|pcie-owner-missing|usb-descriptor-missing|pcie-descriptor-missing|command-not-ready> root_pointer=no
Pairs are USB then PCIe. A complete receipt needs mask=0x00003fff, commit
equal to seq, source=linked-runtime-hid, both owners, both sealed
descriptors, command readiness, proof_gate=14 and blocker=none. Missing
evidence retains version 1 with zero identity/body fields and source=none.
Active enable/probe commands do not emit this pair. The passive command does
not create a hardware transition. Linked local-seat readiness cannot release
pre-proof input until both USB and PCIe owner/descriptor chains are current;
failed service/recovery clears that retained readiness evidence.
Wi-Fi triage, recovery and packet-receipt snapshots
wifi diag has at most eight preflighted body lines plus terminal/status/ACK
output. It leads with the first known failed gate and labels its snapshot
best-effort-multi-record. Later gates are not-reached rather than falsely
current. wifi dump-state is the verbose acceptance/DPC/association/maintenance/
queue/TX/Gate 7–8 surface. Its wifi: pair_handoff records retain separately
owned CYW43 and SDIO first-child traces; observed=no is missing or unstable
information. Legacy probe/load/retry commands return typed ownership refusal
without invoking a physical operation.
Physical-console smp in Wi-Fi mode can prepend a passive atomic 37-line
old-good batch: current serial, USB, HDMI, PCIe, CYW43 and SDIO owner records,
then the contiguous 31-line WIFI_OLDGOOD_RETAINED_BEGIN/hash/26-step/
WIFI_OLDGOOD_RETAINED_END transaction. It needs a complete matching attempt,
pair, generation, firmware and ordered association/EAPOL/DHCP receipt. Its
presence does no device work; its absence is missing evidence. Fresh network,
authenticated TCP, terminal nettest and DPC observations must still follow.
A retained wifi: deferred_recovery scheduler_root uses a 16-digit hex site:
upper 32 bits are source tag 1=hal/driver_task.rs,
2=drivers/driver_task_net.rs, 3=event/mod.rs, 4=userland/mod.rs,
15=other; lower 32 bits are the exact-build line. Zero is unavailable.
terminal=yes binds code/detail/result to the retained root command sequence;
with terminal=no, zero operands are unavailable. The first request survives
recovery and clears at accepted Gate 8. The atomic recovery batch is at most
13 rows; compact wifi diag retains its eight-body-line bound.
wifi: rx_reject schema=v1 is one retained=no row when absent, otherwise
11 rows: identity, four before/after queue samples, two header samples and
four entry-half rows. Failure stages are envelope, queue-before,
generation, header, initial-identity, queue-after, final-identity,
count. These name failed checks, not root causes. Queue samples are the
existing stable-read pair; headers are the original two reads. observed=false
means placeholders cannot be used as evidence. Metadata is fixed-width hex
except sample/half indices; booleans are true/false. Queue abi is
version/size and depth level/capacity; header count is count/remaining,
valid body-valid/committed; entries are offset/length/flags/source-counter-low
word in FIFO slot order. Payload is not retained. Same-generation in-progress
publication defers without fabricating rejection; malformed, unavailable,
poisoned and identity-invalid records remain distinct. The original deadline
still bounds publication. Records survive recovery scrub and clear at Gate 8.
wifi rx-trace <0..5> requires one ASCII page digit, is serial/local-seat only,
and returns a header, flow row, up to 16 records and
OK WIFI detail=subcommand=rx-trace scope=serial-local. The 96-record journal
contains SYN/FIN/RST and data headers for the latest control flow, not pure
ACKs or payload. New generation or SYN identity resets it; retransmissions keep
separate receipt ordinals/IPv4 IDs. first/next expose eviction, and ignored
counts other flows. Collect all six pages after connection close, before a new
connection; reconcile generation, flow and ordinal headers across snapshots.
IPs, sequence/ACK/flags, IPv4 ID and s/q/r/d are hex; ports, lengths, ordinals
and header counts are decimal. none means unavailable; zero is valid.
s is source-counter low word, q packed Q11 metadata, r root-copy counter
low word and d full dequeue CNTVCT. Source time is not wire arrival.
Pi netstats additionally retains wifi_ack_admission, wifi_ack_last,
wifi_ack_fin and wifi_ack_before_fin version-1 records. These describe a
structurally valid, nonfragmented IPv4 ACK-only header (flags 0x10, no TCP
payload), stage/returned-signal identity and exact child-ingress completion.
consumed=yes does not prove smoltcp processed or retired that ACK.
A received SYN clears latest/close identity without resetting cumulative
counts; a new Wi-Fi generation resets both. wifi_ack_before_fin freezes the
same-flow ACK receipt immediately before the first matching FIN; later ACKs,
repeated FINs and completions cannot rewrite that cut. Missing data is
absent=yes. Collect through serial before another connection and reconcile
with the boot-paired packet capture; no row proves on-air delivery.
Network verdicts, isolated progress and GENET causal refresh
The complete terminal/running network-test record is:
nettest: generation=<connection> run_generation=<run> enabled=<bool> running=<bool> verdict=<none|running|pass|peer-assisted-pass|fail> tx_ok=<bool|na> udp_echo_ok=<bool|na> tcp_ok=<bool|na> console_ok=<bool|na> peer_assisted_ok=<bool|na>
The positive run generation must match admission. Target addresses/backend
identity are emitted separately as nettargets:. profile_backend is resolved
manifest selection; active_driver is this boot’s selected physical/virtual
driver; compatibility backend aliases active_driver.
Isolated profiles also emit isolated_progress, isolated_units and
isolated_state: child turns, last material progress, bounded queues, pending
egress/drain and ingress backpressure/drop. Direct-GENET additions are:
isolated_progress: pcont=<candidates>/<admitted>/<rejected> peff_us=<n> preason=0x<n>
isolated_units: output_ok=<n>
isolated_state: ycalls=<n> ycredit_us=<n> yinvalid=0x<n>
peff_us is root elapsed observation, not admission authority. preason bits
are fence 0x01, cap 0x02, clock 0x04, policy 0x08, counter 0x10,
arithmetic 0x20, reserved retired 0x40, token 0x80. output_ok counts
durable output-stage success, not attempts. yinvalid bits are pre-drain
0x01, counter/frequency 0x02, syscall result 0x04, overflow 0x08.
These fields are zero outside that exact direct-GENET path.
On the exact Pi direct-GENET generation, netstats performs one bounded causal
refresh with an idempotent DGHO replay. It may wake the owner and permit normal
idle service to drain durable RX: not a passive performance sample.
Available rows are emitted in this order:
netstats: genet_direct ...
netstats: genet_direct_flags ...
netstats: genet_direct_before ...
netstats: genet_direct_before_ring ...
netstats: genet_direct_irq ...
netstats: genet_direct_irq_source ...
netstats: genet_direct_notification ...
netstats: genet_direct_dpc ...
netstats: genet_direct_dma ...
netstats: genet_direct_ring ...
netstats: genet_direct_peer ...
refresh is fresh, ready-stale, ready-unverified, ready-missing,
timeout, rejected or inactive; a replacement can be
phase=pre-idle-service. The before rows retain pre-replay owner/ring state;
ready-unverified means no stable pre-replay record existed to prove freshness.
Missing optional rows remain missing. DPC timing/reason fields diagnose bounded
service, not qualified WCET or throughput. Component active=yes cannot
replace canonical NET_ACTIVE backend selection. These rows establish neither
DHCP/ARP/ICMP/TCP success nor Pi acceptance.
Pi fast-path counters and causal seam histograms
The bounded netstats fast-path record grammar is:
netstats: cyw43_publication schema=v1 candidates=<u64> minted=<u64> consumed=<u64> rejected=<u64> reasons=0x<hex>
netstats: cyw43_publication_cut schema=v1 probe=<u64> entry=<u64> pre_network=<u64> revoked=<u64>
netstats: cyw43_productive_window schema=v1 opened=<u64> idle_admitted=<u64> closed=<u64> ready_rechecks=<u64>
netstats: genet_compact schema=v1 stage=<u64> deferred=<u64> fault=<u64> unsupported=<u64> dispatch=<u64> stage_turns=<u64> rotations=<u64>
netstats: genet_compose schema=v1 composed=<u64> no_pending=<u64> not_sealed=<u64> backpressure=<u64> identity_drift=<u64>
netstats: genet_defer schema=v1 passive=<u64> command=<u64> compose_open=<u64> compose_backpressure=<u64> fence=<u64> prior_batch=<u64> control_busy=<u64> output_missing=<u64> stage_backpressure=<u64>
netstats: isolated_seam schema=v2 name=<command-created-root-observe|command-created-publish|command-publish-root-observe|dispatch-stage|stage-control-observe|stage-output-drained|output-drained-root-observe> n=<u64> bad=<u64> ms=<total>/<last>/<max> h=<hex>/<hex>/<hex>/<hex>/<hex> hs=<0|1> [pairs=<u64>]
Publication rejection bits are snapshot/lifetime drift 0x1, operator/recovery
fence 0x2, final pre-Network drift 0x4, empty/non-material publication 0x8.
Cut counters classify rejections, not retries. idle_admitted is a retained
schema field for a retired path and stays zero under event-backed continuation.
ready_rechecks spends the existing one-shot recheck allowance. Full Operator,
Driver and attached Network turns spend the unchanged 64 logical material-work
units; productive Driver/Network progress is independently capped at 64.
Counters do not grant continuation, refill, readiness or device authority.
The exact single-command credit-rebase case must preserve lifetime, identity, service and all operator/recovery fences while admitting one command, one newly sealed completed response and one bounded same-connection flush. Other changes are rejection, not an extra continuation path.
genet_compose composed means a sealed SyncCapture moved. no_pending is not
by itself permission to advance: an immediate terminal’s already queued lane
must independently satisfy exact generation, connection, authentication,
recovery, flush and batch-drain predicates, including one completed response,
stage readiness, terminal queued and producer closed. Otherwise the result is
output_missing; identity drift remains fail-closed. Each aggregate compact
Deferred increments exactly one of the nine genet_defer classes; their sum
matches the aggregate deferred count. compose_open corresponds to NotSealed.
The seven optional version-2 seam names separate creation, publication, root
observation, dispatch, durable StageOutput, observed control-consumption
watermark and OutputDrained publication. pairs appears only on
command-created-publish. Counts and ms=total/last/max are decimal saturating
u64; histogram bins are 0, 1, 2–3, 4–7 and at least 8 milliseconds. Display bins
clip at ffff, with hs=1, while internal bins retain full width. Zero age is
valid with nonzero endpoints; missing/backwards endpoints increment bad.
Mean age is total/n when n is nonzero; rows fit 256 bytes.
Version 1’s command-publish-root-observe included pre-publication waiting;
version 2 separates those timestamps. stage-control-observe includes child
consumption and later observation; stage-output-drained includes peer TCP
ACK retirement and publication waiting. Intervals overlap: do not sum them
into wire latency. Pi uses absolute CNTVCT with generated TIMER_CLOCK_HZ;
host tests retain caller-time fallback and QEMU omits this Pi accounting.
External framed TCP measurements remain authoritative for target latency.
MCS topology, composer/Yield accounting and latest-session evidence
smp mcs labels generated admission source=generated, BootInfo source=kernel
and copied live state source=runtime. Unavailable state is not a fabricated
missing registration. Pi live registrations use paired [smp:registry/v1]
rows, indexed by base into the same snapshot’s ordered non-Worker task rows.
count is one or two; registration/terminal lists match it. Missing generation
is none, terminal unknown, not zero-valued evidence. For example:
[smp:registry/v1] base=0 count=2 registration=present,missing generation0=1/1/1 generation1=none terminal=yes,unknown
The selected four-core Pi Wi-Fi body fits the 64-line synchronous TCP capture and 69-line physical body, retaining paired registrations, owner CPU rows, passive-timeout receipt, timing/idle records and the end marker. Protocol terminal space remains separate. QEMU retains its per-task registration format.
Despite their netstats: prefix, the following 17 lifetime rows belong to
smp mcs, not netstats:
netstats: mcs_quantum schema=v1 hz=<u64> samples=<u64> material=<u64> periods=<u64> invalid=<u64> invalid_period=<u64>
netstats: mcs_quantum_lane schema=v1 wifi=<u64> genet=<u64>
netstats: mcs_quantum_total schema=v1 period_us=<u64> run_us=<u64>
netstats: mcs_quantum_timing schema=v1 period_avg_us=<u64> period_max_us=<u64> run_avg_us=<u64> run_max_us=<u64>
netstats: mcs_quantum_period schema=v1 bounds_us=1000,3000,6000,9000,12000,20000 buckets=<u64>,<u64>,<u64>,<u64>,<u64>,<u64>,<u64>
netstats: mcs_quantum_run schema=v1 bounds_us=1000,3000,6000,9000,12000,20000 buckets=<u64>,<u64>,<u64>,<u64>,<u64>,<u64>,<u64>
netstats: mcs_quantum_last schema=v1 lane=<wifi|genet> generation=<u64> conn=<u64> progress=0x<hex> pending=0x<hex>->0x<hex> period_us=<u64> run_us=<u64> exit=<YIELD|RETAIN|FENCE|FAULT>
netstats: mcs_quantum_exit schema=v2 yields=<u64> retains=<u64> fences=<u64> faults=<u64> pending=<u64> stalled=<u64>
netstats: mcs_command_dispatch schema=v1 samples=<u64> invalid=<u64> avg_ms=<u64> last_ms=<u64> max_ms=<u64>
netstats: mcs_observe_dispatch schema=v1 samples=<u64> invalid=<u64> avg_ms=<u64> last_ms=<u64> max_ms=<u64>
netstats: mcs_yield schema=v1 hz=<u64> samples=<u64> invalid=<u64> pending=<u64> wifi=<u64> genet=<u64>
netstats: mcs_yield_timing schema=v1 total_us=<u64> avg_us=<u64> max_us=<u64>
netstats: mcs_yield_hist schema=v1 bounds_us=1000,3000,6000,9000,12000,20000 buckets=<u64>,<u64>,<u64>,<u64>,<u64>,<u64>,<u64>
netstats: mcs_yield_cause schema=v2 reserve=<u64> no_successor=<u64> passive=<u64> recovery=<u64> operator=<u64> other=<u64>
netstats: mcs_yield_last schema=v1 lane=<wifi|genet> generation=<u64> conn=<u64> pending=0x<hex> trigger=<RESERVE_GUARD|NO_PRODUCTIVE_SUCCESSOR|PASSIVE_ADMISSION|RECOVERY_FENCE|OPERATOR_ROTATION|OTHER_BOUNDARY> hiatus_us=<u64>
netstats: mcs_budget_guard schema=v2 totals=<u64>,<u64>,<u64>,<u64> pending=<u64>,<u64>,<u64>,<u64>
netstats: mcs_budget_reason schema=v1 cap=<u64> clock=<u64> reserve=<u64> policy=<u64> mask=0x<hex>
Progress bits: command 0x1, child 0x2, stage 0x4, drain 0x8, ingress
0x10, token 0x20, queue 0x40. Pending bits: command queue 0x1, root
output 0x2, child control 0x4, child egress 0x8, child event 0x10,
continuation 0x20, Wi-Fi driver 0x40, passive admission 0x80, operator
0x100, recovery 0x200. Budget lists are activation, attached, bootstrap
operator, bootstrap driver. Reason bits are cap 0x1, clock 0x2, reserve
0x4, policy 0x8. Former split v1 state/cause/pending records and emitted
legend rows are folded into these version-2 records and fixed legends.
Three global idle rows follow: mcs_idle schema=v1 has before, after,
timer_reject, clear=<before>/<after>, last_cut=<0|1|2> (before enable,
after enable, timer rejected), mask; two mcs_idle_fences schema=v2
base=<0|8> counts=<eight decimal u64 values> rows retain all 16 independently
saturating fence counts. Bits 0–15 are inexact topology, unavailable child
level, staged IPC, physical input, serial output, display, reboot,
recovery/containment, handoff, passive admission, local fault, physical
response, retained output, network work, child publication service (including
owed ACK), timer-enable rejection. Co-occurring fences are not exclusive.
A clear after-enable cut permits a wait but does not prove the syscall slept.
Composer run brackets its leaf; period is start-to-start from the previous
valid composer observation to the current material quantum. First observation
has no period; backwards starts increment invalid_period. pending is
material work at entry; stalled means pending before and after without
progress. These are not kernel activations, SC refills or CPU consumption.
Yield timing brackets the Pi’s explicit CNTVCT -> svc -> CNTVCT interval,
with one exclusive trigger per sample. Raw 54 MHz counter ticks are converted
only when rendering. Missing/backwards counters or invalid frequency are
counted separately; the final histogram bucket is >=20000 us. Under selected
NaturalPostpone, retained clock/reserve fields are diagnostic/historical, not
productive admission authority. Large wall gaps do not identify a kernel refill.
[smp:consumed/v1] is different: retained per-owner differences of cumulative
kernel Consumed receipts for the latest observed TCP lifecycle. Header decimal
fields are generation/connection/frequency; ended is boolean; selected/pending/
claimed masks are hex. Role bits 0–8 are root-control, console-network, GENET,
CYW43, SDIO, serial, USB, HDMI, PCIe. GENET selects seven owners and Wi-Fi eight.
Per-owner cpu_us is decimal; cap-generation and begin/end bracket pairs are
hex. valid=false invalidates numeric placeholders. Missing samples, errors,
backwards clocks/totals and generation changes invalidate pairs. Asynchronous
owner sampling and observed connection boundaries differ from host benchmark
boundaries. Read before another TCP lifecycle replaces the snapshot.
[smp:passive-timeout/v1] retains cumulative resumes, resettable
last_sc_consumed_us and limit_per_call=1. Reading these snapshots performs
no new kernel Consumed/accounting operation. QEMU does not collect Pi receipts.
Eight latest-session mcs_session* v1 rows instead belong to Pi netstats:
summary, four fence rows (base=0|4|8|12), operator predicates, Yield summary
and maximum Yield cut. They retain the latest nonzero generation/connection
after disconnect; zero identity does not erase it. Operator counts are
serial_rx, serial_line, local_line, local_chunk, usb_bytes,
usb_service, and can co-occur. Yield summary has samples/total/max/invalid and
six decimal cause counts in reserve, no-successor, passive, recovery, operator,
other order. Cause counts saturate at u32 maximum; aggregates at u64 maximum.
mcs_session_yield_cut retains the first maximum valid sample or absent=yes.
Pending/command/stage/drain/tick pairs are hex. Decimal phase maps Serial=0,
Dispatch=1, ContainmentDiagnostic=2, Network=3, LocalSeat=4, Display=5;
publication maps unknown=0, empty=1, durable child publication=2. A shorter or
invalid sample cannot replace the maximum. These are pre-Yield root
observations, not synchronised child snapshots or continuation authority.
Later serial typing with no active TCP identity cannot contaminate them.
Zero idle cuts do not prove an idle-free session; these wall measurements do
not prove consumption, refill exhaustion or that a permitted wait blocked.
Pi poll-time, Yield trace and slow receive intervals
smp poll-time starts with eight rows: a poll_time schema=v1 header with
decimal generation, connection, frequency and invalid count, then seven phases
serial, dispatch, containment, network, local-seat, display,
between. Phase-row n, sum, max, cmd and ticks are hexadecimal.
Sum/max are microseconds; cmd is the accepted-command count at the maximum,
and ticks brackets it. These wall intervals include preemption; between
includes work/waits outside ordinary observed polls. The exclusive post-Yield
passive-admission poll is deliberately not instrumented. The latest nonzero
identity is retained after disconnect. Reading does not reset CPU accounting.
yield_trace schema=v1 follows with up to 32 earliest valid explicit Yield
intervals for that session. Header generation/connection/kept/total/omitted/
invalid are decimal; row n, ctx, phase, pub, hz are decimal and
pending/command/stage/drain/tick fields hex. cause names the existing trigger;
ctx=0 means unavailable context. Invalid intervals are counted, not included.
A zero kept count or omitted tail cannot establish that no scheduling delay
occurred. Context bits and low-word wrap rules are exact-image diagnostic
contracts, not permission to change scheduling decisions; consult
the recorder implementation.
A receive_trace schema=v1 header and up to 16 slowest receive/endpoint-handler
brackets follow, descending by whole microseconds with earlier samples first
on ties. Header counts and sum_us, row n, us, hz are decimal; row cmd
and tick pairs are hex. Outcome is empty, endpoint, fanin or
unavailable. Two counter reads bracket an existing receive only while a
nonzero Pi TCP identity is live; no receive is added. These spans include
endpoint handling and preemption, not necessarily sleep. Invalid clocks are
counted; omitted means valid observations outside bounded retention. The whole
command is bounded to 58 body rows before its terminal acknowledgement.
The host-only cohesix-journey identity|validate|doctor|run command installs
with the Python tools and composes the existing CUDA/LoRA lifecycle. See
Adoption and CI workflows for configuration,
scoped approval, retry identity and verified outcome exit codes. It introduces
no VM console verb.
Graphical operation
SwarmUI connects to a Queen or Hive Gateway through an editable
connection dialog. Namespace actions, validated control forms, installed host
operations, canonical evidence and offline replay do not require console grammar.
The optional expert console retains man, role and key=value spawn compatibility, and
transport-supported root diagnostics. Review and confirmation do not replace
target admission, and an ACK does not imply execution. The host operation schema
is shared with coh; credentials stay out of profiles and previews.
Compiler-generated reference
These marker-delimited blocks are retained mirrors of the standalone
coh-rtc snippets. They describe the generated configuration, not proof that
your currently running target has that configuration. Do not edit their
contents by hand; update manifest/IR inputs and regenerate affected outputs.
In particular, the shared grammar is not the complete host dispatcher and
its path-first echo is not interactive cohsh syntax.
cohsh client policy
cohsh client policy (generated)
manifest.sha256:0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11policy.sha256:ad39ddfc70f5e0519738403304069384e8fbdd9a9eabc8d3e9ce84edc7d4a769cohsh.pool.control_sessions:2cohsh.pool.telemetry_sessions:24cohsh.tail.poll_ms_default:1000cohsh.tail.poll_ms_min:250cohsh.tail.poll_ms_max:10000cohsh.host_telemetry.nvidia_poll_ms:1000cohsh.host_telemetry.systemd_poll_ms:2000cohsh.host_telemetry.docker_poll_ms:2000cohsh.host_telemetry.k8s_poll_ms:5000retry.max_attempts:3retry.backoff_ms:200retry.ceiling_ms:2000retry.timeout_ms:5000heartbeat.interval_ms:15000trace.max_bytes:1048576trace.max_duration_ms:60000
Generated from configs/root_task.toml (sha256: 0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11).
cohsh client defaults
cohsh client defaults (generated)
manifest.sha256:0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11worker.task_abi_schema:worker-task-abi/v2worker.task_abi_version:2worker.observation_schema:cohesix-worker-observation/v1worker.integration_evidence_schema:cohesix-worker-integration-evidence/v1worker.maximum_live_tasks:256worker.canonical_telemetry_template:/shard/<label>/worker/<id>/telemetryworker.shard_bits:8worker.legacy_worker_alias:trueworker.lifecycle:absent, queued, starting, ready, closing, faulted, terminalworker.receipt:none, pending, confirmed, rejected, staleworker.artifact:missing, verified, mismatchworker.execution_proof:none, host-model, qemu, fresh-piworker.role.worker-heartbeat: declaration=executable, executable_slots=1worker.role.worker-gpu: declaration=executable, executable_slots=127worker.role.worker-bus: declaration=model-only, executable_slots=0worker.role.worker-lora: declaration=executable, executable_slots=128secure9p.msize:8192secure9p.walk_depth:8trace.max_bytes:1048576trace.max_duration_ms:60000client_paths.queen_ctl:/queen/ctlclient_paths.queen_lifecycle_ctl:/queen/lifecycle/ctlclient_paths.queen_schedule_ctl:/queen/schedule/ctlclient_paths.queen_lease_ctl:/queen/lease/ctlclient_paths.queen_export_ctl:/queen/export/ctlclient_paths.policy_ctl:/policy/ctlclient_paths.log:/log/queen.logtelemetry_ingest.max_segments_per_device:4telemetry_ingest.max_bytes_per_segment:131072telemetry_ingest.max_total_bytes_per_device:524288telemetry_ingest.max_reference_entries_per_segment:1024telemetry_ingest.max_reference_manifest_bytes_per_segment:131072telemetry_ingest.max_reference_bytes_per_segment:1073741824telemetry_ingest.eviction_policy:evict-oldest
Generated from configs/root_task.toml (sha256: 0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11).
cohsh console grammar
cohsh console grammar (generated)
helpbicaps [mcs]smp [activity|mcs|poll-time|dump]mempingtestnettestnetstatsrebootlogcachelog [n]quittail <path> [lines]cat <path>ls <path>echo <path> <payload>attach <role> [ticket]spawn <payload>kill <worker>
Generated from cohsh-core verb specs (20 verbs).
cohsh ticket policy and quotas
cohsh ticket policy (generated)
ticket.max_len:224queentickets are optional; TCP validates claims when present, NineDoor passes through.worker-*tickets are required; role must match and subject identity is mandatory.
Generated from cohsh-core ticket policy.
Ticket quota limits (generated)
ticket_limits.max_scopes:8ticket_limits.max_scope_path_len:128ticket_limits.max_scope_rate_per_s:64(0 = unlimited)ticket_limits.bandwidth_bytes:8388608(0 = unlimited)ticket_limits.cursor_resumes:16(0 = unlimited)ticket_limits.cursor_advances:256(0 = unlimited)
Generated by coh-rtc (sha256: 3b1501e34fd9367b624534459a6f036cd1990d2e663f21189fa7c85781584da9).
coh policy and doctor defaults
coh policy defaults (generated)
manifest.sha256:0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11policy.sha256:61fc575a244b78954632e4e1eb8ff70cd37a77244790e259fcef4d14f705c11ccoh.worker.task_abi_schema:worker-task-abi/v2coh.worker.task_abi_version:2coh.worker.observation_schema:cohesix-worker-observation/v1coh.worker.integration_evidence_schema:cohesix-worker-integration-evidence/v1coh.worker.maximum_live_tasks:256coh.worker.canonical_telemetry_template:/shard/<label>/worker/<id>/telemetrycoh.worker.shard_bits:8coh.worker.legacy_worker_alias:truecoh.worker.lifecycle:absent, queued, starting, ready, closing, faulted, terminalcoh.worker.receipt:none, pending, confirmed, rejected, stalecoh.worker.artifact:missing, verified, mismatchcoh.worker.execution_proof:none, host-model, qemu, fresh-picoh.worker.role.worker-heartbeat: declaration=executable, executable_slots=1coh.worker.role.worker-gpu: declaration=executable, executable_slots=127coh.worker.role.worker-bus: declaration=model-only, executable_slots=0coh.worker.role.worker-lora: declaration=executable, executable_slots=128coh.mount.root:/coh.mount.allowlist:/proc, /queen, /shard, /worker, /log, /gpu, /hostcoh.telemetry.root:/queen/telemetrycoh.telemetry.max_devices:32coh.telemetry.max_segments_per_device:4coh.telemetry.max_bytes_per_segment:131072coh.telemetry.max_total_bytes_per_device:524288coh.run.lease.schema:gpu-lease/v1coh.run.lease.active_state:ACTIVEcoh.run.lease.max_bytes:1024coh.run.breadcrumb.schema:gpu-breadcrumb/v1coh.run.breadcrumb.max_line_bytes:512coh.run.breadcrumb.max_command_bytes:256coh.peft.export.root:/queen/export/lora_jobscoh.peft.export.max_telemetry_bytes:131072coh.peft.export.max_policy_bytes:8192coh.peft.export.max_base_model_bytes:1024coh.peft.import.registry_root:out/model_registrycoh.peft.import.max_adapter_bytes:67108864coh.peft.import.max_lora_bytes:65536coh.peft.import.max_metrics_bytes:65536coh.peft.import.max_manifest_bytes:8192coh.peft.activate.max_model_id_bytes:128coh.peft.activate.max_state_bytes:4096retry.max_attempts:3retry.backoff_ms:200retry.ceiling_ms:2000retry.timeout_ms:5000
coh doctor checks (generated)
check=policyvalidatescoh_policy.tomlagainst manifest + policy hashes.check=ticketusesticket.max_len=224and TCP policy (queen tickets optional, worker tickets required).check=mountvalidates allowlist undercoh.mount.rootand requires FUSE when not--mock.check=nvmlprefers NVML when not--mock; Jetson-class NVML falls back to CUDA discovery.check=runtimecheckspython3andqemu-system-aarch64(QEMU skipped with--mock).secure9p.msize:8192secure9p.walk_depth:8coh.mount.allowlist:/proc, /queen, /shard, /worker, /log, /gpu, /host
Generated by coh-rtc (sha256: 8ff5f5a73c1e4d454f1263e3235d01d2bde35adb6553bd578b64ae9f496b3b4b).
Python client defaults
Cohesix Python defaults (generated)
manifest.sha256:0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11cohesix.defaults.sha256:078de55c69cac3e57b7e43d7a9864e43f92167b00cd80b0309d280ebc13208fasecure9p.msize:8192secure9p.walk_depth:8console.max_line_len:2304console.max_path_len:96console.max_json_len:192console.max_echo_len:2048telemetry_ingest.max_bytes_per_segment:131072telemetry_ingest.max_total_bytes_per_device:524288telemetry_ingest.max_reference_entries_per_segment:1024telemetry_ingest.max_reference_manifest_bytes_per_segment:131072telemetry_ingest.max_reference_bytes_per_segment:1073741824coh.mount.root:/coh.mount.allowlist:/proc, /queen, /shard, /worker, /log, /gpu, /hostcoh.telemetry.root:/queen/telemetrycoh.run.breadcrumb.max_line_bytes:512coh.peft.import.registry_root:out/model_registry
Generated by coh-rtc (sha256: ce12ccbdc76733c88c09fe62c41ee0cdb8122b550b6a5f3ffd167c550867e5dd).
SwarmUI defaults
SwarmUI defaults (generated)
manifest.sha256:0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11swarmui.defaults.sha256:efe35eef11704bd933ee4e9ef57f10a55c3453a672424c821518d53010fe8156swarmui.ticket_scope:per-ticketswarmui.cache.enabled:falseswarmui.cache.max_bytes:262144swarmui.cache.ttl_s:3600swarmui.hive.frame_cap_fps:30swarmui.hive.step_ms:16swarmui.hive.lod_zoom_out:0.7swarmui.hive.lod_zoom_in:1.25swarmui.hive.lod_event_budget:512swarmui.hive.snapshot_max_events:4096swarmui.hive.overlay_lines:3swarmui.hive.detail_lines:50swarmui.hive.line_cap_bytes:160swarmui.hive.per_worker_bytes:2048swarmui.hive.pending_lines_per_worker:64swarmui.hive.pending_event_cap:4096swarmui.hive.poll_workers_per_tick:32swarmui.hive.status_poll_ms:500swarmui.hive.degrade_pressure:1.0swarmui.paths.telemetry_root:/workerswarmui.paths.proc_ingest_root:/proc/ingestswarmui.paths.worker_root:/shardswarmui.paths.namespace_roots:/proc, /queen, /shard, /worker, /log, /gpu, /host, /policy, /actions, /audit, /replayswarmui.worker_runtime.maximum_live_tasks:256swarmui.worker_runtime.canonical_telemetry_template:/shard/<label>/worker/<id>/telemetryswarmui.worker_runtime.shard_bits:8swarmui.worker_runtime.legacy_worker_alias:trueswarmui.worker_runtime.role.worker-heartbeat: declaration=executable, executable_slots=1swarmui.worker_runtime.role.worker-gpu: declaration=executable, executable_slots=127swarmui.worker_runtime.role.worker-bus: declaration=model-only, executable_slots=0swarmui.worker_runtime.role.worker-lora: declaration=executable, executable_slots=128trace.max_bytes:1048576
Generated from configs/root_task.toml (sha256: 0fd40c602c76806c30de6963765e4d4b4057716da238c1d6fc14d8fb20858f11).
Implementation and related references
| Contract | Source or authoritative guide |
|---|---|
| Host options, environment resolution, script/trace startup | cohsh main |
| Actual host dispatcher, payload builders, scripts, self-tests and local file export | cohsh core |
| Shared target parser and bounds | cohsh-core command parser |
| TCP connection, acknowledgement and close handling | TCP transport |
| Gateway projection and caller binding | REST transport, API guidelines |
| Worker role/path projection and independent state axes | Worker helpers |
| Installed test content | resources/proc_tests |
| Namespace schemas and control payloads | Interfaces |
| Production mutation/delegation and retry identity | M27a authority |
| Host-side GPU work, bridges, gateway and UI | Host tools |
| Live workflow and advanced recipes | Operator walkthrough, Operator recipes |
| Evidence packs, offline inspection and trace contracts | Operator evidence |
Signed evidence, /proc/attest, verifier trust and unavailable modes |
Attestation |
| Image-qualified release and performance checks | Test plan, Benchmarks |
When changing the CLI, update the owning parser/transport, affected tests and this guide together. Keep examples explicit about their prompt, transport, authority, side effects and success condition. Regenerate the marker blocks instead of editing them. Documentation examples are procedures, not records that a particular Queen or release has passed them.