Rekvira

Changelog

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.

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.

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.

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.

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.

2026-09-04Cowork named on /llms.txt

The engine-facing discovery surface now names the same Claude Cowork path as /connect and /skill.md.

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.

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.

2026-09-04Source search refuses self-outcome regulatory decisions

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.

2026-09-04Cowork named on /connect and /skill.md

Claude Cowork is a first-class connect path, not only web or desktop.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

2026-09-02DORA financial entity heading_note funnel

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.

2026-09-02Duty clock reads pipe-format ledger rows

perfect-cadence.py counted dated rows (264) while docs/LEDGER.md stated iteration 266, so learnings duty was two iterations late.

2026-09-02USE-CASES register tracks home gym session cards

The buyer job register claimed 0 proven · 0 visible while the home page already showed three gym session cards with real tool names and timings.

2026-09-02Security v11 wire: compliance verdict refusal on production

GYM3-3 refusals were ratcheted locally through round 12 but v11 production wire probes stopped at hostile ids. This iteration extends the live suite:

2026-09-02GYM3-3 round 12: guarantee/warrant/audit-ready verdict refusals

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).

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.

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.

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.

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.

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.

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.

2026-09-02Security wire asserts search_regulation hostile ids

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.

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.

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.

2026-09-02Answer-churn workflow wired (CI-2 partial)

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.

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.

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.

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.

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).

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).

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).

2026-09-02Landing deploy rebuilds MCP when render code changes

Deploy landing run 33606877856 went red on /status 500 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.

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.

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.

2026-09-02DORA amendment instructions restored beside quoted inserts

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

2026-09-01Home fold proof panel carries MCP surface chips

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).

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.

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.

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.

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.

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.

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.

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".

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.

2026-09-01Annex bodies, honest filters, procurement paths

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.

2026-09-01Five regulations, one MCP

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.

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.

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.