Separation of concerns is cognitive architecture. Python handles mechanics silently. The model handles judgment explicitly. Same database, opposite data flows. Never confuse the two.
Mechanical. Silent. Always runs.
Opens the drawer. Pulls folders. Counts items. Sorts by date. Filters by domain. Computes embeddings. Runs SQL queries.
The Librarian never reads the content. It doesn't know what a brief says. It only knows: "there are 12 briefs in the technology drawer, here they are."
When the drawer is empty, the Librarian reports: "0 briefs found." No error. No confusion. Just a count.
Judgment. Contextual. Only runs when asked.
Reads the cards the Librarian retrieved. Decides which ones matter. Connects dots across briefs. Evaluates relevance. Makes the call.
The Analyst never touches the database. It doesn't know about SQLite queries or embeddings. It only knows: "here are some cards, which ones help me think about this article?"
When the drawer is empty, the Analyst says: "No relevant past briefs found." No breakdown. Just a straightforward admission.
Two phases use the same SQLite file. Direction matters.
From trace run-019e6027. The Librarian retrieved this. The Analyst used it.
No past briefs found for this domain.
The Librarian returns 0 results. The Analyst proceeds without memory. No error state. No fallback logic. The system handles absence gracefully because the separation of concerns makes absence a normal case, not a failure.