Saphan StudioDocs
The console

Recording a decision from the console

The act, step by step — and it is a human act wherever you perform it.

b. Recording a decision from the console — the act, step by step

This is the one thing on /console that writes. Everything else shows you the record; this puts a signed human decision into it. Read §3b.0 before you click the first time.

3b.0 — what the click actually is. One row in fleet_gate, signed with the workspace key, exactly like the row saphan gate … writes from a terminal. Same writer, same validation, same refusals. The console is not a second way to decide; it is a second hand on the same door.

The signature does not prove who you are. It proves the workspace key produced the row's bytes. That it was you is proved by your session — which is why this button exists only behind the login of §1/§2, and why the actor on every row the console writes is taken from your session and can not be sent by the page.

3b.1 — find the act. Go to /console/next. A row carries a decision form only when the engine's own queue currently owes that act on that stream and the act is an owner-class gate write. Rows without a form are not broken: the projection listed no act you may fire there, and the console never invents one. Copy the command it shows instead.

3b.2 — choose the decision. The choices are the engine's own writable vocabulary for that gate — nothing more. At a stop-2 gate: accept, conditions, reject, closed-without-merge. At a merge gate: ready-to-merge only.

3b.3 — write the ground. The box under the decision is the row's detail — the same field saphan gate --note writes. It is not required, because the CLI does not require it either, and this surface will not refuse an act the engine would accept.

If you leave it empty, it is recorded empty. Nothing is invented on your behalf. The row is permanent, and a decision whose reason was never written down cannot have one added later — the preview says so, in those words, before you confirm.

3b.4 — press Preview this decision. Nothing is written. The page you land on is the dry run: the row that would be inserted, field by field, and the state your stream would move to. It is produced by the same validation the write runs, not by a description someone wrote — so what it shows is what lands.

3b.5 — press Record this decision. Now the row is written and signed. The receipt shows the row as recorded, the state transition, and the next act the record now owes on that stream.

3b.6 — verify it, from outside the console. Do this the first time, at least:

saphan gates --stream <your-stream> --workspace <workspace root>

Your row should be listed with signature verdict ok.

3b.7 — if it refuses. You get a page naming the refusal's class and, where the engine produced them, its own sentences — the same ones the terminal prints. Nothing was written. The three you are most likely to meet:

classwhat happenedwhat to do
console-act-not-offeredthe queue does not list that act right now — usually because the record moved since the page was drawn (someone else acted, a run finished)reload /console/next and act on what it now lists
console-act-decision-not-offeredthat decision is not writable at that gatepick one the form offers
gate-integritythe engine refused the row — the numbered list on the page is its own STOP listfix what it names; the page also prints the next act the record projects

3b.8 — if it says "this request carried a valid session cookie and no valid act token" (console-act-forgery): the form you posted did not come from a freshly loaded console page of your session. Reload /console/next and act from there. If you did not initiate that request, some other page did — see §6 on CSRF.

3b.9 — what the console will not do. It will not merge (the human merges; the engine observes, §1.7). It will not tear down. It will not act on many streams at once. It will not fire an act the queue did not list, whatever a crafted request asks for.

On this page