8e56df3842
Закрывающий variant-analysis-гейт Фазы 1 вскрыл класс P-1 для PowerShell: у powershell-gate был СВОЙ PS_HARD_BLACKLIST (29 паттернов), а пол использовал отдельный узкий psContentBlock (7) — подмножество, которое дрейфовало бы (та же проблема, что P-1 для Bash). После Фазы 8 (увольнение powershell-gate) пол оказался бы слабее гейта, который он заменяет. Решение владельца: исправить сейчас. Зеркало P-1: - PS_HARD_BLACKLIST + matchPsHardBlacklist перенесены в единый дом shell-content-rules; powershell-gate ре-экспортирует (тест single-source-identity: ссылка gate === SCR). - +bare-egress (Invoke-WebRequest/iwr/irm/curl/wget bare — floor НЕ default-deny, нужен в blacklist, не только в whitelist гейта) +rmdir +rm (алиасы Remove-Item, которые гейт ловил whitelist'ом default-deny — полу нужны явно). - psContentBlock стал ТОНКИМ делегатом над matchPsHardBlacklist (симметрия с bashIsContentBlock); пол через него видит ТОТ ЖЕ набор, что гейт. Дрейф невозможен. - Следствие (осознанно): floor теперь блокирует все Set-Content/sc/$env/Az/… как гейт (симметрия с Bash-полом, блокирующим все cp/mv/redirect). Escapable. FP-толерантность унаследована от гейта (например `sc query`/`del.txt` — gate-aligned, fail-safe). powershell-destructive.mjs физически не удалён (живые gate'ы блокируют rm/git rm) — оставлен тонким делегатом (НЕ второй источник). Удаление — follow-up по git-approval. Регрессия tools-only: 3044 passed + 2 skip (baseline 2843+2, 0 регрессий).
18 lines
1.2 KiB
JavaScript
18 lines
1.2 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* powershell-destructive — floor-предикат content-block для PowerShell-tool (V1-PS, правило 8 §4.1).
|
|
* Реоткрытие v3.8 F1: PowerShell-tool был полностью вне scope content-floor.
|
|
*
|
|
* M7 PS single-source (variant-analysis закрыл дрейф): psContentBlock — ТОНКИЙ предикат над ЕДИНЫМ
|
|
* matchPsHardBlacklist (живёт в shell-content-rules, его же зовёт powershell-gate). Раньше здесь был
|
|
* собственный узкий 7-паттерн набор — подмножество gate'а, который дрейфовал бы (та же проблема, что
|
|
* P-1 для Bash). Теперь один источник: пол и gate видят один и тот же набор. Симметрия с
|
|
* bashIsContentBlock (тот тоже floor-предикат над matchBashHardBlacklist + sub-shell/per-segment).
|
|
* floor-decide зовёт это для name==='PowerShell' (Task 1.4).
|
|
*/
|
|
import { matchPsHardBlacklist } from './shell-content-rules.mjs';
|
|
|
|
export function psContentBlock(command) {
|
|
return matchPsHardBlacklist(command) !== null;
|
|
}
|