Registering a feature and its probe
A feature's state in Vagaris is derived, never stored. There is no status field to set: the answer is computed from what has been observed about the feature, and the strongest thing that can be observed is a probe assertion — the result of the server running a registered probe against the real surface.
vagaris feature register is how a feature gets that probe.
Why a claim is not enough
You can tell Vagaris what you believe with feature claims. A claim is recorded honestly as a claim:
it enters at the last rung of the precedence ladder, and its confidence is capped below a probe
assertion's. That is deliberate. A verification system whose subject can write its own verification is
a formality, so no executor may write an assertion — not a seat, not CI, not an operator's script.
Only the server's probe runner writes one, and only by observing.
Registering a probe is therefore not a way to assert something. It is a way to hand the server a question it can ask repeatedly on your behalf.
The positive control is not optional
This is the single most load-bearing field in a probe, and the command refuses to store one without it.
A probe that comes back "not present" is produced identically by two completely different facts: the feature is genuinely absent, or the instrument could never have found it. An unauthenticated body greps to nothing. A wrong host 404s. A dead runner times out. Without a control asserted to pass in the same breath, one broken instrument writes ABSENT across the estate, and every one of those rows then reads as evidence.
So the runner executes the control first. If the control fails, it records a finding about the instrument and no assertion about the feature at all — because "we could not observe" is a different fact from "it is not there", and collapsing them is exactly what the control exists to prevent.
Registering
vagaris feature register \
--catalogue-id VOI-021 \
--title "Provider/model/voice configuration" \
--source "the catalogue row this came from" \
--probe-url https://app.example.com/v1/settings/voice \
--probe-expect-status 401 \
--probe-control-url https://app.example.com/api/session \
--probe-control-expect-status 200 \
--probe-on-pass API_ONLY \
--probe-on-fail ABSENT
That example is worth reading twice, because the expectation is a 401 rather than a 200.
A protected endpoint answering 401 is evidence the endpoint exists. A 404 would be evidence it
does not. The probe is not testing whether you can authenticate — it is discriminating deployed from
not deployed, and the 401 is the discriminating answer. The control (/api/session → 200) proves the
host was reachable and the instrument worked, so the 401 means what it appears to mean.
Where a status alone cannot discriminate — the classic case being a 200 that renders an error page —
add --probe-expect-body-regex (and --probe-control-expect-body-regex for the control).
For the whole probe as one object, including anything the flags do not expose:
vagaris feature register --catalogue-id VOI-021 --title … --source … --probe-file ./probe.json
--probe-file and the --probe-* flags are mutually exclusive. A file plus overrides would be two
authorities for one object, and the loser would be silent.
Re-registering
Re-registering the same catalogue id is the same feature, not a duplicate, and the route merges rather
than replaces — but the merge covers the ops fields only, and it is worth knowing exactly which ones.
Safe to omit (absent means unchanged): probe, vendor_org_id, visibility, source_hash, and
the lifecycle — a second register does not wipe a probe it does not mention and does not downgrade a
ratified feature back to candidate.
Always sent, so always overwritten: --title and --source are required by the contract, and
confidence is a column rather than an ops field, so it is written on every register whether or not
you named it. Omitting --confidence therefore sets it to the default 0.6 — including over a higher
stored value. If the feature already carries a confidence you care about, pass it explicitly.
So when you are only attaching a probe to a feature that already exists, read it first and pass back
what it carries: vagaris feature show <id> prints the title, source and confidence.
Running it
vagaris feature verify <id> # the server runs the probe, control first
vagaris feature evidence <id> # what has been observed, claimed and found
vagaris feature recompute <id> --target <maturity>
verify is refused for agent actors: an agent may register a feature, and a registered feature
carries a probe, so the URL the server would later fetch can be an agent's choice. Both the probe URL
and the control URL are checked against the fleet SSRF policy before any request, and a rejection takes
the instrument-finding path rather than becoming an assertion — "we refused to look" is a statement
about the runner, exactly as "we could not reach it" is, and neither is a state of the feature.
Registering without a probe
Perfectly legitimate, and most catalogue rows have none. Omit every --probe-* flag and the feature is
registered with its edges and provenance and no probe. Absence here is a choice, not an omission — the
command does not invent one.