Files
portal/tools/powershell-destructive.mjs
T
Дмитрий 8e56df3842 refactor(m7-floor): PS-content единый источник — matchPsHardBlacklist в shell-content-rules (variant-analysis)
Закрывающий 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 регрессий).
2026-06-08 09:34:23 +03:00

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;
}