fix: settle the Count and Sheet Set merge

- Both PRs registered "Requires an integer between {min} and {max}." under
  their own key; keep the sheet set one, which every locale translates.
- Pin the MCP tool schema digest with the sheet set actions added.
- searchable_layer_coexists_with_outlines read glyph outlines from the
  shared atlas while other tests could re-bake it, and failed now and
  then; lay out and export under one atlas generation.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 5.5 committed 2026-10-06 09:49:38 +03:00
1 parent fbe55bab37
commit fafb1758c1
24 files changed
+23 -35

No files matched your search

-1
View File
@@ -6129,7 +6129,6 @@ count-feature =
.area-active = منطقة العد نشطة.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (للقراءة فقط)
.requires-0-or-1 = يتطلب 0 أو 1 فقط.
.requires-int-range = يتطلب عددًا صحيحًا بين __ocs_fmt_0__ و __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT نمط النص الحالي: "__ocs_fmt_0__" ارتفاع النص: __ocs_fmt_1__
.fields-found = تم العثور على __ocs_fmt_0__ من الحقول.
-1
View File
@@ -6117,7 +6117,6 @@ count-feature =
.area-active = Областта за преброяване е активна.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (само за четене)
.requires-0-or-1 = Изисква се само 0 или 1.
.requires-int-range = Изисква се цяло число между __ocs_fmt_0__ и __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Текущ текстов стил: "__ocs_fmt_0__" Височина на текста: __ocs_fmt_1__
.fields-found = Намерени полета: __ocs_fmt_0__.
-1
View File
@@ -6114,7 +6114,6 @@ count-feature =
.area-active = Oblast počítání je aktivní.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (jen pro čtení)
.requires-0-or-1 = Vyžaduje pouze 0 nebo 1.
.requires-int-range = Vyžaduje celé číslo mezi __ocs_fmt_0__ a __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Aktuální styl textu: "__ocs_fmt_0__" Výška textu: __ocs_fmt_1__
.fields-found = Nalezeno polí: __ocs_fmt_0__.
-1
View File
@@ -6115,7 +6115,6 @@ count-feature =
.area-active = Zählbereich ist aktiv.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (schreibgeschützt)
.requires-0-or-1 = Nur 0 oder 1 zulässig.
.requires-int-range = Erfordert eine ganze Zahl zwischen __ocs_fmt_0__ und __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Aktueller Textstil: "__ocs_fmt_0__" Texthöhe: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ Feld(er) gefunden.
-1
View File
@@ -6117,7 +6117,6 @@ count-feature =
.area-active = Η περιοχή καταμέτρησης είναι ενεργή.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (μόνο για ανάγνωση)
.requires-0-or-1 = Απαιτείται μόνο 0 ή 1.
.requires-int-range = Απαιτείται ακέραιος μεταξύ __ocs_fmt_0__ και __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Τρέχον στυλ κειμένου: "__ocs_fmt_0__" Ύψος κειμένου: __ocs_fmt_1__
.fields-found = Βρέθηκαν πεδία: __ocs_fmt_0__.
-1
View File
@@ -6118,7 +6118,6 @@ count-feature =
.area-active = count area is active.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (read only)
.requires-0-or-1 = Requires 0 or 1 only.
.requires-int-range = Requires an integer between __ocs_fmt_0__ and __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Current text style: "__ocs_fmt_0__" Text height: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ field(s) found.
-1
View File
@@ -6117,7 +6117,6 @@ count-feature =
.area-active = El área de recuento está activa.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (solo lectura)
.requires-0-or-1 = Solo admite 0 o 1.
.requires-int-range = Se requiere un entero entre __ocs_fmt_0__ y __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Estilo de texto actual: "__ocs_fmt_0__" Altura de texto: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ campo(s) encontrado(s).
-1
View File
@@ -6114,7 +6114,6 @@ count-feature =
.area-active = Laskenta-alue on aktiivinen.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (vain luku)
.requires-0-or-1 = Vain 0 tai 1 sallitaan.
.requires-int-range = Vaaditaan kokonaisluku väliltä __ocs_fmt_0__–__ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Nykyinen tekstityyli: "__ocs_fmt_0__" Tekstin korkeus: __ocs_fmt_1__
.fields-found = Kenttiä löytyi: __ocs_fmt_0__.
-1
View File
@@ -6116,7 +6116,6 @@ count-feature =
.area-active = La zone de comptage est active.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (lecture seule)
.requires-0-or-1 = Nécessite 0 ou 1 uniquement.
.requires-int-range = Nécessite un entier compris entre __ocs_fmt_0__ et __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Style de texte courant : "__ocs_fmt_0__" Hauteur du texte : __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ champ(s) trouvé(s).
-1
View File
@@ -6105,7 +6105,6 @@ count-feature =
.area-active = गणना क्षेत्र सक्रिय है।
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (केवल पढ़ने के लिए)
.requires-0-or-1 = केवल 0 या 1 आवश्यक है।
.requires-int-range = __ocs_fmt_0__ और __ocs_fmt_1__ के बीच पूर्णांक आवश्यक है।
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT वर्तमान टेक्स्ट शैली: "__ocs_fmt_0__" टेक्स्ट ऊँचाई: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ फ़ील्ड मिले।
-1
View File
@@ -6116,7 +6116,6 @@ count-feature =
.area-active = A számlálási terület aktív.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (csak olvasható)
.requires-0-or-1 = Csak 0 vagy 1 adható meg.
.requires-int-range = __ocs_fmt_0__ és __ocs_fmt_1__ közötti egész szám szükséges.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Aktuális szövegstílus: "__ocs_fmt_0__" Szövegmagasság: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ mező található.
-1
View File
@@ -6116,7 +6116,6 @@ count-feature =
.area-active = L'area di conteggio è attiva.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (sola lettura)
.requires-0-or-1 = Richiede solo 0 o 1.
.requires-int-range = Richiede un numero intero compreso tra __ocs_fmt_0__ e __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Stile di testo corrente: "__ocs_fmt_0__" Altezza testo: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ campi trovati.
-1
View File
@@ -6105,7 +6105,6 @@ count-feature =
.area-active = カウント領域が有効です。
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (読み取り専用)
.requires-0-or-1 = 0 または 1 のみ指定できます。
.requires-int-range = __ocs_fmt_0__ から __ocs_fmt_1__ までの整数を指定してください。
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT 現在の文字スタイル: "__ocs_fmt_0__" 文字の高さ: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ 個のフィールドが見つかりました。
-1
View File
@@ -6116,7 +6116,6 @@ count-feature =
.area-active = 개수 영역이 활성화되었습니다.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (읽기 전용)
.requires-0-or-1 = 0 또는 1만 입력할 수 있습니다.
.requires-int-range = __ocs_fmt_0__에서 __ocs_fmt_1__ 사이의 정수가 필요합니다.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT 현재 문자 스타일: "__ocs_fmt_0__" 문자 높이: __ocs_fmt_1__
.fields-found = 필드 __ocs_fmt_0__개를 찾았습니다.
-1
View File
@@ -6115,7 +6115,6 @@ count-feature =
.area-active = Telgebied is actief.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (alleen-lezen)
.requires-0-or-1 = Alleen 0 of 1 toegestaan.
.requires-int-range = Vereist een geheel getal tussen __ocs_fmt_0__ en __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Huidige tekststijl: "__ocs_fmt_0__" Teksthoogte: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ veld(en) gevonden.
-1
View File
@@ -6116,7 +6116,6 @@ count-feature =
.area-active = Obszar liczenia jest aktywny.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (tylko do odczytu)
.requires-0-or-1 = Wymaga wyłącznie 0 lub 1.
.requires-int-range = Wymaga liczby całkowitej z zakresu od __ocs_fmt_0__ do __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Bieżący styl tekstu: "__ocs_fmt_0__" Wysokość tekstu: __ocs_fmt_1__
.fields-found = Znaleziono pól: __ocs_fmt_0__.
-1
View File
@@ -6117,7 +6117,6 @@ count-feature =
.area-active = A área de contagem está ativa.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (somente leitura)
.requires-0-or-1 = Requer apenas 0 ou 1.
.requires-int-range = Requer um número inteiro entre __ocs_fmt_0__ e __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Estilo de texto atual: "__ocs_fmt_0__" Altura do texto: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ campo(s) encontrado(s).
-1
View File
@@ -6118,7 +6118,6 @@ count-feature =
.area-active = Область подсчёта активна.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (только чтение)
.requires-0-or-1 = Допускается только 0 или 1.
.requires-int-range = Требуется целое число от __ocs_fmt_0__ до __ocs_fmt_1__.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Текущий текстовый стиль: "__ocs_fmt_0__" Высота текста: __ocs_fmt_1__
.fields-found = Найдено полей: __ocs_fmt_0__.
-1
View File
@@ -6040,7 +6040,6 @@ count-feature =
.area-active = Sayım alanı etkin.
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__ (salt okunur)
.requires-0-or-1 = Yalnızca 0 veya 1 girilebilir.
.requires-int-range = __ocs_fmt_0__ ile __ocs_fmt_1__ arasında bir tamsayı gerekir.
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT Geçerli metin stili: "__ocs_fmt_0__" Metin yüksekliği: __ocs_fmt_1__
.fields-found = __ocs_fmt_0__ alan bulundu.
-1
View File
@@ -6100,7 +6100,6 @@ count-feature =
.area-active = 计数区域已激活。
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__(只读)
.requires-0-or-1 = 只能为 0 或 1。
.requires-int-range = 需要介于 __ocs_fmt_0__ 和 __ocs_fmt_1__ 之间的整数。
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT 当前文字样式: "__ocs_fmt_0__" 文字高度: __ocs_fmt_1__
.fields-found = 找到 __ocs_fmt_0__ 个字段。
-1
View File
@@ -6112,7 +6112,6 @@ count-feature =
.area-active = 計數區域已啟用。
.read-only-value = __ocs_fmt_0__ = __ocs_fmt_1__(唯讀)
.requires-0-or-1 = 只能為 0 或 1。
.requires-int-range = 需要介於 __ocs_fmt_0__ 與 __ocs_fmt_1__ 之間的整數。
.target-count = __ocs_fmt_0__ ...... __ocs_fmt_1__
.mtext-current-style = MTEXT 目前文字型式: "__ocs_fmt_0__" 文字高度: __ocs_fmt_1__
.fields-found = 找到 __ocs_fmt_0__ 個欄位。
+22 -12
View File
@@ -2779,20 +2779,30 @@ mod tests {
// identical in both (zero visual change — the layer only adds bytes).
#[test]
fn searchable_layer_coexists_with_outlines() {
let mut outline_only = text_wire("HELLO", [20.0, 20.0, 0.0]);
outline_only.wire.searchable_text.clear();
let mut searchable = text_wire("HELLO", [20.0, 20.0, 0.0]);
searchable.wire.searchable_text =
searchable_wire("HELLO", [20.0, 20.0, 0.0]).wire.searchable_text;
use crate::scene::text::sdf_atlas;
// Other tests share the glyph atlas; a re-bake between laying out the
// glyphs and exporting them moves the outline lookups, so build and
// export under one atlas generation.
let (outline_bytes, searchable_bytes) = loop {
let generation = sdf_atlas::generation();
let mut outline_only = text_wire("HELLO", [20.0, 20.0, 0.0]);
outline_only.wire.searchable_text.clear();
let mut searchable = text_wire("HELLO", [20.0, 20.0, 0.0]);
searchable.wire.searchable_text =
searchable_wire("HELLO", [20.0, 20.0, 0.0]).wire.searchable_text;
// Outlines are never suppressed: both wires keep their glyph quads.
assert!(
!searchable.wire.text_verts.is_empty(),
"searchable wire must keep its outline quads"
);
// Outlines are never suppressed: both wires keep their glyph quads.
assert!(
!searchable.wire.text_verts.is_empty(),
"searchable wire must keep its outline quads"
);
let outline_bytes = build_pdf_pages(&[test_page(vec![outline_only])], None).unwrap();
let searchable_bytes = build_pdf_pages(&[test_page(vec![searchable])], None).unwrap();
let outline_bytes = build_pdf_pages(&[test_page(vec![outline_only])], None).unwrap();
let searchable_bytes = build_pdf_pages(&[test_page(vec![searchable])], None).unwrap();
if sdf_atlas::generation() == generation {
break (outline_bytes, searchable_bytes);
}
};
let outline_stream = pdf_stream_text(&outline_bytes);
let searchable_stream = pdf_stream_text(&searchable_bytes);
-1
View File
@@ -5719,7 +5719,6 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
"count area is active." => Some(("count-feature", "area-active")),
"{name} = {v} (read only)" => Some(("count-feature", "read-only-value")),
"Requires 0 or 1 only." => Some(("count-feature", "requires-0-or-1")),
"Requires an integer between {min} and {max}." => Some(("count-feature", "requires-int-range")),
"{name} ...... {n}" => Some(("count-feature", "target-count")),
"MTEXT Current text style: \"{}\" Text height: {:.4}" => Some(("count-feature", "mtext-current-style")),
"{found} field(s) found." => Some(("count-feature", "fields-found")),
+1 -1
View File
@@ -29,7 +29,7 @@ const MODERN_PROTOCOL_VERSION: &str = "2026-07-28";
/// changes, so schema drift (new params, renamed tools) is always a conscious,
/// reviewed edit — and clients can detect a stale bridge by comparing digests.
#[cfg(test)]
const TOOL_SCHEMA_DIGEST: &str = "537fd4e77a61b9333f21dcd294b6c91b338884acc9cd2964cbb74855821cfa12";
const TOOL_SCHEMA_DIGEST: &str = "bbecd61a9295ecd8e3fefe6a223252107d80d173da7544edacaa2880139683ad";
const MAX_REQUEST: usize = 1_048_576;
const MAX_RESPONSE: u64 = 16 * 1024 * 1024;
const CACHE_TTL_MS: u64 = 3_600_000;