{
  "schema": "reviews394-organizer-trainer-proposal-v2",
  "status": "TARGETED_DESIGN_COMPLETE_IMPLEMENTATION_AUTHORIZED",
  "date": "2026-11-03",
  "canonical_issue": 394,
  "parent_issue": 372,
  "source_sha": "1d8a0c9b0115a499a786384c0f60da7de17c66d0",
  "source_tree": "5a82f31d9ca1f4a1f3b8bcd27e97bf919628178f",
  "installed": {
    "sha": "7f33e9da0cf7b52d260567bbfb37114a3613d479",
    "app": "alpha19",
    "api": "0.27",
    "receipt": "r41479055286-a2",
    "evidence": "trusted assignment; no runtime inspection"
  },
  "current_vs_proposed": {
    "private_organization": "installed: score 1..5 and/or text; broad discrepancy policy",
    "private_training": "installed: text only, no skill score; broader than confirmed experience",
    "peer": "installed: private strict shared experience",
    "public_role_experience": "proposed; not installed",
    "PR471": "installed private received PEER report + assigned independent exact revision read only",
    "venue": "separate unfinished scope; broad writer closed"
  },
  "precedence": "deny on missing authorization; hold on unresolved basis; eligibility does not publish; approval never bypasses privacy",
  "public_submission_all_of": [
    "active authorized actor/session and existing write restrictions",
    "durable submission + existing Cases queue/link atomically available; reviewer online or assignment NOT required",
    "exact own event ended by server time",
    "published or completed event; held outcome",
    "eligibleFromTransitions historical participation",
    "present by manager_explicit or case_reviewer; actor != attendance subject",
    "no unresolved attendance or held/role basis dispute",
    "historical role subject proven, not current-role guess",
    "author != subject across account identity",
    "for training: trainer_led plus actual historical instructor service, no unresolved substitution",
    "target role public projection available under existing visibility rules",
    "public draft separate from private record",
    "exact projection consent for this revision"
  ],
  "matrix": [
    {
      "id": "regular_held_present",
      "condition": "Own eligible regular game; all public gates; proven organizer",
      "public_organization": "may_submit",
      "public_training": "not_applicable",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Отзыв об организации"
    },
    {
      "id": "training_held_present",
      "condition": "Own eligible trainer_led event; proven organizer and actual trainer; all gates",
      "public_organization": "may_submit",
      "public_training": "may_submit",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Выберите предмет; не копировать отзыв в обе роли"
    },
    {
      "id": "outsider",
      "condition": "No historical participation",
      "public_organization": "deny",
      "public_training": "deny",
      "private_service_feedback": "no_new_right",
      "action_ru": "Чтение доступных публичных отзывов"
    },
    {
      "id": "pending_rejected_prestart_withdrawn",
      "condition": "Explicit non-confirmed transition at event start",
      "public_organization": "deny",
      "public_training": "deny",
      "private_service_feedback": "existing_policy_no_expansion",
      "action_ru": "Нет подтверждённого участия"
    },
    {
      "id": "withdrawn_after_start",
      "condition": "Confirmed as of start; later withdrawn/removed; independent present and all other gates",
      "public_organization": "may_submit",
      "public_training": "may_submit_if_training",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Поздний отказ сам по себе не стирает посещение"
    },
    {
      "id": "missing_mark",
      "condition": "No attendance assertion; version 0",
      "public_organization": "hold",
      "public_training": "hold",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Посещение ещё не отмечено → запрос отметки"
    },
    {
      "id": "unknown_mark",
      "condition": "Existing unknown assertion; version >0",
      "public_organization": "hold",
      "public_training": "hold",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Уточнить посещение"
    },
    {
      "id": "absent_no_show",
      "condition": "Explicit absent",
      "public_organization": "deny_until_corrected",
      "public_training": "deny_until_corrected",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Уточнение при ошибке; не выдавать запись на игру за посещение"
    },
    {
      "id": "late_present",
      "condition": "Permitted present with late=true; other gates valid",
      "public_organization": "may_submit",
      "public_training": "may_submit_if_training",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Опоздание не публикуется и не лишает допуска"
    },
    {
      "id": "open_dispute",
      "condition": "Open dispute even if latest mark changed to present",
      "public_organization": "hold",
      "public_training": "hold",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Дождаться разрешения по актуальным версиям"
    },
    {
      "id": "self_mark",
      "condition": "present asserted by author or self_attested source",
      "public_organization": "deny",
      "public_training": "deny",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Нужна отметка другого уполномоченного лица либо независимое решение"
    },
    {
      "id": "nonparticipant_manager",
      "condition": "Manager with no eligible participation",
      "public_organization": "deny",
      "public_training": "deny",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Приватный организационный канал по текущим правам"
    },
    {
      "id": "self_review",
      "condition": "Author account equals historical role subject",
      "public_organization": "deny_for_self_role",
      "public_training": "deny_for_self_role",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Нельзя оценить себя; другая роль другого человека проверяется отдельно"
    },
    {
      "id": "cancelled_not_held",
      "condition": "Cancelled lifecycle OR explicit not_held",
      "public_organization": "deny",
      "public_training": "deny",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Приватное обращение об отмене без бейджа посещения"
    },
    {
      "id": "unknown_outcome",
      "condition": "No held proof OR unresolved held dispute",
      "public_organization": "hold",
      "public_training": "hold",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Нужны сведения о проведении; attendance alone недостаточно"
    },
    {
      "id": "historical_identity_missing",
      "condition": "Only current manager/trainer known; no trustworthy event-role proof",
      "public_organization": "hold_affected_role",
      "public_training": "hold_affected_role",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Уточняем, кто проводил встречу"
    },
    {
      "id": "substitute_trainer",
      "condition": "Actual instructor differs from binding or disputed",
      "public_organization": "unaffected_if_organizer_proven",
      "public_training": "hold_until_independent_role_correction",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Не оценивать запланированного тренера за чужое занятие"
    },
    {
      "id": "role_changed_later",
      "condition": "Historical proof intact; current organizer/trainer differs",
      "public_organization": "historical_subject_only",
      "public_training": "historical_subject_only",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Отзывы и ответы не переходят новому исполнителю"
    },
    {
      "id": "independent_late_correction",
      "condition": "Cases corrected exact versions, no open disputes; held and role separately proven",
      "public_organization": "may_submit",
      "public_training": "may_submit_if_training",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Пересчитать допуск без штрафа за ожидание"
    },
    {
      "id": "queue_persistence_unavailable",
      "condition": "Cannot persist pending submission and Cases link atomically",
      "public_organization": "no_false_receipt_reconcile_original_operation",
      "public_training": "no_false_receipt_reconcile_original_operation",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Техническая ошибка или UNKNOWN; не путать с отсутствием человека онлайн"
    },
    {
      "id": "target_private",
      "condition": "Target role cannot be publicly projected under existing fences",
      "public_organization": "closed_surface",
      "public_training": "closed_surface",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Не раскрывать профиль/роль через обходной review endpoint"
    },
    {
      "id": "replay_after_basis_loss",
      "condition": "Replay/duplicate create after admission revoked",
      "public_organization": "deny_or_hold",
      "public_training": "deny_or_hold",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Проверить исходную операцию; не создавать новый intent"
    },
    {
      "id": "reviewer_offline",
      "condition": "All own eligibility gates pass, durable queue available, no current assignee or human online",
      "public_organization": "may_submit_pending",
      "public_training": "may_submit_pending_if_training",
      "action_ru": "Отправлено; ожидает назначения человека. Срок неизвестен"
    },
    {
      "id": "negative_opinion",
      "condition": "Verified own service experience; evaluative disappointment without policy violation",
      "public_organization": "may_submit_and_publish_after_human_approval",
      "public_training": "may_submit_and_publish_after_human_approval",
      "action_ru": "Критика полезна; адресат не имеет вето"
    }
  ],
  "roles": {
    "organization": {
      "subject": "historical responsible host at exact event",
      "presence_as_player_required": false,
      "facets_ru": [
        "Договорённости",
        "Ход встречи",
        "Общение"
      ],
      "public_numeric_rating": false,
      "private_score": "preserve 1..5 optional with comment"
    },
    "training": {
      "subject": "historical actual instructor of held trainer_led event",
      "profile_flag_is_sufficient": false,
      "facets_ru": [
        "Объяснения",
        "Внимание к участникам",
        "Организация занятия"
      ],
      "public_numeric_rating": false,
      "skill_score": false
    },
    "same_person": "one identity card, explicit role tabs, no cross-role aggregate or automatic duplication"
  },
  "visibility": {
    "private_service": "author + original recipient under existing policy; no new general staff read",
    "private_note": "author only, existing manager creation scope unchanged",
    "peer": "private, unchanged",
    "game_QA": "existing public-game comment audience and fences; no experience badge",
    "draft": "own in-memory form; no localStorage persistence; not manager note",
    "submitted": "author and assigned authorized independent Cases reviewer; no recipient preview",
    "public": {
      "author_labels_ru": [
        "Участник игры",
        "Участник тренировки"
      ],
      "fields": [
        "opaque public review token",
        "role",
        "plain text",
        "0..2 facets",
        "experience label",
        "safe role reply",
        "allowed actions",
        "permitted roleHandle and subject display",
        "organization heldGamesCount with confirmed_history scope",
        "publishedReviewCount",
        "opaque projectionVersion"
      ],
      "forbidden": [
        "author accountId/publicPlayerId/name/avatar/profile link",
        "stable cross-target author alias",
        "gameId/participationId",
        "event or publication exact date/time",
        "private roster/contact/location",
        "discrepancy/private feedback body",
        "private cursor payload"
      ],
      "subject": "only already permitted public role projection",
      "anonymity_guarantee": false
    },
    "proof": "private exact versions/provenance; assigned scoped access only"
  },
  "content": {
    "plain_text_min": 1,
    "plain_text_max": 500,
    "optional_facets_max": 2,
    "links_attachments_mentions": false,
    "default_audience": "private",
    "switch_to_public": "new empty independent draft; explicit preview; unchecked consent",
    "consent_binding": [
      "projection revision/hash",
      "subject",
      "role",
      "audience"
    ],
    "content_change": "invalidate consent and approval",
    "public_average": null,
    "public_counts": "publishedReviewCount = currently visible current approved review slots for this role; replies/pending/removed/withdrawn excluded; separate from organizer heldGamesCount",
    "negative_neutral": "allowed equally"
  },
  "uniqueness": {
    "event_fence": [
      "author",
      "event",
      "historical_subject",
      "role"
    ],
    "public_current_slot": [
      "author",
      "subject",
      "role"
    ],
    "new_event": "update same public slot with independently admitted new basis",
    "withdrawal": "retains uniqueness and private audit",
    "same_person_two_roles": "explicit choice, distinct experience content; no auto-copy"
  },
  "publication": {
    "submission_deadline": null,
    "mandatory_delay_hours": null,
    "timing_status": "implementation defaults under latest Owner authorization; no deadline/cooling period or automatic publication",
    "requires": "exact consent + independent revision approval + valid/reaffirmed basis + current visibility",
    "states": [
      "draft",
      "submitted",
      "needs_correction",
      "held_basis",
      "published",
      "revision_waiting",
      "withdrawn",
      "removed"
    ],
    "transitions": [
      {
        "from": "draft",
        "event": "explicit public consent + all gates",
        "to": "submitted"
      },
      {
        "from": "submitted",
        "event": "no handler available",
        "to": "submitted; waiting honest, no auto publication"
      },
      {
        "from": "submitted",
        "event": "independent exact approval + fences",
        "to": "published"
      },
      {
        "from": "submitted",
        "event": "adverse correction/open dispute",
        "to": "held_basis"
      },
      {
        "from": "published",
        "event": "author edits",
        "to": "revision_waiting; old approved revision remains"
      },
      {
        "from": "revision_waiting",
        "event": "new exact consent/approval",
        "to": "published; old reply waits recipient reconfirmation"
      },
      {
        "from": "published",
        "event": "unilateral adverse manager change",
        "to": "published with basis-under-review label + private Case; no automatic removal"
      },
      {
        "from": "published",
        "event": "independent invalid basis/policy decision",
        "to": "removed"
      },
      {
        "from": "any owned state",
        "event": "withdraw",
        "to": "withdrawn; no public reply/text; uniqueness remains"
      },
      {
        "from": "withdrawn",
        "event": "explicit resubmit same slot + all gates",
        "to": "submitted"
      },
      {
        "from": "published",
        "event": "report on exact content revision",
        "to": "published; linked Case; no report-count hide"
      },
      {
        "from": "removed",
        "event": "independent restore exact valid consent/revision/basis/visibility; not withdrawn",
        "to": "published"
      },
      {
        "from": "submitted",
        "event": "unassigned or human offline",
        "to": "submitted with durable receipt; waiting without SLA"
      }
    ]
  },
  "reply": {
    "author": "historical subject in exact role only",
    "max_current": 1,
    "text_max": 500,
    "moderation": "same exact consent/revision review",
    "threaded": false,
    "private_identity_disclosure": false,
    "subject_changed": "no transfer to new manager",
    "withdrawn_review": "reply hidden",
    "changed_review": "accepted reply to old revision not silently attached to new text",
    "withdrawal": "historical subject may withdraw own reply only; never review by another author"
  },
  "moderation": {
    "reuse": "Cases assignment/step-up/permissions/audit; bounded new public target/action",
    "not_installed": "public submit moderation, role/outcome basis corrections, public reports/replies and appeals",
    "COI_excludes": [
      "author",
      "subject",
      "reporter",
      "event participant",
      "historic manager",
      "creator",
      "historical trainer"
    ],
    "appeal": "same linked history, another independent human reviewer, waiting if none available",
    "report_count_auto_hide": false,
    "recipient_veto": false,
    "private_proof_access": "no public or general staff access",
    "operational_gate": "durable Cases intake required; reviewer online/assigned NOT a submission gate; no human session means human DEV UAT NOT_TESTED",
    "first_line": "existing deterministic auth/admission/idempotency/format protections, preliminary flags and report intake; no paid model, truth claims or report-count removal",
    "human_commands": [
      "approve",
      "retain",
      "request_correction",
      "remove",
      "restore",
      "resolve_held_or_role_basis"
    ],
    "rationale": "required and version-bound; generic Case closure is not publication",
    "source_access": "assigned current authorized independent principal with step-up; exact review/reply plus minimal proof; preserve existing evidence policy",
    "pending": "not public; report links exact version if legitimately accessible; no recipient preview before approval",
    "published_reported": "visible until authorized human remove; privacy fences remain independent",
    "negative_opinion": "allowed; disagreement and disappointment are not harassment or proof of fabrication",
    "no_new_accounts": true,
    "no_new_enrollment_platform": true,
    "cases": [
      {
        "id": "subject_disagrees",
        "decision": "may_reply_or_dispute; cannot_delete_review"
      },
      {
        "id": "many_reports",
        "decision": "queue_only; not_auto_hide"
      },
      {
        "id": "preliminary_pii_flag",
        "decision": "human_inspects; flag_is_not_fact_or_approval"
      },
      {
        "id": "human_confirms_pii_threat_or_fabrication",
        "decision": "remove_exact_target_with_rationale; author_can_appeal"
      },
      {
        "id": "human_rejects_report_on_criticism",
        "decision": "retain_review"
      },
      {
        "id": "report_on_reply",
        "decision": "only_reply_removed_if_violation; review_unchanged"
      },
      {
        "id": "author_withdraws",
        "decision": "hide_own_review_and_reply; preserve_slot_history"
      },
      {
        "id": "subject_withdraws_reply",
        "decision": "hide_own_reply_only"
      },
      {
        "id": "restore_withdrawn",
        "decision": "deny; requires_author_resubmission_consent"
      },
      {
        "id": "stale_decision_or_lost_assignment_stepup",
        "decision": "deny_without_publication"
      },
      {
        "id": "appeal_reviewer_original_decider",
        "decision": "deny_coi"
      },
      {
        "id": "human_not_online",
        "decision": "pending_allowed; no_auto_approval"
      },
      {
        "id": "dev_no_authorized_existing_session",
        "decision": "code_HTTP_checks_only; human_moderation_UAT_NOT_TESTED; no_credentials_created"
      }
    ]
  },
  "restrictions": {
    "blocks": "current viewer/direct-contact fences; no global erasure or recipient veto",
    "account_privacy": "current authorized projections; preserve history without bypass",
    "session_change": "clear protected UI/drafts; retain original UNKNOWN operation receipt safely",
    "UNKNOWN": "reconcile original key/body; no fabricated success or new replay"
  },
  "checks": "bounded policy + disposable integration for new gates, exact revisions and projection; independent QA, mandatory CI/security, trusted DEV smoke and Owner UAT separate",
  "open_decisions": [],
  "release_dependencies": [
    "single source writer with immutable revision",
    "role proof and scoped corrections implemented",
    "one shared public projection across game/list/profile",
    "durable existing Cases pending queue with typed human decisions",
    "one independent Medium QA of different model and mandatory Product CI/security",
    "trusted DEV accepted release and smoke; human moderation and Owner UAT tracked separately"
  ],
  "not_claimed": [
    "implementation",
    "product tests PASS",
    "independent QA",
    "DEV acceptance of proposal",
    "PROD",
    "public skill rating",
    "external attendance verification"
  ],
  "authority": {
    "source": "trusted Owner assignment; #394 comment 6590824797",
    "implementation_after_revision": true,
    "new_design_approval_required": false,
    "this_run": "artifacts only; no implementation or external write"
  },
  "reading": {
    "requires_own_attendance": false,
    "requires_own_review": false,
    "requires_booking": false,
    "authorization": "existing permitted surface privacy/block/session checks; optional session for already guest-public context",
    "projection": "one role reputation server projector for game/list/profile, no client counts",
    "matrix": [
      {
        "id": "guest_permitted_game",
        "read": "allow_safe_role_projection",
        "write": "require_session_and_verified_own_past_experience"
      },
      {
        "id": "signed_in_outsider",
        "read": "allow_permitted_role",
        "write": "deny_without_experience"
      },
      {
        "id": "trainer_future_games_empty",
        "read": "past_role_reviews_remain_if_role_visible",
        "count": "do_not_reset"
      },
      {
        "id": "private_profile",
        "read": "deny_profile; only independently permitted game-role summary may be read",
        "write": "no_profile_bypass"
      },
      {
        "id": "private_game",
        "read": "existing private game 404 preserved; permitted public role aggregate contains no source events"
      },
      {
        "id": "withdrawn_or_removed_review",
        "read": "not_in_public_items_or_count"
      },
      {
        "id": "published_reported_negative",
        "read": "still_visible_until_human_decision"
      },
      {
        "id": "pending_review",
        "read": "author_and_assigned_authorized_reviewer_only"
      },
      {
        "id": "role_privacy_closed_or_blocked",
        "read": "current viewer fence; unavailable not zero"
      }
    ]
  },
  "organizer_held_count": {
    "name": "heldGamesCount",
    "unit": "distinct game_id",
    "period": "all available confirmed service history through DB now; not lifetime outside service",
    "all_of": [
      "ends_at <= DB now",
      "lifecycle published or completed",
      "explicit current accepted held",
      "accepted historical organization-role proof for subject",
      "no unresolved held/role basis dispute"
    ],
    "includes": [
      "regular",
      "trainer_led",
      "private/unlisted only in undivided aggregate"
    ],
    "excludes": [
      "future",
      "draft",
      "cancelled",
      "not_held",
      "unknown",
      "missing historical role proof",
      "unresolved held/role basis"
    ],
    "not_denominators": [
      "announcements created",
      "current managers memberships",
      "attendance rows",
      "published reviews",
      "training skill",
      "all people who ever managed event"
    ],
    "privacy": "single count only; no event IDs/dates/roster/locations/public-private breakdown or time/location filters",
    "label_ru": "Проведено N игр по подтверждённой истории",
    "zero_ru": "В подтверждённой истории пока нет проведённых игр",
    "history_may_be_incomplete": true,
    "backfill": "exact historical provenance or independent Cases correction only; no current-role inference",
    "correction": "versioned accepted evidence; recalculate distinct count; review content dispute alone does not change it",
    "same_person_roles": "organizer count includes organized trainer_led game once; no combined role total",
    "demo_numbers": "15/20 are illustrative only; never real seed aggregates",
    "cases": [
      {
        "id": "ended_published_held_proven",
        "delta": 1
      },
      {
        "id": "ended_completed_held_proven",
        "delta": 1
      },
      {
        "id": "private_held_proven",
        "delta": 1,
        "public_event_details": false
      },
      {
        "id": "duplicate_revisions_multiple_reviews",
        "delta": 0
      },
      {
        "id": "future_or_draft_or_cancelled",
        "delta": 0
      },
      {
        "id": "unknown_or_missing_history",
        "delta": 0
      },
      {
        "id": "later_manager_change",
        "old_subject": "retain_if_proof_valid",
        "new_subject": "no_automatic_credit"
      },
      {
        "id": "role_or_held_disputed",
        "count": "exclude_until_independent_resolution",
        "review": "separate_published_basis_under_review_state"
      },
      {
        "id": "review_report_or_one_attendance_dispute",
        "count": "unchanged"
      },
      {
        "id": "backend_unavailable",
        "count": null,
        "display": "unavailable_not_zero"
      }
    ]
  },
  "surfaces": {
    "existing_training_list": "/games?activity=trainer_led; GamesDiscoveryPage.tsx + discovery/DiscoveryGameCard.tsx",
    "to_build_selected_trainer_filter": "same /games list; trainer=<roleHandle> URL and trainerRoleHandle API filter; no new dashboard",
    "game": "/games/[gameId]",
    "profile": "/players/[publicPlayerId]",
    "own_write": "/my-games/[gameId]/results?section=feedback",
    "admin": "existing AdminApp Cases section; configured basePath; no new public admin route",
    "not_review_composer": "/games/[gameId]/review is participation application",
    "not_public_trainer_page": "/profile/trainer is own editor"
  },
  "role_history": {
    "planned": "versioned publish binding plus changes",
    "performed": "explicit held role confirmation tied to earlier provenance; current binding alone insufficient",
    "old_events": "verified audit or independent scoped correction only",
    "substitution": "actual role subject, hold if unresolved",
    "correction": "append-only exact-version Cases decision; never transfer old review to current manager"
  },
  "delivery": {
    "one_coordinated_PR_DEV_delivery": true,
    "source_only_stages_are_done": false,
    "new_owner_design_go": false,
    "human_moderation_without_session": "NOT_TESTED; deliver operable pending queue, no invented approval",
    "product_source_modified_by_this_run": false,
    "PROD": false
  }
}
