{
  "changelog_id": "praxikon:sys:registry:register:dataset-releases",
  "changelog_format_version": "1.0.0",
  "dataset_id": "praxikon:sys:registry:dataset:ai-act-implementation-graph",
  "register_started_at": "2026-08-08",
  "generated_from": [
    "data/ai-act/releases.ts",
    "data/ai-act/graph-snapshots",
    "data/ai-act/implementation-graph.ts"
  ],
  "current": {
    "dataset_version": "2.2.0",
    "schema_version": "1.5.0",
    "openapi_version": "1.12.0",
    "default_effective_at": "2026-08-08T00:00:00.000Z",
    "default_known_at": "2026-09-06T00:00:00.000Z"
  },
  "coverage": {
    "recorded_releases": 4,
    "recorded_dataset_versions": [
      "1.1.0",
      "2.0.0",
      "2.1.0",
      "2.2.0"
    ],
    "snapshot_register_started_at": "2026-08-13T00:00:00.000Z",
    "limits": [
      {
        "code": "content_releases_without_a_snapshot",
        "detail": {
          "nl": "1.0.0 verzette de inhoudsteller maar heeft geen vastgelegde momentopname. Die payloads staan niet meer in de repository, dus het verslag valt achteraf niet te maken. Paragraaf 5.6 van het versiebeleid beschrijft in woorden wat er bewoog, en die beschrijving is alles wat er is.",
          "en": "1.0.0 moved the content counter but has no recorded snapshot. Its payloads are no longer in the repository, so the record cannot be created after the fact. Section 5.6 of the versioning policy describes in words what moved, and that description is all there is."
        }
      }
    ]
  },
  "releases": [
    {
      "release_id": "praxikon:sys:registry:release:2026-09-06-application-dates-and-scope",
      "sequence": 14,
      "released_at": "2026-09-06",
      "dataset_version": "2.2.0",
      "schema_version": "1.5.0",
      "openapi_version": "1.12.0",
      "moved": [
        "dataset",
        "schema"
      ],
      "headline": {
        "nl": "De bepalingenlaag is geregistreerd, en de toepassingsdatum staat niet langer in hetzelfde veld als de praktische datum",
        "en": "The provision layer is registered, and the application date no longer shares one field with the practical date"
      },
      "summary": {
        "nl": "De artikelen 43 tot en met 49, 72, 73, 85 en 86 worden in geen van de drie punten van artikel 113, derde alinea, genoemd en vallen daarmee onder de algemene toepassingsdatum van de tweede alinea: 2 augustus 2026. Die datum staat nu op de betrokken plichtobjecten, met het nieuwe veld `timing_basis` dat zegt waarop zij rust. De praktische datum, de dag waarop het hoog-risicoregime van bijlage III een plicht voorwerp geeft, staat ernaast in het eveneens nieuwe veld `high_risk_regime_from` en niet meer in het veld dat een machine als toepassingsdatum leest. De drie objecten die daardoor van inhoud veranderden dragen hun gepubliceerde versie onveranderd naast de nieuwe: wie op de oude kennisdatum bevraagt, krijgt nog steeds wat hij toen kreeg. Daarnaast beoordeelt de motor buiten het bereik van de Unie niets meer in plaats van elke plicht als niet aangewezen te melden, en levert de screening van artikel 5 zonder signaal het toetsdossier als bewijs van die conclusie. Een dossier dat buiten het bereik van de Unie niets beoordeelt, draagt bovendien de bron waarop die uitspraak rust, artikel 2 van de basisverordening, en het gepubliceerde schema aanvaardt die lege lijst alleen nog met die grond erbij. Ten slotte is de bepalingenlaag geregistreerd: de dataset gaat van zevenentwintig naar vierenvijftig plichtobjecten en van vier naar veertien bronnen, met Richtlijn (EU) 2019/1937 erbij. Drie van de nieuwe objecten krijgen een beslisregel; de andere vierentwintig staan met een reden als bewust niet beoordeeld in elke beoordeling, zodat afwezigheid nooit als uitkomst leest.",
        "en": "Articles 43 to 49, 72, 73, 85 and 86 are named in none of the three points of Article 113, third paragraph, and therefore fall under the general application date in the second paragraph: 2 August 2026. That date now sits on the duty objects concerned, with the new field `timing_basis` stating what it rests on. The practical date, the day the Annex III high-risk regime gives a duty an object, sits beside it in the equally new field `high_risk_regime_from` rather than in the field a machine reads as the application date. The three objects whose content changed carry their published version unchanged alongside the new one: anyone querying on the old known_at still gets what they got then. Beyond that, outside the reach of the Union the engine now assesses nothing rather than reporting every duty as not indicated, and the Article 5 screening without a signal delivers the screening record as evidence of that conclusion. A dossier that assesses nothing outside the reach of the Union now also carries the source that statement rests on, Article 2 of the base regulation, and the published schema accepts that empty list only with that ground attached. Finally, the provision layer is registered: the dataset moves from twenty-seven to fifty-four obligation objects and from four to fourteen sources, with Directive (EU) 2019/1937 added. Three of the new objects gain a decision rule; the other twenty-four are declared, with a reason, as deliberately not assessed in every assessment, so absence never reads as an outcome."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": true,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.2.0",
        "recorded_at": "2026-09-06T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 579
      },
      "diff": {
        "available": true,
        "from_dataset_version": "2.1.0",
        "to_dataset_version": "2.2.0",
        "url": "https://www.praxikon.com/api/v1/diff?from_dataset_version=2.1.0&to_dataset_version=2.2.0&lang=en"
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-09-06-scope-and-conditional",
      "sequence": 13,
      "released_at": "2026-09-06",
      "dataset_version": "2.1.0",
      "schema_version": "1.4.0",
      "openapi_version": "1.12.0",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Zeggen welke plichten wel en niet zijn beoordeeld",
        "en": "Saying which duties were and were not assessed"
      },
      "summary": {
        "nl": "Een beoordeling die vijf routes draait en daarna zwijgt over de rest, leest als een uitspraak over alles. Het manifest draagt daarom nu een beoordelingsbereik: per plicht staat of zij is beoordeeld en, wanneer niet, om welke reden. Een profiel dat `profile_version` op 2.0.0 zet, laat de motor iedere geregistreerde plicht langsgaan; een profiel zonder dat veld houdt exact de oude vijf routes en dezelfde uitkomsten. Een voorwaardelijke uitkomst is een eigen antwoordvorm geworden in plaats van een plicht die stil verdwijnt, en een antwoord noemt zijn geadresseerde. Het manifestschema staat daarmee op 1.3.0 en het OpenAPI-document op 1.12.0. Er verdween of hernoemde geen veld, geen enumwaarde verviel, en de graaf bewoog niet: dataset 2.1.0 en schema 1.4.0 staan waar zij stonden.",
        "en": "An assessment that runs five routes and then says nothing about the rest reads as a statement about everything. The manifest therefore now carries an assessment scope: per duty it says whether it was assessed and, if not, on what ground. A profile that sets `profile_version` to 2.0.0 makes the engine walk every registered duty; a profile without that field keeps exactly the original five routes and the same outcomes. A conditional outcome is now an answer shape of its own rather than a duty that quietly disappears, and an answer names its addressee. The manifest schema moves to 1.3.0 and the OpenAPI document to 1.12.0. No field was removed or renamed, no enum member was dropped, and the graph did not move: dataset 2.1.0 and schema 1.4.0 stand where they stood."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.1.0",
        "recorded_at": "2026-08-14T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 425
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-15-addressable-answers",
      "sequence": 12,
      "released_at": "2026-08-15",
      "dataset_version": "2.1.0",
      "schema_version": "1.4.0",
      "openapi_version": "1.11.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Een vast adres voor ieder gepubliceerd antwoord",
        "en": "A stable address for every published answer"
      },
      "summary": {
        "nl": "Het antwoordendpoint kan naast een vrije vraag nu ook exact op `answer_id` of het canonieke paginapad lezen. Basisantwoorden en verfijningen dragen dezelfde taal-onafhankelijke identifier in de volledige en compacte vorm. Het OpenAPI-contract beschrijft de werkelijke respons nu volledig als drie expliciete vormen: compact, volledig en geen treffer. Er verdween of hernoemde geen veld en de graph bewoog niet.",
        "en": "Alongside a free-form question, the answer endpoint can now retrieve an exact `answer_id` or canonical page path. Base answers and refinements carry the same language-independent identifier in the full and compact views. The OpenAPI contract now describes the actual response completely as three explicit shapes: compact, full and no match. No field was removed or renamed and the graph did not move."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.1.0",
        "recorded_at": "2026-08-14T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 425
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-14-article-86",
      "sequence": 11,
      "released_at": "2026-08-14",
      "dataset_version": "2.1.0",
      "schema_version": "1.4.0",
      "openapi_version": "1.10.0-beta.1",
      "moved": [
        "dataset",
        "schema"
      ],
      "headline": {
        "nl": "Het recht dat tegenover de plicht staat",
        "en": "The right that sits opposite the duty"
      },
      "summary": {
        "nl": "De kennisbank dekte de plichten van de gebruiksverantwoordelijke wel en het recht van de persoon over wie wordt beslist niet. Artikel 86 is nu een eigen object: wie geraakt wordt door een besluit dat op de uitvoer van een bijlage III-systeem steunt, kan uitleg vragen over de rol van dat systeem en over de hoofdelementen van het besluit. Het object is het eerste dat een voorlopige lezing draagt. Dat is nieuw in schema 1.4.0: twee velden die zeggen dat de tekst van een bepaling vaststaat terwijl de toepassing ervan nergens is uitgemaakt, met een toelichting die zegt wat er open is en welke andere lezing verdedigbaar is. Die toelichting reist mee in de API, de MCP-antwoorden en de gestructureerde data, en staat niet als voetnoot op een pagina. Het object draagt ook de eerste eigen kennisdatum: tot nu toe droeg elk gepubliceerd object hetzelfde moment, waardoor een venster op de kennisas twee momenten niet kon scheiden.",
        "en": "The knowledge base covered the deployer duties but not the right of the person being decided about. Article 86 is now an object of its own: anyone affected by a decision resting on the output of an Annex III system can request an explanation of the role of that system and of the main elements of the decision. It is the first object to carry a preliminary reading. That is new in schema 1.4.0: two fields saying that the text of a provision is settled while its application has not been decided anywhere, with a note stating what is open and which alternative reading is defensible. That note travels in the API, the MCP responses and the structured data rather than sitting as a footnote on a page. The object also carries the first known_at of its own: until now every published object carried the same moment, so a window on the knowledge axis could not separate two moments."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.1.0",
        "recorded_at": "2026-08-14T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 425
      },
      "diff": {
        "available": true,
        "from_dataset_version": "2.0.0",
        "to_dataset_version": "2.1.0",
        "url": "https://www.praxikon.com/api/v1/diff?from_dataset_version=2.0.0&to_dataset_version=2.1.0&lang=en"
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-compact-answer-view",
      "sequence": 10,
      "released_at": "2026-08-13",
      "dataset_version": "2.0.0",
      "schema_version": "1.3.0",
      "openapi_version": "1.10.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Hetzelfde antwoord, een tiende van de bytes",
        "en": "The same answer, a tenth of the bytes"
      },
      "summary": {
        "nl": "Het antwoord-endpoint kent nu `view=brief`. Die vorm geeft terug wat een agent nodig heeft om te handelen en te verwijzen: de vraag, de vermoedelijke rol, de verplichtingen met label, identifier, status en toepassingsmoment, de eerste acties, het gevraagde bewijs, en per verplichting één vindplaats. Het is hetzelfde antwoord uit dezelfde deterministische engine met de toelichting eruit, niet een ander oordeel. De volledige vorm blijft de standaard en verandert niet; wie de parameter weglaat merkt niets. Een onbekende waarde valt terug op de volledige vorm in plaats van een fout te geven, want een tikfout in een parameter die alleen de omvang bepaalt hoort geen antwoord te kosten.",
        "en": "The answer endpoint now takes `view=brief`. That form returns what an agent needs in order to act and to cite: the question, the likely role, the obligations with label, identifier, legal status and application date, the first actions, the required evidence, and one locator per obligation. It is the same answer from the same deterministic engine with the explanation removed, not a different conclusion. The full form stays the default and does not change; anyone who omits the parameter notices nothing. An unrecognised value falls back to the full form rather than returning an error, because a typo in a parameter that only governs size should not cost an answer."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.0.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "at_release",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-ruling-register",
      "sequence": 9,
      "released_at": "2026-08-13",
      "dataset_version": "2.0.0",
      "schema_version": "1.3.0",
      "openapi_version": "1.9.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Wat wij weten dat een bepaling betekent",
        "en": "What we know a provision means"
      },
      "summary": {
        "nl": "Naast de laag die zegt wat er is gebeurd, staat nu een laag die zegt wat een uitspraak met een bepaling doet: interpreteert, verengt, verruimt, bevestigt of spreekt tegen. Die relatie is het punt, want een uitspraak verandert de tekst van een verplichting niet en verschuift haar ingangsdatum niet; zij verschuift wat wij erover weten, en dat moment staat als aparte datum op de uitspraak. Een manifest dat een verengde verplichting draagt, komt daardoor via `/api/v1/impact` naar boven zonder dat er een veld in de graph bewoog. Er is nog geen rechtspraak over de AI-verordening zelf, en dat staat er met zoveel woorden bij in plaats van als een leeg veld: de zeven opgenomen besluiten zijn AVG-context en dragen uitsluitend de relatie \"illustreert\".",
        "en": "Beside the layer that says what happened there is now a layer that says what a ruling does to a provision: interprets, narrows, broadens, confirms or contradicts. That relation is the point, because a ruling does not change the text of an obligation and does not move its date of application; it moves what we know about it, and that moment sits on the ruling as a date of its own. A manifest carrying a narrowed obligation therefore surfaces through `/api/v1/impact` without a single field of the graph having moved. There is no case law on the AI Act itself yet, and that is stated in words rather than left as an empty field: the seven recorded decisions are GDPR context and carry the relation \"illustrates\" only."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/nl/rechtspraak"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.0.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "at_release",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-identifier-namespace",
      "sequence": 8,
      "released_at": "2026-08-13",
      "dataset_version": "2.0.0",
      "schema_version": "1.3.0",
      "openapi_version": "1.8.0-beta.1",
      "moved": [
        "dataset",
        "schema",
        "api_surface"
      ],
      "headline": {
        "nl": "Ruimte voor meer dan een verordening",
        "en": "Room for more than one regulation"
      },
      "summary": {
        "nl": "Elke identifier draagt nu de rechtsorde en de regeling waar hij bij hoort: `praxikon:eu:ai-act:obligation:article-11-technical-documentation` in plaats van de platte vorm van daarvoor. Zonder die twee segmenten zouden artikel 11 van de AI Act, van de AVG en van een nationale uitvoeringswet om dezelfde sleutel vechten. De oude identifiers blijven permanent oplossen op precies hetzelfde object, en elk antwoord noemt de canonieke vorm van wat u vroeg plus de oude vorm van elk object.",
        "en": "Every identifier now carries the legal order and the instrument it belongs to: `praxikon:eu:ai-act:obligation:article-11-technical-documentation` instead of the flat form before it. Without those two segments, Article 11 of the AI Act, of the GDPR and of a national implementing act would fight over the same key. The old identifiers keep resolving to exactly the same object, permanently, and every response names the canonical form of what you asked for plus the old form of every object."
      },
      "payload_hashes_moved": true,
      "payload_hashes_note": {
        "nl": "De payloadhash van elk object dat een identifier draagt, bewoog mee: de hash gaat over de hele payload en daar staan de verwijzingen in. Geen enkele uitspraak, bron, datum of status bewoog. Dat is geen belofte maar een controle: een releaseguard schrijft de payload van vandaag terug naar de oude naamruimte en eist dat elke veldvingerafdruk precies is wat in de momentopname van 1.1.0 staat. Wie op hash verifieert, leest paragraaf 5.8 van het versiebeleid.",
        "en": "The payload hash of every object carrying an identifier moved with it: the hash covers the whole payload, and the references sit inside it. Not one statement, source, date or status moved. That is a check rather than a promise: a release guard writes the current payload back into the old namespace and requires every field fingerprint to be exactly what the 1.1.0 snapshot recorded. If you verify by hash, read section 5.8 of the versioning policy."
      },
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "praxikon:sys:registry:graph-snapshot:2.0.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "at_release",
        "object_count": 417
      },
      "diff": {
        "available": true,
        "from_dataset_version": "1.1.0",
        "to_dataset_version": "2.0.0",
        "url": "https://www.praxikon.com/api/v1/diff?from_dataset_version=1.1.0&to_dataset_version=2.0.0&lang=en"
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-api-hygiene",
      "sequence": 7,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.2.0",
      "openapi_version": "1.7.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Goedkoop pollen, en één foutvorm",
        "en": "Cheap polling, and one error shape"
      },
      "summary": {
        "nl": "De twee endpoints die een consument hoort te pollen, de datasetbeschrijving en het OpenAPI-document, geven nu een ETag en een 304 op `If-None-Match`, net als de graph-endpoints al deden. Daarnaast een statusendpoint op `/api/v1/status` met de release, het aantal objecten en de uitkomst van de laatste guardrun, deze changelog, en één foutvorm op alle v1-endpoints. Over verzoeklimieten staat nu precies wat er wordt afgedwongen en waar niets geldt.",
        "en": "The two endpoints a consumer is supposed to poll, the dataset description and the OpenAPI document, now carry an ETag and answer `If-None-Match` with a 304, as the graph endpoints already did. Alongside that: a status endpoint at `/api/v1/status` carrying the release, the object counts and the outcome of the last guard run, this changelog, and one error shape across every v1 endpoint. On request limits it now states exactly what is enforced and where nothing applies."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/status"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-impact-feed",
      "sequence": 6,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.2.0",
      "openapi_version": "1.6.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Of wat bewoog uw dossier raakt",
        "en": "Whether what moved touches your dossier"
      },
      "summary": {
        "nl": "De impactfeed op `/api/v1/impact` legt een manifest naast een venster in de kennislaag en meldt per geraakt object de grond van de match. Niet kunnen kijken is er nooit \"geen impact\": een venster dat niet is vastgelegd komt terug als een aanbeveling om opnieuw te rekenen.",
        "en": "The impact feed at `/api/v1/impact` lays a manifest beside a window in the knowledge layer and reports, per touched object, the ground of the match. Not being able to see is never \"no impact\": an uncovered window comes back as a recommendation to recompute."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-regulatory-diff",
      "sequence": 5,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.2.0",
      "openapi_version": "1.5.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Wat bewoog tussen twee ijkpunten, en welke helft ertoe deed",
        "en": "What moved between two reference points, and which half mattered"
      },
      "summary": {
        "nl": "De regulatoire diff werd bereikbaar op `/api/v1/diff`, met daaronder het momentopnameregister dat per release vastlegt welke objectversies er stonden. Elk antwoord draagt de dekking van de vastgelegde historie mee, zodat een lege diff niet als een rustige periode kan worden gelezen.",
        "en": "The regulatory diff became reachable at `/api/v1/diff`, with the snapshot register underneath it recording which object versions stood published per release. Every response carries the coverage of the recorded history, so an empty diff cannot be read as a quiet period."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-manifest-over-http",
      "sequence": 4,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.2.0",
      "openapi_version": "1.4.0-beta.1",
      "moved": [
        "api_surface"
      ],
      "headline": {
        "nl": "Het dossier over de lijn",
        "en": "The dossier over the wire"
      },
      "summary": {
        "nl": "Het Regulatory Manifest werd bereikbaar over HTTP, samen met een endpoint dat een manifest controleert dat u al heeft. Beide bewaren niets. Er kwam geen object bij en er bewoog geen payload, dus alleen het API-oppervlak groeide.",
        "en": "The Regulatory Manifest became reachable over HTTP, together with an endpoint that validates a manifest you already hold. Neither stores anything. No object was added and no payload moved, so only the API surface grew."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/api/v1/openapi"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-review-status-and-corrections",
      "sequence": 3,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.2.0",
      "openapi_version": null,
      "moved": [
        "schema"
      ],
      "headline": {
        "nl": "Wanneer wij voor het laatst keken, en wat wij fout hadden",
        "en": "When we last looked, and what we got wrong"
      },
      "summary": {
        "nl": "Een controlestatus op elke objectversie, buiten de payloadhash gehouden zodat een hercontrole geen citatie ongeldig maakt, en een openbaar correctieregister op `/api/v1/corrections`. Vorm bewoog, inhoud niet: geen object erbij, geen versie toegevoegd, geen payload verplaatst, en daarom bleef `dataset_version` op 1.1.0 staan.",
        "en": "A review status on every object version, kept outside the payload hash so that a recheck cannot invalidate a citation, and a public correction register at `/api/v1/corrections`. Shape moved, content did not: no object added, no version appended, no payload touched, which is why `dataset_version` stayed at 1.1.0."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/en/correcties"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "dataset_version_unchanged",
        "detail": {
          "nl": "Deze release verzette de inhoudsteller niet, dus valt er per object niets te vergelijken. Wat bewoog was de vorm van het antwoord of het oppervlak eromheen, en dat staat in de samenvatting.",
          "en": "This release did not move the content counter, so there is nothing to compare per object. What moved was the shape of the response or the surface around it, and that is described in the summary."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-13-relation-model",
      "sequence": 2,
      "released_at": "2026-08-13",
      "dataset_version": "1.1.0",
      "schema_version": "1.1.0",
      "openapi_version": null,
      "moved": [
        "dataset",
        "schema"
      ],
      "headline": {
        "nl": "Wie draagt de plicht, en wie wordt alleen geraakt",
        "en": "Who carries the duty, and who is only affected"
      },
      "summary": {
        "nl": "Vijf optionele relatievelden op de payload, ingevuld op alle 25 verplichtingen, plus een `duty_holder`-parameter en twee toezichthoudende actoren. Een verplichting zegt sindsdien apart wie de normadressaat is en wie er praktisch door wordt geraakt, zodat een vraag naar plichten geen plichten van een ander meer teruggeeft.",
        "en": "Five optional relation fields on the payload, populated on all 25 obligations, plus a `duty_holder` parameter and two supervisory actors. An obligation now states separately who the legal addressee is and who is practically affected, so a query about duties no longer returns duties resting on someone else."
      },
      "payload_hashes_moved": true,
      "payload_hashes_note": {
        "nl": "De payloadhash van 25 verplichtingen verschoof bij een ongewijzigd objectversienummer, omdat de hash over de hele payload gaat en die vijf velden erbij kwamen. Geen bestaand veld bewoog en geen superseded versie werd aangeraakt. Wie op hash verifieert, leest paragraaf 5.6 van het versiebeleid.",
        "en": "The payload hash of 25 obligations moved at an unchanged object version, because the hash covers the whole payload and those five fields were added. No existing field moved and no superseded version was touched. If you verify by hash, read section 5.6 of the versioning policy."
      },
      "documentation": [
        "https://www.praxikon.com/en/methodologie"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": true,
        "snapshot_id": "raip:graph-snapshot:1.1.0",
        "recorded_at": "2026-08-13T00:00:00.000Z",
        "recorded_basis": "first_registration",
        "object_count": 417
      },
      "diff": {
        "available": false,
        "code": "release_not_recorded",
        "detail": {
          "nl": "Een vergelijking van release tot release vraagt aan beide kanten een vastgelegde momentopname, en 1.0.0 heeft die niet. Het momentopnameregister begon op 2026-08-13T00:00:00.000Z; wat daarvoor gepubliceerd stond is niet vastgelegd en wordt achteraf niet gereconstrueerd.",
          "en": "A release-to-release comparison needs a recorded snapshot on both sides, and 1.0.0 has none. The snapshot register started at 2026-08-13T00:00:00.000Z; what stood published before that date was not recorded and is not reconstructed after the fact."
        }
      }
    },
    {
      "release_id": "praxikon:sys:registry:release:2026-08-08-first-public-release",
      "sequence": 1,
      "released_at": "2026-08-08",
      "dataset_version": "1.0.0",
      "schema_version": "1.0.0",
      "openapi_version": null,
      "moved": [
        "dataset",
        "schema"
      ],
      "headline": {
        "nl": "Eerste openbare release",
        "en": "First public release"
      },
      "summary": {
        "nl": "De implementatiegraph werd voor het eerst openbaar: gepubliceerde objecten met twee tijdassen, per uitspraak een primaire bron, en een payloadhash per objectversie om een citatie mee te controleren. Dit is ook de kennisdatum waarop elke gepubliceerde versie sindsdien staat, en daarmee de bodem van de kennisas.",
        "en": "The implementation graph became public for the first time: published objects on two time axes, a primary source per statement, and a payload hash per object version to verify a citation against. It is also the knowledge date every published version has carried since, and therefore the floor of the knowledge axis."
      },
      "payload_hashes_moved": false,
      "payload_hashes_note": null,
      "documentation": [
        "https://www.praxikon.com/en/methodologie"
      ],
      "is_current": false,
      "snapshot": {
        "recorded": false,
        "code": "release_predates_snapshot_register",
        "detail": {
          "nl": "Van dataset 1.0.0 is geen momentopname vastgelegd. Het register begon op 2026-08-13T00:00:00.000Z en een eerdere release valt achteraf niet te reconstrueren, want die payloads staan niet meer in de repository. Dat is een gat in de vastgelegde historie en geen bewering dat er niets bewoog.",
          "en": "No snapshot is recorded for dataset 1.0.0. The register started at 2026-08-13T00:00:00.000Z and an earlier release cannot be reconstructed after the fact, because its payloads are no longer in the repository. That is a gap in the recorded history, not a statement that nothing moved."
        }
      },
      "diff": {
        "available": false,
        "code": "no_predecessor_release",
        "detail": {
          "nl": "Dit is de eerste gepubliceerde release. Er is geen eerdere stand van de dataset om hem tegen af te zetten.",
          "en": "This is the first published release. There is no earlier state of the dataset to compare it against."
        }
      }
    }
  ],
  "links": {
    "self": "https://www.praxikon.com/changelog.json",
    "human_page_nl": "https://www.praxikon.com/nl/releases",
    "human_page_en": "https://www.praxikon.com/en/releases",
    "status": "https://www.praxikon.com/api/v1/status",
    "dataset": "https://www.praxikon.com/api/v1/dataset",
    "diff": "https://www.praxikon.com/api/v1/diff",
    "corrections": "https://www.praxikon.com/api/v1/corrections",
    "documentation": "https://www.praxikon.com/api/v1/openapi",
    "licence": "https://www.praxikon.com/nl/legal/terms"
  },
  "note": "Three counters move independently: dataset_version says which content is published, schema_version which shape it has, and the OpenAPI version how large the surface around it is. Each entry states which of the three moved. This register says what we released; it does not say a change in the law happened, which lives in /api/v1/changes, and it does not say we were wrong, which lives in /api/v1/corrections."
}
