---
title: "Changelog: MCP-ul de administrare VIStudio"
description: "Istoricul versiunilor MCP-ului de administrare VIStudio: unelte noi, parametri și câmpuri noi, refuzuri și corecturi, de la 1.0.0 până la versiunea curentă."
canonical: https://www.vistudio.ro/developers/changelog
---

# Changelog: MCP-ul de administrare VIStudio

> Istoricul versiunilor MCP-ului de administrare VIStudio: unelte noi, parametri și câmpuri noi, refuzuri și corecturi, de la 1.0.0 până la versiunea curentă.

Sursă: https://www.vistudio.ro/developers/changelog

Istoricul versiunilor MCP-ului de administrare (`https://app.vistudio.ro/mcp`), de la cea mai nouă la cea mai veche. Versiunea curentă este **1.15.0**, din 28.10.2026; o vezi și în câmpul `version` întors de `whoami`. Regulile de versionare (semver) și politica de depreciere de cel puțin 30 de zile sunt pe [pagina pentru dezvoltatori](https://www.vistudio.ro/developers).

După o actualizare, reconectează clientul: lista uneltelor și parametrii lor se negociază la conectare.

## 1.15.0 — 28.10.2026

- ChatGPT se poate conecta din nou prin CIMD: un document de metadate al clientului care declară `none` printre metodele de autentificare (lista `token_endpoint_auth_methods_supported` din SEP-3149 sau câmpul vechi `token_endpoint_auth_method`) e acceptat ca client public cu PKCE, chiar dacă metoda lui preferată e `private_key_jwt`. Un document fără `none`, sau cu o metodă cu secret partajat (`client_secret_basic`, `client_secret_post`, `client_secret_jwt`), rămâne refuzat cu `invalid_client`. Metadatele serverului nu se schimbă;
- OAuth: o cerere la `/oauth/token` sau `/oauth/revoke` cu `client_assertion` sau `client_assertion_type` e refuzată explicit cu `invalid_client` („client\_assertion is not supported by this server: use token\_endpoint\_auth\_method none”), în loc să fie tratată tăcut ca un client public;
- cheia de sesiune: fiecare conectare are o cheie stabilă, aceeași la toate reînnoirile orare ale tokenului. `whoami` întoarce câmpul nou `session.key` (lângă `session.id`, care rămâne rândul tokenului curent și se schimbă la reînnoire) și câmpul nou `clientId`, id-ul aplicației: uuid-ul înregistrării dinamice sau adresa documentului CIMD. La cheia API ambele sunt `null`;
- `agent_sessions_list` întoarce câte o intrare pe sesiune (o conectare), nu pe token, cu câmpurile noi `sessionKey`, `clientId` și `generations`; `createdAt` e al primei generații, iar `lastUsedAt`, `refreshExpiresAt`, `revokedAt` și `active` sunt ale ultimei. Lista nu mai e tăiată la 200 de rânduri;
- jurnalul agenților din admin reține, la fiecare acțiune nouă, sesiunea și id-ul aplicației: doi agenți care lucrează cu același utilizator (de exemplu ChatGPT și Claude, sau două conversații ale aceleiași aplicații) se deosebesc;
- limita de 120 de apeluri pe minut se socotește pe sesiune și nu se mai resetează la reînnoirea tokenului;
- fără unelte noi. Descrierile actualizate ale lui `whoami` și `agent_sessions_list` se văd după reconectarea clientului.

## 1.14.0 — 25.10.2026

- unealtă nouă `page_table_edit`: schimbă celule sau rânduri dintr-un bloc `table` fără să retrimită blocul. Operațiile (`setCell`, `hideRow`, `showRow`, `insertRow`, `removeRow`, `moveRow`) se aplică în ordine, cu indexuri de la 0 care numără și rândurile ascunse; un index în afara tabelului refuză tot apelul (`invalid`), fără nimic scris; o cheie sau o operație necunoscută e refuzată înainte de unealtă, ca eroare de validare a parametrilor. Lucrează pe **o singură limbă** (`locale` obligatoriu) și are `dry_run`; răspunsul întoarce tabelul rezultat (`table: { columns, rows, hidden }`);
- bloc nou de pagină `table`: titlu și/sau legendă, stil `default` sau `board`, 1–8 coloane (cu aliniere), rânduri cu câte o celulă pe coloană, rânduri ascunse, rând evidențiat și legătură opțională pe rând. Apare în `blocks_schema` și `block_template`; regula „fiecare rând are exact câte celule are capul” e verificată în `block_validate`, `page_block_insert`, `page_block_update`, `page_blocks_set`, `pages_create` și `pages_create_many`, iar mesajul numește rândul. Rândurile ascunse lipsesc din `llms-full.txt` și din Markdown-ul paginii, unde tabelul apare ca tabel Markdown;
- argument nou `accent` în `pages_create`, `pages_create_many` și `pages_update` (`none`, `blue`, `green`, `yellow`, `orange`, `red`, `purple`, `teal`, `pink`): un indiciu de culoare pentru pagină, pe care tema site-ului îl poate folosi; `pages_get` și `pages_tree` îl întorc (`none` când lipsește), iar `pages_update` cu `dry_run` îl arată în `changes`. `pages_create_many` primește și `hideTitle`, ca `pages_create`;
- blocul `image-gallery` (galeria cu lightbox) se poate pune acum și pe pagini, nu doar în articole;
- `settings_update` acceptă `tiktok` în rețelele sociale, iar `settings_get` îl întoarce;
- modulul nou `search` (căutarea pe site) poate apărea în `modules` din `region_info` și `regions_list`; îl pornește administratorul platformei, pe fiecare site. Nu adaugă unelte MCP;
- descrierile și parametrii noi se văd după reconectarea clientului.

## 1.13.0 — 24.10.2026

- planul de site: `task_link` refuză acum cu `conflict` un task revendicat activ de alt agent, ca `task_update`; `plan_apply_structure` refuză cu `conflict`, înainte de orice scriere și și la `dry_run`, când un task pe care l-ar anula (sau E9.0, al cărui text îl rescrie) e ținut de alt agent, iar mesajul listează cheile și cine le ține. Administratorul site-ului trece;
- regula revendicării se aplică acum pe orice cale: o modificare din adminul web sau din API-ul REST pe un task revendicat activ de alt agent primește 409 `plan_task_claimed`, fără nimic scris; eticheta clientului din revendicare se schimbă doar la o revendicare nouă sau la eliberare;
- un blocaj reciproc în baza de date pe scrierea unei pagini (de exemplu o pagină publicată exact când părintele ei e redenumit) nu mai iese `internal: Failed query: …`, ci `conflict: [page_busy] …`, fără nimic scris: reîncearcă după câteva secunde. Se aplică uneltelor de pagini și lui `translate_document` / `translation_unlock` când documentul e o pagină. Cursa în sine nu mai apare: redenumirea părintelui așteaptă publicarea copilului;
- OAuth: `POST /oauth/revoke` pe o sesiune ale cărei site-uri aprobate au fost toate șterse răspunde 200 (înainte, 500); sesiunea e revocată, iar reînnoirea ei dă `invalid_grant`;
- fără unelte noi și fără schimbări în parametrii uneltelor. Descrierea actualizată a lui `plan_apply_structure` se vede după reconectarea clientului.

## 1.12.0 — 23.10.2026

- câmp nou `theme.release` în `design_schema`, `design_get` și `design_validate`: `{ tag, version, schema }`, release-ul temei pe care rulează site-ul și schema după care se validează designul (`"release"` = schema acelui release; `"current"` = schema curentă a temei, când release-ul nu are o schemă proprie);
- un site fixat pe un release mai vechi al temei își păstrează opțiunile: `design_validate`, `design_draft_set`, `design_restore`, `design_submit` și `design_publish` validează după schema acelui release (înainte, după schema curentă a temei), iar `themeVersion` al versiunii salvate e versiunea release-ului;
- o valoare zecimală aflată pe pasul opțiunii (de exemplu `0.3` la pasul `0.1`) nu mai e refuzată din cauza erorilor de rotunjire; `0.35` la pasul `0.1` rămâne refuzat;
- la schimbarea temei site-ului, opțiunile pe care tema nouă nu le are sau nu le permite revin la valorile implicite, într-o versiune activă nouă cu nota „Schimbarea temei …”, vizibilă în `design_versions` și `design_get`;
- fără unelte noi. Descrierea actualizată a lui `design_schema` se vede după reconectarea clientului.

## 1.11.4 — 22.10.2026

- `plan_delete`: un subtask mutat într-un alt plan pleacă odată cu task-ul lui părinte și intră în numărul `tasks` din refuz, din `dry_run` și din `deleted` (înainte rămânea în celălalt plan, ca task de nivel superior);
- `frontend_update`, `frontend_set_page_role`, `frontend_set_homepage` și `frontend_set_blog_page` nu mai pică cu „invalid selections” când pagina de start, pagina de blog sau o pagină cu rol (`about`, `contact`, `privacy`, `terms`, `pricing`) e în coș: legătura păstrată trece, iar una nouă spre o pagină din coș e refuzată cu `[link_target_trashed]`;
- `posts_delete` și `posts_unpublish` (și cu `dry_run`) întorc `linkedFrom` și `linkedFromNote`: ce trimite la articol (blocurile și textul paginilor și articolelor, redirecturile, meniurile);
- avertismentul `warning` al uneltelor `settings_menu_*` spune acum că legăturile spre coș au devenit text și nu mai blochează alte salvări;
- OAuth: un `client_id` cu caractere de control sau mai lung de 512 caractere primește `invalid_client` (la `/oauth/authorize` direct, fără redirect; 401 la `/oauth/token` și `/oauth/revoke`), nu 500 `server_error`;
- OAuth: redirectul automat la erorile de la `/oauth/authorize` și eticheta „aplicație cunoscută” de pe pagina de consimțământ se dau doar pe adresa de callback a aplicației (`https://claude.ai/api/mcp/auth_callback`, `https://claude.com/api/mcp/auth_callback`, `https://chatgpt.com/connector/oauth/<id>`), în forma ei canonică; adresele loopback rămân de încredere pe orice cale și port. Pentru altă adresă de pe aceste gazde, adminul afișează eroarea, fără s-o urmeze;
- pagina de consimțământ: butoanele devin active abia la primul gest pe pagină (mișcarea mouse-ului, o tastă) sau la 1 s după ce fereastra primește focus; o decizie trimisă la mai puțin de 1 s de la afișarea paginii e refuzată (400), iar o pagină de consimțământ deschisă înainte de actualizare răspunde „Formular invalid sau expirat”: conectarea se reia din aplicație;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.11.3 — 22.10.2026

- traducerea automată pornește de la versiunea publicată a limbii principale, nu de la ultima ciornă: o ciornă salvată imediat după publicare nu mai ajunge în limbile traduse înaintea limbii principale, ci odată cu publicarea ei; un document retras înainte să ruleze traducerea nu mai e tradus și republicat. Descrierea `translate_document` și `autoTranslate.note` din `translation_status` o spun;
- `design_preview_url`: calea cerută e verificată pe fiecare segment, și după decodare; segmentele goale, `.` și `..` (și codate, de exemplu `%2e` sau `%252e`), `%2f`, `%5c`, `~`, caracterele de control și codările invalide sunt refuzate cu `invalid`, iar mesajul le numește;
- `design_schema`: exemplul are culorile în forma normalizată de server (`#rrggbb`, litere mici), deci `design_validate` pe el întoarce `conversions: []`;
- sugestiile „Did you mean …?” recunosc și sinonimele pentru umbra cardurilor (`shadows`, `card shadow`, `card elevation` și altele);
- `posts_create` și `posts_update` întorc o eroare când autorul articolului nu poate fi salvat, în loc de un succes fals;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.11.2 — 22.10.2026

- un bloc citit cu `pages_get` se poate trimite înapoi neschimbat la `page_blocks_set`, `page_block_insert`, `page_block_update`, `pages_create`, `pages_create_many` și `block_validate`: câmpurile adăugate la citire (`href` și `publicHref` din legături, în ambele formate) sunt scoase înainte de validare; înainte, orice bloc cu o legătură era refuzat cu `link: must NOT have additional properties`. Altă cheie necunoscută e refuzată în continuare;
- o legătură (CTA, card, blocul de redirect, linkul din text, redirectul) salvată într-o ciornă cu id-ul unei pagini, al unui articol sau al unui fișier media din alt site nu mai întoarce calea sau adresa acelei ținte: `href` e `null` (în `pages_get` cu `format: json` și în previzualizare); legăturile din același site nu se schimbă;
- `pages_delete` și `pages_unpublish` pe o pagină dinamică publicată (o listare, inclusiv pagina de blog) întorc în `gone` căile ei, pe limbi (înainte, `gone: []`); la mutarea unei astfel de pagini, platforma creează și redirectul 301 automat, iar `redirects_list` și `redirects_test` îi văd calea;
- OAuth: `POST /oauth/token` (reînnoirea tokenului sau schimbul de cod) pe o sesiune ale cărei site-uri aprobate au fost toate șterse întoarce 400 `invalid_grant`, nu 500; nimic nu se revocă, iar clientul reia autorizarea. O reînnoire picată lasă valabil vechiul refresh token, deci clientul poate reîncerca;
- pașii de reconectare după un scope nou sunt în skill-urile `administer-site` și `design-site` și în ghidul de conectare: în Claude Code, `/mcp` → conectorul → Clear authentication, apoi Authenticate; în claude.ai, Disconnect, apoi Connect (Re-authenticate păstrează scope-urile vechi);
- `region_clone_check` (`mode=plan`) nu mai numără printre referințele fără pereche legăturile care n-au avut niciodată o referință în sursă;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.11.1 — 22.10.2026

- două salvări sau publicări simultane ale aceleiași pagini trec acum pe rând, așa că o alegere de meniu făcută în admin nu se mai pierde; dacă pagina e ocupată mai mult de 10 secunde, uneltele răspund `conflict: [page_busy] …`, fără nimic scris: reîncearcă după câteva secunde;
- o salvare a unei pagini-părinte oprită de salvarea simultană a unei subpagini răspunde `conflict: [child_resave_busy] …` (înainte, `internal: [child_resave_failed]`), fără nimic scris: reîncearcă;
- traducerea automată nu mai ține pagina ocupată cât traduce, doar cât scrie limbile traduse;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.11.0 — 22.10.2026

- stratul de CSS al designului: pe site-urile unde administratorul platformei l-a pornit, o versiune de design poate avea și un CSS propriu, filtrat și limitat la conținutul paginii (nu poate acoperi antetul, subsolul sau bannerul de cookie-uri). Argument opțional nou `css` la `design_validate` și `design_draft_set`; `design_get` întoarce `cssLayer` și `css`, `design_validate`, `design_draft_set` și `design_restore` întorc `css`, iar `design_schema` are `limits.cssLayer`. Refuzuri noi: `design_css_disabled` (stratul e oprit pe site) și `design_css_invalid` (cu codurile filtrului, `css_*`);
- formularele: ce întoarce `forms_get` se poate trimite înapoi neschimbat la `forms_update`. Câmpul ascuns `reference` e acceptat (doar `name` și `required`): valoarea lui e titlul documentului ales ca sursă în blocul formularului, goală fără sursă, deci `required: true` are sens doar dacă fiecare bloc are sursa setată; `fields[].label` și `submitButtonLabel` acceptă `null` (`submitButtonLabel: null` șterge eticheta butonului);
- jurnalul agenților arată documentul corect pentru fiecare unealtă (articole, etichete, sedii, media, formulare, setări, plan, task-uri); `task_link` întoarce și `id`, iar `plan_apply_structure` întoarce `planId`;
- clonarea unui site: avertismentul pentru o legătură fără referință în sursă spune că tipul și referința nu au fost setate niciodată;
- fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

## 1.10.0 — 21.10.2026

- legăturile spre o pagină mutată în coș sau ștearsă nu mai blochează salvarea: o legătură existentă, în același câmp, rămâne, iar o legătură nouă spre o pagină din coș e refuzată cu `[link_target_trashed]` (sau `[link_target_deleted]` pentru o pagină ștearsă);
- `pages_delete` (și cu `dry_run`) întoarce `linkedFrom` și `linkedFromNote`: ce trimite la pagină (blocuri, text, redirecturi, meniuri, rolurile din front-end), ca să le schimbi înainte sau după;
- `redirects_list` marchează cu `broken` redirecturile spre o țintă din coș sau ștearsă (cu `brokenTotal` și `note`), iar `redirects_coverage` întoarce `brokenRedirects`; `redirects_update` pe un redirect fără țintă cere o țintă nouă;
- `settings_update` întoarce `convertedMenuLinks` și `convertedNote` când un element de meniu rămas fără țintă a devenit text;
- `pages_delete` și `pages_undelete` lucrează în limba principală a site-ului: o pagină doar în română nu mai capătă un rând gol în engleză;
- fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

## 1.9.0 — 21.10.2026

- redirecturi automate: când se schimbă calea publică a unei pagini sau a unui articol publicat (slug, părinte, slug-ul tradus), platforma creează singură redirectul 301 de la adresa veche, pe fiecare limbă, și pentru subpaginile publicate (iar la pagina de blog, pentru articole); fără lanțuri și fără bucle;
- `pages_publish`, `posts_publish`, iar `pages_update` / `posts_update` când publică direct, întorc `redirects: { created, updated, deleted }`; `pages_unpublish`, `pages_delete`, `posts_unpublish` și `posts_delete` întorc `gone`, căile care nu mai răspund;
- `redirects_list` arată și redirecturile spre articole (`to.type: 'post'`, `postId`), iar `redirects_test` le urmărește, pe calea publicată a articolului;
- mutarea paginii de blog repornește site-ul, ca noua rutare să se aplice; `pages_publish` o spune în `note`;
- `forms_delete` cu `confirm: true` șterge formularul și trimiterile lui într-o singură operație (înainte, o ștergere picată putea pierde trimiterile); refuzul fără `confirm` spune câte trimiteri are formularul;
- `plan_delete` cu `confirm: true` șterge planul, task-urile și toate comentariile lor (și pe ale altor utilizatori) într-o singură operație; răspunsul are `deleted.comments`, iar refuzul fără `confirm` numără și comentariile;
- două publicări programate ale aceluiași document (`pages_publish` / `posts_publish` cu `at`) nu mai rulează simultan; ștergerea definitivă a unei pagini sau a unui articol îi scoate programările;
- formulări ca „în toate limbile”, „și în engleză” sau „multilingv” nu mai sunt luate drept o cerere de traducere manuală: agentul scrie doar în limba principală, iar platforma traduce restul (instrucțiunile serverului, `policy` din `whoami` și descrierile uneltelor de scriere);
- fără unelte noi. Descrierile uneltelor atinse se văd după reconectarea clientului.

## 1.8.0 — 21.10.2026

- câmp nou `mcpOnly` în răspunsul `whoami`: regiunile sesiunii pe care contul lucrează doar prin MCP și o notă pentru agent; `null` când nu există. Bifa „Doar prin MCP” o pune administratorul platformei pe contul agentului, pe fiecare site. Pe aceste site-uri contul are rolul lui doar prin MCP (OAuth sau cheie API); în adminul web și în API-ul REST nu are mai mult decât un vizitator anonim, deci agentul lucrează doar cu uneltele MCP;
- regula de lucru recomandată: fiecare agent are contul lui, separat de contul persoanei pentru care lucrează;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.7.1 — 20.10.2026

- schimbarea paginii de blog (`frontend_set_blog_page`) și a limbilor site-ului (`region_languages_update`) repornește acum site-ul, ca noua rutare să se aplice; înainte, un site altfel neschimbat rămânea pornit cu rutarea veche;
- descrierea și câmpul `note` din răspunsul lui `frontend_set_blog_page` spun că repornirea durează 1–2 minute și cum o verifici: până când `/api/health` al site-ului arată un `startedAt` nou, lista articolelor răspunde pe calea veche;
- `region_languages_update` spune același lucru în descriere și în `note`, alături de nota despre conținutul limbilor scoase;
- doar texte: fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.7.0 — 20.10.2026

- `posts_get` întoarce conținutul articolului ca Markdown în câmpul nou `markdown`;
- `content` din `posts_get` e depreciat: e o copie identică a lui `markdown` și dispare după 19.11.2026 (versiunea 2.0.0); citește `markdown`;
- în ChatGPT, `posts_get` ajungea ca `{}`, fiindcă lanțul ChatGPT pierde rezultatul unei unelte care are un câmp `content` la primul nivel; clientului ChatGPT nu i se mai trimite `content`, deci primește articolul întreg;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.6.0 — 20.10.2026

- Agent Skill nou `get-started` (`https://app.vistudio.ro/.well-known/agent-skills/get-started/SKILL.md`): promptul pe care îl copiezi în chat-ul agentului tău ca să-l pornești. Agentul conectează MCP-ul, află site-ul cu `whoami`, face un raport doar-citire al stării lui și continuă cu tine pe regulile serverului. Promptul în română e pe pagina [Pornește un agent AI pe site-ul tău](https://www.vistudio.ro/developers/porneste-agentul);
- ghidul de conectare (`https://app.vistudio.ro/mcp/guide`) are secțiunea „Pornește un agent nou”, cu același prompt;
- fără unelte noi și fără schimbări în parametrii uneltelor.

## 1.5.0 — 20.10.2026

- slug-ul dat explicit rămâne al documentului: un slug trimis la `pages_create`, `pages_create_many`, `pages_update`, `posts_create`, `posts_update` sau `tags_create`, diferit de cel derivat din titlu, nu mai e rescris din titlu când documentul e deschis în admin;
- câmp nou `slugLocked` (pe limbă): `true` = slug-ul urmează titlul, `false` = rămâne cel dat; în `pages_get`, `posts_get`, `posts_list`, `pages_tree` și în răspunsurile scrierilor;
- `pages_update` și `posts_update` primesc `slugLocked`, care blochează sau deblochează slug-ul fără să-l schimbe;
- `pages_get` și `posts_get` întorc `note` pe o limbă fără conținut propriu (tradusă de platformă la publicare sau lipsă): câmpurile goale nu sunt o eroare.

## 1.4.0 — 19.10.2026

- `dry_run` la uneltele care șterg (`pages_delete`, `posts_delete`, `media_delete`, `forms_delete`, `redirects_delete`, `offices_delete`, `plan_delete`): nu scrie nimic, nici cu `confirm: true`;
- un parametru care nu e în schema uneltei refuză apelul cu `invalid` și „Did you mean …?” (înainte era ignorat); `region` la o unealtă care nu-l are și `confirm` în plus sunt ignorate, cu nota `ignored`;
- titlurile cu caractere de control sunt refuzate.

## 1.3.0 — 18.10.2026

- unelte noi pentru designul site-ului: `design_schema`, `design_get`, `design_validate`, `design_preview_url`, `design_versions`, `design_draft_set`, `design_restore`, `design_submit`, `design_publish`; scope nou `mcp:design`. Un design nu se publică niciodată direct: `design_publish` cere rolul de admin, `mcp:publish` și `confirm: true`.

## 1.2.0 — 12.10.2026

- `frontend_update` primește `whenToUse`, textul secțiunii „When to use” din `llms.txt` (pe limbă, cel mult 1000 de caractere); `settings_get` îl întoarce în `site.whenToUse`;
- `pages_publish`, și publicarea programată, adaugă pagina în meniurile alese în admin, în secțiunea „Meniu” a paginii;
- mutarea unei pagini în coș (`pages_delete`) și ștergerea ei definitivă o scot din meniuri;
- uneltele `settings_menu_*` raportează `converted` când transformă în text un element de meniu spre o pagină din coș sau inexistentă;
- restaurarea unei versiuni din admin rulează în limba principală a site-ului (`pages_restore` rula deja așa).

## 1.1.0 — 12.10.2026

- unelte noi: `pages_schedule_cancel` și `posts_schedule_cancel` (anulează programările active ale unei pagini sau ale unui articol, fără să schimbe documentul);
- `pages_publish` și `posts_publish` primesc `at`, publicarea programată: o dată și oră ISO 8601 în viitor, cel mult 365 de zile; fără fus orar, ora e cea a României. Ca la orice publicare, agentul cere întâi confirmarea utilizatorului;
- `pages_get` și `posts_get` întorc `schedules`, programările active;
- conectarea: CIMD. `client_id` poate fi adresa https a documentului de metadate al clientului; înregistrarea dinamică rămâne;
- o salvare de pagină care nu poate actualiza calea unei subpagini întoarce eroarea `child_resave_failed` și nu scrie nimic (înainte raporta succes fără să scrie);
- crearea unei pagini a cărei cale nu se poate scrie întoarce eroarea `page_breadcrumbs_failed` și nu creează nimic (înainte întorcea pagina, deși ea nu exista).

## 1.0.0 — 12.10.2026

Prima versiune cu politică de versiuni și depreciere. Față de versiunea anterioară:

- unelte noi: `frontend_set_page_role` (rolurile de pagină: about, contact, privacy, terms, pricing), `region_clone_check` și `region_clone` (doar pentru super-admin);
- limba principală: paginile, articolele și etichetele se scriu doar în limba principală. Celelalte limbi le traduce platforma la publicare (`region_info.autoTranslate`, `pendingAutoTranslation` în `pages_tree` și `content_status`). `translation_unlock` deblochează o limbă doar la cererea explicită a utilizatorului;
- `region_languages_update` primește `autoTranslateNewDocuments`;
- `translation_status` are `manualLanguages`;
- `translate_document` traduce și formularele, la cerere (`collection: forms`);
- conectarea: `scope=` în `WWW-Authenticate`, `resource_documentation` în metadatele resursei, `listChanged: false` în capabilități;
- limitele: `retry after N s` în `rate_limited` și `Retry-After` pe 429-ul OAuth;
- `whoami` întoarce `version`.
