Verification Integrity
The two tools behind cks-mcp’s anti-hallucination guarantees. See
Security Model for the full trust model these implement.
verify_source
Section titled “verify_source”Performs a real HTTP request against an external URL and builds a
cryptographically signed VerificationRecord from the actual result. This
is the only sanctioned way to produce a VerificationRecord — every
other tool treats a record without a valid signature as fabricated (see
below).
Parameters: url (string, required), subject_id (string, required —
the id of the Knowledge Object this verification is about).
Response
{ "objects": [ {"identity": {"id": "vr-...", "type": "VerificationRecord", "name": "verification"}, "structure": {"checked_at": "2026-07-30T12:00:00Z", "checked_via": "automated_http_check", "http_status": 200, "signature": "<HMAC>"}}, {"identity": {"id": "rel-...", "type": "Relation", "name": "r"}, "structure": {"participants": ["<subject_id>", "vr-..."], "relation_type": "verified_by"}} ]}Merge this straight into your structure with evolve_knowledge
(add_object for both entries), or include it directly in a json_data
payload. The request itself is hardened against SSRF and DNS rebinding:
only http/https are allowed, the resolved IP is validated against
public-address ranges (blocking private, loopback, link-local, and
cloud-metadata ranges, plus CGNAT-style shared address space), and the
connection is pinned to the validated IP for the actual request — redirects
are followed manually, one hop at a time, re-validating each new target.
detect_contradictions
Section titled “detect_contradictions”Flags logical contradictions in a structure using two constraint types. Read-only.
mutual_exclusion— the same source–target pair has both of two declared relation types (e.g. bothsupportsandrefutes).functional_relation— a single source has more than one target via a relation type declared single-valued (e.g. a planetorbitstwo stars).
To use it, your structure must contain MutualExclusionRule and/or
FunctionalRelationRule objects declaring which relation types are subject
to which check:
{"identity": {"id": "rule-1", "type": "MutualExclusionRule", "name": "no-support-and-refute"}, "structure": {"relation_type_a": "supports", "relation_type_b": "refutes"}}{"identity": {"id": "rule-2", "type": "FunctionalRelationRule", "name": "single-orbit"}, "structure": {"relation_type": "orbits"}}Parameters: session_id or json_data (one of the two).
Response
{ "session_id": "sess-abc123", "contradiction_count": 1, "contradictions": [ {"code": "CKS-EXT-FUNCTIONAL-RELATION", "severity": "warning", "source": "extension", "message": "...", "metadata": {}} ]}Why provenance is checked unconditionally
Section titled “Why provenance is checked unconditionally”A VerificationRecord looks the same to a downstream reader whether it was
genuinely produced by verify_source or hand-crafted by an LLM trying to
look convincing. Because of that, validate_knowledge, evolve_knowledge,
merge_knowledge, merge_branch, and the json_data fallback paths of
serialize_knowledge/explain_knowledge/detect_contradictions all check
every VerificationRecord’s HMAC signature regardless of whether you
requested the verification_record extension. A forged record can never
become a persisted, readable version — see Security Model.