{
  "schemaVersion": 1,
  "id": "P49-C01",
  "title": "Помощник продаж: ответ только по действующему прайсу",
  "author": {
    "id": "P49",
    "name": "Григорий Никитин"
  },
  "specialty": "Проверка качества ИИ-помощников",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P49-C01",
    "title": "Помощник продаж",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Красивой фразы о наличии недостаточно. Я отделил наличие товара в справочнике от права назвать цену и срок. В наборе есть старая цена, отсутствующий артикул и недоступный прайс.",
  "decision": "Обработчик сначала проверяет доступность источника и дату, затем точный артикул, цену и остаток. Ответ содержит номер редакции; в нем нельзя оказаться цене из устаревшей строки.",
  "constraint": "Это проверяемая логика подготовки ответа, а не испытание языковой модели.",
  "steps": [
    "Зафиксировать вход и ожидаемое поведение до запуска.",
    "Выполнить обработчик на обычном и конфликтном сценарии.",
    "Сохранить фактический журнал и повторяемую проверку."
  ],
  "inspection": [
    "Цена появляется только в Q1; 999 из P6 не утекла в ответ — проверено.",
    "Падение источника запрещает все ценовые ответы — проверено.",
    "Подтверждение остатка L5 разрешает ровно второй ответ — проверено."
  ],
  "sample": {
    "headers": [
      "Запрос",
      "Ответ",
      "Цена Разрешена"
    ],
    "rows": [
      [
        "Q1",
        "L1: 2400 ₽; остаток 3. Источник P7.",
        "Да"
      ],
      [
        "Q2",
        "Нет подтвержденного остатка. Срок поступления неизвестен.",
        "Нет"
      ],
      [
        "Q3",
        "Не подтверждены цена или остаток. Уточнить у менеджера.",
        "Нет"
      ],
      [
        "Q4",
        "Нужна действующая цена; прежняя не используется.",
        "Нет"
      ],
      [
        "Q5",
        "Не подтверждены цена или остаток. Уточнить у менеджера.",
        "Нет"
      ],
      [
        "Q6",
        "Уточните точный артикул.",
        "Нет"
      ]
    ]
  },
  "sampleNote": "Авторский набор событий и полные тексты. Все решения выполняются локальным кодом, внешняя модель не вызывается.",
  "caseStudy": {
    "role": "Инженер проверки сценариев и доступа",
    "contribution": "Я составил шесть запросов к каталогу и проверил ответы по текущим значениям цены и остатка.",
    "objective": "Шесть запросов проходят один обработчик; отсутствие цены, остатка или актуального источника меняет ответ на уточнение.",
    "problem": "Красивой фразы о наличии недостаточно. Я отделил наличие товара в справочнике от права назвать цену и срок. В наборе есть старая цена, отсутствующий артикул и недоступный прайс.",
    "result": "Из шести запросов только L1 получает цену 2400 ₽ из P7. Остальные пять получают конкретную причину уточнения. Отключение источника закрывает все цены; подтверждение остатка L5 открывает только его ответ.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Цена L2 известна, остаток нулевой",
        "text": "Q1 получает цену L1 2400 и остаток 3 из P7. У Q2 есть цена L2 1800, но нулевой остаток меняет ответ; у Q3 цена отсутствует вовсе. Я проверяю эти состояния отдельно: одна удачная строка прайса не доказывает, что обработчик умеет работать с отказом и неполнотой."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p49-c01/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p49-c01/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c01/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      }
    ],
    "summary": "Из шести запросов только L1 получает цену 2400 ₽ из P7. Остальные пять получают конкретную причину уточнения. Отключение источника закрывает все цены; подтверждение остатка L5 открывает только его ответ."
  },
  "takeaway": "Из шести запросов только L1 получает цену 2400 ₽ из P7. Остальные пять получают конкретную причину уточнения. Отключение источника закрывает все цены; подтверждение остатка L5 открывает только его ответ.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
