{
  "schemaVersion": 1,
  "id": "P50-C04",
  "title": "Локальный кэш поиска: повтор, другой пользователь и новая редакция",
  "author": {
    "id": "P50",
    "name": "Вячеслав Фомин"
  },
  "specialty": "Стоимость и скорость ИИ-сервисов",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P50-C04",
    "title": "Помощник техподдержки",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Кэш ускоряет повтор, но может вернуть старую инструкцию или результат чужого пользователя. В последовательности есть оба изменения и два обычных повтора.",
  "decision": "Ключ включает user, query, revision. Baseline пересчитывает каждый раз; revised читает результат по точному ключу. В журнале остаются источник ответа и число фактических вычислений.",
  "constraint": "Это локальный кэш строк в одном вызове стенда. Сетевой сервис и языковая модель не участвуют.",
  "steps": [
    "Зафиксировать полный вход и два режима обработки.",
    "Проверить правильность результата до сравнения времени.",
    "Выполнить 50 прогревочных запусков и 30 серий по 100 повторов; сохранить все сводные времена."
  ],
  "inspection": [
    "Два точных повтора используют кэш; пользователь и версия пересчитываются — проверено.",
    "Без кэша выполняются пять вычислений — проверено.",
    "Новая версия последнего запроса не использует старый результат — проверено."
  ],
  "sample": {
    "headers": [
      "Ключ",
      "Источник",
      "Ответ"
    ],
    "rows": [
      [
        "u1|экспорт|1",
        "Расчет",
        "Экспорт v1: скачать CSV через меню."
      ],
      [
        "u1|экспорт|1",
        "Кэш",
        "Экспорт v1: скачать CSV через меню."
      ],
      [
        "u2|экспорт|1",
        "Расчет",
        "Экспорт v1: скачать CSV через меню."
      ],
      [
        "u1|экспорт|2",
        "Расчет",
        "Экспорт v2: выбрать набор, затем скачать CSV."
      ],
      [
        "u1|экспорт|2",
        "Кэш",
        "Экспорт v2: выбрать набор, затем скачать CSV."
      ]
    ]
  },
  "sampleNote": "Авторский набор. В timings.json записан фактически выполненный локальный замер кода; тариф модели и сеть в него не входят.",
  "caseStudy": {
    "role": "Разработчик стендов измерения обработки данных",
    "contribution": "Я реализовал локальный кэш по пользователю и версии и измерил пять последовательных обращений.",
    "objective": "Повторные запросы используют сохраненный результат только при совпадении пользователя и версии документа.",
    "problem": "Кэш ускоряет повтор, но может вернуть старую инструкцию или результат чужого пользователя. В последовательности есть оба изменения и два обычных повтора.",
    "result": "Из пяти запросов два точных повтора получили результат из кэша, три были вычислены. Новый пользователь и редакция v2 не получили прежний ответ. Проверка v3 также вызвала новый расчет.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css",
      "timings.json"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Попадание в кэш имеет конкретный контекст",
        "text": "Пять обращений дают три вычисления и два повторных использования. Ключ включает пользователя и версию, поэтому похожий запрос другого пользователя или к новой редакции не засчитывается как попадание. Я считаю вычисления отдельно от времени: это объясняет причину экономии работы, а не только различие замеров."
      }
    ]
  },
  "deliverable": {
    "type": "analysis",
    "entry": "/catalogue/deliverables/p50-c04/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p50-c04/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/benchmark.cjs",
        "name": "benchmark.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c04/timings.json",
        "name": "timings.json",
        "mimeType": "application/json"
      }
    ],
    "summary": "Из пяти запросов два точных повтора получили результат из кэша, три были вычислены. Новый пользователь и редакция v2 не получили прежний ответ. Проверка v3 также вызвала новый расчет."
  },
  "takeaway": "Из пяти запросов два точных повтора получили результат из кэша, три были вычислены. Новый пользователь и редакция v2 не получили прежний ответ. Проверка v3 также вызвала новый расчет.",
  "capabilities": [
    "completed_analysis"
  ],
  "externalConnections": []
}
