Skip to content
Merged
2 changes: 2 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ def main():
all_ok &= run_script("scripts/architecture_linter.py", "architecture_linter")
all_ok &= run_script("scripts/lock_guard.py", "lock_guard (advisory)")
all_ok &= run_script("scripts/check_known_issues.py", "check_known_issues")
all_ok &= run_script("scripts/check_third_party_data.py", "third_party_data")
all_ok &= run_script("scripts/check_parallel_sessions.py", "parallel_sessions")
all_ok &= run_script("scripts/ruff_gate.py", "ruff_gate")

if not all_ok:
Expand Down
63 changes: 63 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,69 @@ For file renames, use `apply_file_move(old, new)` instead of `notify_change` —
- NO new root files вне канонического набора §0.6.
- NO второй дневник / KNOWN_ISSUES — `AGENT_DIARY.md` и корневой `KNOWN_ISSUES.md` единственные (проверка `find . -iname "KNOWN_ISSUES.md"`).

### Чужие данные в репозитории (§7.1a) — ЗАПРЕЩЕНО
Репозиторий **PUBLIC** (MIT). Поэтому «взять и закоммитить» = опубликовать навсегда.

- **NEVER** коммитить выгрузку чужой публикации/страницы/профиля: личные email третьих лиц,
блоки `Location/Joined/Education`, дословный чужой текст целиком.
- **В репозитории** допустимы: свой вывод, `sha256`, URL источника, короткие цитаты по делу.
- **Вне репозитория** (сюда): `%LOCALAPPDATA%/mscodebase/audit-cache/<задача>/` — сырьё, frozen-входы,
полные дампы. Это та же конвенция, что `progress.json` (§0).
- **Лицензия:** наш репозиторий MIT; дословная копия чужого текста (dev.to по умолчанию
CC BY-NC-SA) притащит NC/share-alive в наш файл — это заражение лицензии, не только приватность.
- **Gate:** `scripts/check_third_party_data.py` (10-й pre-commit, `--selftest` = positive 2/2 +
negative 2/2, `--all` = FP-замер). Правила: R1 личный email · R2 сигнатура выгруженного профиля ·
R3 объёмный чужой дамп (advisory). Вендоренные метаданные зависимостей (`fixtures/`, lock-файлы,
`pyproject.toml`, `package.json`, `pom.xml`) — легитимная атрибуция, в allowlist.
- **Ловушка при написании своего сканера:** наивный email-regex даёт **89% мусора**
(`модуль@символ.py` в трейсах, `n@mcp.tool` в сниппетах). Замер 2026-10-03: 767 совпадений
на 1893 файлах, из них 686 ложных. Сканер без замера FP бесполезен и умирает от FP-усталости.
- **Перед коммитом:** `git diff --cached --name-only` и спроси себя «это моё или я это выгрузил?».

### Параллельные агент-сессии (§7.1b) — обязательный порядок
> Инцидент 2026-10-03: две сессии в одном дереве. Одна создала `tools/verification/*.py`,
> другая не знала. `tools/knowledge/` появился в общем дереве и исчез — сессия объявила
> «данные потеряны, P1», пока вторая держала их в своём worktree. Третья переключила
> ветку в чужом дереве. Три инцидента из-за одного нарушения: **нет границы территорий.**

1. **Одно рабочее дерево = одна сессия = одна задача.** Если рядом работает другая сессия —
ей нужен **свой worktree**: `git worktree add ../wt-<задача> -b feat/<задача>`.
Никогда две сессии в одном дереве.
2. **Ветка = территория.** Не переключать ветку в дереве, где работает кто-то ещё,
и не делать checkout файлов из чужого дерева.
3. **Реестры принадлежат одной сессии.** Кто начал писать `AGENT_DIARY.md` /
`KNOWN_ISSUES.md` / `EXPERIMENTS_LOG.md` / `WISDOM.md` / `ISSUE.md` — тот и владеет ими.
Остальные пишут **предложение** в `experiments/<задача>/PENDING_LEDGER.md`, а не в реестр.
Молчаливый двойной дневник хуже, чем отсутствие записи.
4. **Коммитить только свои файлы.** Всегда явный список: `git add scripts/x.py AGENTS.md`.
**Никогда** `git add -A`, `git add .`, `git commit -a` — это заберёт чужую незавершённую работу.
5. **Worktree не в `%TEMP%`.** Temp одноразовая: очистка системы удалит незакоммиченную работу
безвозвратно. Постоянные worktree — только рядом с репозиторием.
6. **Перед коммитом — гейт:** `scripts/check_parallel_sessions.py` (11-й pre-commit).
Показывает все чужие деревья, их ветки и незакоммиченные файлы; **BLOCK**, если
застейдженный файл изменён в другом дереве или это реестр, который трогает другая сессия.
7. **Правило §19.4 на отсутствие:** «нет в этом дереве» ≠ «нет нигде». Прежде чем объявить
пропажу — спросить все деревья (`git worktree list`) и только потом делать вывод.

### Что можно и нельзя класть в реестры
> Реестры — **публичный** документ в публичном репо. Что попало в дневник, то опубликовано.

| В реестр ✅ | В реестр ❌ |
|---|---|
| наш вывод и вердикт | выгрузка чужой страницы/профиля целиком |
| `sha256` + URL первоисточника | личные email третьих лиц |
| короткая цитата по делу (1–2 строки) | блоки `Location/Joined/Education` |
| имя автора как атрибуция идеи + ссылка | вендоренный файл без LICENSE/NOTICE |
| числа с командой и знаменателем | числа без referent'а |

- **Вендоренные чужие файлы** (как `experiments/4A_unit_of_return/frozen/crystal_catalogue_2026-09-26.md`,
Apache-2.0, Spanda Works LLC) держать **только** с provenance-заголовком + копией лицензии.
Apache-2.0 §4(c): если у оригинала есть NOTICE — его **обязан** воспроизвести.
Сейчас NOTICE не воспроизведён — это зафиксированное отступление, не скрытая утечка.
- **Замер 2026-10-03 (дневники):** персональных данных в 5 реестрах — **0**.
Имена третьих лиц встречаются как атрибуция идей (40 вхождений «Tom Jones» в 20 файлах) —
это нормальная практика цитирования, при условии что рядом есть ссылка.

### Windows subprocess (§5.16)
- **NEVER** use `subprocess.run(capture_output=True)` in daemon threads — pipe buffer deadlock on Windows.
- **ALWAYS** use `subprocess.Popen(stdout=PIPE, stderr=DEVNULL)` + `communicate(timeout=N)`.
Expand Down
Loading
Loading