What actually changed, dated, in language that means something to somebody
using this.
Latest entry 2026-09-05 · 81 entries
2026-09-05Coverage stays inside the phone viewport
The coverage ledger now tells phone visitors that its full regulation table scrolls horizontally, instead of making the last columns look accidentally cut off.
The same six source-derived columns remain available in a labelled, focusable table region.
Footer links now wrap into the responsive grid on coverage and other inner pages, so they do not widen the page.
2026-09-05A clearer boundary before you connect
The home page now names what Rekvira does not do before a buyer starts the keyless trial.
Rekvira returns official EU-law text and pinpoints; it does not decide what compliance requires.
A direct link to that boundary now leaves its heading visible below the site header.
2026-09-04A shorter path from question to source
The home page now leads a non-technical compliance buyer from the question to the official source without asking them to read a technical product log first.
The fold states who Rekvira is for, the €0 Founding Beta trial, and the live corpus size.
Compliance officers, DPOs, and in-house counsel get one concrete source-led path each.
The full playbook library now has its own /playbooks page. Raw tool sessions and the live table remain available as optional evidence, while coverage stays linked from the buyer path.
2026-09-04Rekvira links now include a product preview
The home page now supplies Rekvira's name, a browser manifest, and a preview image served from Rekvira's own domain.
The preview uses the same teal and dark-navy identity as the home page.
The visible page and its claims are unchanged. The public check follows the scheduled daily deploy.
2026-09-04A source trail before setup
The home page now shows one concrete research path before the technical setup: AI Act Article 26(9), GDPR Article 35, and a citation check.
The example shows the article and paragraph pinpoints Rekvira returns when a team asks about a deployer's DPIA duty.
The page still states the corpus boundary and links to the guided trial rather than presenting the example as legal advice.
2026-09-04Cowork named on /llms.txt
The engine-facing discovery surface now names the same Claude Cowork path as /connect and /skill.md.
/llms.txt lists human-click paths for Claude (desktop, web, or Cowork) beside the start.md and /connect links.
Agents matching on the word Cowork can see the path on the surface they already fetch.
2026-09-04Provider/deployer of AI systems resolve like the short roles
Counsel who type the long AI Act role still hit the same obligation headings as provider and deployer.
lookup_obligations(eu-ai-act, role='provider of an AI system') and providers of AI systems now return Arts 16/50/53/55/88.
deployer of high-risk AI systems returns Arts 26 and 50, matching the short deployer path.
2026-09-04Soft DPIA compliance questions refuse at search
Asking whether completing a DPIA means you are GDPR-compliant is a verdict, not a keyword search.
Soft counsel phrasing such as *Does completing a DPIA mean we are GDPR-compliant?* now returns refusal=compliance_conclusion, matching the sharper *Are we GDPR compliant…* path.
Source questions remain searchable. Ask *What does completing a DPIA mean under the GDPR?* for held Article 35 text.
Rekvira can show the official requirements, but it cannot decide whether your own system is lawful, fit for purpose, eligible for market placement, or ready to launch. Those answers need facts and professional judgment outside the corpus.
Twelve new self-outcome phrasings now return refusal=compliance_conclusion, including *Can we lawfully launch our high-risk AI system?* and *Are our controls fit for purpose under DORA?*
Source questions remain available. Ask *What does the AI Act require before placing a high-risk system on the market?* to get held text and pinpoints.
2026-09-04Cowork named on /connect and /skill.md
Claude Cowork is a first-class connect path, not only web or desktop.
/connect names Cowork beside Claude web and desktop.
/skill.md lists Claude including Cowork so an agent matching on the description can see the same path.
/start.md already named Cowork; the human page and the skill surface now agree.
2026-09-04Singular provider-of GPAI duties resolve to Arts 53/55/88
lookup_obligations used to miss the statutory singular phrasing *provider of general-purpose AI models* while the plural form returned Arts 53, 55 and 88.
The role matcher now pluralizes the head noun before of , so singular and plural both reach those articles.
Guide and tool prose name the singular form so an officer pasting the official wording is not told the heading index is empty.
Ranking and corpus text are unchanged; this is match coverage, not a new obligation list.
2026-09-04DPIA cross-reg search teaches the Art 26(9) ↔ Art 35 bridge
A cross-regulation search that names DPIA, AI Act Article 26(9), and GDPR Article 35 can bury both bridge units behind scope articles. When they are absent from the first ten hits, the search response now carries a search_note that names the honest next step.
Use read_unit for AI Act Article 26(9) and GDPR Article 35, or get_workflow('gdpr-dpia-lookup').
Queries that name Article 26(9) no longer get redirected to GDPR Article 26(1).
Ranking is not boosted. Keyword search is still not obligation lookup.
2026-09-04ICT third-party search teaches DORA Article 28 when ranking buries it
A cross-regulation search for ICT third-party risk can rank scope and definitions articles ahead of DORA Article 28. When Article 28 is absent from the first ten hits, the search response now carries a search_note that names the honest next step.
Use read_unit(regulation='dora', kind='article', number='28') or get_workflow('dora-ict-third-party').
The note stays quiet when Article 28 is already visible in the top ten (for example a query that already includes "register").
Ranking is not boosted. Keyword search is still not obligation lookup.
2026-09-04Paragraph pinpoints win when kind=article conflicts
read_unit used to honour an explicit kind=article even when the same call also carried a paragraph pinpoint such as Article 28(3), and returned the whole-article rollup. The resolver now prefers the more specific paragraph pinpoint and adds a param_note that teaches kind=paragraph.
Conflicting kind=article + pinpoint='Article 28(3)' returns the paragraph text (about 1,331 characters) with the teaching note.
Bare Article 28 without a paragraph pinpoint still returns the article rollup.
verify_citation.next already taught the paragraph shape; read now matches it.
2026-09-03Keep a private compliance playbook in the same trial
You can save a firm-specific compliance procedure in the same keyless client instead of only reading the shipped playbook library.
Call connect and keep its trial_id, then use save_workflow, list_workflows, and get_workflow to write and read your own draft.
publish_workflow marks a draft ready only inside that same trial; it does not add it to the shipped library or share it with another trial. delete_workflow removes only your private draft.
The private state is keyed by the trial_id, with no browser sign-in or cross-device recovery. A lost ID cannot reopen the draft. The privacy notice names the retained fields and asks you not to put personal data in a private workflow.
2026-09-03Remember applicability verdicts across a trial session
A compliance officer who decided Article 6(1) does not apply should not re-derive that every Monday. Two new tools keep structured verdicts on regulation pinpoints for the keyless trial.
connect returns a trial_id. Pass it to record_assessment and list_assessments.
Verdicts are closed: applicable, not_applicable, needs_review, deferred. Reasons are closed codes too (never free-text notes).
Assessments annotate the officer's reading; they never hide search or read results.
Dropping trial_id or switching devices starts empty memory. Browser sign-in stays an operator decision. Product feedback (submit_feedback) stays anonymous and never uses trial_id.
2026-09-03GDPR DPIA / Article 35 playbook
An officer asking whether high-risk processing needs a DPIA now gets a named playbook, not a blank list_workflows and a gym transcript.
get_workflow('gdpr-dpia-lookup') teaches the measured path: heading index is empty and does not name Art 35, also_named names controller Arts 24/26/27/29/79, then search, read, and verify. An AI Act deployer pointer ranks Art 26(9) first.
It does not invent obligation titles. Keyword search is still not obligation lookup.
Every Covered job now has a named playbook.
2026-09-03NIS2 essential-entity playbook
An officer asking how an essential or important entity should read NIS2 now gets a named playbook, not a blank list_workflows and a gym transcript.
get_workflow('nis2-essential-entity') teaches the measured path: heading index is empty, also_named names Art 32 (essential) and Arts 3/33/34 (important), then search, read, and verify.
It does not invent obligation titles. Keyword search is still not obligation lookup.
The DPIA playbook is still not in the catalogue.
2026-09-03Explicit in-conversation feedback, private by design
Agents can now offer to send feedback about Rekvira after a user explicitly approves the exact message. The new submit_feedback tool accepts a bug, feature request, friction, or praise; it never files an agent opinion as a user's words.
It stores only the approved message, its type, whether the user wrote it or approved an agent draft, and the time. It does not attach search text, a profile, or a call history.
The feedback count and latest message are visible only to the operator's existing private traction endpoint, never on a public status page.
The production wire is verified: an unconfirmed request is refused and its attempted body is not echoed. This proves the consent boundary, not a real user response.
2026-09-03Home shows a DORA ICT register session and a GRC price anchor
A procurement buyer asking about an ICT third-party risk register now sees that path on the home page, not only in a gym transcript. The FAQ answers why this is not a GRC replacement and anchors cost against billed counsel hours.
Fourth session card: DORA Art 28(3) search → full read_unit → verify_citation held (design run 106 timings).
FAQ: "Why not the GRC platform and counsel we already pay?" with €0 keyless trial vs hours of counsel research.
Named vendor /compare page still open (CRIT4-1); this ships the loop-executable price anchor on /.
2026-09-03Home footer is a labelled link grid
The public home page footer was a classless <footer> with an unstructured wrap of links. It now uses site-footer plus a responsive site-footer-nav grid. Destinations still come from the runtime generator: Connect, Coverage, Changelog, Privacy, Terms, Sub-processors, and the rest of the existing set.
2026-09-03CI-4 closed: live rollback drill green
CI-4 DoD needed one live moneta dispatch proving rollback on a forced smoke failure (then reverted), plus env-check ratchets so the four mechanisms cannot silently drop.
scripts/env-check.py ratchets DEPLOYED_SHA, --wait, rollback, and dated deploy-watch (--selftest-ci4).
config/ci4-drill.json records run_id33717614858 / date2026-09-03.
2026-09-02CI-4 live rollback drill on moneta
CI-4 DoD still needed one dispatch proving rollback on a forced smoke failure (then reverted). Iter 269 shipped the offline post-deploy-verify --selftest only.
infra/ci4-live-rollback-drill.sh runs on moneta: save known-good → SMOKE_FORCE_FAIL_ONCE → rollback restore → re-smoke green → deploy rejected.
deploy.yml adds workflow_dispatch input ci4_rollback_drill and a dedicated job; scripts/record-ci4-drill.py writes config/ci4-drill.json on success.
2026-09-02ONBOARDING timed walk derives from keyless_walk_constants
docs/ONBOARDING.md still hand-typed ~55 ms connect and ~1.4 s total from iter 237 while /start.md and /connect already derived timings from keyless_walk_constants.py. Prod wire (iter 277, three runs) measured ~100 ms per step and ~1.5 s total.
Refreshed PROD_WIRE_MS from production wire; walk_doc.py feeds start.md, /connect, and ONBOARDING via scripts/sync-onboarding-walk.py.
Ratchets refuse ONBOARDING drift from the shared funnel.
2026-09-02CI-4 deploy-watch runs through post-deploy smoke
Live deploy run 33648658156 measured 12 health polls and 0 consecutive failures, but deploy-watch stopped before origin smoke, so the window ended ~19 s into ship while smoke ran afterward. config/deploy-watch.json now records that live measurement.
deploy.yml stops deploy-watch after post-deploy origin smoke and edge smoke.
Ratchet in test-mcp-api.py asserts step order.
2026-09-02Keyword seeds source matches config
keyword-seeds.py had drifted from config/keywords.json: ranks 48 to 57 lived only in the generated file, so --write would have dropped 10 class-2 rows. Restored the missing ranks in the source and added rank 58 (*use-case register landing session cards*).
2026-09-02CI-4 deploy short-circuit SSH key fix
Since iter 258, every deploy dispatch failed at the DEPLOYED_SHA short-circuit step (runs 33647204242 and three before it) with Load key … error in libcrypto. The last green deploy (33633853252) predated the short-circuit step.
infra/deploy-short-circuit.shread-remote now writes the PEM with a trailing newline (matching deploy.yml) and uses a trap safe when the keyfile is unset.
Ratchets in test-mcp-api.py guard both fixes.
2026-09-02Agent surfaces carry privacy and terms links
Measured 0/3 agent discovery surfaces with explicit privacy and terms URLs (skill.md, llms.txt, start.md had founding-beta only or a privacy FAQ fragment). Buyer HTML footers already linked all three since iter 230.
disclosures.agent_legal_links_plain() + agent_legal_links_markdown() funnel injects privacy, terms and sub-processors on skill.md, llms.txt, and start.md.
Ratchets in test-mcp-api.py for all three surfaces.
2026-09-02CI-4 deploy-watch through MCP deploy
MCP restarts on moneta were invisible to post-deploy smoke. Smoke runs after the stack is healthy, so a gap during docker compose up --wait never failed a deploy.
infra/deploy-watch.py polls https://mcp.rekvira.com/health during deploy; allowance 12 consecutive failures at 2 s poll is dated in config/deploy-watch.json (measured 2026-09-02, sibling-host baseline + mcp-only start_period 20 s).
deploy.yml arms the watcher before rsync, reports after ship, and logs an explicit nothing to deploy step when the DEPLOYED_SHA short-circuit fires.
test_ci4_rollback_wiring is wired into test-mcp-api main (was defined but not run).
2026-09-02CI-4 rollback drill selftest
Post-deploy verify never ran smoke-p0.sh; the smoke command list was passed as extra arguments to boot-check.sh instead of two sequential steps.
run_smoke() now runs boot-check, then smoke-p0.sh (with --origin when requested).
post-deploy-verify.sh --selftest simulates a failed deploy, restores known-good, re-smokes green, and rejects the bad revision (offline drill for CI-4 DoD).
Rollback save/restore skips edge landing paths under ROLLBACK_SELFTEST.
Measured 2/20(regulation, role) pairs return result_count: 0 with empty also_named, only DORA financial entity and operator. heading_note already named search_regulation, but guide, skill, start, tool description, and the dora-ict-third-party playbook taught only the provider also_named path.
guide.py, mcp_server.py, skill.md, start.md, and the DORA ICT playbook now teach: when also_named is empty on DORA, read heading_note and use search_regulation then read_unit (Arts 28/30 for ICT third-party context).
Ratchet covers the triple-zero class and the teaching surfaces.
Counsel phrasing census round 12: 8/20 new verdict-seeking queries slipped through the iter-249 regex (guarantee, warrant, audit-ready, regulatory clearance, confirm we satisfy).
Extended _COMPLIANCE_VERDICT_RE in tools.py; ratchet covers 20 round-12 phrasings.
Production wire: read_unit hostile article= probe added to security v11 suite.
Fleet law 2: the windowed moneta job should end green with "nothing to deploy" when HEAD matches the last green sha over MCP-affecting paths, not rsync and rebuild on every schedule tick.
config/mcp-deploy-pathspec.txt lists what the MCP stack actually ships (services, config, corpus, infra, scripts).
infra/deploy-short-circuit.sh compares DEPLOYED_SHA on moneta against GITHUB_SHA over that pathspec; deploy.yml skips rsync, purge, and smoke when unchanged.
rollback.sh record-success writes /opt/rekvira/DEPLOYED_SHA; compose uses up -d --wait.
2026-09-02CI-4 partial: deploy rollback on red origin smoke
A red post-deploy smoke must not leave production on the rejected revision. The sibling avokata pattern snapshots repo, landing, and MCP image before rsync, then restores on failure.
deploy.yml saves known-good before rsync; origin smoke runs through post-deploy-verify with auto-rollback; edge smoke remains a separate runner step.
Rekvira's EUR-Lex work is a batch library (scripts/fetch-regulations.py), not a long-running compose service. BI12 law 5 still needs an asserted answer, not a silent n/a.
config/etl-lane.json records etl: none with dated measurement evidence (compose lists one service, mcp; no cursor/checkpoint in services/etl/).
env-check.check_etl_lane() fails if compose gains an etl service without lifecycle, drain script, stop_grace_period, and a resume test.
2026-09-02CI workflows use saas-deploy runner label
BI12 law 7 requires SaaS products to route GitHub Actions jobs to the sentinel runner's saas-deploy label, not the portal fleet's portal-deploy.
All 6runs-on lines across deploy.yml, deploy-landing.yml, uptime.yml, and answer-churn.yml now read [self-hosted, linux, x64, saas-deploy].
env-check and test-cadence.py ratchet against portal-deploy regressions.
2026-09-02L-041 regression: MCP deploy restores /connect and /start.md
Iter 252's walk_doc.py funnel imported scripts/keyless_walk.py, which is not copied into the MCP Docker image. Production served 500 on /connect and /start.md until the MCP lane shipped keyless_walk_constants.py inside the image.
Ratchet asserts walk_doc.py never imports from scripts.* (docker class fix).
MCP deploy restores L-041 (/start.md and /skill.md200 on production wire).
2026-09-02Public onboarding surfaces name the measured keyless walk
scripts/keyless_walk.py and docs/ONBOARDING.md documented the five-minute bar since iter 237, but /start.md and /connect still described only generic search/read steps.
walk_doc.py derives the measured tool sequence from keyless_walk.py constants and injects it into /start.md and /connect at serve time.
Production wire (2026-09-02): ~1.6 s total tool time for connect → search → read_unit on Article 26(1).
Production wire probes already called search_regulation with path-like and unknown regulation ids but never asserted the structured decline, unlike sibling tools probed in iter 194.
v11 wire now refuses unknown_regulation for both ../../../etc/passwd and not-a-regulation on the live MCP endpoint.
Ratchets in test-mcp-api.py and test-security.py lock the assertions.
2026-09-02GYM3-3 phrasing census round 11
Counsel phrasings like *compliance memo*, *regulatory sign-off*, and *pass regulatory review* slipped the iter-203 verdict regex and reached keyword search instead of the tool-layer refusal.
Extended _COMPLIANCE_VERDICT_RE with nine round-11 branches (memo, sign-off, scrutiny, readiness, and related patterns).
Ratchet now holds 124 measured verdict phrasings across eleven census rounds.
2026-09-02/pricing JSON-LD shares home offers funnel
Home already published Schema.org AggregateOffer (lowPrice 0, founding-beta honesty); /pricing showed €0 in HTML only. Procurement and search crawlers that land on the pricing URL now get the same machine-readable offer object via one shared funnel.
aggregate_offer_ld() in landing.py: home JSON-LD and /pricing JSON-LD both derive from it.
Rekvira has no content engine like avokata's build-content.py, but gym runs already verify stable MCP paths (connect, deployer search, Art 26(1) body, obligation lookup, citation verify, compliance refusal, and cross-reg DORA interleave). Nothing re-asked them on a clock.
config/answer-churn-probes.json: seven fixed production probes.
scripts/record-answer-churn.py: drives the wire, appends to data/answer-churn.jsonl, commits via infra/ci-commit-push.sh.
.github/workflows/answer-churn.yml: daily at 04:40 UTC from estate runners.
Ratchets in test-cadence.py; env-check points at the new script.
2026-09-02Uptime workflow wired (CI-2 partial)
Fleet PR-1 pattern: the observer runs on estate CI runners, not on moneta, so an outage is detected independently of the host being down. Rekvira had the shared infra/ci-commit-push.sh snippet from iter 242 but no committing workflow yet.
.github/workflows/uptime.yml: every 10 minutes, infra/uptime-check.sh probes rekvira.com, mcp.rekvira.com/health, and mcp.rekvira.com/ping from outside moneta, plus victano/avokata on the shared host.
scripts/record-uptime.py appends to data/uptime.jsonl and commits via infra/ci-commit-push.sh (push failure is a warning, not a run failure).
Ratchets in test-cadence.py.
2026-09-02CI-2 shared commit-push snippet (BI12 law 6)
Fleet law 6: a workflow that commits after a successful probe must not fail the run when git push races another job. Rekvira had no committing workflows yet, but also no shared snippet for when answer-churn or uptime land.
env-check.check_ci_commit_steps() asserts the snippet while BUILD-PLAN CI-2 is open.
Ratchets in test-cadence.py.
2026-09-02Keyless onboarding walk measured and ratcheted
The PERFECT onboarding bar is a citable regulation answer in under five minutes with no account. We had the tools and copy, but no timed replay that proved the bar on production wire.
scripts/keyless_walk.py drives connect → search → read on local tools or --wire against https://mcp.rekvira.com/mcp; production measured ~1.4 s tool time (bar: 5 min).
docs/ONBOARDING.md records the measured steps and how to run the script.
Ratchet test_keyless_five_minute_walk in the gate refuses regressions above the bar.
2026-09-02CI-1 truthful smokes DoD closed on both deploy lanes
Landing lane 3/3 consecutive green pushes: 33609304042, 33612610006, 33616102433. MCP lane 3/3 consecutive workflow_dispatch greens after the bash 5.3 fix: 33616261253, 33616756392, 33616978805. Each run passes origin boot-check --wait then the appropriate smoke (--landing skips corpus floor; full deploy runs edge smoke after origin).
scripts/ci1-dod.py counts consecutive greens per lane; env-check reports status while BUILD-PLAN CI-1 stays open.
2026-09-02Origin smoke survives bash 5.3 when the server is already up
MCP deploy runs 33607399205, 33612636739, and 33614085452 all failed post-deploy smoke with zero edge output. Origin boot-check passed; smoke-p0.sh --origin exited before its first HTTP check. Moneta runs bash 5.3.9: a trailing [ test ] && printf at the end of wait_for_origin is fatal under set -e when the wait loop never prints (origin already answering 200).
Replaced the trailing && with if/fi so the fast path reaches the real smoke checks.
Ratchet in test_ci1_truthful_smokes refuses the old pattern.
2026-09-02CRA annex table rows get Part-aware pinpoints
CRA ANNEX I essential requirements use (N) table cells outside any article division. Ten rows across Part I and Part II previously shared labels like (1) under the same parent, so pinpoints collided as ANNEX I(1).
structure.py routes (N) table matches inside anx_* containers through annex part headings (oj-ti-grseq-1), producing pinpoints such as ANNEX I Part II(1).
fnp_1 closing-formula span now ends at the first annex container (it previously extended to EOF and swallowed annex content).
All five committed corpora re-parsed; AI Act ANNEX VIII section headings pick up the same funnel (29 rows).
2026-09-02Landing deploy rebuilds MCP when render code changes
Deploy landing run 33606877856 went red on /status500 while /api/status stayed 200. The lane had rsynced new status.html markers (FOUNDING-BETA-READ, FOOTER-NAV-INNER) but the MCP image still ran the previous landing.py, so finalize_public_html refused unreplaced markers.
deploy-landing.yml now rsyncs services/mcp/app/ and runs docker compose up -d --build --wait mcp before origin smoke.
Path triggers include the MCP render modules that fill serve-time markers.
2026-09-02Buyer footers link the sub-processor list
The sub-processor page has been live since September, but five buyer surfaces (home, connect, coverage, pricing, and status) did not link it from the footer. Privacy and terms already pointed there in the body copy; the footer is what a procurement or InfoSec reviewer scans.
Footer navigation on buyer HTML pages now derives from one funnel in landing.py, so sub-processors, privacy, and terms stay aligned when a page is added.
/status also links pre-registered founding-beta signal names on /pricing#founding-beta-read, matching /coverage and /api/status.
2026-09-02Deploy smokes wait for health and tell the truth about what shipped
Landing deploy run 33601509816 went red because the edge smoke compared MCP corpus units on the public API against the committed git floor, but a landing push does not ship corpus. The smoke also fired before containers finished starting.
Post-deploy smokes now wait up to 120s for loopback /api/status before probing.
curl -L follows redirects on every HTTP check.
Landing lane runs origin boot-check --wait only (R11: boot-check already covers the smoke-p0 --origin HTTP subset); edge smoke still uses --landing.
Iter 218 dropped two DORA rows when an amendment instruction (N) shared a digit with a quoted insert N., but they are different units. Art 60(2) is *"Article 34 is amended as follows:"* while 60·2. is the trade-repository quote; Art 61(4) vs 61·4. the same.
Both rows ship again (dora570→572 units; fleet total 3536→3538).
Pinpoints distinguish them: Article 60, amendment (2) vs Article 60(2).
read_unit disambiguates with label= when digits collide; standard Article N(M) cites resolve to the quoted insert.
2026-09-02The home page follows the buyer ladder end to end
Sessions on the home page still showed a programme-lead run from an older gym, and the page jumped from playbooks straight to boundaries before the coverage ledger. Buyers who scroll for proof before limits had to hunt.
Worked examples now come from gym run 45 (privacy counsel): cross-regulation AI Act Art 26(9) to GDPR Art 35, with real timings.
A three-step "How it works" strip sits between playbooks and coverage.
Coverage now precedes boundaries; a buyer FAQ and pricing CTA close the page.
2026-09-02Definitions articles no longer cite as recitals
274 numbered rows inside article divisions were stored as preamble recitals because the parser matched the same table-cell shape used in the recital block. The EU AI Act's Article 3 definitions were the worst case: 68 binding definitions cited as "Recital (1)", "Recital (2)", and so on.
Recitals are now scoped to EUR-Lex rct_N divisions only.
In-article numbered definition rows become paragraphs of their parent article, so Article 3(1) reads the 'AI system' means… text with the correct pinpoint.
Two DORA amendment-insert rows that duplicated real numbered paragraphs are dropped (Articles 60 and 61).
2026-09-02The home hero now reads measured liveness, not a deploy flag
The install block on the home page polled /api/status and treated mcp_live as proof the endpoint was answering. That field is a deployment setting somebody typed once; it cannot go false while the container is up. start.md step 0 was corrected in the last release to read probe.ok instead, but the hero block on / did not.
The hero now checks the HTTP response, then reads probe.ok, the same measured field smoke and boot-check assert.
A failed status fetch or a probe that reports unhealthy shows an honest message instead of "Endpoint live".
2026-09-02Search weighs rare words more than common ones
search_regulation used to rank by how many of your words a passage contained, so three common words could outvote the one word that actually identified the answer. search_regulation('eu-ai-act', 'entry into force twentieth day') returned 25 rows and Article 113 was not among them, even though twentieth appears in exactly one place in the act.
Ranking now uses inverse document frequency: a word that appears in one unit counts more than a word that appears in hundreds.
Recitals still rank after operative text; section headings rank after paragraphs and articles.
The same query now returns Article 113 first.
2026-09-02The skill file said we do not hold GDPR
The description in /skill.md is the line an assistant reads to decide whether Rekvira can answer a question. It named four regulations and left out GDPR, which has been loaded since 2026-09-01 and holds 769 of the 3,538 units. An assistant with the skill installed could therefore skip Rekvira on a GDPR question it can answer. The home page said the same thing in different words, four sections above its own coverage table, which listed GDPR as loaded.
Both lines now come from the registry at render time, like the corpus figures already did, so loading a regulation updates every place that names one.
The boundary about coverage now says what is true: all five registered regulations are loaded, and a cross-regulation citation can still name an act outside the registry.
If a future surface names the loaded set without deriving it, the build refuses rather than serving a list that has gone stale.
2026-09-02Articles that used to answer with their own number
read_unit(regulation='eu-ai-act', kind='article', number='113') used to return the text Article 113, wrapped in a CELEX, a pinpoint and a date. That article states when the AI Act applies. It now returns what it says, including the staggered 2025/2026/2027 application dates.
The cause was that only NUMBERED paragraphs were parsed, so an article written as unnumbered sub-paragraphs kept nothing. 74 of 393 articles across the five loaded regulations were in that state; none are now, and 145,742 characters of held text came back.
Unnumbered blocks attach where they are cited from: to the numbered paragraph they follow, so Article 6(1) now carries its second subparagraph, or to the article itself.
14 obligation rows that the guidance advertises pointed at one of those articles. None do now, and that is checked against every role the guidance names rather than a list.
If a future act is marked up in a way the parser cannot read, the answer says so (body_absent, no text, and a link to the official version) rather than returning the article number as though it were the article.
Two things are still wrong, and checking this change on the live service is what found the second one.
The definitions article of the AI Act and of DORA is stored as if it were part of the preamble, so 'AI system' means… cites as a recital rather than as Article 3. 274 of 3,538 units are affected. Recitals are not binding and definitions are.
And search counts how many of your words a passage contains, without noticing that one of them was the rare one. search_regulation('eu-ai-act', 'twentieth') returns Article 113 and nothing else, because that word is in exactly one place in the act. Ask for entry into force twentieth day and Article 113 is not in the 25 rows you get back. Across 40 randomly chosen words that each appear in exactly one place, the passage holding the word was missing from the page 37 times. The response does say there are more matches and how to scope the search, so nothing is hidden. The row you wanted was still not on the page.
2026-09-02A status page that can say no
/status is new: it reports whether the MCP server is answering, how many tools it advertises and how long two real calls took, measured while the page renders. The same figures are in /api/status under probe.
The old liveness field, mcp_live, is a deployment setting somebody typed. It is still there, now labelled as declared rather than measured, and kept in a separate block from anything the page timed.
The check reports a failure when the tools and the coverage ledger disagree about the corpus, or when neither can read one at all. Agreement at zero is not health.
The page names what it cannot see: it runs inside the service, so it does not test DNS, TLS or the CDN in front of it.
start.md step 0 now tells an agent to read probe.ok rather than mcp_live.
2026-09-01Hand a pinpoint straight back to read_unit
Every result row carries a pinpoint like Article 6(1), and read_unit used to reject it as an unknown argument. It now reads that string directly, as read_unit(regulation='gdpr', pinpoint='Article 35(1)'), and says how it resolved it, so the interpretation is visible rather than assumed. A section title reads as the article it heads; a title that heads two articles is declined by name rather than answered with a coin flip.
No tool requires an argument at the schema any more. A call that leaves one out is answered by the service, naming a shape that works, instead of returning a validation error from the framework.
The same sentence about pinpoints is served at connect, on the read_unit description, in start_here, and on /start.md and /skill.md, from one definition.
2026-09-01Every decline now names what would have worked
A tool that cannot answer says why and what to try instead, instead of echoing the arguments back. read_unit answering not_found now names the kind values that regulation actually holds (read from the corpus, not a typed list), the argument shape that works (kind='article', number='6'; add article= for a paragraph), and the tools that find wording or check a citation as written.
unknown_regulation names the regulation ids that are loaded right now, so a wrong id is one call from the right one.
The teaching is attached where every response is assembled, so a decline added later cannot ship silent.
2026-09-01Home coverage freshness ledger on the fold path
The buyer home now carries the same live regulation table as /coverage: loaded counts, CELEX ids, structure kinds, and per-regulation data_as_of, rendered from /api/coverage at serve time, not hand-typed.
Section IV sits after boundaries and before pricing so freshness is visible without leaving the home ladder; full JSON remains at /api/coverage.
2026-09-01Union institution fines path on the AI Act
Counsel working with Union institutions, bodies, offices and agencies can now follow onboarding for lookup_obligations(role='union institution') on the EU AI Act: zero obligation headings, with Art 100 in also_named for administrative fines on Union institutions.
/, /start.md, /skill.md, start_here, and the deployer-obligations playbook name the union-institution path alongside market surveillance authority and notified body.
2026-09-01Ten more counsel phrasings refuse at the tool layer
Ten additional compliance-verdict phrasings that ask for an all clear, a blessing, an endorsement, regulatory approval, or a stamp of approval, including *all clear on AI Act compliance*, *bless our compliance posture*, and *cleared for launch*, now return refusal=compliance_conclusion with zero hits instead of keyword search dressed as an answer.
Obligation lookup and read_unit remain the honest paths when the question is what the regulation requires, not whether you already meet it.
2026-09-01Deploy smoke asserts corpus units floor
Post-deploy smoke-p0.sh now reads the same derived corpus floor as infra/boot-check.sh (corpus-floor.py) and fails when /api/coverage reports fewer loaded regulations or units than the committed corpus, not only when imported-reg count drops below five.
Keeps deploy smoke and post-reboot boot-check aligned (R11 phase-4).
2026-09-01Hero install column rebalanced for fold ink
The home hero now uses a two-column layout on desktop: outcome copy and CTAs on the left, live corpus proof plus the keyless install prompt on the right inside a teal-washed aside. The install block polls /api/status and pulses when the MCP endpoint is live.
Same light-surface doctrine as before: no dark side record panel; fold ink targets the factory 10% surface budget on the right half.
2026-09-01Seven more counsel phrasings refuse at the tool layer
Seven additional compliance-verdict phrasings that ask for certificates, a clean bill of health, or whether you are good to go, including *compliance certificate*, *confirm we meet requirements*, and *state whether we are in compliance*, now return refusal=compliance_conclusion with zero hits instead of keyword search dressed as an answer.
Obligation lookup and read_unit remain the honest paths when the question is what the regulation requires, not whether you already meet it.
The live corpus aside on / now shows tool and playbook counts beside the render-time coverage figures, and the proof copy splits headline counts from source names so the right column reads as evidence at desktop fold (L-055 balance).
Hero layout keeps the light install strip under the primary CTA; no dark side record panel.
2026-09-01Twenty-eight more counsel phrasings refuse at the tool layer
Twenty-eight additional compliance-verdict phrasings that ask for assurance, clearance, or sign-off, including *compliance assurance*, *compliance clearance*, *compliance attestation*, and *legal opinion on AI Act compliance*, now return refusal=compliance_conclusion with zero hits instead of keyword search dressed as an answer.
Obligation lookup and read_unit remain the honest paths when the question is what the regulation requires, not whether you already meet it.
2026-09-01Hostile regulation paths ratcheted on production wire
Production security wire probes now cover path-like regulation ids on lookup_obligations and verify_citation, plus path-like kind on read_unit. These are the same hostile shapes local adversarial tests already exercised on role and cross-reg search.
Path traversal attempts return structured unknown_regulation, invalid_role, or not_found errors with data_as_of, not stack traces or filesystem paths.
2026-09-01Post-deploy smoke now validates /api/status JSON
Deploy smoke (smoke-p0.sh) and post-boot checks (boot-check.sh) now assert the same dash-contract shape: /api/status must return mcp_live, beta, and data_as_of, and boot-check verifies the public changelog carries the newest dated entry from source.
Fleet dashboards and reboot recovery both probe the same contract the dash expects.
2026-09-01Home hero fold rebalanced for desktop
The install prompt on / now sits in a light strip under the primary call to action instead of a dark side panel. At a standard desktop viewport the fold reads as headline, corpus proof, and connect, not half empty and half terminal chrome.
/connect still carries the full setup guide; copy and start.md paths are unchanged.
2026-09-01Wrong MCP param names no longer leak validation errors
Agents that pass query= to lookup_obligations or cite= to verify_citation now get a guided response (with param_note) instead of a raw Pydantic `Field required message. Natural-language query= on obligation lookup is interpreted as role= plus optional system_class=` when the phrase names high-risk.
Use role= and citation= on follow-up calls. The aliases exist so the first mistake does not break the session.
2026-09-01Eight more counsel phrasings refuse at the tool layer
Eight additional compliance-verdict phrasings, including *confirm regulatory compliance*, *compliance opinion*, and *represent compliance to the board*, now return refusal=compliance_conclusion with zero hits instead of keyword search dressed as an answer.
search_regulation and search_regulations refuse these queries and name lookup_obligations, read_unit, and verify_citation as the honest next steps.
2026-09-01Notified body obligation path on the AI Act
Conformity assessment officers can now follow onboarding for lookup_obligations(role='notified body') on the EU AI Act: Arts 34 and 45 return as obligation headings, with Arts 31 through 38 in also_named for requirements, lists, and coordination duties whose titles omit "obligation".
/, /start.md, /skill.md, start_here, and the deployer-obligations playbook name the notified-body path alongside conformity assessment body and market surveillance authority.
2026-09-01Counsel compliance questions refuse at the tool layer
Fourteen additional counsel phrasings that ask for a compliance conclusion, such as *meeting our AI Act obligations*, *considered compliant*, or *claim AI Act compliance*, now return refusal=compliance_conclusion with zero hits instead of keyword search results dressed as an answer.
search_regulation and search_regulations refuse verdict-seeking queries and name lookup_obligations, read_unit, and verify_citation as the honest next steps.
Obligation research queries (for example *What obligations must a deployer meet…*) still search normally.
Annex text from EUR-Lex now parses into numbered points you can cite and verify, not title stubs. Search tells you when a kinds= filter would return zero hits instead of looking like an empty corpus. The coverage page links procurement readers to the founding-beta-read signals on pricing.
AI Act annexes like Annex III carry full body text (for example Annex III point 1 for high-risk classification lists); verify_citation accepts those pinpoints.
When kinds= would hide every match, responses disclose how many hits exist in other kinds and how to undo the filter.
Rekvira now loads five EU regulation modules (the AI Act, DORA, NIS2, CRA and GDPR) with more than three thousand pinpoint units from EUR-Lex. The coverage page and every buyer surface show the live count at render time, not a hand-typed figure.
Cross-regulation search spans every loaded module in one call, with each hit carrying its regulation id for read_unit.
Compliance playbooks and the home page name the tools your assistant should call next, including lookup_obligations for heading-index duties by role.
Privacy and terms pages are published at rekvira.com/privacy and rekvira.com/terms.
A dated sub-processor list is published at rekvira.com/subprocessors (hosting and edge only).
2026-08-31A buyer home, not a connect doc
The front page at rekvira.com/ is now a product page: what Rekvira does, three real gym sessions with tool names and timings, and a Founding Beta strip that says checkout is closed and nothing is charged today.
JSON-LD on the home page carries the live corpus unit count and dateModified from /api/coverage.
2026-08-30Keyless trial on the wire
You can connect Rekvira to Claude, ChatGPT or Cursor without an account or API key. Every answer carries data_as_of and a sources-not-advice note; the trial tells you how many searches you have left today.
Tools include read_unit with article aggregation, verify_citation with exists/quote split, and lookup_obligations matched against section titles that name a role.
start.md, skill.md and llms.txt ship on the public origin for agent discovery.