v0.6.0 #96
benoitcayladbx
announced in
Announcements
v0.6.0
#96
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
OntoBricks — Release Notes V0.6.0
Release date: 2026-06-27 (updated 2026-07-02)
Type: Major feature release
Test status: 2967 passed, 275 skipped, 5 deselected (scenario), 0 failed
(
uv run pytest -q -m "not scenario"). The former full-suite async-endpointordering failures are gone: the nightly Playwright e2e browser suite now
auto-skips in routine runs, so it no longer poisons the in-process event loop.
Summary
v0.6.0 is the largest feature release since v0.5.0. It ships three independent pillars
of new capability:
Collaborative Comments & Tasks — domain-scoped discussion threads, task management,
with a shared team Discussion accessible from every surface (Ontology, Mapping, Graph
Explorer, Validation, and the new Domain → Collaboration page).
Graph Analytics — server-side centrality metrics (PageRank, betweenness, degree,
closeness, clustering), a Data Model Health card, and an AI interpretation agent that
explains and recommends improvements grounded in live entity data.
Mapping Designer depth — per-attribute include/exclude, always-quoted column names,
append-mode OWL/RDFS/SKOS/SHACL import with conflict detection, and a richer
Ontology Designer (neighbourhood highlight, entity search, inheritance toggle, Business
View auto-generation).
In addition the release includes a suite of UX improvements (sidebar user panel, App Logs
viewer, Registry access check, domain menu restructure) and a significant set of bug fixes.
The 2026-06-30 update adds three operational-hardening items on top of the same
version: Domain Edit-Lock (single-editor concurrency control for DRAFT versions),
In-app Registry Permission Grants (apply Lakebase grants from the UI, no
psql),and a deploy-script dependency preflight.
The 2026-07-01 update adds an Ontology & Mapping Audit Trail — a fine-grained,
buffered-then-flushed record of every design change (who / what / when), surfaced as a
third stream in the Domain audit-trail timeline, with AI-assistant edits tagged. It also
reworks the Domain Edit-Lock (release-based, then leased — see below), ships an admin
Settings → Locks panel (registry-wide lock overview + force-unlock), a
close-before-open switch so you never hold two DRAFT locks, and a
make scenario-campaignentrypoint for the live end-to-end journey suites.The 2026-07-02 update gives the Domain Edit-Lock a renew-only lease so abandoned
locks (crashed browser / closed tab) auto-expire instead of needing an admin
force-unlock. The holder's browser keeps the lease alive with a background renew ping;
the lock is never released on page unload (multi-page navigation can't steal it), and
it only lapses after a full TTL with no renew — at which point the next opener silently
reclaims it. TTL is configurable via
ONTOBRICKS_EDIT_LOCK_TTL_S(default 600 s;0disables → prior hold-until-close). The navbar domain badge grows a hover countdown
tooltip of the remaining lease, and a lost lease flips the page to read-only with a
"session expired" banner. The edit-lock service also moved into a dedicated
back/objects/registry/lockmgtsubpackage.No breaking changes. All v0.5.x features are fully intact.
New Features
1. Collaborative Comments & Tasks
Domain versions can now carry a shared Discussion thread accessible from every surface
(Ontology Designer, Mapping Designer, Graph Explorer, Domain → Validation, and the new
Domain → Collaboration page). Comments are threaded; any comment can be turned into a
task assigned to a domain member.
markedsupport), per-thread statuschips, and a standalone "New task" button in the panel header.
diagram), on entity/relationship edit panels, on mapping modals, and on Graph Explorer
node/edge detail panels.
domain_comments,domain_tasks) with thecanonical upgrade script
scripts/upgrade_lakebase_0.5_To_0.6.sql.2. Graph Analytics
A new Analytics tab in the Knowledge Graph Explorer computes and renders:
Clustering — each with a bar chart, clickable bars (navigate to Graph Viewer), metric
explanation popup, and a detail ranking table.
computing metrics on the full connected subgraph for accuracy.
(low degree, low clustering, temporal predicates, high predicate count) and surfaces
them with reasoning badges.
agent_graph_interpreter): tool-enabled agent (up to 8 tooliterations) that calls
get_entity_detailsto ground its insights in live data; returnsKey Findings, Notable Entities, and Recommendations as styled Bootstrap sub-cards.
components, avg degree, density, and top-5 PageRank nodes.
3. Mapping Designer — Per-Attribute Include/Exclude
Attributes (data properties) can be individually excluded from a mapping without deleting
the entity's SQL configuration:
agent's attribute list, R2RML output, and the Mapping Information page.
restarts (persisted in the registry).
4. Append-mode OWL/RDFS Import with Conflict Detection
The OWL and RDFS import tabs now offer a Replace / Append mode selector. Append mode
uses a two-phase flow:
POST /ontology/analyze-import— read-only conflict analysis (new / duplicate /uri_conflict / name_conflict) displayed in a persistent step timeline panel.
POST /ontology/merge-import— per-entity resolution (skip / overwrite / rename)before merge.
Extended format support:
skos:Concept/skos:prefLabel/skos:broadervocabularies.ontology class list.
5. Ontology Designer Improvements
applies a blue glow ring to connected neighbours/endpoints.
arrows; state preserved in
sessionStorage.selected entity and triggers the neighbourhood highlight.
direct neighbours) and saves it as a new Design View (
Auto_<EntityName>); navigatesdirectly to Business Views.
6. Application Logs Viewer (Settings → Admin)
A new Logs section under Settings → Admin streams a live tail of
ontobricks.logwith level filtering (ALL / DEBUG / INFO / WARNING / ERROR), text search, configurable
line count (default 200, max 5 000), and 10-second auto-refresh.
7. Registry Access Check (Settings)
The "Registry Catalog & Volume" panel now includes a Check Access button that runs
two parallel probes:
USAGE/CREATEon schema, andSELECT/INSERT/UPDATE/DELETEon all 10 registry tables; failing checks includethe exact
GRANTSQL to fix them.9. User / Role Info Panel in Sidebar
All pages using the shared sidebar nav show the connected user's email and role badges
(Admin in red, domain role in blue when it differs) pinned to the sidebar footer. The
redundant role pill in the top-right navbar is hidden.
10. Domain Edit-Lock (renew-only lease single-editor + Close button)
Only one browser may edit a given DRAFT
(domain, version)at a time. The firstopener acquires the lock and edits; every later opener lands read-only with a banner
naming the current editor. The lock lives in Lakebase (multi-replica safe).
The concurrency model is a renew-only lease (updated 2026-07-02). Once acquired, the
holder's browser keeps the lease alive with a background renew ping (~TTL/3, and on tab
re-focus); the lock is never released on page unload, so in a multi-page app — where
every navigation is a full unload — nothing can steal it mid-session. A lease only lapses
when no renew arrives for a full TTL, at which point the next opener silently reclaims
the stale lease. TTL is configurable via
ONTOBRICKS_EDIT_LOCK_TTL_S(seconds, default600;0disables the lease → the prior "held until explicit Close / take-over" model).The lease clock reuses the long-dormant
heartbeat_atcolumn, so no migration isrequired. This keeps ownership crisp (no release-then-reacquire churn) while ensuring a
genuinely abandoned lock (crashed browser, closed tab) frees itself instead of needing an
admin.
POST /domain/load-from-ucacquires the lock for a loadedDRAFT version and returns a
lockblock for an immediate toast. Opening a differentdomain closes the previous one first (releases its lock before the new one loads,
so you never hold two DRAFT locks); a same-domain version switch releases the old
version's lock after the new one loads.
edit-lock.jspingsPOST /domain/edit-lock/renewon a timer. If a renew reports the lease was lost(
renewed === false), the page flips to read-only and shows a "your editing sessionexpired — read-only, saving disabled" banner with a Reload button; transient
network blips are ignored (the next tick retries).
#currentDomainName) shows ahover tooltip with a live
M:SScountdown of the remaining lease — only while thisbrowser is the editor and a lease is configured. Frontend-only, reusing the Bootstrap
Tooltip.beside a Close button. Close prompts "Save before closing?" (Save & Close / Close
without saving / Cancel), then
POST /domain/closereleases the lock and resets thesession, returning to the Home page. Any user (viewers included) can close a domain they
have open.
reloads the current domain from the Registry or loads another of its versions (listed from
GET /domain/versions-list, current version flagged), reusingPOST /domain/load-from-uc.A "Save my changes before switching" box (ticked by default) persists edits first; unticking
discards them.
button (
POST /domain/edit-lock/acquirewithforce); the evicted editor is read-onlyon its next page load.
(domain, version, lifecycle status, holder, acquired time,
is_stale) with aforce-unlock action (
GET /settings/locks,POST /settings/locks/release;admin-gated).
PermissionMiddlewareblocks a non-holder'smutating request on a DRAFT version with a 403 ("being edited by …"); a stale lease
is treated as not blocking, so an abandoned lock never locks out a new editor. Admins
are not auto-exempt (they must take over first). Defence-in-depth re-check in
Domain.save_domain_to_uc.body.read-only-lockedclass is folded intothe existing read-only CSS selector group, so every write surface locks down with no
per-control changes;
edit-lock.jsrenders the read-only banner.domain_edit_locks(keyed by(domain_id, version),ON DELETE CASCADE), provisioned as schema owner bybootstrap-lakebase-perms.shandlazily self-healed by the store (
_ensure_domain_edit_locks_table).heartbeat_atisthe lease clock;
acquire_edit_lock'sON CONFLICTreclaims a stale lease viamake_interval. No migration required.back/objects/registry/lockmgtsubpackage (from back.objects.registry.lockmgt import EditLockService); persistence stays onLakebaseRegistryStore.11. In-app Registry Permission Grants (no
psqlrequired)Lakebase registry-schema permissions can now be applied directly from the UI, removing the
psql-dependent manualscripts/bootstrap-lakebase-perms.shstep for the common case.CAN_USE,schema
USAGE/CREATE/DML, and UCALL_PRIVILEGESgrants to the app + MCP serviceprincipals, returning a
permissionssummary (best-effort, never fatal to Initialize).re-applies the grants on demand (
POST /settings/registry/grant-permissions) and rendersa per-grant results panel with any warnings.
back/core/databricks/lakebase_grants.pyand reused by both the graph-DB provisioner and the registry store (no duplication).
12. Deploy-script dependency preflight
scripts/deploy.shnow checks external tooling up front: hard dependencies(
databricks,python3) abort immediately, while soft dependencies (psql, only when aLakebase-target run will reach the GRANT bootstrap) surface a warning and an interactive
"continue anyway?" prompt — instead of failing deep into the deploy.
13. Ontology & Mapping Audit Trail (who / what / when)
Every ontology and mapping change is now traced: who changed it, what changed,
and when. Fine-grained edits (class/property/mapping add/update/remove, SHACL/SWRL/
group edits, imports, resets) are buffered in the working session as they happen and
flushed to the registry in one batch on Save to registry, so the trail survives the
save round-trip while adding no per-edit database chatter.
("Ontology & mapping") alongside status/comments and build runs, with a filter toggle
and version dropdown. Each entry shows the action, affected entity, actor and real edit
time; AI-assistant edits carry an AI badge.
with
source=agent, distinguishing them from human edits.domain_change_eventstable(
source,action,entity_type,entity_ref,summary,meta,occurred_at,created_at), folded into the consolidatedscripts/upgrade_lakebase_0.5_To_0.6.sqlmigration (new installs self-heal).
Bug Fixes
Domain & Registry
_record_build_runnow callsstamp_last_buildon every successful UI/API build, writing directly todomain_versions.last_buildin Lakebase so the "Last Built" indicator survives domainreloads.
read_versionnow reads the canonicaldomains.base_uricolumn;
write_versionuses aCASE WHENguard so an empty incoming value neveroverwrites a stored one; empty-string
base_urinow triggers theDEFAULT_BASE_URIfallback consistently across the session, OWL generator, R2RML generator, and external
API.
Mapping & R2RML
R2RMLGeneratornowunconditionally double-quotes every
rr:columnandrr:templatecolumn reference perR2RML spec §7.4;
R2RMLParserstrips these quotes on read-back. The auto-mapping agentalways backtick-quotes column names in SQL and never submits quoted names as mapping
keys (backtick stripping in
tool_submit_entity_mapping).tool_submit_entity_mapping/_relationshippreserve
excluded_attributesfrom the existing mapping;tool_get_ontologyhidesexcluded attributes from the agent entirely.
Knowledge Graph
TripleStoreFactory._resolve_graph_engineand
_resolve_graph_engine_confignow acceptforce=True; the build pipeline and thesync start endpoint always pass
force=Trueso themanaged_syncedmode is read fromLakebase even immediately after a cold start.
_STATUS_GATE_EDIT_PATHSwasnarrowed from the broad
/dtwin/sync/prefix to/dtwin/sync/startand/dtwin/sync/loadonly; read-only POSTs (/dtwin/sync/filteretc.) are now accessibleregardless of lifecycle status.
Ontology Designer
normalization (smaller entity ID → larger) ensures opposite-direction links offset to
opposite sides; Bezier midpoint placement corrected to
t=0.5(offset × 0.5, not × 1).Affects the Ontology Designer, Mapping Designer, and Business Views (OntoViz).
to a clean lowercase prefix derived from the ontology name, instead of the empty string.
UI & Deployment
SettingsServicenow overlays env-var fallbacks (
LAKEBASE_PROJECT,LAKEBASE_BRANCH,PGDATABASE/LAKEBASE_DATABASE) for empty fields before returning the config.prefillLakebaseConnectionFromConfigextended to also populate
lakebaseUcCatalog; engine change handler triggersloadUcCatalogsForGraphEnginewhen saved mode ismanaged_synced.Anynot imported inUnityCatalog.py— import fixed.runDetailsModalanddomain-runs.jsadded todtwin.html; null guard added inshowRunDetailsObj.blue-tint (
#e8f4fd/#1a73e8) inquery-sigmagraph.css.lakebase_database_resource_segmentempty in DAB command — the resolveddb-…segment is now patched back into_dab_var_overridesbefore the bundle deploy._getand_postin the MCP serverretry up to 3 times (5 s → 10 s → 20 s back-off) on 502/503 cold-start responses.
Upgrade Notes
New deploys (v0.6.0 from scratch)
No special action required beyond the standard
make bootstrap-lakebasewhich creates allrequired tables including
domain_comments,domain_tasks,domain_edit_locks, anddomain_change_events. Registry-schema grants can also be applied straight fromSettings → Initialize (no
psql).Upgrading from v0.5.x
Run the single consolidated migration script as schema owner. It folds in every
0.6-cycle registry addition (collaboration, graph analytics, change audit):
The script creates
domain_comments,domain_tasks,graph_analytics,graph_analytics_runs, anddomain_change_events(with their indexes + CHECKconstraints), drops the dead comment-anchor columns if present, and patches the graph
schema's
*_sync/*__apptables withdatatype/lang. It is fully idempotent andsafe to re-run. Every table is also lazily self-healed by the app on first use
(
_ensure_collab_tables,_ensure_graph_analytics_table,_ensure_change_events_table),so running the script is optional if you prefer the in-app path.
The
domain_edit_lockstable is now provisioned as schema owner byscripts/bootstrap-lakebase-perms.sh(run bymake deploy) and is also listed in theconsolidated
upgrade_lakebase_0.5_To_0.6.sql. Owner-provisioning is required because theapp service principal lacks the
REFERENCESprivilege the table's FK needs, so the app'slazy
_ensure_domain_edit_locks_tableself-heal cannot create it on its own. The in-appgrant flow (Initialize / Repair permissions) covers its DML grants automatically. The
2026-07-02 renew-only lease needs no migration — it reuses the existing
heartbeat_atcolumn as the lease clock — and is tuned purely via theONTOBRICKS_EDIT_LOCK_TTL_Senvironment variable (default 600 s).No other schema changes. No data migrations required.
Changes Summary
registry/CommentService.py,registry/store/lakebase/store.py,api/routers/internal/comments.py,scripts/upgrade_lakebase_0.5_To_0.6.sqlback/core/graph_analysis/GraphMetrics.py,api/routers/internal/dtwin.py,partials/dtwin/_query_analytics.htmlagents/agent_graph_interpreter/,back/objects/digitaltwin/DigitalTwin.pyfront/static/mapping/js/mapping-design.js,back/objects/mapping/Mapping.py,agents/tools/mapping.pyback/core/w3c/owl/OntologyConflictDetector.py,back/objects/ontology/Ontology.py,api/routers/internal/ontology.pyback/core/w3c/rdfs/RDFSParser.pyfront/static/ontology/js/ontology-map.js,ontology-map.css,_ontology_map.htmlapi/routers/internal/settings.py,front/static/config/js/settings-logs.jsback/core/databricks/UnityCatalog.py,back/objects/domain/SettingsService.pyfront/templates/partials/layout/_sidebar_nav.html,css/sidebar-layout.cssback/core/w3c/r2rml/R2RMLGenerator.py,R2RMLParser.pyregistry/store/lakebase/store.py,session/DomainSession.pyregistry/store/base.py,digitaltwin/_build_pipeline.pyback/core/triplestore/TripleStoreFactory.py,digitaltwin/_build_pipeline.pysrc/shared/fastapi/main.pyontology-map.js,mapping-design.js,ontoviz.jsMakefiletests/e2e/conftest.py,.cursor/08-testing-and-deployment.mdcregistry/lockmgt/EditLockService.py,registry/store/lakebase/store.py,registry/store/lakebase/schema.sql,api/routers/internal/domain.py,api/routers/internal/home.py,src/shared/fastapi/main.py,objects/domain/Domain.py,front/static/global/js/edit-lock.js,permissions.css,permissions.js,base.htmlregistry/lockmgt/EditLockService.py,registry/store/lakebase/store.py,api/routers/internal/domain.py,src/shared/fastapi/main.py,objects/domain/Domain.py,front/static/global/js/edit-lock.js,navbar.js,base-ui-handlers.js,main.css,menu_config.json,base.htmlregistry/lockmgt/EditLockService.py,registry/store/lakebase/store.py,api/routers/internal/domain.py,front/static/global/js/edit-lock.jsregistry/lockmgt/EditLockService.py,registry/store/lakebase/store.py,api/routers/internal/settings.py,partials/settings/_settings_locks.html,config/js/settings-locks.js,menu_config.json,settings.htmllockmgtsubpackageregistry/lockmgt/__init__.py,registry/lockmgt/EditLockService.py(moved), import sites (domain.py,settings.py,home.py,main.py),docs/sphinx/api/app.objects.registry.rstback/core/databricks/lakebase_grants.py,registry/store/lakebase/store.py,objects/domain/SettingsService.py,api/routers/internal/settings.py,partials/registry/_registry_configuration.html,registry/js/registry.js,graphdb/lakebase/provisioner.pyMakefile,tests/e2e/scenarios/_harness.py,conftest.py,README.md,test_scenario_0{1,2,3}_*.py,test_scenario_validation.py,pyproject.tomluv.lockpublic-CDN re-pinscripts/deploy.sh,uv.lockpyproject.toml0.6.0What is NOT changed
/api/v1/endpoints are backward-compatible.mappings are logically identical.
settings).
This discussion was created from the release v0.6.0.
All reactions