# Отчёт: что изменилось после переустановки AutoClaw и что из этого сломалось

**Дата замера:** 15 октября 2026, ~14:30–14:45 (локальное время машины).
**Проект:** RAGRAF (`RAGRAF`), корпус `rev-0137…rev-0139`, `capability=full`.
**Роль:** диагностика связки «AutoClaw ↔ RAGRAF». Правки внесены только там, где дефект замерен.

Короткий итог — в разделе 1. Разбор вопроса «чем грозит работа не от админа» — раздел 5.
Ответ про скрипт прав — раздел 8.

---

## 1. Короткий итог

1. **Переустановка — это переход 1.18.5 → 2.1.1 и смена раскладки установки**: приложение
   переехало из машинного `C:\Program Files\AutoClaw` в пользовательский
   `%LOCALAPPDATA%\Programs\AutoClaw2`, поэтому и работает без прав администратора.
   Это штатное следствие новой раскладки, а не поломка.
2. **Главная находка к переустановке не относится.** Каталог `RAGRAF` помечен
   **меткой целостности Low**, а по замеру (раздел 3) **любой exe, лежащий в таком каталоге,
   запускается с низкой целостностью и урезанным токеном**. `java.exe` живёт в
   `.tools\jdk\bin`, поэтому всегда стартует с Low и **не может писать
   никуда, кроме этого дерева**: ни в `%TEMP%`, ни в каталоги других проектов. Это и есть
   причина отказа сборки CPG (Joern), о котором писал отчёт по `a.batteryservice.ru`
   (второе вложение): временный `php.ini` для php2cpg и файл `cpg.bin` создаются вне дерева.
3. **Права NTFS ни при чём.** Запись внутрь дерева у java есть; ограничение задано меткой
   целостности (SACL), поэтому лечится не выдачей прав на папки, а снятием метки Low —
   либо работой java только внутри дерева.
4. **Исправлено при этой проверке:** развёрнутые копии навыка `ragraf-core` отстали от
   проектных (раздел 6.2). Остальные точки из промта от 12.10 совпали с эталоном.
5. **Требует решения владельца:** снять метку Low (скрипт приложен, раздел 8) либо сохранить
   песочницу и перенастроить пути java/Joern (раздел 8.3).

---

## 2. Что именно изменилось при переустановке

| | Эталон 12.10.2026 | Факт 15.10.2026 |
|---|---|---|
| Приложение | 1.18.5.851, `C:\Program Files\AutoClaw` | **2.1.1.262**, `%LOCALAPPDATA%\Programs\AutoClaw2` (по-user) |
| Прежняя установка | — | `C:\Program Files\AutoClaw\AutoClaw.exe` (1.18.5.851, 11.09.2026) осталась на диске |
| Процесс | — | `AMD5700X3D\mvd`, целостность **Medium**, `Administrators → Group used for deny only` |
| Состояние приложения | `.openclaw-autoclaw\` | `%USERPROFILE%\.openclaw-autoclaw\` (workspace агента остался `<полигон>`) |

Замер версий:

```
C:\Program Files\AutoClaw\AutoClaw.exe            FileVersion 1.18.5.851   mtime 2026-09-11 11:45
%LOCALAPPDATA%\Programs\AutoClaw2\AutoClaw2.exe   FileVersion 2.1.1.262    mtime 2026-10-12 13:41
%LOCALAPPDATA%\Programs\AutoClaw2\version         содержимое: 42.6.1
%USERPROFILE%\.openclaw-autoclaw\.startup-validation.json  {"version":"1.18.5","updatedAt":"2026-10-15T04:39:17.308Z"}
```

Замечание к последним двум строкам: файл `version` рядом с исполняемым файлом (42.6.1) — это
версия рантайма Electron, а не приложения; в справочнике `AMD\01-машина\Окружение.md`
именно она записана как версия AutoClaw (строка таблицы «AutoClaw | 42.6.1 | …AutoClaw2»), то есть
**число в справочнике требует уточнения.** Запись `1.18.5` в `.startup-validation.json` сделана
сегодня в 07:39 — в те же минуты обновлялись `config\mcporter.json` (07:38) и
`.cluster\expert-playbook.md` (07:39), что похоже на след операции переноса/обновления;
работающее приложение при этом — из `AutoClaw2`.

---

## 3. Главная находка: метка Low на дереве RAGRAF и отказ java

### 3.1 Измеренное правило

Проба: копия `%SystemRoot%\System32\whoami.exe` кладётся в проверяемый каталог, запускается с
`/groups`, в выводе читается строка `Mandatory Label\…`. Результаты:

| Куда положен exe | Метка каталога | Целостность процесса |
|---|---|---|
| `RAGRAF` (корень) | Low | **Low** |
| `src` | Low (наследуется) | **Low** |
| `.tools` | Low (наследуется) | **Low** |
| `.ragraf` | Low (наследуется) | **Low** |
| `%TEMP%\ragraf-probe` | метки нет | Medium |
| `<полигон>` | метки нет | Medium |
| `z.batteryservice.ru` | метки нет | Medium |
| `C:\tools` | метки нет | Medium |
| `C:\Windows\Temp` | метки нет | Medium |
| `…\AppData\Local\Microsoft\Windows\INetCache\Low` | Low | **Low** |
| `…\Microsoft\Windows\Temporary Internet Files\Low` | Low | **Low** |
| `…\AppData\Local\Temp\Low` | Low | **Low** |
| `…\AppData\LocalLow` | Low | **Low** |

Два независимых уточнения:

* **Правило не наследуется от процесса.** Тот же `java.exe`, запущенный через WMI
  (`Win32_Process.Create`, родитель — системная служба `WmiPrvSE`), получил тот же **Low**.
  Значит, дело не в песочнице приложения и не в цепочке запуска.
* **Правило привязано к расположению, а не к файлу.** Копия, перенесённая из дерева в `%TEMP%`,
  метку не сохраняет и запускается уже **Medium**.

Те же четыре системных каталога `…\Low` (созданные Windows, а не владельцем) воспроизводят
поведение, поэтому источник правила — **метка целостности на каталоге**, а не какая-либо
настройка конкретного продукта.

### 3.2 Что это делает с java и CPG

`java.exe` лежит в `.tools\jdk\bin\java.exe`, то есть **всегда** попадает под
правило — независимо от того, какой корпус индексируется. Замер (java 21.0.12.1):

```
java.io.tmpdir = C:\Users\<пользователь>\AppData\Local\Temp\
  createTempFile      -> AccessDeniedException
  createTempDirectory -> AccessDeniedException
  запись php.ini      -> AccessDeniedException

java -Djava.io.tmpdir=.scratch-probe
  createTempFile      -> OK
  createTempDirectory -> OK
  запись php.ini      -> OK
```

Это ровно те два отказа, которые зафиксировал отчёт по `a.batteryservice.ru`: временный `php.ini`
для php2cpg и запись `cpg.bin`. Вывод того отчёта («ограничение окружения на запись для процессов
Java… вопрос к вам, а не правка в проекте») подтверждается, но причина не «режим AutoClaw»:
правило действует и для процесса, запущенного системной службой.

Ссылки на код, откуда берутся пути запуска (по индексу, rev-0139):
`src/ragraf/cpg.py:63-88` — `find_java()`: сначала `RAGRAF_JAVA_HOME`, затем `.tools/jdk`, затем
`PATH`; `src/ragraf/cpg.py:91-102` — `find_php()`; `src/ragraf/joern_server.py:153-159` —
`JAVA_HOME` в окружении сервера Joern и рабочий каталог сервера.

### 3.3 Что ещё стоит на дереве

```
RAGRAF  Everyone:(CI)(DENY)(DC)
                    S-1-4-379822104-920673769:(OI)(CI)(W,D,DC)
                    NT AUTHORITY\Authenticated Users:(OI)(CI)(F)
                    BUILTIN\Users:(OI)(CI)(F)
                    BUILTIN\Administrators:(I)(OI)(CI)(F)
                    NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                    BUILTIN\Users:(I)(OI)(CI)(RX)
                    NT AUTHORITY\Authenticated Users:(I)(M)
                    Mandatory Label\Low Mandatory Level:(OI)(CI)(NW)
```

* метка Low выставлена **явно на корне** дерева (`<полигон>` метки не имеет, то есть она не
  унаследована сверху);
* SID `S-1-4-…` — authority 4 («non-unique»), ни в имя пользователя, ни в группу не
  разрешается (`Translate()` возвращает «identity references could not be translated»), и ему
  выдана запись в дерево;
* ACE «Everyone (CI) DENY DC» проверен на практике: удаление файлов и подкаталогов внутри дерева
  проходит, помех работе не создаёт;
* владелец корня — `BUILTIN\Administrators`, владелец `.tools` — `AMD5700X3D\mvd`.

**Источник этих ACE и метки не найден** ни в файлах проекта, ни в справочнике `AMD`,
ни в `.zwork`, ни в конфигурации приложения (искал по `setintegritylevel`, `S-1-4-…`,
`Low Mandatory`, `Mandatory Label`). Версия-гипотеза (не факт): дерево готовилось как песочница —
метка Low + запрет удаления + выдача записи отдельному SID. Датировать изменение без
администратора нельзя: журнал USN и `HKLM\SECURITY\Policy\Safer` доступны только с повышением.

### 3.4 Почему это не связано с переустановкой

Метка — свойство каталога, а не приложения: правило воспроизводится на системных каталогах
`…\Low`, действует для процесса, запущенного службой, и на поведение процессов, запущенных из
каталогов без метки, обновление не влияет. Против версии «это сделало обновление» говорит и то,
что замер по `RAGRAF` не зависел ни от версии приложения, ни от того, повышен ли
процесс.

---

## 4. Что из проблем из второго вложения связано с этой находкой

| Проблема из отчёта по `a.batteryservice.ru` | Связь | Почему |
|---|---|---|
| CPG падает: `php.ini` (php2cpg) и `cpg.bin` — `AccessDeniedException` | **Да, та же причина** | java всегда Low (раздел 3.2) |
| `capability=full` держится только на рёбрах прошлых ревизий | Косвенно | следствие отказа CPG |
| Слой схемы из миграций пуст (маска `migrations/*.sql`) | Нет | отдельная мелочь разбора, прав и меток не касается |
| Пороги переиндексации 10/40/30 под корпус 7352 файла | Нет | настройка конфига, решение владельца |
| В сессии нет инструментов `ragraf_*` | Нет | MCP-сервер RAGRAF не зарегистрирован; подтверждаю для своей сессии: работал через CLI |

---

## 5. Ответ на вопрос: чем грозит работа приложения не от администратора

Замер: аккаунт `mvd` **входит** в `Administrators`, но процесс идёт с фильтрованным токеном UAC —
`BUILTIN\Administrators → Group used for deny only`, целостность Medium, `IsInRole(Administrator)`
= `False`.

| Доступно без повышения | Недоступно без повышения |
|---|---|
| `<полигон>` и подкаталоги, `C:\tools` (Authenticated Users: M), `%TEMP%`, профиль | `C:\Program Files\**`, `C:\Windows\**`, правка `C:\ProgramData\MySQL\data` |
| запись индекса RAGRAF (замерено: пересбор `full`, 621 файл) | службы: `Restart-Service`, `Set-Service`, правка `my.ini` |
| MySQL: работа с уже запущенной службой, SQL по §7 правил | чтение `HKLM\SECURITY\Policy\Safer` (правила SRP), полный реестр HKLM |
| git по HTTPS (диспетчер учётных данных) | установка MSI / `--scope machine`, правила брандмауэра, задачи от SYSTEM |
| проверки проекта (`Invoke-ProjectDoctrine.ps1`, `check_bom_crlf.py`) | изменение метки целостности на объектах, не подконтрольных пользователю |

Отдельно замерено: снятие метки целостности **на объекте, подконтрольном пользователю**,
прошло **без** прав администратора: `icacls <подкаталог> /setintegritylevel "(OI)(CI)M"` →
`Successfully processed 1 files`, метка сменилась `Low → Medium`. То есть права администратора
для этой правки не обязательны (раздел 8).

**Вывод.** Ни одна из найденных поломок не вызвана не-административным режимом работы:
ограничение задано меткой на каталоге и воспроизводится независимо от прав процесса.
Не-административный режим сужает круг задач (службы, реестр, установка), но именно CPG ломает
не он.

Попутно: `Get-MpPreference` в этой сессии вернул `0x800106ba` (служба Windows Defender не
запущена — активна Kaspersky), поэтому состояние Controlled Folder Access и правил ASR прочитать
не удалось.

---

## 6. Что ещё проверено по промту от 12.10.2026

### 6.1 Сверка с эталоном

| Точка | Эталон 12.10 | Факт 15.10 | Вывод |
|---|---|---|---|
| Индекс проекта | rev-0039, 491 файл | rev-0137 → rev-0139, 621 файл (`ensure` → `reindexed`, full 53,2 с) | растёт, норма |
| Сумма корпуса | `514a115a…` | `06daf33c…`; `freshness`: `changed_since_index=false`, `stale=false` | изменилась вместе с кодом, актуальна |
| `AGENTS.md` проекта | 53 970 б, `6B941AB8…` | 43 515 б, `E12EC402…`, mtime 14.10 16:13 | сокращён при выносе ловушек в `AGENTS-TRAPS.md` (47 479 б, 14.10 14:24) — проектная работа |
| `docs/AGENTS-context.md` | 34 065 б | 47 280 б, mtime 14.10 23:29 | проектная работа |
| `config/ragraf.yaml` | 5 156 б, `325C07B8…` | 5 156 б, `325C07B8…` | **совпал** |
| Навык `SKILL.md` | 9 811 б, `6D4C3353…` | проект 12 358 б; развёрнутые копии 11 894 б | **отстали → исправлено (6.2)** |
| Навык `reference/operations.md` | 7 546 б | проект 14 777 б; развёрнутые 8 503 б | **отстали → исправлено (6.2)** |
| Навык `reference/repair.md` | 11 271 б, `995A56BB…` | 11 271 б, `995A56BB…` | **совпал** |
| Правила рабочего каталога `AGENTS.md` | 12 524 б, `901C10FD…` | 12 524 б, `901C10FD…` | **совпал** |
| Правила pwsh `~\.pi\agent\AGENTS.md` | 134 466 б, `1E658D75…` | 147 494 б, `A6B0203E…`, mtime 14.10 19:24 | **вырос**; разделы на месте — в моих инструкциях есть §8, §8.17, §8.20, то есть подхват правил работает; уменьшения/потери нет, рядом 30 резервных копий |
| Линтер `Test-PwshApiVintage.ps1` | 12 846 б, `AA8C1FC6…` | 12 846 б, `AA8C1FC6…` | **совпал** |
| Чекер конвенций | 14 проверок, 0/0 | **19 проверок, 0 ошибок, 0 предупреждений, PASS** | вырос, чисто |
| Чистота текстов | 38 из 38 | **39 из 39** | чисто |
| Git-источник | `RAGRAF.git\RAGRAF`, ветка `main`, `6a62a07` | ветка `main`, `6a62a07` (12.10) | **совпал** |
| MCP рабочего каталога | 2 сервера `enabled` | 2 сервера `enabled` (`autoclaw-productivity`, `autoclaw-github`) | **совпал** |
| Joern | порт 9500 свободен, `java.exe` 0 | порт 9500 свободен, `java.exe` 0 | **совпал** |
| workspace агента | `<полигон>` | `agents.defaults.workspace = <полигон>`; `agents.list`: `main` c `default: true` | **совпал** |
| `runtime.sqlite`: `governed_project_instruction_revisions` | 38 строк | **43** | вырос, потерь нет |
| SOP платформы (`expert-sop*.json/txt`) | были на месте | на глубине 4 в каталогах аккаунта не найдены | **требует уточнения** (возможно, лежат глубже или переименованы) |

Конфигурации приложения и MCP читались, но **не правились** (по §0.1 промта).

### 6.2 Исправленный дефект: развёрнутые копии навыка отстали

Правило §11 проекта требует, чтобы копия навыка в служебном каталоге совпадала с проектной
**побайтово**. Было: в обеих учётных записях `SKILL.md` 11 894 б и `reference/operations.md`
8 503 б (13.10 17:42) против проектных 12 358 б и 14 777 б (14.10 16:11).

Сделано: обновлены 4 файла в двух каталогах
`%APPDATA%\AutoClaw-oversea-official\accounts\<аккаунт>\runtime\zwork-agent\skills\ragraf-core`;
побайтовое совпадение проверено хешами после копирования.
Хранилище ревизий платформы (`pi-resources\revisions\…`) не трогалось: это её внутренний слепок.

---

## 7. Что я не делал

* не менял ACL, метки целостности, владельцев и права — ни на одном каталоге;
* не правил реестр, конфигурации приложения и MCP, не трогал `C:\Program Files\AutoClaw` и
  `AutoClaw2` (в том числе не патчил бинарники);
* не менял код проекта: предложения по `cpg.py`/`joern_server.py` не вносил (раздел 8.3);
* не запускал реиндексацию ради мелочей (`schema_db`, пороги) — только `ensure` по правилу §8;
* не удалял ничего из файлов владельца.

Изменено за задачу: 4 файла копий навыка (6.2). Создано: отчёт и скрипт (раздел 8).
Пробники удалены: `%TEMP%\ragraf-probe`, `%TEMP%\ragraf-diag`, `.scratch-probe`,
`.tools\wprobe.exe`, `.tools\jjj.exe`,
`.tools\zan2.exe`.

Не проверено (названо прямо): содержимое `HKLM\SECURITY\Policy\Safer`, датировка появления метки,
SOP-файлы платформы, `Get-MpPreference` (`0x800106ba`).

---

## 8. Что делать: ответ про «скрипт, который пропишет права»

**Права выдавать не нужно.** У java уже есть полный доступ внутрь дерева
(`Authenticated Users:(OI)(CI)(F)`), и запись туда проходит — замерено. Ломает работу **метка
целостности**, поэтому исправление — это снятие метки Low, а не `icacls /grant`.

### 8.1 Скрипт

`tools\Fix-LowIntegritySandbox.ps1` — запускается **владельцем**, по умолчанию только измеряет:

```powershell
# отчёт: ACL, метка, целостность процесса из каталога, проба записи java
pwsh -NoLogo -NoProfile -File .\tools\Fix-LowIntegritySandbox.ps1

# снятие метки (метка Medium, наследуемо на подкаталоги) + повторная проверка
pwsh -NoLogo -NoProfile -File .\tools\Fix-LowIntegritySandbox.ps1 -Apply -Confirm:$false
```

Что он делает: снимает факты до правки (журнал + текстовый слепок ACL и метки, `icacls /save`
метку не сохраняет), по ключу `-Apply` вызывает `icacls <корень> /setintegritylevel "(OI)(CI)M"`,
затем повторяет пробу и говорит, устранено ли ограничение. Коды возврата: 0 — чисто/устранено,
1 — осталось, 2 — правка отклонена (нужен запуск из консоли администратора), 3 — нет целевого
каталога. Права администратора нужны **не всегда**: замерено, что на объекте, подконтрольном
пользователю, метка меняется и без повышения; корень дерева принадлежит `BUILTIN\Administrators`
(его ACL выдаёт `Authenticated Users` полный доступ), поэтому возможны оба исхода — скрипт
сообщит, какой получился.

После снятия метки:

```powershell
cd RAGRAF
python tools\ragraf.py -p config\ragraf.yaml reindex
```

Признак успеха: в `index_status` стадия `cpg` даёт `items>0`, а `capability=full` не держится на
фразе «рёбра перенесены из rev-…».

### 8.2 Если решено сохранить песочницу

Тогда метку не снимать, а держать записи java внутри дерева:

* задать процессу Joern/php2cpg `TEMP`, `TMP` и `-Djava.io.tmpdir` на каталог внутри
  `RAGRAF` — замерено, что этого достаточно (проба в разделе 3.2);
* рабочий каталог Joern держать внутри дерева; для чужих корпусов (вне дерева) это и есть причина
  отказа — им потребуется либо свой Low-помеченный каталог, либо снятая метка;
* либо перенести инструменты наружу (`C:\tools\jdk`, `C:\tools\joern`) и указать
  `RAGRAF_JAVA_HOME` (`src/ragraf/cpg.py:63-88`): тогда java снова Medium и ограничение не
  касается вовсе.

### 8.3 Что стоит выяснить под администратором

```powershell
reg query HKLM\SECURITY\Policy\Safer /s      # правила Software Restriction Policies (если есть)
fsutil usn readjournal C: | findstr /i ragraf   # датировать изменение по журналу USN
```

Если окажется, что метку поставил предыдущий эксперимент с изоляцией агента, снимать её безопасно;
если это чужая политика — решение за владельцем.

---

## Приложение: как воспроизвести замеры

```powershell
# 1. целостность процесса из каталога
$p = 'RAGRAF'
New-Item -ItemType Directory -Path "$p\il-probe" -Force | Out-Null
Copy-Item "$env:SystemRoot\System32\whoami.exe" "$p\il-probe\w.exe"
Start-Process "$p\il-probe\w.exe" -ArgumentList '/groups' -RedirectStandardOutput "$p\il-probe\g.txt" -Wait -NoNewWindow
Select-String "$p\il-probe\g.txt" -Pattern 'Mandatory Label'     # Low = S-1-16-4096, Medium = S-1-16-8192
Remove-Item "$p\il-probe" -Recurse -Force

# 2. метка каталога
icacls RAGRAF | Select-String 'Mandatory Label'

# 3. проба записи java
& .tools\jdk\bin\java.exe -XshowSettings:properties -version 2>&1 | Select-String 'java.io.tmpdir'
```

---

## 9. Итог правки (15.10.2026, 15:01–15:05)

По просьбе владельца метка Low с дерева снята:

```
icacls "RAGRAF" /setintegritylevel "(OI)(CI)M"    -> Successfully processed 1 files
```

Снимок состояния до правки: `%TEMP%\ragraf-label-before-20261015-150153.txt`.
Откат (вернуть песочницу): `icacls "RAGRAF" /setintegritylevel "(OI)(CI)L"`.

| Проверка | До | После |
|---|---|---|
| целостность процесса, запущенного из дерева | Low | **Medium** |
| java: временный файл и `php.ini` в `%TEMP%` | AccessDeniedException | **OK** |
| стадия `cpg` при полной индексации | `items=0`, «Joern завершился с кодом 1» | **`items=1919` за 66,0 с** (rev-0142, 623 файла, вся индексация 98,2 с) |
| рёбра вызовов | перенесены из прошлой ревизии (1441) | построены по CPG (`.ragraf\cpg\rev-0142.cpg.bin`, 9,1 МБ) |

Точная причина отказа до правки (измерена на живом запуске Joern):

```
java.lang.ExceptionInInitializerError: Cannot unpack libzstd-jni-1.5.6-3: Access is denied
    ... flatgraph.storage.Serialization.writeGraph ... io.joern.pysrc2cpg.NewMain.main
```

JVM не могла распаковать собственную нативную библиотеку во временный каталог, поэтому запись
графа падала, а `cpg.bin` оставался нулевым файлом.

**Осталось (не связано с меткой, найдено попутно):**

* стадия `cpg` сообщает «серверный путь не дал вызовов…» и «экспорт недоступен: вызовы взяты
  запросами к файлу CPG» — это известная граница проекта (`AGENTS.md`, раздел «Coverage gaps»),
  рёбра получены обходным путём;
* в прогонах индексации векторный слой помечается «vec0 недоступен: sqlite-vec не загрузился»,
  и новые векторы не считаются (`векторов=0`). В отдельном процессе та же база открывается иначе:
  `writable=True, extension_loaded=True, vec_ok=True`, `vec0` виден в `pragma_module_list`,
  создание таблицы проходит; поиск использует вектор (в выдаче «совпало по: вектор»),
  в хранилище 1541 вектор на 8847 чанков. Пометка минимум неточна, покрытие векторами неполное —
  требует отдельного разбора (вероятная причина — блокировка базы параллельными процессами MCP).