# #394 · Репутация организатора и тренера до записи Целевая ревизия v2 · 03.11.2026 · canonical #394 / parent #372. **Owner разрешил реализацию после этой доработки без нового согласования дизайна** (trusted assignment; решение в #394, comment 6590824797). Этот пакет — дизайн и задание автору, не реализация. База: source `1d8a0c9b0115a499a786384c0f60da7de17c66d0`; по trusted assignment его дерево соответствует принятому DEV `7f33e9da0cf7b52d260567bbfb37114a3613d479`, alpha19 / API0.27 / `r41479055286-a2`. Runtime заново не проверялся. Переиспользован v1; проверены только список тренировок, роль/итог и Cases. Нового исследования источников нет. **Сейчас в исходнике:** приватные organization/training/peer отзывы и личные заметки PG3, подтверждение участия/итога, существующий список «С тренером», public player profile и Admin Cases. PR471 даёт scoped чтение жалобы на полученный PRIVATE PEER. **Нужно построить:** отдельные public role reviews/replies, исторический proof исполнителя и held-count, единый safe projector, фильтр списка по тренеру и typed Cases-команды публикации/разбора. Наличие Cases UI не означает, что эти команды уже реализованы. ## Итоговое поведение Человек **до записи** открывает список тренировок, игру или доступный профиль в «Людях» и читает опыт других: стоит ли идти к этому тренеру или организатору. Для чтения не нужно участвовать, иметь прошлые игры или писать свой отзыв. Сохраняются действующие guest/session, block и privacy fences конкретной поверхности. «Публично» означает доступному читателю, а не обход закрытого профиля или приватной игры. | Поверхность | Что добавить | |---|---| | `/games?activity=trainer_led` | В существующей карточке — имя тренера и вход «Отзывы о тренировках · N». Узкий фильтр по выбранному публичному тренеру в этом же списке; это расширение, сейчас фильтра по человеку нет | | `/games/[gameId]` | У организатора — «Проведено N игр по подтверждённой истории» и отзывы об организации; у тренера — отзывы о занятиях. Это репутация исполнителя по его прошлому опыту, не отзывы о ещё будущей игре | | `/players/[publicPlayerId]` | «Как организатор»: счётчик и тексты об организации; «Как тренер»: тексты о проведении занятий и переход к его доступным тренировкам. Один человек — одна личность с двумя явно подписанными разделами | | Мои игры → прошедшая встреча → результаты/обратная связь | Допуск к написанию, отдельный публичный текст, свой статус, исправление, снятие, апелляция | Все поверхности используют **один серверный projector** с одинаковыми правилами, count и version; клиент не считает по загруженным карточкам. Публичная ролевaя сводка не раскрывает закрытый профиль: если по правилам игры разрешено показать только исполнителя в роли, можно открыть только эту сводку с проверенным game-context. Недоступный профиль остаётся недоступным. Нет отдельного нового dashboard или публичного `/trainers/...`. ## Честный опыт организатора `heldGamesCount` — число **уникальных game_id за всю доступную подтверждённую историю сервиса** для данного исторического ответственного организатора. Учитываются regular и trainer_led, где организация выполнялась этим человеком; одна игра даёт ровно 1, независимо от участников, отзывов, revisions и двух ролей человека. Не суммировать всех managers и не считать автора объявления автоматически фактическим организатором. Условия включения: конец по серверному времени уже наступил; lifecycle `published` или `completed`; итог явно `held`; есть принятое версионированное доказательство исторической роли; нет нерешённого спора именно об итогe/роли. `published` после окончания с подтверждённым held считается завершённой по факту — не требуем искусственного перевода всех игр в status completed. Будущие, drafts, cancelled, not_held, unknown и неподтверждённые роли не входят. Спор о посещении одного автора или жалоба на его текст сами по себе число игр не меняют. Это не «все игры в жизни» и не число созданных объявлений. Подпись: **«Проведено N игр по подтверждённой истории»**. Подсказка: «Учитываем завершённые встречи с подтверждённым проведением и организатором. Ранняя история может быть неполной». При N=0: «В подтверждённой истории пока нет проведённых игр», а не «никогда не организовывал». При недоступном подсчёте — ошибка/недоступно, не 0. Можно включать подтверждённые private/unlisted встречи в единое число: публично отдаётся только агрегат. Никаких event IDs, дат, списков, площадок, разбивки public/private или фильтров по периоду/месту, из которых восстанавливается частная встреча. Число не зависит от того, видел ли читатель события; доступность самой роли проверяется отдельно. Точное число всё же раскрывает объём деятельности; это разрешённая агрегатная информация, не обещание полной невыводимости. Исторические записи включаются только при наличии точного audit/provenance либо независимого Cases-решения. Текущий manager, creator и trainer display snapshot не являются backfill. Для новых встреч сохраняется плановая привязка роли при публикации/её смене и явное подтверждение фактически проведённой роли вместе с held; спор или неизвестная замена требует разбирательства. Изменения после встречи не переписывают адресата. «15/20» Owner — пример, не начальные данные, миграционный default или DEV факт. Ограниченный DEMO fixture отделён от реальной статистики. ## Кто пишет и что видят другие Писать можно только о **своём подтверждённом прошлом опыте у этого человека в этой роли**: собственная historical eligibility (`eligibleFromTransitions`), актуальное `present` от другого уполномоченного человека (`manager_explicit`) или независимого Cases reviewer, прошедшая held-встреча, доказанный исполнитель, отсутствие нерешённого спора об основании. Самоотметка, заявка и роль manager не заменяют посещения. Для training дополнительно trainer_led и доказанный фактический тренер; оценка его игры как игрока не подходит. Себе писать нельзя. Опоздание не лишает права; позднее удаление из roster не стирает доказанное участие. Missing/unknown/absent/спор ведут к существующему уточнению и помощи. По умолчанию в обратной связи остаётся «Лично». Выбор «Публично» создаёт отдельный пустой draft; private PG3 никогда автоматически не копируется и не меняет аудиторию. Нужны обязательный текст 1–500 символов, до двух необязательных тем и отдельное непредустановленное согласие на точную публичную редакцию, роль и адресата. Правка сбрасывает согласие. Без вложений/ссылок/упоминаний; это ограничение формы, не классификатор правды. Публичных звёзд, общей оценки человека и рейтинга навыка нет. Подпись «Участник игры» / «Участник тренировки» без профиля, имени и стабильного псевдонима. В публичных DTO, DOM и cursor нет автора/accountId, gameId, точной даты опыта/публикации, roster, контактов или private пояснений. Бейдж означает подтверждение участия и роли по сведениям сервиса, не истинность каждой оценки. По самому тексту автора иногда можно узнать; обещания анонимности нет. Один текущий отзыв автора на человека в каждой роли. Новый подтверждённый опыт обновляет тот же slot; withdrawal не обнуляет uniqueness. `publishedReviewCount` считает видимые текущие тексты этой роли, включая критику; ожидающие, снятые, удалённые и ответы не считает. Он не равен `heldGamesCount`. Тренер получает отзывы об объяснениях, внимании, ходе занятия — о сервисе, не о силе игры. ## Критика, ответ и две линии защиты «Темп был слишком высоким, мне не хватило объяснений» или «Начали позже; больше не пойду» — допустимые полезные оценки. Разочарование, низкая оценка сервиса, отсутствие рекомендации и несогласие адресата не основания удаления. Угрозы, травля, чужие личные данные, выдуманное участие, давление или покупка отзывов требуют отдельной проверки. Сам факт сообщения о выдуманном опыте ещё ничего не доказывает. **Первая линия:** существующие session/CSRF/write restrictions, лимиты и idempotency; строгий допуск и exact consent; plain-text/length validation, предварительные flags явных контактов/ссылок и intake жалобы. Очевидная ошибка формата возвращается на исправление; неоднозначные flags идут человеку, не определяют истинность и не удаляют опубликованное. Нет обязательного платного model call, нового provider/framework или удаления по числу жалоб. **Вторая линия:** существующие Admin Cases + ограниченные новые review-команды. Независимый назначенный человек с текущими правами, step-up и без конфликта интересов видит точную редакцию и минимальное основание. Он может опубликовать, оставить, попросить исправление, снять или восстановить с обязательным обоснованием. Он не переписывает чужие слова. Автор может обжаловать; пересмотр — другому независимому reviewer. Сохраняются решения, версии, receipts и история. General staff не получает приватные PG3 тела или весь roster. | Ситуация | Практическое действие | |---|---| | Новая подача / новый ответ | Durable pending + receipt; до решения не публичны. Очередь работает даже если сейчас никто не назначен/не онлайн; срок не выдумываем | | Опубликованный текст обжалован адресатом | Связать report с exact revision; текст остаётся до решения. Жалоба сама не даёт ни удаления, ни публичного ярлыка виновности | | Действующий отзыв редактируется | Новая версия ждёт, прежняя одобренная видна; автор может сразу снять свой текст | | Человек подтвердил нарушение | Снять точную редакцию; причина доступна автору, апелляция открыта. Контакты/опасный текст не оставлять в публичной заглушке | | Жалоба на отзыв отклонена | Критика остаётся. В Case записано почему; ответ адресата может публиковаться отдельно | | Основание опубликованного отзыва оспорено изменением manager | Сохранить исходный proof, открыть Cases, «Основание уточняется». Это не способ односторонне стереть критику; независимое решение подтверждает или снимает | | Автор снимает свой отзыв | Сразу скрываются текст и зависимый ответ; история и slot сохраняются. Организатор/тренер такого права на чужой отзыв не имеют | | Адресат отвечает | Один ответ ≤500 к exact опубликованной версии, отдельные consent и модерация; может снять только собственный ответ. При смене версии отзыва старый ответ не приклеивать к новым словам | | Report касается ответа | Разбирать/снимать ответ отдельно, исходный отзыв сохраняется, если решения по нему нет | Если Cases технически недоступны и нельзя атомарно сохранить submission + очередь, не показывать ложный receipt: вернуть честную ошибку/UNKNOWN с reconciliation исходной операции. **Отсутствие человека онлайн не закрывает public intake.** В DEV очередь строится на существующем UI; новая платформа регистрации/безопасности не нужна. Реальный approve требует существующей авторизованной сессии. При её отсутствии human moderation UAT = NOT_TESTED, а не фиктивный PASS; pending можно выпустить, не отключая чтение и подачу навсегда. ## Передача Один согласованный PR и один DEV delivery: роль/история → публичная запись/Cases → все читательские и авторские поверхности. Это последовательность работы, не три частичных выпуска под видом DONE. Действуют один writer, один независимый Medium QA другой модели, Product CI/security, trusted merge dev, DEV ACCEPTED и smoke. Реальная human UAT и Owner UAT отдельно. Source и тесты не равны публичному запуску или выполненной UAT. Новых вопросов Owner нет. Ограничения: только подтверждённая история, узнаваемость по тексту, отсутствие обещанного срока человека. Venue, общий CommentsSection, private PG3/peer, public skill rating, C5 и PROD вне scope. Стиль/inline Onest/logo переиспользованы из v1 без повторной квалификации manifest. Галерея — восемь DEMO-состояний; не статистика и не продуктовый интерфейс, уже установленный в DEV.