diff --git a/content/docs/api-service/operator-cli.mdx b/content/docs/api-service/operator-cli.mdx
index e3fefac..665315f 100644
--- a/content/docs/api-service/operator-cli.mdx
+++ b/content/docs/api-service/operator-cli.mdx
@@ -110,7 +110,7 @@ service accepts the token, and which versions the service already has.
| `--region` | — | Region. |
| `--prefix` | — | Key prefix. |
| `--force-path-style` | false | Path-style addressing (MinIO, RustFS). |
-| `--addr` | `localhost:23410` | Service gRPC address. |
+| `--addr` | `localhost:23410` | Service gRPC address; `host:port` is resolved by the system resolver, `dns:///…` by grpc-go's. |
| `--token` | `$EASYP_TOKEN` | Write token. |
| `--tls-ca` | system store | CA that signed the server certificate. |
| `--tls-cert`, `--tls-key` | — | Client certificate and key, for mutual TLS. |
diff --git a/content/docs/api-service/operator-cli.ru.mdx b/content/docs/api-service/operator-cli.ru.mdx
index f2a802c..60772cc 100644
--- a/content/docs/api-service/operator-cli.ru.mdx
+++ b/content/docs/api-service/operator-cli.ru.mdx
@@ -110,7 +110,7 @@ Docker. Каждая версия из `plugin.yaml` собирается с `--
| `--region` | — | Регион. |
| `--prefix` | — | Префикс ключей. |
| `--force-path-style` | false | Path-style адресация (MinIO, RustFS). |
-| `--addr` | `localhost:23410` | gRPC-адрес сервиса. |
+| `--addr` | `localhost:23410` | gRPC-адрес сервиса; `host:port` разрешает системный резолвер, `dns:///…` — резолвер grpc-go. |
| `--token` | `$EASYP_TOKEN` | Токен записи. |
| `--tls-ca` | системное хранилище | CA, подписавший сертификат сервера. |
| `--tls-cert`, `--tls-key` | — | Клиентский сертификат и ключ для взаимного TLS. |
diff --git a/content/docs/api-service/quickstart.mdx b/content/docs/api-service/quickstart.mdx
index 20a4b3b..128513b 100644
--- a/content/docs/api-service/quickstart.mdx
+++ b/content/docs/api-service/quickstart.mdx
@@ -63,7 +63,7 @@ services:
retries: 30
service:
- image: ghcr.io/easyp-tech/service:v1.2.0
+ image: ghcr.io/easyp-tech/service:v1.2.1
command: ["service", "start"]
depends_on:
postgres:
diff --git a/content/docs/api-service/quickstart.ru.mdx b/content/docs/api-service/quickstart.ru.mdx
index 1a512a8..3a5d2e9 100644
--- a/content/docs/api-service/quickstart.ru.mdx
+++ b/content/docs/api-service/quickstart.ru.mdx
@@ -63,7 +63,7 @@ services:
retries: 30
service:
- image: ghcr.io/easyp-tech/service:v1.2.0
+ image: ghcr.io/easyp-tech/service:v1.2.1
command: ["service", "start"]
depends_on:
postgres:
diff --git a/content/docs/api-service/upgrading.mdx b/content/docs/api-service/upgrading.mdx
index ca58edc..d8266da 100644
--- a/content/docs/api-service/upgrading.mdx
+++ b/content/docs/api-service/upgrading.mdx
@@ -34,6 +34,43 @@ A rename is handled without breaking anyone: the old configuration key keeps
working for one release while warning, naming both spellings and the line to
change, and only then stops.
+## v1.2.0 → v1.2.1
+
+### Unpacked copies without a checksum marker are fetched once
+
+A version directory with no `.sha256` marker beside it — unpacked before
+v1.2.0, or bind-mounted from a `plugins build` tree — used to count as current.
+It is now fetched again the first time it is used, once per replica, and gets a
+marker. Plan for the disk: each replica downloads every version it serves once
+more, within `registry.cache_max_bytes`. Versions registered without a checksum
+(`plugins publish --plugins-dir`) are unaffected.
+
+### A relative `plugins_dir` is resolved at start
+
+`plugins_dir: ./plugins` now resolves to an absolute path before commands are
+derived. Versions registered with a relative command under v1.2.0 still fail
+with `no such file or directory`; repair them with
+`easyp-svc plugins publish --plugins-dir
--force`.
+
+### The plugin limit holds under concurrent registrations
+
+The licence plugin limit is now counted and enforced in the same transaction as
+the insert. Before, parallel `CreatePlugin` calls could pass the check together
+and land more versions than the limit allows; such extra rows stay, but no new
+version is accepted until the count is below the limit.
+
+### Clients resolve plain addresses with the system resolver
+
+The SDK, `easyp-svc` and `easyp generate` dial a plain `host:port` through
+`passthrough:///`, so the operating system resolves the name when connecting. A
+host without a port gets 443, as before. Prefix `dns:///` to use grpc-go's own
+resolver.
+
+### The rate limit says how long to wait
+
+A refused request reads `rate limit exceeded for , retry after s`. The
+`x-ratelimit-reset` trailer still carries the unix time the bucket refills by.
+
## v1.1.x → v1.2.0
### `plugins publish` replaces `push`, `register` and `pack`
@@ -74,7 +111,8 @@ republish, not to retry. A client matching on reasons gains one; one matching on
`plugins publish --force` replaces a version's config with the new checksum, and
each replica refetches its unpacked copy on next use — it keeps a `.sha256`
marker beside it. Copies unpacked by an older service have no marker and count
-as current; republish a version once to bring its copies in line.
+as current; republish a version once to bring its copies in line. From v1.2.1 a
+copy without a marker is fetched once on its own.
## v1.0.0 → v1.0.2
diff --git a/content/docs/api-service/upgrading.ru.mdx b/content/docs/api-service/upgrading.ru.mdx
index 99721c5..0971d6a 100644
--- a/content/docs/api-service/upgrading.ru.mdx
+++ b/content/docs/api-service/upgrading.ru.mdx
@@ -34,6 +34,44 @@ description: "Заметки по обновлению API Service от рели
работать один релиз, предупреждая и называя оба написания и строку, которую надо
поправить, и только после этого перестаёт.
+## v1.2.0 → v1.2.1
+
+### Копии без маркера контрольной суммы перекачиваются один раз
+
+Каталог версии без маркера `.sha256` — распакованный до v1.2.0 или
+смонтированный из дерева `plugins build` — раньше считался актуальным. Теперь
+при первом использовании он скачивается заново, по разу на реплику, и получает
+маркер. Учтите диск: каждая реплика ещё раз скачает каждую версию, которую
+обслуживает, в пределах `registry.cache_max_bytes`. Версии, зарегистрированные
+без контрольной суммы (`plugins publish --plugins-dir`), это не затрагивает.
+
+### Относительный `plugins_dir` разрешается при старте
+
+`plugins_dir: ./plugins` теперь приводится к абсолютному пути до вывода команды.
+Версии, зарегистрированные в v1.2.0 с относительной командой, по-прежнему падают
+с `no such file or directory`; почините их через
+`easyp-svc plugins publish --plugins-dir --force`.
+
+### Лимит плагинов выдерживает параллельные регистрации
+
+Лимит плагинов лицензии теперь считается и проверяется в одной транзакции со
+вставкой. Раньше параллельные `CreatePlugin` могли пройти проверку вместе и
+записать больше версий, чем позволяет лимит; такие лишние строки остаются, но
+новые версии не принимаются, пока их число не опустится ниже лимита.
+
+### Клиенты разрешают обычные адреса системным резолвером
+
+SDK, `easyp-svc` и `easyp generate` подключаются к обычному `host:port` через
+`passthrough:///`, и имя разрешает операционная система в момент соединения.
+Хост без порта, как и раньше, получает 443. Чтобы использовать собственный
+резолвер grpc-go, укажите префикс `dns:///`.
+
+### Rate limit говорит, сколько ждать
+
+Отклонённый запрос получает `rate limit exceeded for , retry after s`.
+Трейлер `x-ratelimit-reset` по-прежнему содержит unix-время, к которому корзина
+наполнится.
+
## v1.1.x → v1.2.0
### `plugins publish` вместо `push`, `register` и `pack`
@@ -75,7 +113,7 @@ description: "Заметки по обновлению API Service от рели
и каждая реплика перекачивает свою распакованную копию при следующем
использовании — рядом с ней лежит маркер `.sha256`. Копии, распакованные старым
сервисом, маркера не имеют и считаются актуальными; перепубликуйте версию один
-раз, чтобы выровнять их.
+раз, чтобы выровнять их. С v1.2.1 копия без маркера перекачивается один раз сама.
## v1.0.0 → v1.0.2