Files
clawmates/migrations/0068_mission_validator.sql
T
Omar Sobh c840688adb feat(missions): choose the independent validator per mission (#53)
`CLAWMATES_VALIDATOR_MODEL` is deployment-wide, so proving Slice 2 put a second
provider on the critical path of EVERY phase verdict. `cross_provider_judge`
deliberately does not fall back when the independent judge fails — a verdict
quietly produced by a same-family model would claim a property it does not have —
so a z.ai outage makes phases unmeetable rather than merely unverified. That is a
per-mission trade, not a per-deployment one.

`missions.validator_model` (0068), settable at create, with three distinct states
because an empty string and NULL mean opposite things in a nullable text column:

  NULL          use the deployment default
  ''            explicitly NO independent validator — judge with the house model.
                The default must not quietly reinstate independence a mission was
                told to skip.
  'glm:glm-4.7' this spec, subject to the same three refusals as before:
                same-family rejected, unregistered provider rejected, and a failed
                independent judge does not fall back.

Whitespace counts as empty: a column hand-set to " " meant to say nothing.

478 tests pass, clippy clean. Behaviour is unchanged for existing missions — they
have NULL and so keep following the deployment default.
2026-08-05 23:07:38 -07:00

21 lines
1.2 KiB
SQL

-- Which model independently validates a mission's phase verdicts.
--
-- `CLAWMATES_VALIDATOR_MODEL` is deployment-wide, so proving cross-provider
-- validation meant putting a second provider on the critical path of EVERY phase
-- verdict in the deployment. `cross_provider_judge` deliberately does not fall
-- back to the agent's own provider when the independent judge fails — a verdict
-- silently produced by a same-family model would claim a property it does not
-- have — so a z.ai outage makes phases unmeetable rather than merely unverified.
-- That is the right trade to make per mission, not per deployment.
--
-- NULL = use the deployment default (`CLAWMATES_VALIDATOR_MODEL`).
-- '' = explicitly no independent validator; judge with the house model.
-- 'glm:glm-4.7' = this registry spec, subject to the same refusals as the env
-- default (same-family rejected, unregistered provider rejected).
--
-- No CHECK constraint: which providers a deployment registered is a property of
-- its configuration, not of the schema — the same reason `missions.backend` has
-- none.
ALTER TABLE missions
ADD COLUMN IF NOT EXISTS validator_model text;