Part V · Contracts · Plate 07

Soma rubric · gate exit codes

On this page

5. Soma → Thalamus System 1 Oracle and the cns gate Exit Contract (S4, 2026-10-31)

5.1 Instrument note: S4 verdicts are not Series 15/16 verdicts

The Series 15/16 rubric pass rates were produced by experiment scripts that sent model: "jev-latest" (an alias of the clef-flash container at the time) directly to the System 1 server or through spark_lb.py, never through Thalamus, with re-authored task questions and hand-written criteria (run_fleet_benchmark.py:462-570, run_clef_flash_rubric). S4 verdicts come from soma concerns check --systemone: through Thalamus, with the model named by /admin/v1/status, the concern's question text verbatim, and criteria derived only from expect. They are a different instrument. A Series 15/16 number must not be compared with, or used to calibrate, an S4 verdict.

5.2 Request (writer: Soma soma-systemone; reader: Thalamus /v1/systemone, proxied verbatim to the System 1 server)

THALAMUS_URL is required: Soma names no model host, so unset means not evaluated. There is no default relay address (§1.1). --systemone-timeout-ms (default 45000) is one budget measured from the start of soma concerns check: the status read and the call share its deadline.

  1. GET ${THALAMUS_URL}/admin/v1/status. The model is models[0] of the first (by name) entry of planes.verification[] with healthy == true, draining == false, "system1.decide" in capabilities, and a non-empty models. None: not evaluated. /v1/classify (the rerank handler) is never called.
  2. POST ${THALAMUS_URL}/v1/systemone, header x-request-id: <32 hex>, body:

    {"model": "<models[0]>",
     "state": {"git_diff": "<unified diff base..head or working tree>", "changed_files": "<paths, newline-separated>"},
     "questions": {"<concern-id>/<n>": {"type": "noul", "instructions": "<question text verbatim>",
                                        "criteria": {"true": "yes", "false": "no"}}}}
    

    <n> is 1-based within the concern. Only questions of concerns that fired are sent; nothing fired means no call (rubric: vacuous). Section 1.2's example key question is not what Soma sends; Soma sends instructions + criteria, as Series 16 did.

  3. Polarity. A Questions bullet may start with [expect: yes] or [expect: no] (default yes). The marker is removed from the text. This is the one accepted syntax (revision 4): exactly [expect: yes] or [expect: no], lowercase, one space after the colon, first in the bullet, followed by whitespace and the question. Any other text that starts like a marker ([expect, in any case or spacing) anywhere in the bullet, including a trailing ... [expect: no], is an unrecognised polarity marker: soma concerns validate fails, soma concerns check refuses (exit 2), and soma concerns lint --polarity lists every one and exits 2. Nothing marker-like is ever sent as question wording or read as a silent yes. The one fixed mapping (soma_systemone::criteria_for) is yes -> {true: "yes", false: "no"}, no -> {true: "no", false: "yes"}; its canonical JSON {"no":{"false":"yes","true":"no"},"yes":{"false":"no","true":"yes"}} hashes to expect_map_sha = dac6eaec67864d2e8f89f3e7df411f20d7918d24a50cf05d6c8a9a53c82fae5c.

5.3 Response and verdict

5.4 soma concerns check exit codes and output

Exit Meaning
0 Every requested oracle ran; with --check, nothing red
1 With --check: a critical/warning fire, an invalidated pin, or a rubric-red concern
2 Refused (bad arguments, invalid registry)
3 --systemone requested and not evaluated, whatever the structural result

Markdown output ends with ## Oracles, one line oracles: structural; rubric: not evaluated (not requested) | oracles: structural; rubric: vacuous | oracles: structural; rubric: not evaluated (<reason>) | oracles: structural, systemone; rubric: pass|fail (...), then structural: pass | structural: red (<gating concern ids>[; pinned anchor invalidated]), and fired: <n>. The structural: line (revision 4) states the structural result on its own, because exit 3 outranks it. JSON output carries oracles, rubric and structural: {red, gating, pinInvalidated}.

5.5 Verdict log (writer: Soma; readers: S7 concern ledger, S5 provenance)

<generated_dir>/rubric-verdicts.jsonl (default .soma/rubric-verdicts.jsonl, git-excluded), one row per evaluated question, appended: {ts, concern_id, question_idx, expect, score (null when malformed), pass, delta_sha (sha256 of state.git_diff), model, threshold, expect_map_sha, thalamus_url, thalamus_node (x-thalamus-node or null), request_id (= x-request-id sent)}. Unanswered questions are not logged (the run is exit 3).

5.6 cns gate (writer of a vitals.v1 row; reader: cns status [5])