Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ scripts/update_zed_models.py
# Dev notes — не для publish
DEV_EXP.md
# Экспериментальные артефакты — не пушить
.pr_work/
experiments/__pycache__/
experiments/*_results.json
experiments/*_results.csv
Expand Down Expand Up @@ -182,6 +183,13 @@ experiments/compiler_concept*.json
experiments/pagerank_out.txt
experiments/exp_*.py
experiments/research_internet_*.md
# Сырые выгрузки чужих публикаций (дословный текст + личные данные авторов).
# Хранить только ВНЕ репозитория: %LOCALAPPDATA%/mscodebase/audit-cache/.
# В репозитории допустимы лишь свой вывод, sha256, URL и короткие цитаты.
experiments/**/frozen/*_raw_fetch.*
experiments/**/frozen/*.raw.*
experiments/**/frozen/*_page_dump.*
experiments/**/frozen/*_SCRAPED.*
experiments/bootstrap/trace_result.json
experiments/bootstrap/__pycache__/
# Bootstrap Step 3: дефолтный trace_result.json в cwd (bootstrap_trace_plugin.py)
Expand Down Expand Up @@ -231,3 +239,7 @@ _measure_*.py
# E17 experiment: regenerable prompt shards (rebuild via e17_export_*.py)
experiments/bootstrap/e17_shards/*.txt
experiments/bootstrap/e17_judge/*.txt

# Written by tests/test_planted_break_gate.py on every run (atomic, read by nobody).
# Tracked, it dirties git status and invites committing a timestamp.
experiments/planted_break/results.json
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