This log records API friction found while updating Atelier PR #70 to the SQL
diff commands merged in opral/lix#920. The integration is pinned to Lix
origin/main at d0c2c4d5e58c85869e649ff2a5235f3d3576ef18.
The command sinks reject an INSERT … SELECT whose selection is empty with
diff command selection is empty. In a file-scoped UI, an empty selection is a
normal idempotent outcome: a selected file can be unchanged in the requested
range, or reactive state can refresh between rendering and clicking.
Atelier previously ran a matching SELECT count(*) before every selection
command. This added a round trip and left a race between the preflight and the
command. The current integration passes lix_row_ref values directly and
relies on the command result for an empty selection.
Suggestion: treat an empty command selection as a successful zero-row operation, consistent with ordinary SQL DML.
The diff surfaces expose file_id, but file descriptor changes identify their
file through entity_pk. Every file-scoped command therefore repeats:
coalesce(
file_id,
case
when schema_key = 'lix_file_descriptor'
then lix_json_get_text(entity_pk, 0)
end
)Suggestion: expose a normalized logical file_id for file descriptor diffs, or
provide a composed file-diff surface that includes diff_id.
Rejecting VALUES means an application cannot query and inspect a set of
diff_ids, make an application-level selection, then submit that exact set as
parameters. The selection must be reconstructed inside the command SQL.
This is workable for Atelier's current filters, but it couples UI selection logic to SQL text and makes more complex client-side selection harder.
Suggestion: consider allowing parameterized VALUES while retaining stale
diff_id validation in the engine.
After moving the submodule from beb2f1ca to d0c2c4d5, the first
pnpm run build:lix completed both native and WASM Rust builds, then failed in
the SDK TypeScript build:
src/remote/client.ts(1260,36): error TS2307:
Cannot find module 'fflate' or its corresponding type declarations.
The updated SDK manifest declares fflate, but Atelier's existing
node_modules was installed for the previous submodule commit. A root
pnpm install is therefore required after advancing the pinned Lix checkout.
Suggestion: make scripts/build-lix.mjs detect a missing/outdated workspace
install before starting the expensive native and WASM builds, or document the
required reinstall next to the submodule update workflow.
Queries written as FROM lix_file_history now fail during planning with:
table 'datafusion.public.lix_file_history' not found
The new form is lix_history('lix_file') for active-head history or
lix_history('lix_file', $commit_id) for an as-of snapshot. Atelier had to migrate
every history consumer and add a Kysely adapter for the table-valued function.
Queries that previously batched multiple lixcol_as_of_commit_id values now
need one table-function invocation per commit and a UNION ALL or multiple
round trips.
Suggestion: call out this breaking change in migration notes. A first-class
typed SDK/Kysely helper would also keep consumers from using sql<any> for a
public surface.
Writing /docs/ to lix_directory.path now fails with:
non-root path must not end with '/'
Atelier historically uses a trailing slash to distinguish directory paths from file paths throughout the tree UI. The integration now strips the slash at the database boundary and restores it in the filesystem query.
Suggestion: document the directory path invariant prominently. If the strict form is intentional, exposing a canonical path conversion helper would reduce duplicated boundary normalization in clients.
After advancing from d0c2c4d5 to d8d5423c1, inserts into lix_file with
human-readable fixture IDs fail while deriving lix_file_descriptor.entity_pk:
value at primary-key pointer '/id' must be a valid canonical UUID string
The stricter invariant is reasonable, but it surfaced through the derived file
descriptor schema rather than at the lix_file.id boundary. Atelier updated
its newly rebased tests to use canonical deterministic UUIDs.
Suggestion: validate lix_file.id directly and mention the UUID requirement in
the file API migration notes so consumers get an error at the value they wrote.
Atelier's seven-day minimumReleaseAge policy initially rejected the newly
published @lix-js/sdk@0.9.0. Allowing the SDK alone is not sufficient because
its four platform-specific optional packages are versioned and published
separately, so all five packages need explicit exceptions.
This is expected pnpm behavior rather than a Lix bug, but a release checklist snippet listing the SDK and platform package names would make immediate upgrades less error-prone for consumers with dependency-age policies.
Switching from the source pin to @lix-js/sdk@0.9.0 made every query selecting
lix_working_diff.change_kind fail with LIX_COLUMN_NOT_FOUND. The published
table exposes diff_type with the same added | modified | removed values.
Atelier now uses diff_type throughout its own query rows and consumers.
The runtime error clearly listed the available columns, which made diagnosis straightforward. The friction is that TypeScript still accepted the stale column reference, so this incompatibility appeared only at runtime. Generated query types or a 0.9 migration note explicitly calling out the rename would catch or explain this much earlier.