A decision is not a chat completion. It's a schema-bounded act: a Choice among declared options, a Score on a declared rubric, a Noul β yes or no. The model can only answer inside the type. Every call is timed, hashed, and receipted.
Ask a chat model "what should we do?" and it can say anything β that's the feature and the hazard. Hand System One a Choice schema and the response is one of your options, with probabilities. A Score comes back inside [min, max]. A Noul comes back yes or no, with calibration. There is no fourth thing it can say.
That property is what makes decisions safe to wire into a reactive graph. In Quilt, cell kinds are exactly this kind of fence:
A cell whose kind is VIEW can never mutate, no matter what a model suggests. When a model decides which kind a new cell should get, the decision itself is a Choice schema over {BIND, LINK, EFFECT, VIEW, TICK} β the substrate literally cannot propose a sixth kind. That's what "typed" means when AI is in the loop.
# a Choice β schema declares the only legal answers curl -X POST https://quilt-cloudflare.superinstance.workers.dev/api/systemone \ -H 'Content-Type: application/json' \ -d '{"schema":{"type":"Choice","options":["BIND","FORGET","LINK"]},"context":"cell ocean.hit_rate is hot; compact due"}' # a Score β rubric + range curl -X POST https://quilt-cloudflare.superinstance.workers.dev/api/systemone \ -H 'Content-Type: application/json' \ -d '{"schema":{"type":"Score","rubric":"thermal risk, 1=cold 100=melting","min":1,"max":100},"context":"fan at 80%, ambient 31C"}' # a Noul β yes or no, calibrated curl -X POST https://quilt-cloudflare.superinstance.workers.dev/api/systemone \ -H 'Content-Type: application/json' \ -d '{"schema":{"type":"Noul"},"context":"spawn a scout tonight? crew at 40%, room changed 12 cells"}'