{
  "schemaVersion": 1,
  "id": "P45-C02",
  "title": "Регламенты агентства: проверка роли до поиска и прямой ссылки",
  "author": {
    "id": "P45",
    "name": "Константин Морозов"
  },
  "specialty": "Корпоративный поиск по документам",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P45-C02",
    "title": "Регламенты агентства",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "В корпусе есть общая политика предложения и индивидуальные учебные условия клиента X. Поиск и обращение по ID должны применять одно правило видимости.",
  "decision": "Я вынес фильтр роли перед лексическим поиском и перед прямым ID. Меняя роль в стенде, можно увидеть ту же проверку на двух путях. Отзыв роли исключает источник даже при сохраненном ID.",
  "constraint": "Это публичный учебный корпус и тест правил доступа, а не место хранения закрытых клиентских данных.",
  "steps": [
    "Написать законченные документы с версиями и областью применения.",
    "Отфильтровать источники до поиска по словам и прямым ID.",
    "Проверить неподходящий источник, отсутствие ответа и изменение состояния."
  ],
  "inspection": [
    "sales видит общую политику и не видит X1 — проверено.",
    "Прямой IDX1 не обходит роль sales — проверено.",
    "account-team получает полный разрешенный источник — проверено.",
    "Отозванный доступ блокирует сохраненный ID — проверено."
  ],
  "sample": {
    "headers": [
      "Источник",
      "Название",
      "Версия",
      "Текст",
      "Состояние"
    ],
    "rows": [
      [
        "POL",
        "Общая политика скидки",
        "1",
        "Скидка в учебном предложении согласуется до отправки сметы. Менеджер sales заполняет основание и перечень работ, затем передает запрос руководителю. Пока согласование не записано в карточке, клиенту отправляется базовая стоимость. Индивидуальные условия не берутся из чужих проектов.",
        "Источник применим"
      ]
    ]
  },
  "sampleNote": "Полные авторские инструкции сохранены отдельными TXT и в source.json. Правила видимости исполняются локально на несекретном корпусе.",
  "caseStudy": {
    "role": "Разработчик поиска по документам",
    "contribution": "Я реализовал поиск и открытие документа по ID с повторной проверкой роли и отзыва доступа.",
    "objective": "Одинаковое слово «скидка» не дает роли sales доступ к индивидуальному документу account-team.",
    "problem": "В корпусе есть общая политика предложения и индивидуальные учебные условия клиента X. Поиск и обращение по ID должны применять одно правило видимости.",
    "result": "В четырех выполненных сценариях общая политика доступна sales, индивидуальный X1 — только account-team. Прямая ссылка не обходит правило, а флаг отзыва блокирует и поиск, и сохраненный ID. Эти свойства относятся к функции выдачи стенда.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css",
      "document-POL.txt",
      "document-X1.txt",
      "document-CHECK.txt",
      "document-OLD.txt"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Скидка X1 закрыта для роли sales",
        "text": "Роль sales находит общую политику POL, но не индивидуальные условия X1 со скидкой 7% на сопровождение. Я проверяю то же ограничение при открытии X1 по прямому ID. Отзыв доступа действует повторно, поэтому ранее сохранённая ссылка не превращается в основание получить закрытый текст."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p45-c02/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p45-c02/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/document-POL.txt",
        "name": "document-POL.txt",
        "mimeType": "text/plain"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/document-X1.txt",
        "name": "document-X1.txt",
        "mimeType": "text/plain"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/document-CHECK.txt",
        "name": "document-CHECK.txt",
        "mimeType": "text/plain"
      },
      {
        "path": "/catalogue/deliverables/p45-c02/document-OLD.txt",
        "name": "document-OLD.txt",
        "mimeType": "text/plain"
      }
    ],
    "summary": "В четырех выполненных сценариях общая политика доступна sales, индивидуальный X1 — только account-team. Прямая ссылка не обходит правило, а флаг отзыва блокирует и поиск, и сохраненный ID. Эти свойства относятся к функции выдачи стенда."
  },
  "takeaway": "В четырех выполненных сценариях общая политика доступна sales, индивидуальный X1 — только account-team. Прямая ссылка не обходит правило, а флаг отзыва блокирует и поиск, и сохраненный ID. Эти свойства относятся к функции выдачи стенда.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
