- Meaning
- Every permission check passes and the assessment completes cleanly.
- Delivery
- Exactly one bound item in the local outbox.
How it works
Advice and permission, kept apart
A language model is good at noticing manipulation and bad at being a security boundary. ForgeVigil uses it for the first job only.
One request, start to finish
A request names a document, a recipient, optionally an approval reference, and a free-text message. The server owns every fact about documents, recipients and approvals. Nothing in the request can change them.
1. Scope comes first
Code checks the sender, document and recipient against the operator’s registry. A restricted document, an unknown recipient or an unapproved vendor is denied immediately. The model is never called and intent is never guessed, so no wording can argue past it.
2. Muse investigates, within fixed bounds
Meta’s Muse receives the request as JSON-encoded, untrusted data. It may call three read-only lookups:
lookup_approval, get_document_facts and get_recipient_facts. After four tool calls
or four model calls it must answer. The worst-case cost of each call is reserved against a spend cap before the call is
made.
3. Evidence is checked by code
The answer must match a strict schema. A threat finding becomes BLOCK only if code confirms everything it cites: quotes must appear in the request, and registry, document and recipient claims must match the server’s own records. A finding that can’t be confirmed is held for a person, which turns a possible false positive into a review instead of a refusal.
4. Policy decides
policy.py is the only code that can return ALLOW,
and only when every check passes explicitly. The absence of a denial is never enough. A missing or unknown approval is
treated as uncertainty and held, not as proof of forgery.
5. Delivery and receipt
An allowed request produces exactly one item in a local outbox, bound to the approved bytes and destination. Every outcome writes a durable receipt. Duplicate, concurrent and crash-and-restart behavior is covered by system tests.
Scope check code
Unknown or restricted documents, unapproved recipients and inactive senders are denied before any model is called.
Investigation Muse · advisory
Muse reads the request as untrusted data and may call three read-only lookups, with a fixed limit on calls and a spend cap.
Evidence check code
Every quote and registry fact the model cites must exist. A threat finding that cannot be confirmed is held, not blocked.
Decision code
policy.pyis the only code that can produce ALLOW. Model output grants no capability.Outbox and receipt code
At most one bound outbox item per request, and a durable receipt for every result. Held requests wait for a local operator.
The four outcomes
- Meaning
- A threat finding whose supporting evidence code has verified.
- Delivery
- None. A blocked request can never be released.
- Meaning
- The document, recipient or sender is out of scope. Intent is not guessed.
- Delivery
- None. Decided before the model is ever called.
- Meaning
- Uncertainty, a missing approval, unconfirmed evidence or a failed assessment.
- Delivery
- Held. A local operator may release it after the checks run again.
People stay in charge of the uncertain cases
Held requests wait for a local operator. review show explains a case in plain language: why it was held,
what the model found, which evidence checked out, the cost, and the exact commands for each allowed decision.
review release delivers a held request only after re-running the scope checks against the current registry.
Blocked requests can be confirmed or marked as false positives, never released.
Review is a local command only. It is never exposed over HTTP. Every operator decision gets its own receipt, and a requester who replays a request sees the decision made on it.
Privacy and records
- The request is stored as a keyed fingerprint (
hmac-sha256), not as message text, so a copied database alone can’t confirm a guessed message. - Receipts keep fixed evidence codes and verification results, not quotes or model-chosen targets.
- On Linux and macOS the database, its side files, lock and key are readable by their owner only.
- Verified backups snapshot the database while the server runs, prove the key matches, and restore without ever overwriting anything.
Sensitive by design
Registered document bytes, including restricted ones, are stored unencrypted in the database and its backups, and exports and the requester’s journal contain request text. Treat the state folder and backups as sensitive. See Limits.
Engineering discipline
- Prompts are pinned by SHA-256. Changing a measured prompt’s text requires a new prompt version.
- Rules for paid prompt decisions are fixed before the data. The prompt is never tuned against the held-out set.
- A deliberate-defect check breaks the safety rules on purpose to prove the tests notice.
- Each layer of work is validated on Windows before the next one starts.