Указатели на контракт — на самом сервере

Контракт в репозитории достаёт только агентов, у которых этот репозиторий
есть. Astra работает на fr1 как tgclaude и infra у неё не склонирован, так
что до неё не дошло бы ничего.

Заведено на сервере:
  ~rus/CLAUDE.md и ~tgclaude/CLAUDE.md — указатель на репо, правило и пять
  граблей, стоивших больше всего; AGENTS.md рядом симлинком, для агентов с
  другой конвенцией. Claude Code читает CLAUDE.md вверх по дереву, поэтому
  файл в хоме работает и при работе в ~tgclaude/imgbot.

  ~rus/MyVault/TOOLS.md, раздел SSH — то же для Astra. Файл смонтирован в
  claude-channels как /vault, изменение видно агенту сразу, в Gitea уезжает
  кроном каждые 5 минут.

MOTD и .bashrc сознательно не использованы: .bashrc выходит на строке 6 для
неинтерактивных шеллов, MOTD показывается только при интерактивном входе, а
агенты обычно дёргают `ssh host 'команда'` и не увидят ни того, ни другого.

Ограничения механизма и причина, по которой детектор дрейфа не заведён,
описаны в servers/fr1.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
gilfanovr
2026-09-08 17:04:08 +03:00
co-authored by Claude Opus 5
parent b56c137b5c
commit 11531ceb16
+31
View File
@@ -241,5 +241,36 @@ backend=systemd banaction=ufw
- ⏳ Дроп-ин `/etc/ssh/sshd_config.d/50-cloud-init.conf` не читается из-под `rus` — под root проверить `sshd -T | grep -iE "permitrootlogin|passwordauth"`, чтобы знать эффективные значения, а не собранные из файлов вручную.
- ⚠️ Описания **других** серверов не сверялись: `servers/de1.md` и `servers/ru1.md` датируются временем до вывода de1, так что могут врать.
## Как это описание поддерживается
Механизм заведён 2026-09-08, после того как сверка нашла десяток расхождений.
**В репозитории:** `CLAUDE.md` — контракт «тронул сервер, обнови описание в
том же прогоне» и правила оформления; `.claude/skills/server-audit/` — метод
сверки и накопленные грабли; `scripts/snapshot.sh` — инвентаризация живого
состояния за один проход (только чтение, без sudo, секретов не печатает).
**На самом сервере**, для агентов, у которых репозитория нет:
- `~rus/CLAUDE.md` и `~tgclaude/CLAUDE.md` — указатель на репо, правило и
пять граблей, которые дороже всего стоили (ufw не видит docker-портов;
группа docker равна root; процесс из SSH не переживёт ребут; абсолютные
пути в чужих базах; мигающий IPv6). Рядом `AGENTS.md` — симлинк на тот же
файл, для агентов, читающих эту конвенцию. Claude Code подхватывает
`CLAUDE.md` вверх по дереву каталогов, поэтому файл в хоме виден и при
работе в подкаталогах вроде `~tgclaude/imgbot`.
- `~rus/MyVault/TOOLS.md`, раздел SSH — та же обязанность для агента Astra.
Файл смонтирован в контейнер `claude-channels` как `/vault`, так что
изменение видно ему сразу, и синкается в Gitea кроном каждые 5 минут.
⚠️ **Чего этот механизм не гарантирует.** MOTD и `.bashrc` не помогут:
`.bashrc` выходит на строке 6 для неинтерактивных шеллов, а MOTD
показывается только при интерактивном входе — то есть агент, дёргающий
`ssh fr1 'команда'`, не увидит ничего. Файлы в хомах достанут только тех,
кто читает `CLAUDE.md`/`AGENTS.md` и чей рабочий каталог оказался внутри
хома. Серверного хука «агент закончил работу» не существует.
Детектор дрейфа (таймер, сравнивающий отпечаток состояния с прошлым и
пишущий в Telegram) обсуждался и **сознательно не заводился** — если
незадокументированные изменения снова начнут накапливаться, начинать
стоит с него.
## Установленные пакеты (сверх базы)
htop, mtr-tiny, tmux, vim, curl, wget, git, unzip, net-tools, dnsutils, ncdu, rsync, fail2ban, unattended-upgrades, sysstat.