Releases: SFHAJJI/lex
Release list
v1.2.1 — Live temporal-search engineering demo
Lex v1.2.1 — live engineering demo and cross-publisher result fusion
This release publishes the final continuous-browser engineering demo for the expanded Luxembourg/EU temporal search release.
The 74-second narrated recording uses the production site in one take. It shows:
- point-in-time keyword retrieval on 1 March 2020;
- the optional local multilingual hybrid mode;
- the exact applicable CRR Article 92 with validity and provenance;
- a guarded comparison from the Article 92 state beginning 29 June 2021 to 1 January 2025;
- citation/evidence controls; and
- the live Azure deployment commit, immutable image, and signed artifact-manifest identifier.
The compact GIF is a continuous accelerated excerpt of the same recording for the README. The MP4 is the full source of truth and the asset to upload natively to LinkedIn.
This release also contains the production cross-publisher presentation fix: independently ranked Luxembourg and EU result envelopes are fused deterministically instead of concatenated, so one corpus cannot consume every visible result slot.
Artifacts:
law-soufien-interviewer-demo-v2.mp4— full narrated 1280×720 demolex-interviewer-preview-v2.gif— 12.7-second README preview
v1.2.0 — Temporal Luxembourg/EU hybrid search
Lex now searches an expanded, temporal Luxembourg and EU corpus with deterministic keyword retrieval as the production default and optional local hybrid retrieval for conceptual questions.
What shipped
- 2,647 legal works and 9,370 dated versions in the verified production artifact.
- 1,248 EU works across reviewed Luxembourg-facing domains, including every available official consolidated expression selected by scope and relationship closure.
- Exact identifier, citation, title, phrase, article, hierarchy, domain, language, jurisdiction, and date-aware filtering.
- Optional local multilingual semantic retrieval fused with FTS5/BM25; no Azure AI Search or generative model participates in retrieval.
- Temporal article comparison with extraction-profile safeguards, visible sources, evidence export, and stable permalinks.
- Official MCP SDK transport at
https://law.soufien.lu/mcpover the same Luxembourg and EU indexes. - Signed artifact manifests, managed-identity deployment, zero-traffic candidate smoke tests, revision promotion, and immediate rollback.
Keyword remains the default until the published activation gates are satisfied. Benchmark judgments remain honestly labelled by their actual review status.
The attached 69-second demo was recorded against the live production site and ends on its public deployed-architecture evidence.
v1.1.0
Two ways this could answer confidently and wrongly, both closed.
A comparison across extraction profiles now refuses
Comparing the Code du travail between 2020 and 2026 reported 1,196 articles added
and 12 removed. Nothing of the sort happened. The 2020 version was read by
pdf-lu/1 and yielded 13 provisions anchored art_541-8; the 2026 version was
read by akn-lu/1 and yielded 1,197 anchored art_l_010-1. Pairing those by
anchor compares two parsers, not two states of the law, and reports the
disagreement as legislation.
diff now returns provision_level_comparable and, when the two sides came from
different profiles, the status profiles_differ with both profile names, instead
of a diff. The web view refuses in the same terms and links each version instead.
Only when both profiles are known and differ. A null profile means the version
carries no text, and two unknowns are not evidence of a mismatch.
A server with no corpus now says so
The index is roughly 947 MB and is not distributed in the repository or the
container image, so anyone building from source gets a working binary over an
empty shelf. Every tool used to answer such a caller with an empty list:
coverage returned [], search returned [], and nothing distinguished "this
law does not exist" from "no law was ever loaded here". A model reading that
concludes the corpus is empty and tells its user so.
Every tool call against a reader-less server now returns no_corpus_mounted,
naming the directory it searched, how to build an index, and the public hosted
endpoint that serves the same tools over the full corpus.
Also
- A required date argument that is missing or malformed returns
from_date required (ISO date, YYYY-MM-DD)instead of the .NET internal
Value cannot be null. (Parameter 's'), which named a parameter absent from the
tool schema to a caller that is usually a model. - Side-by-side comparison renders every row rather than only changed ones, so on a
comparison made mostly of insertions the toggle no longer appears to do nothing. SQLitePCLRawpinned forward to 3.0.5, closing GHSA-2m69-gcr7-jv3q (high
severity), which arrived transitively via the newestMicrosoft.Data.Sqlite.- Sitemap
lastmodusesobserved_fromrather than a law's commencement date,
which could legitimately be years in the future.
157 tests, including golden snapshots of every rendered page and every tool
response, so any byte that moves has to be explained.
v1.0.0
Point-in-time retrieval of Luxembourg law and ten EU acts.
Regulators publish the current rule. Every audit, investigation and dispute is
about a past date. Lex keeps every version it has seen and answers what a law
said on a given day, with the validity interval, the timeline, and a hash chain
back to the publisher's own bytes.
What is in it
- 1,409 consolidated works and 4,705 dated versions, from the official Legilux
SPARQL endpoint and EUR-Lex Cellar, in French, German, English and
Luxembourgish - A public MCP endpoint at https://law.soufien.lu/mcp, no key and no signup,
with ten read-only tools: as_of, timeline, in_force_on, diff, search,
article_history, provenance, coverage, cited_by, changes_in_period - A server-rendered site where every version of every law has a permalink
- A grounded assistant that answers only from tool results and refuses in
machine-readable form when it cannot know
Why the answers can be checked rather than trusted
Every record carries a SHA-256 of the publisher's bytes and of the derived
document. The index carries a signed stamp binding a content digest, so a
tampered index fails verification rather than answering wrongly. lex verify stamp exits non-zero on a mismatch. Nothing is summarised or paraphrased: the
text served is the text the publisher issued.
Operational
- Corpus rebuilt nightly, indexes signed at build time
- 157 tests, including golden-file snapshots of every rendered page and every
MCP tool response, so a refactor that changes one byte of output fails - Runs as a single self-contained container, indexes baked in, no configuration
Corpus and derived data are CC-BY. The code is Apache-2.0.