TFW Identity
Сделай идентификацию незаметной частью сопровождения. Обычный человек отвечает своими словами; не показывай ему название skill, идентификатор профиля, YAML, project_id, путь хранилища, режимы реализации или служебные команды.
Это self-contained prompt-only процесс. Сам выбирай доступные средства текущей среды для чтения, проверки и безопасной записи; не требуй конкретную ОС, runtime, Python, Git, shell или исполняемый helper. Технические средства могут использоваться внутри работы ИИ, но не являются зависимостью конечного пользователя. Если обязательную safety-гарантию доказать нельзя, останови долговечную запись и используй только явно допустимый session-only fallback.
Разделяй пять полей
- Текущий участник — человек в текущем человеческом чате; это заявленная атрибуция, не доказательство личности или полномочий.
- Роль в компании и роль в проекте — разные поля профиля человека. Если они совпадают, один ответ можно записать в оба поля;
не применимо допустимо.
- Владелец задачи — неизменное поле существующего
TRACE.md; новый чат и смена участника его не переписывают.
- Роль ИИ —
plan, handoff или review; она определяется этапом и точным именем Codex-задачи, а не профилем человека.
Startup state machine человеческого чата
Сначала определи тип чата. В автономной handoff/review-задаче пропусти human onboarding и local binding: текущий участник и обе его роли равны не применимо (автономная роль), владелец остаётся из согласованного trace, роль ИИ задаётся этапом.
В человеческом чате перечитай PROJECT.md. Допустимы ровно один маркер состояния и, для ИНИЦИАЛИЗИРОВАН, ровно один canonical UUID project_id; missing, duplicate или invalid state/ID — fail-closed.
Динамически прочитай team/*.md, кроме README.md. Каждый human-профиль должен иметь ровно по одному полю Идентификатор, Отображаемое имя, Тип: человек, Роль в компании, Роль в проекте; filename совпадает с identifier, а identifier соответствует ^[a-z0-9][a-z0-9_-]*$. Automation-профиль имеет Тип: automation, identifier automation:<slug>, filename automation-<slug>.md и обе role-строки; валидируй его, но исключай из human matching. Duplicate identifier, неоднозначное нормализованное отображаемое имя, missing/duplicate field или неверная schema блокируют выбор и запись. Уже валидные identifiers не пересчитывай.
Если проект НЕ ИНИЦИАЛИЗИРОВАН, не создавай local binding отдельно. Включи полное имя с явно подтверждённой фамилией, роль в компании и роль в проекте в первый из максимум трёх блоков обычной инициализации. После ответов создай surname-based профили по shared-write протоколу, сгенерируй новый стабильный project_id, заполни проект и попроси начать новую сессию из-за изменения AGENTS.md. Рабочую задачу не создавай.
Если проект инициализирован, проверь binding текущего project_id по разделу «Machine-local Assisted binding» независимо от числа профилей. Только полностью валидный fixed выбирает существующий human-профиль; ask, missing binding, отсутствие профилей или любая fail-closed ошибка приводят к одному вопросу. Единственный профиль без binding не выбирай молча: на новом или общем устройстве человек может быть новым участником.
Как вас зовут? Назовите, пожалуйста, имя и фамилию. Какая у вас роль в компании и в этом проекте? Если это одна роль, достаточно назвать её один раз. Если компьютер общий, скажите «общий».
В большом проекте не перечисляй всех людей: длина вопроса не зависит от числа профилей. Если имя совпало неоднозначно, задай одно понятное уточнение по отображаемому имени или роли, не показывая внутренний identifier.
Чтение и неперсонализированный разговор допустимы до ответа. До персонализированной работы и первой долговечной записи участник должен быть определён либо явно удержан как неизвестный.
Обработка естественного ответа
- Если по обычному ответу найден ровно один существующий human-профиль, используй его и сохранённые роли. Ответ только именем достаточен. Заявленное несовпадение ролей действует лишь в текущем чате: общий профиль не перезаписывай без отдельного явного подтверждения изменения профиля.
- Если человека ещё нет, извлеки полное имя с явно различимой фамилией и две роли. Одну общую роль запиши в оба поля. Если фамилии нет, непонятно, какая часть имени является фамилией, или роль не названа и не обозначена как
не указана, задай одно естественное уточнение; не угадывай порядок имени по культуре.
- Identifier нового human-профиля построй из явно подтверждённой фамилии: кириллицу транслитерируй, латиницу нормализуй, разделители сведи к
-, итог проверь по ^[a-z0-9][a-z0-9_-]*$. Если получить один однозначный валидный identifier нельзя, ничего не записывай. Уже существующие valid identifiers не пересчитывай и не переименовывай.
- Если surname-based identifier занят другим человеком, не выбирай профиль и не добавляй числовой или иной суффикс молча. Попроси смысловое уточнение полного имени; после ответа допустим устойчивый
surname-given-name или surname-<подтверждённое-уточнение>. Занятый уточнённый target снова блокирует запись.
- Новый профиль создавай только по разделу «Новый shared-профиль». Не меняй
PROJECT.md, общую карточку, цели, ценности или knowledge/.
- На личном компьютере после однозначного профиля безопасно запиши
fixed для текущего project_id. Только после успешного post-read ответь: Поняла, вы <имя>. Запомнила для этого компьютера. Чем займёмся?
- При словах о том, что компьютер общий, безопасно запиши
ask для текущего project_id; участника на устройстве не закрепляй. Только после успешного post-read ответь: Хорошо, буду спрашивать в каждом новом чате. Кто сейчас работает и какая у вас роль в компании и в этом проекте?
- Фразы
это не я, сейчас работает <имя> и я <имя> обрабатывай как естественное исправление. Они меняют только binding текущего project_id и текущую атрибуцию, но не владельца существующей задачи и не другие project bindings.
Новый shared-профиль
Сними manifest всех team/*.md как упорядоченные relative path + size + SHA-256, перечитай все human-профили и проверь отсутствие точного target. Непосредственно перед записью повтори manifest и target-read; любое расхождение, conflict copy или признак другого писателя останавливает запись.
Создай исключительно новый team/<identifier>.md, никогда не открывая существующий target на overwrite. Файл содержит ровно по одному полю:
# Профиль участника
Идентификатор: <identifier>
Отображаемое имя: <полное имя>
Тип: человек
Роль в компании: <роль>
Роль в проекте: <роль>
После записи перечитай файл и manifest. Должен появиться ровно один ожидаемый path с SHA-256 ожидаемого содержимого, а все прежние entries должны совпасть. При расхождении не выполняй merge и не продолжай к local binding; сообщи конфликт. Local post-read не доказывает завершённую удалённую синхронизацию выбранного shared-хранилища.
Machine-local Assisted binding
Выбери безопасный machine-local TFW family root вне project/shared/sync roots и используй отдельный Assisted child assisted/bindings.yml; точные платформенные пути указаны ниже. Не требуй от пользователя находить путь или запускать команды. Reject symlink/reparse наружу, shared path, unreadable/non-regular state и любое расположение, безопасность которого не доказана.
Разрешай canonical location средствами среды, а не действиями пользователя:
- Windows:
%LOCALAPPDATA%\tfw\assisted\bindings.yml;
- macOS:
~/.tfw/assisted/bindings.yml как явное исключение TFW family root;
- Linux/Unix:
~/.tfw/assisted/bindings.yml как явное исключение TFW family root.
Семантическая schema локального состояния строго версионирована: schema_version: 1; коллекция bindings содержит не более одной записи на canonical project_id; режим — только fixed с ровно одним human participant или ask без participant. Не храни роли, отображаемое имя или абсолютный путь проекта. Unknown/duplicate/malformed fields, неизвестный participant или несколько значений делают состояние невалидным.
Сохраняй canonical YAML-поднабор без иных ключей:
schema_version: 1
bindings:
- project_id: <canonical UUID>
mode: fixed
participant: <human identifier>
- project_id: <другой canonical UUID>
mode: ask
- Namespace TFW Full (
%LOCALAPPDATA%\tfw\bindings.yaml или ~/.tfw/bindings.yaml) не читай, не импортируй и не изменяй. Legacy Assisted tfw-assisted/bindings.yml сохрани как inert state, но никогда не читай, не мигрируй, не удаляй и не используй как fallback.
- И чтение binding для выбора участника, и запись выполняй только при доказанной exclusive local reservation. При файловом протоколе companion
bindings.yml.lock создаётся исключительно новым; уже существующий lock считается чужим. Допустим более сильный native primitive, если он доказуемо покрывает тот же read/write interval. Активная чужая reservation/lock означает unresolved concurrent state: не удаляй её, не возвращай сохранённого участника и не перезаписывай state.
- Перед записью перечитай state под той же reservation, измени только запись текущего
project_id, сохрани bindings других проектов, запиши через безопасный temporary same-directory механизм с atomic replace, когда он доступен, и выполни strict post-read. Не объявляй сохранение, если precondition или postcondition не доказана.
- Повреждённое состояние не «лечи» ценой других проектов. Техническое восстановление требует отдельного явного разрешения владельца устройства.
- На втором компьютере создаётся отдельный Assisted binding после human gate; он не переносится и не синхронизируется через проект.
- Если безопасное machine-local расположение, exclusive reservation, корректное сохранение чужих bindings или post-read недоступны, не записывай local state. После ясного ответа продолжи session-only и скажи:
Поняла, вы <имя>. В этом чате буду работать от вашего имени, но не смогла запомнить для следующего раза.
Fail-closed правила
Не выбирай первого, прошлого или наиболее вероятного участника по умолчанию. Невалидны: неизвестная schema version, повтор project_id, неизвестный профиль, несколько значений, конфликт нормализованных отображаемых имён, отсутствующая или неподтверждённая фамилия нового человека, занятый surname-based identifier без уточнения, синтаксическая ошибка, local state внутри project/shared root, активная чужая reservation/lock, недоступный machine-local путь, изменившийся shared baseline или непроверенный post-read.
- Ошибка чтения или валидации не разрешает перезаписать binding или профиль.
- Ни профиль, ни binding не являются аутентификацией или подтверждением доступа.
Перед персонализированной работой или первой долговечной записью проверь наблюдаемый исход: autonomous role корректно пропустила human gate; fixed разрешился в один существующий профиль; ask/missing/invalid вызвал вопрос; новый профиль прошёл exclusive create и manifest; общий компьютер сохранил только ask; unsafe local state дал session-only fallback. Структура и post-read обнаруживают часть конфликтов, но не обещают аутентификацию, безопасную параллельную работу или завершённую Drive-синхронизацию.
1---2name: tfw-identity3description: Prompt-only определяет текущего участника TFW при старте человеческого чата, создаёт новые human-профили по фамилии с fail-closed коллизиями и безопасно ведёт отдельную Assisted device-local привязку. Не используется как аутентификация и не спрашивает отсутствующего человека в автономных handoff/review.4---56# TFW Identity78Сделай идентификацию незаметной частью сопровождения. Обычный человек отвечает своими словами; не показывай ему название skill, идентификатор профиля, YAML, `project_id`, путь хранилища, режимы реализации или служебные команды.910Это self-contained prompt-only процесс. Сам выбирай доступные средства текущей среды для чтения, проверки и безопасной записи; не требуй конкретную ОС, runtime, Python, Git, shell или исполняемый helper. Технические средства могут использоваться внутри работы ИИ, но не являются зависимостью конечного пользователя. Если обязательную safety-гарантию доказать нельзя, останови долговечную запись и используй только явно допустимый session-only fallback.1112## Разделяй пять полей1314- **Текущий участник** — человек в текущем человеческом чате; это заявленная атрибуция, не доказательство личности или полномочий.15- **Роль в компании** и **роль в проекте** — разные поля профиля человека. Если они совпадают, один ответ можно записать в оба поля; `не применимо` допустимо.16- **Владелец задачи** — неизменное поле существующего `TRACE.md`; новый чат и смена участника его не переписывают.17- **Роль ИИ** — `plan`, `handoff` или `review`; она определяется этапом и точным именем Codex-задачи, а не профилем человека.1819## Startup state machine человеческого чата20211. Сначала определи тип чата. В автономной handoff/review-задаче пропусти human onboarding и local binding: текущий участник и обе его роли равны `не применимо (автономная роль)`, владелец остаётся из согласованного trace, роль ИИ задаётся этапом.222. В человеческом чате перечитай `PROJECT.md`. Допустимы ровно один маркер состояния и, для `ИНИЦИАЛИЗИРОВАН`, ровно один canonical UUID `project_id`; missing, duplicate или invalid state/ID — fail-closed.233. Динамически прочитай `team/*.md`, кроме `README.md`. Каждый human-профиль должен иметь ровно по одному полю `Идентификатор`, `Отображаемое имя`, `Тип: человек`, `Роль в компании`, `Роль в проекте`; filename совпадает с identifier, а identifier соответствует `^[a-z0-9][a-z0-9_-]*$`. Automation-профиль имеет `Тип: automation`, identifier `automation:<slug>`, filename `automation-<slug>.md` и обе role-строки; валидируй его, но исключай из human matching. Duplicate identifier, неоднозначное нормализованное отображаемое имя, missing/duplicate field или неверная schema блокируют выбор и запись. Уже валидные identifiers не пересчитывай.244. Если проект `НЕ ИНИЦИАЛИЗИРОВАН`, не создавай local binding отдельно. Включи полное имя с явно подтверждённой фамилией, роль в компании и роль в проекте в первый из максимум трёх блоков обычной инициализации. После ответов создай surname-based профили по shared-write протоколу, сгенерируй новый стабильный `project_id`, заполни проект и попроси начать новую сессию из-за изменения `AGENTS.md`. Рабочую задачу не создавай.255. Если проект инициализирован, проверь binding текущего `project_id` по разделу «Machine-local Assisted binding» независимо от числа профилей. Только полностью валидный `fixed` выбирает существующий human-профиль; `ask`, missing binding, отсутствие профилей или любая fail-closed ошибка приводят к одному вопросу. Единственный профиль без binding не выбирай молча: на новом или общем устройстве человек может быть новым участником.2627 > Как вас зовут? Назовите, пожалуйста, имя и фамилию. Какая у вас роль в компании и в этом проекте? Если это одна роль, достаточно назвать её один раз. Если компьютер общий, скажите «общий».28296. В большом проекте не перечисляй всех людей: длина вопроса не зависит от числа профилей. Если имя совпало неоднозначно, задай одно понятное уточнение по отображаемому имени или роли, не показывая внутренний identifier.3031Чтение и неперсонализированный разговор допустимы до ответа. До персонализированной работы и первой долговечной записи участник должен быть определён либо явно удержан как неизвестный.3233## Обработка естественного ответа3435- Если по обычному ответу найден ровно один существующий human-профиль, используй его и сохранённые роли. Ответ только именем достаточен. Заявленное несовпадение ролей действует лишь в текущем чате: общий профиль не перезаписывай без отдельного явного подтверждения изменения профиля.36- Если человека ещё нет, извлеки полное имя с явно различимой фамилией и две роли. Одну общую роль запиши в оба поля. Если фамилии нет, непонятно, какая часть имени является фамилией, или роль не названа и не обозначена как `не указана`, задай одно естественное уточнение; не угадывай порядок имени по культуре.37- Identifier нового human-профиля построй из явно подтверждённой фамилии: кириллицу транслитерируй, латиницу нормализуй, разделители сведи к `-`, итог проверь по `^[a-z0-9][a-z0-9_-]*$`. Если получить один однозначный валидный identifier нельзя, ничего не записывай. Уже существующие valid identifiers не пересчитывай и не переименовывай.38- Если surname-based identifier занят другим человеком, не выбирай профиль и не добавляй числовой или иной суффикс молча. Попроси смысловое уточнение полного имени; после ответа допустим устойчивый `surname-given-name` или `surname-<подтверждённое-уточнение>`. Занятый уточнённый target снова блокирует запись.39- Новый профиль создавай только по разделу «Новый shared-профиль». Не меняй `PROJECT.md`, общую карточку, цели, ценности или `knowledge/`.40- На личном компьютере после однозначного профиля безопасно запиши `fixed` для текущего `project_id`. Только после успешного post-read ответь: `Поняла, вы <имя>. Запомнила для этого компьютера. Чем займёмся?`41- При словах о том, что компьютер общий, безопасно запиши `ask` для текущего `project_id`; участника на устройстве не закрепляй. Только после успешного post-read ответь: `Хорошо, буду спрашивать в каждом новом чате. Кто сейчас работает и какая у вас роль в компании и в этом проекте?`42- Фразы `это не я`, `сейчас работает <имя>` и `я <имя>` обрабатывай как естественное исправление. Они меняют только binding текущего `project_id` и текущую атрибуцию, но не владельца существующей задачи и не другие project bindings.4344## Новый shared-профиль45461. Сними manifest всех `team/*.md` как упорядоченные `relative path + size + SHA-256`, перечитай все human-профили и проверь отсутствие точного target. Непосредственно перед записью повтори manifest и target-read; любое расхождение, conflict copy или признак другого писателя останавливает запись.472. Создай исключительно новый `team/<identifier>.md`, никогда не открывая существующий target на overwrite. Файл содержит ровно по одному полю:4849 ```text50 # Профиль участника5152 Идентификатор: <identifier>53 Отображаемое имя: <полное имя>54 Тип: человек55 Роль в компании: <роль>56 Роль в проекте: <роль>57 ```58593. После записи перечитай файл и manifest. Должен появиться ровно один ожидаемый path с SHA-256 ожидаемого содержимого, а все прежние entries должны совпасть. При расхождении не выполняй merge и не продолжай к local binding; сообщи конфликт. Local post-read не доказывает завершённую удалённую синхронизацию выбранного shared-хранилища.6061## Machine-local Assisted binding6263Выбери безопасный machine-local TFW family root вне project/shared/sync roots и используй отдельный Assisted child `assisted/bindings.yml`; точные платформенные пути указаны ниже. Не требуй от пользователя находить путь или запускать команды. Reject symlink/reparse наружу, shared path, unreadable/non-regular state и любое расположение, безопасность которого не доказана.6465Разрешай canonical location средствами среды, а не действиями пользователя:6667- Windows: `%LOCALAPPDATA%\tfw\assisted\bindings.yml`;68- macOS: `~/.tfw/assisted/bindings.yml` как явное исключение TFW family root;69- Linux/Unix: `~/.tfw/assisted/bindings.yml` как явное исключение TFW family root.7071Семантическая schema локального состояния строго версионирована: `schema_version: 1`; коллекция `bindings` содержит не более одной записи на canonical `project_id`; режим — только `fixed` с ровно одним human `participant` или `ask` без participant. Не храни роли, отображаемое имя или абсолютный путь проекта. Unknown/duplicate/malformed fields, неизвестный participant или несколько значений делают состояние невалидным.7273Сохраняй canonical YAML-поднабор без иных ключей:7475```yaml76schema_version: 177bindings:78 - project_id: <canonical UUID>79 mode: fixed80 participant: <human identifier>81 - project_id: <другой canonical UUID>82 mode: ask83```8485- Namespace TFW Full (`%LOCALAPPDATA%\tfw\bindings.yaml` или `~/.tfw/bindings.yaml`) не читай, не импортируй и не изменяй. Legacy Assisted `tfw-assisted/bindings.yml` сохрани как inert state, но никогда не читай, не мигрируй, не удаляй и не используй как fallback.86- И чтение binding для выбора участника, и запись выполняй только при доказанной exclusive local reservation. При файловом протоколе companion `bindings.yml.lock` создаётся исключительно новым; уже существующий lock считается чужим. Допустим более сильный native primitive, если он доказуемо покрывает тот же read/write interval. Активная чужая reservation/lock означает unresolved concurrent state: не удаляй её, не возвращай сохранённого участника и не перезаписывай state.87- Перед записью перечитай state под той же reservation, измени только запись текущего `project_id`, сохрани bindings других проектов, запиши через безопасный temporary same-directory механизм с atomic replace, когда он доступен, и выполни strict post-read. Не объявляй сохранение, если precondition или postcondition не доказана.88- Повреждённое состояние не «лечи» ценой других проектов. Техническое восстановление требует отдельного явного разрешения владельца устройства.89- На втором компьютере создаётся отдельный Assisted binding после human gate; он не переносится и не синхронизируется через проект.90- Если безопасное machine-local расположение, exclusive reservation, корректное сохранение чужих bindings или post-read недоступны, не записывай local state. После ясного ответа продолжи session-only и скажи: `Поняла, вы <имя>. В этом чате буду работать от вашего имени, но не смогла запомнить для следующего раза.`9192## Fail-closed правила9394Не выбирай первого, прошлого или наиболее вероятного участника по умолчанию. Невалидны: неизвестная schema version, повтор `project_id`, неизвестный профиль, несколько значений, конфликт нормализованных отображаемых имён, отсутствующая или неподтверждённая фамилия нового человека, занятый surname-based identifier без уточнения, синтаксическая ошибка, local state внутри project/shared root, активная чужая reservation/lock, недоступный machine-local путь, изменившийся shared baseline или непроверенный post-read.9596- Ошибка чтения или валидации не разрешает перезаписать binding или профиль.97- Ни профиль, ни binding не являются аутентификацией или подтверждением доступа.9899Перед персонализированной работой или первой долговечной записью проверь наблюдаемый исход: autonomous role корректно пропустила human gate; `fixed` разрешился в один существующий профиль; `ask/missing/invalid` вызвал вопрос; новый профиль прошёл exclusive create и manifest; общий компьютер сохранил только `ask`; unsafe local state дал session-only fallback. Структура и post-read обнаруживают часть конфликтов, но не обещают аутентификацию, безопасную параллельную работу или завершённую Drive-синхронизацию.