Releases · deeplethe/utopia · GitHub
Skip to content

Releases: deeplethe/utopia

v0.1.0-rc9

v0.1.0-rc9 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 11 Oct 03:42
888761c

Two days after rc8, this release is mostly what people running rc8 found: Gemini's OpenAI-compatible endpoint now works from embedding to tool calls, a deployment with a restricted database role gets its vector indexes, and a failing embedding model no longer silences chat memory. The first cut of regression cases for the ontology arrives, and the old ontology growth loop is retired.

Model endpoints

Four fixes from one deployment against Gemini's OpenAI-compatible endpoint; each also holds for any endpoint that answers in the same shape.

  • An embedding item without an index takes its position beside the indexed ones. On rc8 every ingestion batch failed (#1135).
  • A tool call's extra_content is returned to the endpoint within the turn. Gemini 3 signs each function call and refuses the next request without the signature (#1183).
  • A streamed tool call without an index starts a new call when it brings an id. Two parallel calls used to merge into one with a concatenated name (#1190).
  • A failed answer is logged on the server with its code and the endpoint's message; before, only the browser saw it (#1189).

Memory

  • A memory is extracted even while the embedding model answers with an error, and a sentence that cannot be embedded or extracted no longer blocks the ones after it. On rc8, remember kept answering "Recorded" while nothing reached confirmation (#1188).

Ontology

  • Regression cases. A property remembers the example statements it was approved with, and a person can add a case from any open statement in the document viewer. When alignment decides again after an edit, each case records whether it still binds, and when; a signature a person bound by hand passes and says so. The Ontology page lists the cases with their evidence (0061 cut 2, #1178, #1184).
  • The old growth loop is retired. Suggest, automatic extension and adoption by wording are gone; the agent's proposals are the one way the ontology grows (#1129, #1132, #1128).
  • A column becomes an attribute through the expression tree rules already execute (#1133). A rule update that keeps Y conditions without a join is refused (#1126).

Identity, alignment and extraction

  • Recall does not pair two names that carry different numbers, such as migration 395 and migration 394 (#1134).
  • A phrase signature's vector is kept, so an alignment run embeds only the texts it has not seen (#1186).
  • A vector index is built by the role that owns the table, so a deployment with a restricted runtime role gets its indexes (#1124).
  • An empty balance stops open extraction at the refused chunk; the job fails once and raises the alert (#1118). Duplicate reviews are read in batches and their summary counts are cheaper (#1119).
  • A # line inside a Markdown code block is no longer read as a heading when a time word looks for its section (#1162).

Interface and CLI

  • In the Chinese interface a weekly schedule is saved as valid cron (#1166). The schedule keeps its last valid time while the time box is incomplete (#1168).
  • The worker form offers the range the server accepts, 1 to 256 (#1163).
  • In the rule editor an empty numeric condition is refused instead of saved as zero (#1148), and a range may have signed bounds (#1147).
  • A number with a physical unit is shown as 500 MW, not MW500 (#1143). A data source's database, catalog or schema name may contain #, ? or % (#1157). A field's label is tied to its text input (#1156).
  • utopia backup and restore refuse an option whose value is missing (#1140).

Measured

  • Identity bench for #1134, two builds one commit apart, 16 new bases a side: F1 0.64 before and 0.63 after; decisions between two names that both carry digits fell from 33 to 7 over eight bases a side.
  • The bench scripts take a judge's verdict only when it is the boolean true (#1175), stop instead of scoring when the pipeline misses its deadline (#1174), and refuse an HTTP error page as a filing (#1170).

Housekeeping

CONTRIBUTING says how much test a change carries, that a test has to run in CI, and when a pull request must explain its size (#1180). The README has a new banner (#1182, #1185, #1191). The web lockfile takes the patched MCP SDK, proxy-addr, source-map-js and postcss-selector-parser 7 (#1125). Tests that proved again what their change left alone were removed (#1127).

Upgrading

  • Migrations 0109 and 0110, both forward-only, applied on startup. An rc8 database with data (two documents and a pushed statement) was started on this build: the counts were unchanged, the old account signed in, documents, search and the sealed model keys read back, and a new document, a new push and a new memory were processed with no failed job.
  • Routes removed with the old growth loop: POST /ontology/suggest, POST /ontology/misses/dismiss and /restore, GET /ontology/proposed-predicates, GET /ontology/auto-extension, POST and DELETE /ontology/adopt-predicate. GET /ontology no longer returns misses. The auto_extend_ontology setting is still accepted and has no effect.
  • A base that still holds typed facts without a predicate from before the open graph can no longer adopt their wordings as relations. Bases built on rc7 or later have none.

Thanks

To everyone whose work is in this release: @gedaiu, @rudycelekli, @virtue039, @evolv3ai, @Floating-Y, @Aschenbath and @asaf-shitrit. And to @BColladoT, whose reports led to #1124 and #1134.

v0.1.0-rc8

v0.1.0-rc8 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 09 Oct 06:46
d592c9c

Two 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:hexBinary range is imported as text (#1008).

Alignment and extraction

  • Every model call uses the workspace's reasoning effort, and none is 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_effort like every other call. On DeepSeek endpoints, none turns thinking off and minimal does 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.

v0.1.0-rc7

v0.1.0-rc7 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 25 Sep 21:21
70e852e

Six days in which the typed graph became a view that keeps itself honest: alignment learned to reconcile what it writes, to shortlist what it asks about and to read a model's answer in whatever shape it comes; an errata agent now needs two votes and a structural reason before it retracts anything; a name meets its entity through a vector as well as a string; and a source can push statements straight into the open contract.

Alignment writes a view, and the view reconciles itself

  • A phrase decision records the inputs it considered, so a binding is stale when its basis changed, not when a clock says so (0053, #878). A human decision commits with its own recomputation job and answers 202 (0051, #876).
  • Materialization reconciles the rows it writes along their uniqueness timelines, as the write path always did, so a later observation of a functional attribute closes the earlier one without a manual reconcile; a document version keeps the date it was pushed with, so a same-identity update no longer makes two values look simultaneous (#911, from the #875 replay in #898).
  • A shape of statement can imply a fact of another property, read once per phrase and cached (#882); a business rule may join two entities and conclude a relation (0047, #861); a rule's definition has a history, and a conclusion names the version it was drawn under (0060, #913).
  • The aligner reads the kind-word and phrase replies in the shapes models actually write, and asks again a bounded number of times, so a whole base no longer stays untyped in silence (#894, #895). When the structure fits more than ten properties it shows the ten nearest by the ontology's own vectors, describes the candidates once per batch, accepts a label where a key was asked for, and asks for rules only about bound signatures (#906).
  • Each task thinks as hard as it needs: chat_reasoning_effort in the workspace settings rides on every chat call, extraction and errata run at minimal, alignment and rule proposals at low, all measured on the typed-graph bench (#906, migration 0075).

An errata agent, on two votes and a flag

An agent reviews each document's typed facts through the gate, structure first (0044 decision 7, #885). The first measured runs showed it retracting mostly what the document did say, so a retraction or revision now needs a structural flag and a second vote asked alone with the document; an unflagged fact is never retracted by the agent alone. Additions opened the other way: a name the document contains becomes an entity, and a document with no typed facts is reviewed once with an empty list (#906). On 100 documents: 34 wrong retractions to zero, recall 9.3% to 18.4%.

A name meets its entity

Recall proposes a pair by name vector, so a short form or a name in another script meets its entity through a question rather than a silent second entity (0041 cut 2, #877, migration 0080). A pair proposed by similarity rather than by the same string is never merged on the batch verdict alone: it takes the tool-using second look, or goes to a person when that look cannot run (#889). Review paging looks the two entities up before their same-name peers (#888).

A source may push statements

A Statements source accepts the open extraction contract over HTTP with its own push token: what a client sends is what the graph reads, no model in between, and it reaches the typed layer the same way a document does, through alignment. Same identity is an update, deleted is a tombstone, a key outside the contract or a subject not listed is refused at the door (0054, #884).

What a call to the endpoint survives

  • An endpoint that refuses our completion ceiling has stated its own; the call is retried once at that number and the client remembers it, so gpt-4o-mini works again without a setting (#914, fixes #891 from rc6).
  • Two vector index builds, or a drop racing a build, take one lock instead of deadlocking (#887, #908); a loaded embedding runner cannot fail the elapsed-time gate (#881).
  • A base is governed by one run at a time: nine overlapping governance runs were deciding the same clusters ten times over, a third of one bench run's tokens; a run that finds the base busy leaves and books one for a minute later (#916).

Chat and the interface

  • A turn ends in exactly one earned terminal, whatever the producer's exit path, and the stream is parsed by a standard SSE parser (#903, #858, #851, #848); fallback retrieval failures stay distinct from empty results, and a failed save is never reported as a completion (#850, #852, #845).
  • Older conversations are reachable with bounded pagination, history refreshes once after an idle reattachment, stale navigation callbacks stay out of the current view (#855, #856, #854).
  • The chat's search_docs tool now finds the MCP guide, with a test that keeps the docs corpus and the Docs page in step (#905).
  • The data-source dialog reports one outcome at a time: a bad connection string tested and then added no longer shows the same error twice (#925, from #921).

Export and provenance

  • Provenance references stay inside the knowledge base (0048, #832); an export uses one snapshot and validates local references (#833); the preflight coverage follows the schema (#874).
  • A literal object resolves value before summary, a typing conclusion exports its class, and prose is always xsd:string (#865); exported rules say which family they belong to (#910, #904).
  • Document content and versions are served as a read contract (0052, #860).

Measured

A typed-graph bench on Re-DocRED measures what alignment recovers against the record's thresholds, waits on the right jobs, scores what errata adds and logs usage once per reply (#880, #893); the second measured runs and every cut above are tabled in scripts/bench/README.md. The #875 replay (premise-linked plan steps) runs as store tests (#898, #897, #896).

Housekeeping

Login takes the same time whether the email or the password is wrong (#867). Worker concurrency falls back to the migration's default (#871). CI runs lint, test and build as parallel jobs behind one aggregator, database-backed tests included, and the store integration tests compile as one binary (#879, #872, #873, #869, #868, #886).

Upgrading

Migrations 0070 to 0076, 0080 and 0090, all forward-only, applied on startup. An rc6 database with data was migrated and read back by this build without warnings.

v0.1.0-rc6

v0.1.0-rc6 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 19 Sep 08:24
ee8a873

Two weeks in which extraction stopped writing into a schema and started writing what documents say, and alignment learned to turn that back into typed facts. The ledger, the interface and the reading of files all moved with it.

A document is read in its own words

Extraction writes an open graph — the subject, the relation phrase as written, the object, the quote it came from — and nothing is bent to fit a class on the way in (0044, #710, #731, #736).

  • The quote is the first thing a statement carries, so the model copies the sentence before it writes from it (#748)
  • A statement reads on its own, and a thing is named by a proper name or a term that means the same in any document (#743)
  • A statement says its mood: a plan, a forecast and a requirement are not facts about the world, and never become typed facts (#745, #746)
  • A table keeps its headings, its sections and its caption, in HTML, in Word, in a spreadsheet and in a CSV (#744, #750)
  • A memory waits in its own words rather than being written straight into the graph (#735)

The ontology is a view over that, not a gate in front of it

  • A kind word binds to a class and a phrase binds to a property, each by two votes with the candidates reversed, and a person's decision is never overwritten (#741, #751)
  • A bound statement becomes a typed fact through the same gate as any other fact, with its sources recorded; several statements about one triple make one row, not one each (#752, #753)
  • What the aligner could not decide has a queue, beside the other review queues (#754)
  • Editing a class or property definition reconsiders the negative bindings it may now fit, not only the new ones (#775, thanks @Maya-Kid)
  • The ontology table can create classes and properties, not only edit them (#756, thanks @siu91)

Time

  • A document is dated from its own text, every time mention is interpreted by the model and computed by code, and upload time is never a document's date (0045, #724, #740)
  • A timeline closes on how a start was got, not on a number. The resolution grade travels from the mention to the statement to the typed row; a successor whose start could not be anchored closes nothing and opens no conflict, and AUTO_CLOSE_MIN_CONFIDENCE is gone from the engine (#762)

A file is read by something that says how it read it

  • A chunk carries its origin — stated, OCR'd, transcribed, described — the model that produced it, and an anchor back into the original bytes (#719, #722)
  • Scans and images go to a layout service; a recording is read with its speakers, and an unlabelled transcript degrades rather than lying (#720, #721)
  • A PDF whose text layer uses a CJK CMap no longer panics the reader (#761, thanks @Floating-Y)
  • A WebDAV file whose name contains an XML entity is no longer silently skipped (#765, thanks @Maya-Kid)

What a call to the endpoint survives

  • 408, 502, 503, 504 and a request that never sent are transient and retried; 500 is not, and neither is a read timeout (#757)
  • Extraction streams, so the timeout measures silence rather than thinking. A stream that stops mid-answer is a failure, not a short answer (#757), and the two live-stream paths now check the same thing (#785, thanks @Maya-Kid)
  • A multi-byte character split across two network chunks survives (#764, thanks @Maya-Kid)
  • The token ceiling is ours rather than the endpoint's default, and a reply cut at it says so in the drop table (#786, thanks @basil-k-aji-dev)
  • Embedding responses that carry an index are paired by it, not by arrival order (#784, thanks @Maya-Kid)
  • A passage that could not be extracted is a row in the drop table, not silence (#757)

Measured, and left alone

Capping the model's reasoning halves the thinking and costs a sixth of a filing's table figures, 885 statements against 729, and nearly double the misworded rate. The lever is documented and not pulled (#759). Two runs of the same four filings under one configuration differ by about 7% of their statements and half a point of misworded, which is the band any claim has to clear (#769).

Interface

  • A follow-up answer keeps streaming when the previous connection finishes closing (#763, thanks @Maya-Kid)
  • A statement whose object is a value shows the value; the extraction rail beside a document widens with the screen and separates its items (#772)
  • A calendar date that does not exist is refused even when a clock time is supplied (#766, thanks @Maya-Kid)
  • Removing a name asks first (#757), the stop button keeps a stop-sized square (#777), the panel's tab strip starts where its rows do (#771)
  • Closing a fact clears it from the unconfirmed queue (#732, thanks @siu91)

Reads through MCP

Schema reads follow result chunks and are not truncated by the row cap (#737, thanks @rollroyces). Rule and document read failures are tool errors rather than empty successes, and the retrieval limit is applied after visibility filtering (#727, #728, #733, #734, thanks @Maya-Kid).


Thank you @Maya-Kid, @siu91, @rollroyces, @Floating-Y and @basil-k-aji-dev.

v0.1.0-rc5

v0.1.0-rc5 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 05 Sep 00:17
a97a7ae

Time

  • Every graph read now rewinds the second clock. as_of travels beside at all the way to the API, so the graph, its neighbourhoods and an entity's panel can be asked what we believed on a date, not only what was true on one (#317)
  • A wrong extracted date can be corrected without deleting the document. The edit goes through the ledger — the old reading stays, with the correction pointing back at it (#311)

The ledger can leave

  • A base exports as RDF, in Turtle or JSON-LD: GET /api/v1/kbs/{id}/export. Facts carry both clocks as reified statements, evidence rides as PROV-O lineage back to the document and the sentence, and imported classes keep the IRIs they arrived with (#320)

Ontology

  • The ontology can be seen as a schema, not only edited as forms — classes as nodes, inheritance, disjointness and object properties as edges (#281, thanks @kalyp-angel)
  • A deployment's first base starts with a vocabulary instead of an empty one (#325, #292)
  • A class imported without a readable IRI takes its key from its label (#328)
  • Type resolution runs itself after extraction, and applies only what stays inside the subtree (#297)

Who is who

  • Two people with one name in a single document keep their identities (#296)
  • A namesake tie now goes to review instead of being decided by the order rows came back from the database (#329, thanks @ousamabenyounes)
  • The review card stops presenting a namesake pair as 100% context similarity (#310, thanks @Floating-Y)
  • Disambiguating suffixes follow the ontology's own predicates rather than a four-word list, so a schema.org base stops showing two identical "John Smith · Person" (#319)
  • The entity-name guard reads structure instead of a hand-written verb list (#285)

Agents and data

  • An agent can record over MCP. remember is exposed to a write-scoped token held by an editor, and what it records waits in Review before entering the graph; the card names which agent said it (#318)
  • MySQL-compatible warehouses can be mounted — one driver reaches TiDB, OceanBase, Doris and StarRocks (#315, #323)
  • A data source is usable the moment it is registered (#294)
  • Trino now has a test against a real cluster (#327)

Security

  • Credentials are sealed before they reach the database (#284)
  • The push key is compared in constant time (#301)
  • Purging a deleted document removes its content for good (#283)

Also

Empty pages say which step comes next (#321) · the class form has room to breathe (#288) · search boxes stand at one height (#312) · one embedding refresh per base at a time (#295) · the in-app docs explain agents over MCP (#293) · the README says what ships (#291) · the benchmark gets an answer key that does not come from us (#289) and a GLiNER side-by-side (#305, #309) · business rules join the roadmap (#278)

Upgrading

The schema still evolves between versions and migrations only roll forward. Pin UTOPIA_IMAGE, and back up the database along with the data directory before upgrading.

v0.1.0-rc4

v0.1.0-rc4 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 03 Sep 19:00
0549296

Fourth release candidate. Deleting a document is now an event that can be undone, retractions retract, failed jobs come back, and CI runs every database test.

Library

  • Deleting a document is an event on the recording axis, not a hole in the database. The document gets a tombstone, its chunks are marked superseded, and nothing is cleared. Only facts whose every source is deleted are retired; a fact another live document vouches for stays. The toast offers Undo, a sync that meets the tombstone while the source still has the file revives it, and re-uploading the same content revives it too. The evidence panel says "source deleted" on a quote whose document is gone. (#273, #268)
  • The privacy policy and the cleanup dialog describe what deletion actually does. (#273)

Review and graph

  • "Retract" on a contradiction retracts the fact you point at, and a resolved violation whose promise did not hold reopens. (#257)
  • A burst of graph events refetches the graph once, not once per event. (#263)
  • The administration page has one name, and the empty graph points at it. (#272)

Sources and jobs

  • A failed job finds its way back to the queue: a knowledge base can rerun its failed jobs, the alert for a model that is out of credit or unreachable offers "Run those again", and an admin can requeue across bases. (#258)
  • The Notion client waits out a rate limit instead of failing the sync. (#269)

Search and chat

  • An agent can read a whole document after a search hit. (#265)
  • A search keeps its query in the URL. (#264)
  • Switching knowledge base lands on the same page, not the same conversation. (#262)
  • Two live answers no longer write into one store. (#259)

Also

  • CI runs every database test, and a missing database fails instead of skipping. (#260, #266)
  • Decision record 0019, "The second clock can be rewound", is planned: an as-of on the recording axis. (#271)
  • README Community wording, by @Danmushu. (#250)
  • Compose defaults to this tag. (#274)

Image: ghcr.io/deeplethe/utopia:0.1.0-rc4

v0.1.0-rc3

v0.1.0-rc3 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 03 Sep 07:29
bb5bfc0

The third release candidate. A security fix reported against rc2, the fix that lets the connectors added in rc2 actually be created, and everything else that landed since. latest still does not point here.

ghcr.io/deeplethe/utopia:0.1.0-rc3

docker-compose.yml defaults to this tag, so the quick start in the README works unchanged.

Security

Source credentials stay on the server. Until now only the custom fetcher's auth_header was stripped from responses; the S3 / Azure / GCS keys, the WebDAV password and the Notion token went out to every viewer of a knowledge base, on listing as well as on create and update. One list of credential keys now governs the listing, the responses, the update merge (an empty field keeps the stored value) and the audit log. Every source endpoint also confirms the source belongs to the knowledge base in the path. Reported by @hekr4jivs (#246). Vulnerability reports go to security@deeplethe.com, see SECURITY.md.

Sources

S3, Azure Blob, Google Cloud Storage, WebDAV and Notion sources can be created — rc2 shipped them in the UI and the sync engine but not in the creation allowlist (#247, also @hekr4jivs). The kinds now come from one enum that the allowlist, the sync dispatcher and the UI list all derive from, with a test that keeps them aligned.

Reasoning

A derivation that contradicts an assertion is no longer silently dropped: it appears under Review > Axioms with the derived triple, the assertion it hit, one clue (the assertion has no end date, two entities share the name, low extraction confidence) and the repairs — give the assertion an end date, retract it, see duplicates, open the ontology, or let both stand. Two rules that produce contradicting derivations are reported once per rule pair under Ontology. On the graph a contested assertion is drawn in an alert colour and a blocked derivation as a ghost edge; the entity panel marks disputed facts and lists the derivations that did not land, each with its proof chain. A derivation's proof chain reads down to the sentence it came from.

Resolution

A declared owl:disjointWith keeps same-name entities apart ahead of class kinship and the built-in confusable list; disjointness is inherited, so a declaration on a parent class reaches its children.

Ask the data

Trino (Iceberg / Delta / Hive), Databricks and Snowflake are query engines behind the same trait; the connection string's scheme picks the engine.

Also

The decision records under docs/decisions are condensed into English.

v0.1.0-rc2

v0.1.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 02 Sep 22:23
69a4c7d

The second release candidate. Everything that landed between rc1 and this tag, plus the fixes from a full end-to-end pass over every feature in the README table. latest still does not point here.

ghcr.io/deeplethe/utopia:0.1.0-rc2

docker-compose.yml defaults to this tag, so the quick start in the README works unchanged.

Sources

S3-compatible buckets (MinIO included), Azure Blob and Google Cloud Storage are sources; so are WebDAV shares and Notion pages, each keeping the document's own clock. A push to an API source without content now marks the document missing as the guide says, and a rejected payload stays in the run history instead of being reported as a source that failed to sync.

Ontology and extraction

Pack import resolves domains and ranges across packs: org:headOf gets its foaf:Agent domain whichever pack came first. Direction is judged by the range as well as the domain, so a fact that only reads correctly backwards is swapped rather than stored as written. The facts a document just produced go through the signature check immediately and any violation waits under Review > Axioms without anyone pressing Run check.

Resolution and review

Same-name entities of sibling classes (Organization / Corporation / OnlineBusiness) now reach the Duplicates queue the entity panel points to. A fact drawn from a remembered sentence waits for a nod before it enters the graph. Activity names the engine — "AI adjudicator" for automatic review decisions, "the engine" for the rest — instead of calling them a removed user.

Data mapping

Explore creates the Metric and Dimension classes it needs, so a fresh base gets proposals; when the model proposes nothing, the alert bell says so, and the Pending list refreshes on its own.

Agents and tools

Personal access tokens have a page of their own under Persona, and the agent gets the configuration to use them.

Also

The Library page no longer crashes on a refresh or a deep link. A citation list is rendered as a block. An empty model balance stops the retry budget from being spent. The README's feature table says each thing once.

v0.1.0-rc1

v0.1.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@WaylandYang WaylandYang released this 02 Sep 13:49
cefb7fe

A release candidate. 0.1.0 was withdrawn — its tag, its GitHub release and its images are gone, and this is what replaces them. latest deliberately does not point here: a candidate that takes latest is not a candidate.

ghcr.io/deeplethe/utopia:0.1.0-rc1

docker-compose.yml defaults to this tag, so the quick start in the README works unchanged.

Reasoning

inverseOf and subPropertyOf reach the reasoner, and both can be declared from the ontology page instead of through SQL. A rule is looked up by the predicate that declared it rather than the one it produced; the two are the same for transitivity and symmetry, which is why the difference stayed invisible until a rule crossed predicates and its results were silently dropped.

Agents and tools

MCP, with personal access tokens that carry a scope without carrying the whole person.

A tool call whose arguments did not parse, or that is missing a required argument, is refused instead of falling back to the user's own question — that fallback produced answers which looked ordinary and were built on the wrong input.

Tool calls and their results replay across turns, so the model can see what it already did. Without that, "translate that" re-ran the whole round and, with several entities sharing a name, came back describing a different set.

Chat

An answer survives the reader leaving. Generation is detached from the request, the in-flight answer lives outside the component that displays it, and a running generation can be reattached to after a reload. The action trace is drawn at the point in the reply where each call happened rather than stacked above it, and citations appear once the answer is finished.

Graph

Edges between the same two nodes fan out into separate arcs instead of overlapping on one line, where their labels used to pile into unreadable stacks. An inverse-derived edge is folded into the edge it came from — one fact said two ways is not two facts.

Also

Rate limits are waited out and reported, and an empty balance is distinguished from one. Switching knowledge base moves the URL, which is what actually changes the base. Star history, from @Danmushu's contribution in #163, rendered by a script in this repository.

Schema migrations run on startup. This is still v0.1: the schema moves between versions.