Skip to content

v0.6.1 — Audit-remediated release

Choose a tag to compare

@pjmalandrino pjmalandrino released this 26 May 09:26
· 94 commits to main since this release

Release date : 2026-05-25
Audit verdict : GO — score 90.27/100, 0 CRIT, 3 MAJ planifiés pour 0.7.0
Full audit report : docs/audit/reports/release-0.6.1-reaudit/summary.md


Highlights

Per-document workspace (#263#268)

The legacy single-page /studio editor gives way to a DocWorkspacePage shell with four dedicated tabs: Parse (preview + LAYERS filters + focus mode + tree color-coding), Chunk (Strategy popover for inline rechunk, decoupled "Generate chunks" CTA), Inspect (Markdown / Elements / Images), Compare. Every doc keeps its own state; navigation no longer leaks bbox or analysis context between documents.

Version history with paired snapshots (#267)

Every analysis run and rechunk now writes a frozen (analysis, chunks) snapshot. The History drawer lists them and lets you switch the active analysis on the fly — no more lost intermediates.

Backend goes DDD-granular (#256, #269)

New ChunkService exposes 9 doc-scoped routes under /api/documents/{id}/chunks/*. The no-UX-shaped-routes rule is now codified — every existing /api/* route is classified in docs/design/269-backend-ddd-audit.md.

Stores get real connection credentials (#279)

Stores are no longer pinned to env-var-only connections. Each store row carries its own connection_uri / connection_username / connection_password, with passwords sealed at rest via Fernet (STORE_SECRET_KEY). Per-(uri, user) connection pools for both Neo4j and OpenSearch. New "Test connection" button in the store form.

Ingest tab + push history (#225, #283, #285)

Workspace gets a proper Ingest view: history-driven shell, pending-push badge on the CTA, hierarchical doc tree with per-tab CTAs and ingest-targets popover. Backend exposes GET /api/documents/{id}/chunks/pushes for the history feed.

Master surface flags (#257)

Two new env-vars gate two opt-in surfaces:

  • STUDIO_MODE_ENABLED — re-enables the legacy /studio page (kept around until 0.7.0 ships its rewrite)
  • RAG_PIPELINE_ENABLED — gates the reasoning pipeline

Both default to false in production (see BREAKING below).

Karate UI e2e suite

First batch of UI regression coverage lands under e2e/ui/ — driven by Karate UI, not Playwright. CI runs @critical tagged scenarios on main.


⚠️ BREAKING CHANGES — read before upgrading

1. POST /api/documents/{id}/chunks/push response field

- { "jobId": "...", "summary": { ... } }
+ { "pushId": "...", "summary": { ... } }

Frontend consumers and any external script that calls this endpoint must update.

2. Surface flags default off in production

STUDIO_MODE_ENABLED and RAG_PIPELINE_ENABLED were implicitly on before 0.6.1. If you rely on the legacy /studio page or the RAG pipeline, set them explicitly:

# docker-compose.yml or .env
STUDIO_MODE_ENABLED: "true"
RAG_PIPELINE_ENABLED: "true"

3. STORE_SECRET_KEY required for sealed stores

Any 0.6.0 deployment that already created store rows with sealed passwords will fail to boot on 0.6.1 until STORE_SECRET_KEY is provided.

Generate a Fernet key and pin it in the environment:

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

Rotating the key invalidates every existing sealed value — keep it stable.

4. i18n keys renamed

Any external translation override file must update:

Old key New key
chunks.pushedJob chunks.pushDispatched
chunks.stale.jobDispatched chunks.stale.pushDispatched
docs.jobDispatched docs.pushDispatched

Placeholder {jobId}{pushId} in all three.

5. No auto-migration from 0.5.x (carried over from 0.6.0)

The SQLite schema is bootstrapped fresh from _SCHEMA. Upgrading from a 0.5.x database requires either (a) re-importing your documents into a fresh DB, or (b) hand-rolling the catch-up DDL.


Installation

Docker (recommended)

# Pull the new image (pick remote OR local)
docker pull ghcr.io/scub-france/docling-studio:0.6.1-local
# or
docker pull ghcr.io/scub-france/docling-studio:0.6.1-remote

# Multi-arch: linux/amd64 + linux/arm64

Docker Compose

Update your docker-compose.yml (or .env) per the BREAKING CHANGES section above, then:

docker compose pull
docker compose up -d --wait
curl -s http://localhost:3000/api/health | jq .
# Expected: {"status":"ok","version":"0.6.1","engine":"...","deploymentMode":"self-hosted"}

See docs/release/deployment-checklist.md for the full deploy + smoke-test procedure.


Quality gate

This release is the first to ship after a full 12-point audit + remediation cycle. Initial verdict was NO-GO (4 CRIT, 11 MAJ, score 79.12/100). After remediation, re-audit verdict is GO (0 CRIT, 3 MAJ planifiés pour 0.7.0, score 90.27/100).

Audit dimension Score
01 Clean Architecture (Hexagonal) 97/100 — GO
02 DDD 97/100 — GO
03 Clean Code 72/100 — GO CONDITIONNEL
04 KISS 87.5/100 — GO
05 DRY 75/100 — GO CONDITIONNEL
06 SOLID 100/100 — GO
07 Decoupling 73/100 — GO CONDITIONNEL
08 Security 100/100 — GO
09 Tests 96/100 — GO
10 CI / Build 100/100 — GO
11 Documentation 100/100 — GO
12 Performance 85.7/100 — GO

Validation pipeline shipped green : backend 733 pytest, frontend 400 vitest, Karate API 39 e2e (12 features), Ruff + ESLint + Prettier + vue-tsc clean, Docker compose stack Healthy, multi-arch images built.

Full per-audit reports under docs/audit/reports/release-0.6.1-reaudit/.


Full changelog

See CHANGELOG.md § 0.6.1 for the unabridged Added / Changed / Fixed / Security / BREAKING CHANGES sections.

Diff : v0.5.1...v0.6.1