{
  "schemaVersion": 1,
  "id": "P48-C05",
  "title": "Сборка контекста: разрешенные фрагменты до любого ответа",
  "author": {
    "id": "P48",
    "name": "Антон Лазарев"
  },
  "specialty": "ИИ в закрытом контуре",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P48-C05",
    "title": "Внутренний поиск",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Фильтрация готового ответа слишком поздняя, если чужой фрагмент уже передан дальше. Стенд строит саму разрешенную входную подборку и показывает ее ключ.",
  "decision": "Я проверяю роль перед отбором фрагментов. При ошибке проверки прав возвращаю пустой контекст. Ключ включает пользователя, версию прав и редакции допущенных документов, поэтому старый персональный результат не переиспользуется.",
  "constraint": "Передача модели не выполняется. Видна только подготовленная входная подборка на публичном учебном корпусе.",
  "steps": [
    "Подготовить общий и два ролевых документа с полными текстами.",
    "Собрать контекст только после успешной проверки прав.",
    "Проверить отказ, смену роли и пользователя до любого вызова модели."
  ],
  "inspection": [
    "Контекст A содержит PUBLIC и DOC-A без контрольной строки B — проверено.",
    "Ошибка прав дает пустой контекст и не создает ключ — проверено.",
    "Смена роли и версии прав меняет состав и ключ — проверено.",
    "Другой пользователь не получает тот же персональный ключ — проверено."
  ],
  "sample": {
    "headers": [
      "Источник",
      "Версия",
      "Фрагмент"
    ],
    "rows": [
      [
        "PUBLIC",
        "1",
        "Общий порядок: сохраняйте номер заявки и источник решения. Не добавляйте неизвестные сроки."
      ],
      [
        "DOC-A",
        "2",
        "Учебная команда A передает макет одним архивом с manifest.csv. Состав сверяется до публикации."
      ]
    ]
  },
  "sampleNote": "Авторский контрольный набор; не клиентские документы и не результаты внешней модели.",
  "caseStudy": {
    "role": "Инженер локальной обработки данных",
    "contribution": "Я реализовал проверку прав перед обработкой документа и привязал кэш к контексту доступа.",
    "objective": "Закрытый документ не попадает даже во входной контекст; ключ кэша зависит от пользователя и версии прав.",
    "problem": "Фильтрация готового ответа слишком поздняя, если чужой фрагмент уже передан дальше. Стенд строит саму разрешенную входную подборку и показывает ее ключ.",
    "result": "Для uA в контекст входят PUBLIC и DOC-A, строка B-CONTENT отсутствует. При ошибке прав контекст пуст. Смена роли, редакции или пользователя меняет ключ подготовки; модель при этом не вызывается.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Строка B-CONTENT не входит в контекст A",
        "text": "Для пользователя uA доступны PUBLIC и DOC-A. Документ DOC-B содержит контрольную строку B-CONTENT, по которой можно заметить попадание чужого текста. Я проверяю право до формирования фрагментов и связываю кэш с контекстом доступа, чтобы уже вычисленный результат не обходил ту же границу."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p48-c05/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p48-c05/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p48-c05/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      }
    ],
    "summary": "Для uA в контекст входят PUBLIC и DOC-A, строка B-CONTENT отсутствует. При ошибке прав контекст пуст. Смена роли, редакции или пользователя меняет ключ подготовки; модель при этом не вызывается."
  },
  "takeaway": "Для uA в контекст входят PUBLIC и DOC-A, строка B-CONTENT отсутствует. При ошибке прав контекст пуст. Смена роли, редакции или пользователя меняет ключ подготовки; модель при этом не вызывается.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
