Repository navigation
v0.1.0-rc8
Pre-releaseTwo weeks in which a document's own dates began to govern what is true when: extraction reads time as it goes, a statement is attested by the date its section speaks from, and a deleted document stops attesting. The ontology is now proposed from the open graph and judged by the questions it answers. Word, Excel, PowerPoint and PDF files are read as they are laid out. This is also the first tag published for linux/arm64 as well as linux/amd64.
Time is read as the document speaks
- Extraction reads time as it goes (0064, #989). Each chunk reports the dates its passage states, and a time word is measured from the date of its own section (#991). A statement is attested by that date, and one with no time holds at every moment (#995). A document that states no date is not asked for one (#998).
- The uniqueness timeline orders a row without a start by its attestation (#1054). Each piece of evidence records when its passage speaks, so a deleted document's date no longer attests (#1059). A row a rule implies is attested by the statements it read (#1012).
- A binding to a state property says which end a single date marks, and a state row with equal ends is never written (#975). An end the timeline derived cites the fact that closed the row, and a corrected date says which end a person changed (#986, #976). A corrected fact keeps the statements it was computed from (#967, #972).
- Time mentions resolve whatever order the model lists them in (#1087). A pushed statement's complete date or zoned timestamp is resolved in code, with no chat model (#1090). A quote and its time words are found across a line break (#1081), a deck's cover date attests every slide (#1082), and an upload's date is read from its filename before its body (#979).
The ontology is proposed from the open graph and judged by its questions
- Competency questions are rows of a base. An agent proposes classes and properties from the signatures and kind words nothing binds, each with a definition and the statements behind it; adopting one writes the element and re-decides those shapes (0061, #945, #947).
- The agent remembers what it has seen, and "already in the ontology" becomes a proposal a person adopts as a binding (#950). It proposes questions for a base that has none, and the ontology is measured by two numbers (#955, #962). Its glossary is trimmed per batch the way alignment picks candidates (#963, #965).
- The editor refreshes the ontology's vectors before alignment runs (#956). A kind-word decision records the inputs it considered (#932). An empty ontology says what the documents still need (#1083). A SHACL shape gives a property the domain and range it does not declare (#1001), and an
xsd:hexBinaryrange is imported as text (#1008).
Alignment and extraction
- Every model call uses the workspace's reasoning effort, and
noneis a value: alignment no longer thinks on its own (#1066). - Phrase alignment batches signatures by their candidates, casts no second vote after a first that says none, and asks no rules of a bare head word (#999). Class definitions are written once per batch of kind words (#1004). Phrase alignment waits for the last kind-word round (#926).
- An extraction reply that is not valid JSON is read item by item, and a slot of the wrong type costs only that slot (#1003, #1011). The usage log says which call it was (#996). The extraction loop is split into call and apply halves, ahead of concurrent chunks (#980).
- On large bases: the signature queries make one pass instead of one scan per group (#1108), and signatures are not embedded while no property has a vector (#1107). Both come from a deployment with 36,000 open statements.
Documents are read as they are laid out
- Word: headings are read as headings, so sections reach the chunks and each is dated by its own date (#1018). A text box is read once (#1020), a non-breaking hyphen is a hyphen (#1031), and a paragraph ends a Markdown block so split tables keep their captions (#1038).
- Spreadsheets and CSV: a date is read as the date it shows (#1017), a number with the 15 significant digits Excel keeps (#1032), and merged cells fill what they cover (#1039). A capped sheet says what was left out (#1043), and a delimited record keeps its empty fields (#1035).
- Slides: tables keep their rows, columns and merged cells (#1042, #1044, #1077), and a line break keeps words apart (#1019).
- PDF: text uses the characters it shows, not the radicals and ligatures that look like them (#1013).
- A chunk is named by the section it holds (#1026). The OCR reader chooses its provider: MinerU as before, or a Volcengine Ark vision model (#1015).
Sources and warehouses
- A ClickHouse warehouse can be mounted read-only, with slow queries stopped by the server timeout or
KILL QUERY(#1094). Databricks and Snowflake results are read to the last chunk and partition (#1063, #1062). - Notion imports keep nested blocks and table cells, and a page that cannot be read leaves its stored body alone (#1085, #1101). An incremental GitHub sync preserves unchanged comments (#1061). WebDAV keeps URL escapes intact (#1052). The GCS path has been run against a real bucket (#1091).
- The Token dialog shows a Statements source its own push URL (#1111).
Identity and reasoning
- A pair that was kept apart is not queued again the next time either entity is mentioned (#1113). An adjudication reply whose reason spans lines is read (#919). Degree and fact counts are scoped to their base (#1072, #1078), and graph rebuilds use foreign-key indexes (#958).
- Transitive chains complete when their right-hand premise arrives later (#1051), keep every premise of the edge they extend (#1037) and every interval of a triple (#1040). Covered derived intervals are removed after propagation (#1073). Provenance references stay inside their base (#938).
Chat
- Stop cancels generation and keeps the partial answer (#969). Long conversations shed old exchanges and recover from context refusals (#973, #1021). A failed answer can be asked again in place (#960).
- Graph answers cite the sentence each fact was read from, and the preview marks it (#968, #977). Only the numbers an answer renders are listed as sources (#952, #953).
- A question goes to the model once and is embedded once per turn (#929, #971, #978). Tools say when they stopped at a limit (#941), list an exact name first (#940) and report an unknown entity id as such (#948). Equal-score retrieval candidates keep their order (#1060).
- Stream failures and refusals carry stable codes the interface words in the reader's language (#951, #931, #957, #1027). A tool call written as text stays out of the answer (#946). Answers and code blocks can be copied without the Clipboard API (#954, #959).
- A page holds one notification stream, gives it up while hidden, and refreshes what it missed after a reconnect (#1053, #1036, #1080). Model event streams are read with every SSE line ending (#1050).
Access and export
- An app with a trusted client id can exchange its user's fresh ID token for a Utopia session (#1049). An invalid personal access token expiry is refused before issuance (#1084).
- RDF export includes what is contested, fact conflicts and axiom violations (#922), and writes numbers and dates in valid XSD forms (#1086).
Measured
- Typed-graph bench on deepseek-flash: 48k tokens per document on a fresh base and 42k on a warm one with alignment thinking, 19k to 22k with thinking off. 0044 records that its token threshold is not met (#1029, #1065, #1068).
- Identity bench for #1113: 29 of 98 review rows re-asked a pair already kept apart before the change, none after.
- New: a bench for time words (#990). The recall, temporal and competency benches wait for the queue to settle, mark incomplete rounds and score what the question asks (#1005, #1014, #1002, #1000, #997). An empty SQL field no longer scores as zero (#1102).
Housekeeping
The repository has a code of conduct, issue forms and a pull request template (#1064). The README says what Utopia is for and walks one path end to end (#928). Decision records carry a one-line status and one index by domain (#974). Extraction failure reasons are stored in English (#1112). The web lockfile takes patched brace-expansion, ip-address and fast-uri (#1046), and the server takes rustls 0.23.45 (#1115).
Upgrading
- Migrations 0077 to 0079 and 0091 to 0106, all forward-only, applied on startup. An rc7 database with data (two documents and a pushed statement) was migrated by this build with no warnings and read back; a new document and a new push were then processed on it.
- The image is multi-arch from this tag: linux/amd64 and linux/arm64 (#939). The compose default moves to it in a follow-up on
dev. - Reasoning effort: alignment used to raise it on its own. It now follows
chat_reasoning_effortlike every other call. On DeepSeek endpoints,noneturns thinking off andminimaldoes not. - A failure reason stored before this release keeps its text until the document is retried.
Thanks
To everyone whose work is in this release: @Maya-Kid, @Floating-Y, @Harbor404, @ansonnmm, @plpycoin, @jeremycapps, @rollroyces, @evolv3ai, @asaf-shitrit, @Fonna, @GhaziBenDahmane, @Yi-111-a, @fabianimv, @virtue039 and @Aschenbath. And to those who reported what they found running it: @BColladoT, @MatheusCylo and @gaotiesuanna.