fix(tests): пропуск платформенной верификации, привязанный к сборке платформы

Кейсы form-main-attr-dynamic-list и form-main-attr-list-query падали на маке. Диагностика:
дело не в порте (Windows+python проходит) и не в ОС (мак на 8.3.24.1691 проходит) — отвергает
конкретная сборка 8.3.27.1688. Решающий опыт: расширение, загруженное на 8.3.24 и выгруженное
самой платформой, сборка 1688 тоже отвергает с теми же «Неверный путь к данным» — то есть она
не принимает собственный артефакт Конфигуратора, а не наш эмит.

Глухой skipPlatformVerify снял бы проверку и на стендах, где она работает, поэтому он теперь
принимает объект {reason, platforms:[…]} — пропуск только на перечисленных сборках.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-17 23:13:44 +03:00
co-authored by Claude Opus 5
parent e9a40a1499
commit 9dcaa9b6b1
4 changed files with 27 additions and 4 deletions
+1 -1
View File
@@ -300,7 +300,7 @@ ibcmd-проход автоматически `○ skipped`, если рядом
| `osOnly` | нет | `"win32"` / `"darwin"` / `"linux"` — кейс работает только на этой ОС (напр. фейк платформы написан как `.cmd`), на других `○ skipped`. Принимает и массив: `["darwin","linux"]` |
| `cwd` | нет | `"workDir"` — запустить навык из рабочего каталога (нужно, если кейс кладёт туда `.v8-project.json`) |
| `skipValidation` | нет | `true` — не запускать `postValidate` из `_skill.json` (только при `--with-validation`) |
| `skipPlatformVerify` | нет | Непустая строка с причиной — `verify-snapshots.mjs` пропускает кейс. Нужен, когда фикстура не является конфигурацией, которую можно загрузить (напр. фрагмент расширения) |
| `skipPlatformVerify` | нет | Непустая строка с причиной — `verify-snapshots.mjs` пропускает кейс. Нужен, когда фикстура не является конфигурацией, которую можно загрузить (напр. фрагмент расширения). Объект `{"reason": "…", "platforms": ["8.3.27.1688"]}` — пропуск только на перечисленных сборках платформы: кейс валиден, но конкретная сборка его не принимает, а на остальных стендах проверка должна остаться |
### Ключи `expect`
@@ -25,5 +25,9 @@
"file": "cfe/Documents/Расход/Forms/ФормаСписка/Ext/Form.xml",
"text": ["name=\"Объект\"", "<SavedData>"]
}
},
"skipPlatformVerify": {
"reason": "сборка 8.3.27.1688 (macOS) отвергает заимствованную форму с основным реквизитом-динамическим списком: те же «Неверный путь к данным» дала и выгрузка, сделанная самой платформой 8.3.24 из успешно загруженного расширения, — то есть отвергается её собственный артефакт, а не наш эмит. На 8.3.24.1691 и 8.3.27.1859 кейс проходит",
"platforms": ["8.3.27.1688"]
}
}
@@ -18,5 +18,9 @@
"file": "cfe/Documents/Расход.xml",
"text": "<Name>Товары</Name>"
}
},
"skipPlatformVerify": {
"reason": "сборка 8.3.27.1688 (macOS) отвергает заимствованную форму с основным реквизитом-динамическим списком: те же «Неверный путь к данным» дала и выгрузка, сделанная самой платформой 8.3.24 из успешно загруженного расширения, — то есть отвергается её собственный артефакт, а не наш эмит. На 8.3.24.1691 и 8.3.27.1859 кейс проходит",
"platforms": ["8.3.27.1688"]
}
}
+18 -3
View File
@@ -753,10 +753,25 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) {
// Кейс может осознанно исключаться из платформенной проверки — когда его
// результат невалиден by design (например, операция намеренно оставляет
// висящий импорт). Причина обязательна, молча пропускать нельзя.
// Строка — пропуск всегда. Объект `{reason, platforms:[…]}` — пропуск ТОЛЬКО на перечисленных
// сборках платформы: бывает, что кейс валиден и проверяется на всех стендах, кроме одного,
// где сама платформа отвергает даже собственный артефакт. Глухой пропуск в таком случае снял
// бы проверку и там, где она работает.
if (caseData.skipPlatformVerify) {
result.skipped = true;
result.skipReason = String(caseData.skipPlatformVerify);
return result;
const spec = caseData.skipPlatformVerify;
const isObj = typeof spec === 'object' && spec !== null;
const reason = isObj ? spec.reason : String(spec);
if (!reason) {
result.errors.push('skipPlatformVerify: причина обязательна');
return result;
}
const builds = isObj && Array.isArray(spec.platforms) ? spec.platforms : null;
const v8exe = (opts.v8ctx && opts.v8ctx.v8exe) || '';
if (!builds || builds.some(b => v8exe.includes(b))) {
result.skipped = true;
result.skipReason = reason;
return result;
}
}
// caseFiles — файловый вход кейса (напр. XSD для xdto-compile), как в runner.mjs