What is checked, every run
The 33 invariants
Thirty-three checks executed against the real engine and a real database. An exception is a failure, not a pass.
Why invariants rather than a feature list
A feature list says what the author intended. An invariant says what the machine will not allow. Each of the 33 below is a function that manipulates a real tenant in a real SQLite file and asserts an observable outcome. GET /invariants runs all of them now and returns per-check detail, including failures.
The checks
Run at 2026-11-03T12:50:24Z · 33/33 passed in 179.23 ms
| ID | Check | Result | Detail |
|---|---|---|---|
| A33-01 | tenant_isolation_read | pass | cross-tenant get refused |
| A33-02 | tenant_isolation_search | pass | tenant B searched A's token and saw 0 hits |
| A33-03 | no_authority_from_memory | pass | every memory view and hit is annotated non-authoritative |
| A33-04 | injection_quarantined_on_write | pass | status=quarantined reason="matches instruction-injection family 'OVERRIDE'" |
| A33-05 | quarantined_not_returned_by_default | pass | default search returned 0 quarantined hits |
| A33-06 | quarantine_visible_when_explicitly_asked | pass | explicit search listed 1 hit(s), text withheld |
| A33-07 | quarantine_release_requires_named_human | pass | blank reviewer and missing reviewer secret refused |
| A33-08 | quarantine_release_is_audited | pass | audit actions=['release', 'write'] |
| A33-09 | released_memory_becomes_searchable | pass | after release, search returned 1 |
| A33-10 | content_hash_is_stable | pass | 56d3e1e3397f5466... |
| A33-11 | tombstone_survives_forget | pass | row survives with status=deleted |
| A33-12 | deleted_text_is_erased | pass | stored text/terms cleared and view hides text |
| A33-13 | deleted_memory_not_searchable | pass | search returned 0 |
| A33-14 | deleted_memory_not_reinstated_by_search | pass | hits=[] |
| A33-15 | ttl_expires_memory | pass | expired memory excluded from search, still addressable by id |
| A33-16 | chain_valid_after_writes | pass | entries=5 head=fda4910dcd081c6b... |
| A33-17 | chain_detects_edited_entry | pass | edited seq=28 -> entry_hash does not match its contents |
| A33-18 | chain_detects_truncation | pass | deleted tail still walks, but fails against the recorded head |
| A33-19 | write_log_is_append_only | pass | prior seqs preserved as a prefix ([35, 36, 37] -> [35, 36, 37, 38]) |
| A33-20 | provenance_declared_when_source_given | pass | declared/source_attached |
| A33-21 | unattributed_memory_is_unverified | pass | unattributed/unverified |
| A33-22 | contradiction_is_flagged | pass | flags=[{'memory_id': 'mem_8687d484cf6d4dd9', 'similarity': 1.0, 'resolution': 'unresolved', 'note': 'lexical overlap with opposite negation polarity; review, not a verdict'}] |
| A33-23 | contradiction_is_not_resolved | pass | new memory kept active; every flag marked unresolved |
| A33-24 | contradiction_does_not_delete_prior | pass | prior memory untouched |
| A33-25 | recall_is_deterministic | pass | identical order across 2 runs (5 hits) |
| A33-26 | recall_reports_bm25 | pass | ranking=Okapi BM25 (k1=1.5, b=0.75) scores_desc=True |
| A33-27 | tag_filter_is_conjunctive | pass | both tags -> 1, superset -> 0 |
| A33-28 | empty_query_rejected | pass | blank queries refused |
| A33-29 | empty_text_rejected | pass | blank memories refused |
| A33-30 | duplicate_text_gets_distinct_ids | pass | same content hash, distinct identities (no silent dedupe) |
| A33-31 | timestamps_non_decreasing | pass | 1793710224.000 <= 1793710224.002 |
| A33-32 | audit_covers_every_memory | pass | 4 memories, 4 write entries |
| A33-33 | spaces_index_consistent | pass | spaces={'s1': {'space': 's1', 'active': 2}, 's2': {'space': 's2', 'quarantined': 1}} |
How to read a failure
A failing check is evidence, not noise. The response names the check, the detail string and the milliseconds it took. Nothing in this service reports a pass for a check that raised — the runner catches every exception and records passed: false.
AETHER-33 is a product over CAIN-42's governed-memory stack, not a new architecture moat.
Memory never carries authority: every response is annotated
grants_authority: false.
No third-party audit has been performed. Limits ·
FAQ · what is live now