{
  "schemaVersion": 1,
  "id": "P49-C03",
  "title": "Регламенты: пять проверок доступа до поиска и по прямой ссылке",
  "author": {
    "id": "P49",
    "name": "Григорий Никитин"
  },
  "specialty": "Проверка качества ИИ-помощников",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P49-C03",
    "title": "Поиск по регламентам",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Регламент цены открыт продажам, регламент возврата — поддержке. В наборе есть отозванный документ. Обычный поиск и известный ID должны соблюдать одну политику.",
  "decision": "Для каждой попытки я вычисляю разрешение до чтения текста. Пустая или чужая роль дает отказ. Отозванный источник исключается даже при сохраненном идентификаторе.",
  "constraint": "Тексты составлены для открытого стенда, настоящих закрытых регламентов здесь нет.",
  "steps": [
    "Зафиксировать вход и ожидаемое поведение до запуска.",
    "Выполнить обработчик на обычном и конфликтном сценарии.",
    "Сохранить фактический журнал и повторяемую проверку."
  ],
  "inspection": [
    "Разрешены T1 и T3; закрытый текст не выдается — проверено.",
    "Отзыв ранее открытого источника сразу закрывает ответ — проверено.",
    "Смена роли не переносит прежнее разрешение — проверено."
  ],
  "sample": {
    "headers": [
      "Попытка",
      "Документ",
      "Решение",
      "Текст"
    ],
    "rows": [
      [
        "T1",
        "PRICE",
        "Разрешен",
        "Цена называется только по действующему прайсу. Без цены запрос передается менеджеру."
      ],
      [
        "T2",
        "PRICE",
        "Закрыт",
        ""
      ],
      [
        "T3",
        "RETURN",
        "Разрешен",
        "Возврат получает номер обращения. Срок решения не обещается без статуса проверки."
      ],
      [
        "T4",
        "OLD",
        "Закрыт",
        ""
      ],
      [
        "T5",
        "RETURN",
        "Закрыт",
        ""
      ]
    ]
  },
  "sampleNote": "Авторский набор событий и полные тексты. Все решения выполняются локальным кодом, внешняя модель не вызывается.",
  "caseStudy": {
    "role": "Инженер проверки сценариев и доступа",
    "contribution": "Я подготовил пять проверок доступа по роли, статусу и прямому ID и сопоставил фактические исходы с ожиданиями.",
    "objective": "Роль, статус документа и версия прав проверяются до выдачи текста; прямой идентификатор не является разрешением.",
    "problem": "Регламент цены открыт продажам, регламент возврата — поддержке. В наборе есть отозванный документ. Обычный поиск и известный ID должны соблюдать одну политику.",
    "result": "Из пяти попыток текст получают только T1 и T3. Чужая роль, пустая роль и отзыв дают пустой результат, включая запрос по известному ID. Оба изменения прав проверены повторным выполнением.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Один PRICE, две роли",
        "text": "Попытка T1 от sales открывает PRICE, а T2 от support получает закрытый результат без текста. При этом support может читать RETURN в T3. Такой набор проверяет не всеобщий запрет, а конкретное разделение прав; пустой интерфейс для всех прошёл бы только самую удобную половину проверки."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p49-c03/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p49-c03/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c03/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      }
    ],
    "summary": "Из пяти попыток текст получают только T1 и T3. Чужая роль, пустая роль и отзыв дают пустой результат, включая запрос по известному ID. Оба изменения прав проверены повторным выполнением."
  },
  "takeaway": "Из пяти попыток текст получают только T1 и T3. Чужая роль, пустая роль и отзыв дают пустой результат, включая запрос по известному ID. Оба изменения прав проверены повторным выполнением.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
