Saphan StudioDocs
Troubleshooting

The record and gates

Refusals about the workspace, the decisions written into it, and the teardown that closes a piece of work.

14 classes. 2 explained, 12 named only.

A gate is a point where a decision is written down and signed. The record is where it is written. Refusals in this family are almost always one of: the product could not work out which workspace or stream you meant, or the decision you asked to write would not survive being read back.

A refused gate writes nothing. The record is unchanged, and the act can be re-run once the refusal's cause is gone.

The engine refused the row

Class: gate-integrity.

What it means. The decision you posted did not satisfy the conditions the gate enforces. The refusal is not a single sentence — it is a numbered list of everything that is wrong, so you can fix them in one pass instead of re-running to discover the next one.

What to do. Fix what the list names. The refusal also prints the next act the record projects, so you do not have to work out what comes next from first principles. When you meet this in the browser rather than the terminal, the page shows the same list and the same projected next act.

This is the engine's answer, not the surface's. Both surfaces run the same validation, so switching from the browser to the terminal will not change the outcome.

Nothing resolved a workspace

Class: no-workspace.

What it means. The act had to be recorded somewhere and nothing determined where. Nothing was written.

What to do. Re-run naming the workspace explicitly: --workspace <path>.

⚠ Discovery from the current directory is convenient and not reliable — if you are automating anything, name the workspace every time rather than depending on where the command happens to run.

Named, not yet explained

These classes are real, deliberate and named. This section does not yet carry their resolution. If you are holding one, the name below is what it indicates.

classwhat its name indicates
access-log-unwritableAn access record could not be written. ⚠ Worth knowing on sight: this product refuses acts it cannot record rather than performing them unrecorded.
capture-invalidA capture was supplied and is not well formed.
config-init-incompleteConfiguration was started and not finished, so there is not enough of it to act on. ⚠ Related: unknown configuration keys are refused against an explicit accepted vocabulary listed in the error — there is no permissive fallback, and a misspelled setting never silently does nothing.
init-collisionInitialisation found something already present where it would create.
merge-preconditionsThe conditions a merge requires were not all met. ⚠ Worth knowing: merging is a human act here — the engine observes and refuses, it does not merge for you.
structural-bounceA document was returned for its structure rather than its content.
teardown-archiveTearing down a piece of work stumbled on its archive step. ⚠ The archive is written before anything is removed, so a refusal here is the safe order working.
teardown-provisioned-unresolvableTeardown could not resolve something that had been provisioned into the work area.
teardown-worktree-unknownTeardown was asked about a work area it does not know.
unknown-captureA capture was named that the record does not hold.
unknown-streamA stream was named that the record does not hold. ⚠ Check the spelling against what the record lists before concluding it is missing.
unknown-workspaceA workspace was named that is not known — as distinct from no-workspace, where none was named at all.

On this page