Claims
Declaring a claim, where checks live, the three computed states, and what counts as checkable.
A claim is something your notes assert that a machine can go and check.
The rule
The evaluator owns the status. The note never does.
A note declares a claim and the evidence it rests on. It does not get to say how
it is doing. If you write status: VERIFIED in frontmatter it is ignored, and
the note is flagged as having tried to certify itself.
That rule exists because of a bug in this project. Until recently the dashboard decided a note was VERIFIED by checking whether the text contained the word "VERIFIED", and rendered a green badge for it. Nothing verified anything, in the one tool whose whole premise is catching claims that carry no check.
Declaring one
---
claim: KYC is complete for onboarding path B
evidence: [kyc_mode, sanctions_clear, approver_recorded]
recheck: 1d
---
evidence holds names, never commands, URLs or paths. A note is untrusted,
because your assistant writes notes, so a name can only ever resolve to
something you put in config yourself.
The checks live in config
checks:
kyc_mode:
kind: http
url: http://127.0.0.1:9000/health/kyc
contains: fail_closed
approver_recorded:
kind: file
path: ~/.brainlyy/records/approvals.json
contains: approved_by
disk_encrypted:
kind: cmd
argv: [manage-bde, -status]
contains: "Fully Encrypted"
| Kind | Passes when |
|---|---|
file |
the path exists, and contains the string if contains is set |
http |
the response is under 400, and contains the string if set |
cmd |
the command exits 0, and its output contains the string if set |
cmd takes an argv list, never a string, and never runs through a shell.
The three states
| State | Means |
|---|---|
VERIFIED |
every check passed, within the recheck window |
UNVERIFIED |
the claim is checkable, and something failed, is missing, or expired |
ASSERTED |
nothing here is machine-checkable, so no check will ever run |
ASSERTED is not a failure. Most of what a knowledge base holds is legitimately
in it: judgements, decisions, context, things that are true but not mechanically
testable. Pretending otherwise is how you get a system that lies more
confidently than the notes did.
What is checkable
All three must hold:
- the subject resolves to an artifact: a file, an endpoint, a record, a command's output
- the predicate is true or false without judgement
- it is falsifiable now, not eventually
"The sanctions screen returned clear on this account" qualifies. "Our approach to onboarding is sound" does not, and never will. Declare the second one anyway. It just stays ASSERTED.
Running it
brainlyy verify # re-check everything, record what was observed
brainlyy verify --strict # exit 1 if anything is unverified, for CI
Every run appends to $BRAINLYY_HOME/evidence/<year>-<month>.jsonl. Nothing is
ever rewritten, so you can reconstruct what evidence supported a claim on a
given date.
The number that matters
brainlyy verify reports how long the longest-lived false claim read VERIFIED
before a run caught it.
That is the point of the whole thing. In the deployment this was extracted from, a knowledge base asserted a false regulatory status and fed it into daily reports for thirteen days. No check failed, because there was no check.
Creating a claim from the dashboard
The dashboard can do everything the frontmatter workflow does: declare a
claim, pick its evidence from the checks config already defines, set a recheck
window, and add new file and http checks to the allowlist, with a
test-before-saving step, so a typo'd check fails in front of you rather than
silently in the next verify run.
One thing is missing from that list on purpose: cmd checks cannot be
created, or even test-run, from the dashboard. The API refuses kind: cmd
outright, at every layer, with a 400.
The reason is the boundary this whole feature sits on. Config is the only
place allowed to define something executable, and the dashboard is a
network-reachable surface that writes config. If it could write a cmd entry,
anyone who could reach the page could line up an arbitrary command and wait
for the next verify to run it, and the guarantee "a browser cannot cause
execution" would then rest entirely on the loopback gate never being relaxed
or misjudged. Refusing cmd in the API keeps that guarantee structural
rather than situational.
Adding a cmd check therefore stays what it should be: a hand edit to
config.yaml, made on purpose, by someone who already controls the machine.
Honest caveats
- A claim is only as good as its check.
file existsproves a file exists, not that its contents mean what you think. - Nothing here detects a claim that has become false when no check covers it. That is the harder problem and it is not built yet.
recheckis a promise about freshness, not a scheduler. Runbrainlyy verifyon a timer, or the window just expires and everything reads UNVERIFIED.