User workflow
- Enter a question in the global Omnibox and select Ask, or select documents on the Documents screen and choose Ask selection.
- Suchi opens Archive research with the active scope shown in the header.
- The server retrieves at most six authorized evidence sources.
- The model returns one structured answer with source numbers.
- Suchi rejects malformed or out-of-range citations before rendering anything.
- The user can open a cited source or explicitly continue to Views, Approvals, or Calendar when the response exposes the corresponding action.
Retrieval architecture
Candidate retrieval
Archive research uses a bounded high-recall lexical candidate pass rather than interpreting the natural-language question as a rich query. Term selection, prefix-OR behavior, BM25 weights, context-source retrieval, and the distinction from ranked Search are centralized in Search architecture: Archive research retrieval.Evidence bounds
- At most six documents per answer.
- At most three reauthorized context documents from the prior turn.
- Provider titles are clamped to 300 Unicode characters. Source text follows the administrator’s Research context preset described below.
- Extracted facts are limited to three per source and twelve total; the response summary still counts every visible fact by status. Their existing 1,600 Unicode-character value and evidence bounds do not grow with Research context.
- Context IDs are loaded directly in requested order without a prior-term test.
- Model generation is capped at 4,096 tokens, including provider reasoning where applicable; the visible answer remains capped at 6,000 characters.
- One provider call per successful turn.
Research context presets
An administrator chooses one global preset under Settings → Archive configuration → Classification. A missing or invalid stored value resolves to Balanced. Saving the preset affects the next question immediately; it does not reload or enable the model, change credentials, apply dates, clear an open research drawer, or require a server restart.
The passage column counts matching FTS windows, not the optional distinct
document ending. That ending and Suchi’s passage separators still count toward
the source-text ceiling. Titles, the question, bounded history, and
capability-gated accepted facts are separate parts of the provider request. The
six-source maximum does not change.
For a long matching document, Suchi keeps the first passage from the complete
normalized question. Balanced and Detailed can add distinct term-specific
passages in question-term order. Each FTS5 passage uses SQLite’s maximum
64-token snippet window. Suchi temporarily marks the first match, clips around
it, removes every marker, and retains at most 1,200 Unicode characters. This
keeps the match even when unusually long tokens push it beyond the first 1,200
characters of SQLite’s snippet. Whitespace-equivalent, duplicate, and contained
passages are removed. When space remains, a distinct document ending is
appended so receipt totals, signatures, and closing clauses are less likely to
disappear.
A document whose complete extracted text fits the selected per-document limit
is sent whole. One restricted FTS query checks every cited follow-up source for
the complete current question, so a matching passage cannot be displaced by
six better-ranked documents and Focused mode still receives it. A long cited
source with no current match uses a bounded beginning-and-ending fallback. The
stitched
snippet returned to the browser is byte-for-byte the source text
supplied to the model, so the reader and provider see the same evidence under
each source number.
Authorization, scope resolution, document content, FTS passages, and fallbacks
are read through one read-only SQLite WAL snapshot per question. A concurrent
ACL, sensitivity, trash, or content change therefore appears either before
that retrieval or on the next one, never halfway through one evidence set.
Focused is the safest starting point for small local models or tight context
windows. Balanced is recommended for most local and hosted models. Detailed is
best reserved for models with enough context capacity when important evidence
is likely to be repeated or far apart in long documents. It can increase
latency, hosted token cost, and the amount of authorized document text sent to
the configured provider.
Detailed improves coverage; it is not exhaustive analysis of every repeated
occurrence in a very large document. Check totals and other high-consequence
claims against the cited sources.
Every research scope below is bounded by the captured current filing system plus
membership/document permissions. Candidate retrieval, prior-turn IDs, accepted
facts, pending suggestions and context passages use that boundary; a multi-system
member cannot ask one request across both. Switching systems destroys browser
conversation state and rejects late responses. Shared model configuration and
FTS/CAS infrastructure do not make foreign documents eligible evidence.
Scope
The research drawer supports these server-enforced scopes:- all accessible archive documents;
- the current rich-query result;
- the current Johnny.Decimal category;
- the exact visible sensitivity, type, tags, correspondents, created-time bounds, and language filters published by Documents or Search;
- the current document; or
- up to 100 explicitly selected documents.
Grounding and citation contract
Suchi requests OpenAI-compatible JSON-object response mode. The provider must then return this schema:1 and the number of supplied sources. The citations array is the
structured grounding contract; Suchi adds any missing inline [n] markers
after validation. Existing inline markers remain accepted for provider
compatibility, and can supply the citation list when the array is empty.
Contradictory or out-of-range source numbers are rejected.
These checks verify the response format and source numbers. They do not prove
that every claim follows from the cited text. The reader can open each source to
check the answer.
When sufficient is false, or a nominally sufficient answer supplies no source
numbers at all, Suchi returns a stable insufficient-evidence answer and retains
the retrieved source boundary. Malformed responses and invalid source numbers
return 502 invalid_provider_response.
A provider response with finish_reason: "length" returns
502 provider_response_truncated, even if its partial text happens to be valid
JSON. Suchi never displays that partial answer or retries automatically. Try a
narrower question or another model if the provider repeatedly reaches its output
limit. Other provider failures return 502 provider_failure.
Document text remains untrusted prompt data. The system instruction tells the
model to ignore role changes and instructions inside evidence. Archive research
has no tools and no write operations, limiting prompt-injection impact to the
proposed answer.
Conversation state
Conversation state exists only in the mounted browser application.- Closing the drawer preserves it.
- Clear deletes it and resets sensitive-document consent.
- Changing the active scope or configured provider resets both transcript and sensitive consent. Disabling sensitive consent clears accumulated history.
- Only complete successful user/assistant pairs enter history.
- Failed and canceled turns cannot poison later role alternation.
- The drawer retains the newest 20 turns, bounding long-session DOM and evidence memory without changing the smaller provider-history limit.
- Only the newest complete pairs fitting four messages and 12 KB are sent.
- Follow-ups carry only sources actually cited by the preceding successful answer; an uncited retrieval set is never used as implicit context.
- The server stores no conversation rows.
Save retrieved documents as a View
Save retrieved documents as a view creates a snapshot withdocument_ids
rather than trying to reconstruct the result from question words. The View
contains the documents shown under Evidence.
Opening or sharing the View re-runs document authorization. A shared snapshot
therefore exposes only the listed documents each viewer can already read.
Snapshot Views contain at most 100 IDs; archive research currently contributes
at most six.
Live Views use the explicit query language; approved
extracted dates participate in its date: and date-role: filters. Archive
research never synthesizes that live query from question words.
Extracted facts and dates
document_intelligence is the shared review ledger for extracted facts. Its
stable columns cover every registered fact type:
- source document;
intelligence_typeand semanticrole;- validated
value_jsonplus an indexedsort_value; - original text, evidence quote, and optional source offset;
- confidence;
pending,accepted, orrejectedstate;- extractor, source blob, and extraction version; and
- reviewer and review timestamp.
core/intelligence. Adding a type requires a
small explicit value contract there, an extractor projection, and a UI renderer.
It does not require a new approval table or state model.
Date extraction, review, and Calendar
Dates use this ledger without adding a second model completion. For the roles, validation rules, confidence threshold, automatic and reviewed dates, rescans, Approvals, and Calendar, see Document dates. Dates available to Calendar may be included beside their original source snippet in a later archive answer. The original document remains the evidence and is still cited. Open N calendar dates counts accepted date facts across all retrieved documents, including sources the answer did not cite. It opens their all-dates agenda, not just the current month. See Document dates: Research links for scope, filters, and pagination.Authorization
Archive research requires:- authentication;
documents:read; and- the
archive_chatcapability, implicit for administrators.
archive_intelligence, also implicit for administrators. Calendar dates are
readable document metadata, so documents:read is sufficient for date: and
date-role: predicates. Extraction and review mutations additionally require
documents:write and Change permission on every source document.
Public demo sessions are denied both capabilities. A narrow Calendar read
exception exposes accepted, curated demo-corpus dates from visible documents;
it grants no access to model output, extraction, review, or Archive research.
Retrieval, source snapshots, extracted fact lists, facts used in chat, and
calendar queries all apply document ACLs inside SQL. Confidential and
Restricted snippets are excluded from chat until the user enables the
per-conversation option. With consent off, only unset, Public, and Internal
sensitivities are eligible; unknown values fail closed.
Provider privacy
The model transport is the same one used by classification:- disabled when no endpoint is configured;
- non-local endpoints require explicit egress acknowledgement;
- redirects are refused;
- API keys never return to the browser;
- response bodies are bounded; and
- provider errors are sanitized.
archive_intelligence—accepted fact value and evidence. It receives no ACL
rows or unrelated document metadata.
The archive-evidence assembly event records only the chosen context mode,
passage count, source count, and bounded evidence size. Failures add a fixed
reason such as output_limit, invalid_answer_json, or citation_out_of_range;
provider bodies and decoder error text are never logged. Separate operational
events still record the normal HTTP method, path, status, byte count, duration,
and request ID; calls to a hosted model also record its host and model name.
Sanitized failures may be logged. None of these events includes questions,
answers, titles, snippets, or extracted evidence.
Abuse controls
Interactive research has three in-process controls:- six evidence-bearing requests per minute per authenticated user, burst two;
- at most two concurrent multi-pass evidence retrievals per Suchi process; and
- at most two concurrent chat completions per Suchi process.
429 chat_rate_limited and Retry-After. Reverse proxies may apply an
additional distributed limit.
HTTP API
Status
Ask
context_source_ids accepts at most three cited IDs. The response includes
answer, sources, citations, grounded, and an
intelligence summary. Facts available to answers appear under their source’s
intelligence field.
Extracted facts
status, type, role, sort_from, sort_to,
document_ids, view_id, q, and normal pagination. q uses the same rich
query compiler as Search and Documents. view_id is resolved server-side and
applies the complete owned/shared View filter plus document ACLs.
The document-scoped Calendar agenda uses this same list endpoint with
status=accepted, type=date, document_ids, page, and page_size=500, without
sort_from or sort_to. Results remain in chronological order across pages;
the optional role filter still applies.
Maintainer file map
Operational checks
Use a real configured model when changing either prompt contract:- Turn automatic Calendar dates off, then classify a long document with a date near the middle.
- Confirm the candidate remains pending and includes matching evidence.
- Approve it and confirm it appears on Calendar.
- Ask a question whose answer uses the Calendar date.
- Confirm the response JSON has valid citations and the source opens.
- Ask a pronoun-based follow-up and confirm the prior cited source remains in the evidence set.
Current limits
- Retrieval is lexical FTS5, not semantic embedding search.
- Chat is intentionally transient and read-only.
- The classification call proposes at most three dates per document.
- Relative dates that cannot be normalized from explicit evidence are ignored.
- Extracted dates represent all-day archival facts; timed events and timezones are outside the current contract.
- Fact rules are never learned implicitly from one approval.