ORIGIN

Receipts for everything your AI reads. Five memory systems on CockroachDB.
Licence rulings answered from memory
measuring
CockroachDB Cluster
Connecting...
Storage Backend
-
Active Corpus
-
Atomic Consistency
Single-Txn Commit
§ 1

What the licence memory already knows

Licence text arrives as free text. It might be mit, or CC-BY-NC-4.0, or a paragraph somebody wrote once. ORIGIN rules on each string once and then remembers it. An exact match resolves straight from memory. A near match is found by cosine search over stored rulings, and reinforces the ruling it reused. Only genuinely novel text ever reaches a model.

Strength rises by 0.1 every time a ruling is reused, so rulings that keep earning their place outrank one-off guesses when several near matches compete. This probe is read-only: a public endpoint that learned whatever a stranger typed would corrupt the thing it exists to show.

§ 2

Working memory, and the receipt for every answer

Ask twice. The second question is answered with the first still in memory, and the trace below shows which turns were recalled. The question, both turns, the answer and its source attributions commit in one transaction. A conversation turn and its receipt cannot drift apart, because there is no moment when one exists without the other.

§ 3

The bouncer at the door

Every document is ruled on before the index is built, against the use the corpus was declared for. A non-commercial document entering a commercial corpus blocks the build and quotes the sentence that says why. Not a warning. Warnings do not get read. Unknown licences block too: the policy fails closed.

§ 4

Which past answers used this document?

Someone asks you to remove their content, so you remove it. But you already served answers using it. Which ones? One indexed lookup returns every past answer that cited the document, who asked, and when. That list does not exist anywhere else; at most organisations this question simply has no answer.

The affected list is snapshotted onto the takedown record at the moment it runs, rather than recomputed later. An answer to this question must not change after the fact.

§ 5

Write-back to the data catalogue

Lineage graphs, classification records, and gate validation outcomes synchronize directly to DataHub so enterprise governance teams can view provenance within existing metadata workflows.

Synchronizing status...

Questions

What problem does ORIGIN solve?

An AI system answers questions by reading a pile of documents. Almost nobody can say what was in that pile last month, what each document was licensed for, or which past answers used a document that has since been deleted. ORIGIN keeps the receipts, so all three questions have answers.

Why does that matter right now?

EU AI Act Article 53 obliges providers of general purpose AI models to keep a copyright policy that honours rights reservations, and to publish a dated summary of the content their model was built on. Penalties reach €15M or 3% of global turnover. Article 53 is the obligation ORIGIN maps to directly.

Articles 10, 12 and 13 are sometimes cited for this kind of tool. Those belong to the high risk regime, which is a different chapter with different duties and a later start date. ORIGIN is a tool that helps a provider meet obligations, not a high risk system itself, so Article 53 is the honest anchor.

Who would use it?

Teams running retrieval over third party data, providers with Article 53 duties, and small companies that cannot staff a governance function. For an SME the value is blunt: instead of asking a lawyer to read every dataset card, the build fails when something non-commercial gets in, and it names the clause.


What are the five memory systems?

Working is the conversation itself, in sessions and session_turns, recalled by recency and by cosine search over prior turns. Semantic is the licence rulings in license_determinations, reinforced each time one is reused. Episodic is every past answer and the documents it cited. Temporal is the corpus as it stood at any past instant. Task state is multi step work in agent_tasks, which resumes from its last committed step after a crash.

Why CockroachDB rather than a vector store plus Postgres?

Two reasons, and both are load bearing rather than decorative.

First, most databases only remember now. Change a row and the old version is painted over, so "what did this look like last Tuesday" is a guess. CockroachDB layers versions instead of overwriting them, which turns the point in time question into one line of SQL.

Second, a conversation turn, the answer, and the answer's source attributions all commit in a single transaction. There is no moment where an answer exists without its receipt. A generic vector store cannot express that, because the embeddings and the operational rows live in different systems.

What does the hit rate actually measure?

The share of licence rulings that were reused rather than decided again. A high number means the memory is doing real work: the same messy licence string is not re-adjudicated every time it appears. It is served live from /api/v1/metrics, computed from license_determinations.


How do I try the write endpoints?

Reads are open. Writes need a header. The demo token is published on purpose so anyone can exercise the full path:

curl -X POST $BASE/api/v1/sessions   -H "X-Origin-Token: origin-demo-2026"   -H "Content-Type: application/json"   -d '{"actor":"reviewer"}'

Without the header the same call returns 401. That is the point: the endpoint is gated, and the credential is published rather than absent.

What is worth looking at first?

GET  /api/v1/metrics              hit rate, rulings, sessions, turns
GET  /api/v1/memory/rulings       what the licence memory knows
POST /api/v1/memory/recall        probe it, read only
GET  /api/v1/cluster              live zone config and ranges
GET  /api/v1/impact/{doc_id}      which answers used a document

Ask a question in section 2, then ask a follow up. The trace shows how many prior turns were recalled, which is working memory doing its job.


Why do answers say "extractive"? Where is the language model?

Amazon Bedrock inference is blocked at the AWS organisation policy level on this account. Verified across four regions, every model family, both the converse and invoke_model APIs: listing models succeeds, invoking them returns Operation not allowed. The Bedrock provider is implemented and tested, and it cannot run here.

So the deployed profile answers extractively and labels every such answer as extractive. An extractive answer presented as a generated one would be a lie about provenance, which is the one thing this project cannot do.

Worth noting what this reveals rather than hides: the memory layer is model independent. Most licence decisions never call a model at all, which is why the system stays fully functional with inference unavailable.

How far back does the time travel actually reach?

Shorter than configured. gc.ttlseconds is set to 7 days on the project tables and SHOW ZONE CONFIGURATION confirms it applied, but the measured horizon is roughly 4 to 5 hours. Resolving a table descriptor also reads system ranges, which keep their own shorter TTL, and the usable window is the smaller of the two.

This is why membership is derivable two independent ways. MVCC is exact and cannot be forged by application code, but is bounded. The bitemporal admitted_at and removed_at columns have no horizon, but are only as honest as this codebase. Neither alone is evidence. Agreement between them is, and a mismatch means the ledger was written around.

Is the latency good?

Warm and sequential, p50 is about 172ms and p95 about 197ms. Under eight concurrent requests the p90 rises to roughly 1184ms while p50 barely moves. That tail is Lambda, not CockroachDB: the container image is large and additional cold starts absorb the parallelism. Provisioned concurrency is the fix. Reproduce any of this with deploy/benchmark.py.

Anything else you would want to know before trusting it?

The vector index is not used by the main retrieval query, because that query joins corpus_members and filters on corpus_id, so the planner declines it. At this corpus size the scan is immaterial. Fixing it properly means a (corpus_id, embedding) prefix index.

The permitted use matrix is a deliberately conservative reading of common licence families, and no lawyer has signed it. It is not legal advice. Unknown licences block rather than pass, and genuinely arguable cases return REVIEW and stop the build rather than being resolved automatically in either direction.

Is the data real?

Yes. 569 documents ingested from HuggingFace dataset cards with their actual licence text, messy and inconsistent as published. The distribution is 385 permissive, 94 unknown, 45 attribution, 43 non-commercial, 2 copyleft. Those 43 non-commercial documents are why the policy gate has something real to block.