What this is
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.
The memory layer
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 to test it
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.
Limitations, stated plainly
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.