{
  "schema": "reviews394-organizer-trainer-proposal-v1",
  "status": "DESIGN_PROPOSAL_ONLY",
  "date": "2026-11-02",
  "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",
    "public processing operational",
    "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": "processing_unavailable",
      "condition": "No actual independent handler/queue or required extension missing",
      "public_organization": "writer_closed",
      "public_training": "writer_closed",
      "private_service_feedback": "existing_private_policy_only",
      "action_ru": "Публичные отзывы пока недоступны; private остаётся по своим правам"
    },
    {
      "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"
    }
  ],
  "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"
      ],
      "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": "actual currently visible current slots for this role only",
    "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": "recommended defaults, not accepted/installed policy; previous venue 14d/48h not inherited",
    "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"
      }
    ]
  },
  "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"
  },
  "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 Case with reason/evidence; another independent reviewer; waiting if none available",
    "report_count_auto_hide": false,
    "recipient_veto": false,
    "private_proof_access": "no public or general staff access",
    "operational_gate": "closed writer until actual independent processing demonstrated"
  },
  "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": [
    "trustworthy event role proof",
    "independent held/role correction path",
    "operational independent public moderation/report/appeal",
    "explicit public-role visibility capability without relaxing privacy"
  ],
  "not_claimed": [
    "implementation",
    "product tests PASS",
    "independent QA",
    "DEV acceptance of proposal",
    "PROD",
    "public skill rating",
    "external attendance verification"
  ]
}
