From 4c84d840dff0ecad4acc46d89f5ccff246750e25 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 8 Aug 2026 12:53:38 +0300 Subject: [PATCH] =?UTF-8?q?fix(tests):=20=D0=B8=D0=BD=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D1=8D=D1=88=D0=B0?= =?UTF-8?q?=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=20empty-config=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20cf-init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Каталог фикстуры кэшировался навсегда: правка cf-init до него не доходила, снэпшоты записывались со старой фикстурой, и расхождение всплывало только на машине с пустым кэшем. Поймано прогоном на маке — там фикстура собралась заново и принесла TextToSpeech, которого нет в снэпшотах, записанных на Windows. Теперь рядом с фикстурой лежит отпечаток: аргументы плюс хэши обоих портов cf-init. Не совпал — каталог пересобирается. Снэпшоты кейсов 2.21 перезаписаны со свежей фикстурой (дрейф — только TextToSpeech). У mxl-compile снэпшот кейса снят через noSnapshot: у навыка normalizeUuids=false, поэтому UUID фикстуры дрожали бы при каждой пересборке, а предмет кейса проверяет fileContains. 663/663 ps1, 660/663 py. Co-Authored-By: Claude Opus 5 (1M context) --- .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221-pal/.fixture-stamp | 3 + .../format-221-pal/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../skills/cases/mxl-compile/format-221.json | 3 +- .../snapshots/format-221/Configuration.xml | 265 ------------------ .../Ext/ClientApplicationInterface.xml | 18 -- .../format-221/Languages/Русский.xml | 16 -- .../snapshots/format-221/Template.xml | 54 ---- .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + .../snapshots/format-221/.fixture-stamp | 3 + .../snapshots/format-221/Configuration.xml | 4 + tests/skills/runner.mjs | 23 +- 28 files changed, 101 insertions(+), 355 deletions(-) create mode 100644 tests/skills/cases/cfe-borrow/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/cfe-init/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/form-add/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/form-compile/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/meta-compile/snapshots/format-221-pal/.fixture-stamp create mode 100644 tests/skills/cases/meta-edit/snapshots/format-221/.fixture-stamp delete mode 100644 tests/skills/cases/mxl-compile/snapshots/format-221/Configuration.xml delete mode 100644 tests/skills/cases/mxl-compile/snapshots/format-221/Ext/ClientApplicationInterface.xml delete mode 100644 tests/skills/cases/mxl-compile/snapshots/format-221/Languages/Русский.xml delete mode 100644 tests/skills/cases/mxl-compile/snapshots/format-221/Template.xml create mode 100644 tests/skills/cases/role-compile/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/subsystem-compile/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/subsystem-edit/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/template-add/snapshots/format-221/.fixture-stamp create mode 100644 tests/skills/cases/xdto-compile/snapshots/format-221/.fixture-stamp diff --git a/tests/skills/cases/cfe-borrow/snapshots/format-221/.fixture-stamp b/tests/skills/cases/cfe-borrow/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/cfe-borrow/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/cfe-borrow/snapshots/format-221/Configuration.xml b/tests/skills/cases/cfe-borrow/snapshots/format-221/Configuration.xml index 2a84f2ed..698d4709 100644 --- a/tests/skills/cases/cfe-borrow/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/cfe-borrow/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/cfe-init/snapshots/format-221/.fixture-stamp b/tests/skills/cases/cfe-init/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/cfe-init/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/cfe-init/snapshots/format-221/Configuration.xml b/tests/skills/cases/cfe-init/snapshots/format-221/Configuration.xml index 47648c8a..3080965f 100644 --- a/tests/skills/cases/cfe-init/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/cfe-init/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/form-add/snapshots/format-221/.fixture-stamp b/tests/skills/cases/form-add/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/form-add/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/form-add/snapshots/format-221/Configuration.xml b/tests/skills/cases/form-add/snapshots/format-221/Configuration.xml index 2a84f2ed..698d4709 100644 --- a/tests/skills/cases/form-add/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/form-add/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/form-compile/snapshots/format-221/.fixture-stamp b/tests/skills/cases/form-compile/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/form-compile/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/form-compile/snapshots/format-221/Configuration.xml b/tests/skills/cases/form-compile/snapshots/format-221/Configuration.xml index 2a84f2ed..698d4709 100644 --- a/tests/skills/cases/form-compile/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/form-compile/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/meta-compile/snapshots/format-221-pal/.fixture-stamp b/tests/skills/cases/meta-compile/snapshots/format-221-pal/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-221-pal/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/format-221-pal/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/format-221-pal/Configuration.xml index 639d97c2..807ab692 100644 --- a/tests/skills/cases/meta-compile/snapshots/format-221-pal/Configuration.xml +++ b/tests/skills/cases/meta-compile/snapshots/format-221-pal/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/meta-edit/snapshots/format-221/.fixture-stamp b/tests/skills/cases/meta-edit/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/format-221/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/format-221/Configuration.xml index 3c8c93fb..246b5ad9 100644 --- a/tests/skills/cases/meta-edit/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/meta-edit/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/mxl-compile/format-221.json b/tests/skills/cases/mxl-compile/format-221.json index 845658d0..d912fef2 100644 --- a/tests/skills/cases/mxl-compile/format-221.json +++ b/tests/skills/cases/mxl-compile/format-221.json @@ -28,5 +28,6 @@ "file": "Template.xml", "text": "xmlns=\"http://v8.1c.ru/8.2/data/spreadsheet\" xmlns:pal=\"http://v8.1c.ru/8.1/data/ui/colors/palette\" xmlns:style=" } - } + }, + "noSnapshot": "фикстура-конфигурация нужна только чтобы навык увидел версию 2.21; её UUID попадают в снэпшот, а у этого навыка normalizeUuids=false — эталон дрожал бы на каждой пересборке фикстуры. Предмет кейса проверяет fileContains." } diff --git a/tests/skills/cases/mxl-compile/snapshots/format-221/Configuration.xml b/tests/skills/cases/mxl-compile/snapshots/format-221/Configuration.xml deleted file mode 100644 index bf135d15..00000000 --- a/tests/skills/cases/mxl-compile/snapshots/format-221/Configuration.xml +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - 9cd510cd-abfc-11d4-9434-004095e12fc7 - 0b4fac2a-6776-4bfc-af10-ad5377cef392 - - - 9fcd25a0-4822-11d4-9414-008048da11f9 - 8392c8a2-cb48-45d2-bb6f-27c67bf9608b - - - e3687481-0a87-462c-a166-9f34594f9bba - 68b934bb-706b-484e-ba96-523db5c1a1c6 - - - 9de14907-ec23-4a07-96f0-85521cb6b53b - 990bbd21-975b-478a-aab0-020172faff72 - - - 51f2d5d8-ea4d-4064-8892-82951750031e - 30407c9e-f7a1-43d6-8d8e-4aca82398bd0 - - - e68182ea-4237-4383-967f-90c1e3370bc7 - 19be8397-1ee6-4a8c-b4c7-02aae4bb6372 - - - fb282519-d103-4dd3-bc12-cb271d631dfc - cb1279b3-b562-4a00-83d4-1d407c27a0c4 - - - - TestConfig - - - ru - TestConfig - - - - - Version8_3_27 - ManagedApplication - - PlatformApplication - - Russian - - - - - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Biometrics - true - - - Location - false - - - BackgroundLocation - false - - - BluetoothPrinters - false - - - WiFiPrinters - false - - - Contacts - false - - - Calendars - false - - - PushNotifications - false - - - LocalNotifications - false - - - InAppPurchases - false - - - PersonalComputerFileExchange - false - - - Ads - false - - - NumberDialing - false - - - CallProcessing - false - - - CallLog - false - - - AutoSendSMS - false - - - ReceiveSMS - false - - - SMSLog - false - - - Camera - false - - - Microphone - false - - - MusicLibrary - false - - - PictureAndVideoLibraries - false - - - AudioPlaybackAndVibration - false - - - BackgroundAudioPlaybackAndVibration - false - - - InstallPackages - false - - - OSBackup - true - - - ApplicationUsageStatistics - false - - - BarcodeScanning - false - - - BackgroundAudioRecording - false - - - AllFilesAccess - false - - - Videoconferences - false - - - NFC - false - - - DocumentScanning - false - - - SpeechToText - false - - - Geofences - false - - - IncomingShareRequests - false - - - AllIncomingShareRequestsTypesProcessing - false - - - - - - NavigationLeft - Auto - Normal - OpenDataInDialogs - - - - - Language.Русский - - - - - - Managed - NotAutoFree - DontUse - DontUse - TaxiEnableVersion8_2 - DontUse - DontUse - Version8_3_27 - - - - Русский - - - \ No newline at end of file diff --git a/tests/skills/cases/mxl-compile/snapshots/format-221/Ext/ClientApplicationInterface.xml b/tests/skills/cases/mxl-compile/snapshots/format-221/Ext/ClientApplicationInterface.xml deleted file mode 100644 index 8fd4bb9e..00000000 --- a/tests/skills/cases/mxl-compile/snapshots/format-221/Ext/ClientApplicationInterface.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 - - - - - b553047f-c9aa-4157-978d-448ecad24248 - - - - - - - - \ No newline at end of file diff --git a/tests/skills/cases/mxl-compile/snapshots/format-221/Languages/Русский.xml b/tests/skills/cases/mxl-compile/snapshots/format-221/Languages/Русский.xml deleted file mode 100644 index 62536e1d..00000000 --- a/tests/skills/cases/mxl-compile/snapshots/format-221/Languages/Русский.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Русский - - - ru - Русский - - - - ru - - - \ No newline at end of file diff --git a/tests/skills/cases/mxl-compile/snapshots/format-221/Template.xml b/tests/skills/cases/mxl-compile/snapshots/format-221/Template.xml deleted file mode 100644 index a0f71e7f..00000000 --- a/tests/skills/cases/mxl-compile/snapshots/format-221/Template.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - ru - ru - - ru - Русский - Русский - - - - 3 - - - 0 - - - 0 - - 2 - - - ru - Тест - - - - - - - true - 1 - 1 - 1 - - Шапка - - Rows - 0 - 0 - -1 - -1 - - - - - 10 - - - 0 - Text - - \ No newline at end of file diff --git a/tests/skills/cases/role-compile/snapshots/format-221/.fixture-stamp b/tests/skills/cases/role-compile/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/role-compile/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/role-compile/snapshots/format-221/Configuration.xml b/tests/skills/cases/role-compile/snapshots/format-221/Configuration.xml index d45d1074..f7497a58 100644 --- a/tests/skills/cases/role-compile/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/role-compile/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/subsystem-compile/snapshots/format-221/.fixture-stamp b/tests/skills/cases/subsystem-compile/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/subsystem-compile/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/subsystem-compile/snapshots/format-221/Configuration.xml b/tests/skills/cases/subsystem-compile/snapshots/format-221/Configuration.xml index 64da9d46..c5e72b04 100644 --- a/tests/skills/cases/subsystem-compile/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/subsystem-compile/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/subsystem-edit/snapshots/format-221/.fixture-stamp b/tests/skills/cases/subsystem-edit/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/subsystem-edit/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/subsystem-edit/snapshots/format-221/Configuration.xml b/tests/skills/cases/subsystem-edit/snapshots/format-221/Configuration.xml index a1d79ea1..1ad84737 100644 --- a/tests/skills/cases/subsystem-edit/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/subsystem-edit/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/template-add/snapshots/format-221/.fixture-stamp b/tests/skills/cases/template-add/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/format-221/Configuration.xml b/tests/skills/cases/template-add/snapshots/format-221/Configuration.xml index f39850aa..399e270f 100644 --- a/tests/skills/cases/template-add/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/template-add/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/cases/xdto-compile/snapshots/format-221/.fixture-stamp b/tests/skills/cases/xdto-compile/snapshots/format-221/.fixture-stamp new file mode 100644 index 00000000..8a227cb8 --- /dev/null +++ b/tests/skills/cases/xdto-compile/snapshots/format-221/.fixture-stamp @@ -0,0 +1,3 @@ +-FormatVersion 2.21 -CompatibilityMode Version8_3_27 +8fb85bbe61436bce439c6daf6d6f56a66ff080bd +65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff \ No newline at end of file diff --git a/tests/skills/cases/xdto-compile/snapshots/format-221/Configuration.xml b/tests/skills/cases/xdto-compile/snapshots/format-221/Configuration.xml index 4c3fd43c..0c25fb36 100644 --- a/tests/skills/cases/xdto-compile/snapshots/format-221/Configuration.xml +++ b/tests/skills/cases/xdto-compile/snapshots/format-221/Configuration.xml @@ -230,6 +230,10 @@ AllIncomingShareRequestsTypesProcessing false + + TextToSpeech + false + diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs index 524bc709..45f3596d 100644 --- a/tests/skills/runner.mjs +++ b/tests/skills/runner.mjs @@ -5,6 +5,7 @@ import { execFileSync, execFile } from 'child_process'; import { existsSync, mkdirSync, mkdtempSync, rmSync, readFileSync, writeFileSync, readdirSync, statSync, cpSync, copyFileSync } from 'fs'; +import { createHash } from 'crypto'; import { join, resolve, dirname, relative, basename, extname } from 'path'; import { tmpdir, cpus } from 'os'; @@ -127,6 +128,17 @@ function ensureSetup(setupName, runtime, skillCasesDir) { // (<=8_3_26 → 5, >=8_3_27 → 9). Отсюда две 2.20-фикстуры с разными режимами. // Фикстура 2.18 (8.3.25) держит границу между свойствами: TypeReductionMode там уже есть, // а LineNumberLength ещё нет — он появился только в 2.20. + // Отпечаток фикстуры: аргументы плюс содержимое ОБОИХ портов cf-init. Порты берём оба, + // чтобы каталог, собранный одним рантаймом, не пережил правку другого. + const fixtureStamp = (args) => { + const parts = [args.join(' ')]; + for (const ext of ['.ps1', '.py']) { + const p = resolve(REPO_ROOT, '.claude/skills/cf-init/scripts/cf-init' + ext); + parts.push(existsSync(p) ? createHash('sha1').update(readFileSync(p)).digest('hex') : 'нет'); + } + return parts.join('\n'); + }; + const EMPTY_CONFIGS = { 'empty-config': [], 'empty-config-218': ['-FormatVersion', '2.18', '-CompatibilityMode', 'Version8_3_24'], @@ -137,12 +149,21 @@ function ensureSetup(setupName, runtime, skillCasesDir) { }; if (EMPTY_CONFIGS[setupName]) { const cached = join(CACHE, setupName); - if (existsSync(cached)) return cached; + // Кэш инвалидируется по содержимому cf-init: без этого правка навыка не доходила до + // фикстуры — старый каталог жил вечно, снэпшоты записывались с ним, и расхождение + // всплывало только на машине с пустым кэшем (поймано на маке, свойство TextToSpeech). + const stamp = join(cached, '.fixture-stamp'); + const want = fixtureStamp(EMPTY_CONFIGS[setupName]); + if (existsSync(cached)) { + if (existsSync(stamp) && readFileSync(stamp, 'utf8') === want) return cached; + rmSync(cached, { recursive: true, force: true }); + } mkdirSync(cached, { recursive: true }); const script = resolveScript('cf-init/scripts/cf-init', runtime); try { execSkillRaw(runtime, script, ['-Name', 'TestConfig', '-OutputDir', cached, ...EMPTY_CONFIGS[setupName]]); + writeFileSync(stamp, want, 'utf8'); } catch (e) { rmSync(cached, { recursive: true, force: true }); throw new Error(`Failed to create ${setupName} fixture: ${e.message}`);