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