{
  "schemaVersion": 1,
  "id": "P29-C06",
  "title": "Локальный счетчик бюджета обращений",
  "author": {
    "id": "P29",
    "name": "Павел Мартынов"
  },
  "specialty": "Доведение AI-прототипов до рабочего продукта",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P29-C06",
    "title": "AI-чат для клиентов",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Разговор об ограничении расходов ничего не доказывает без операции, которая может быть отклонена. Для стенда задан бюджет 100 единиц.",
  "decision": "Сделал три команды с фиксированной стоимостью. Перед сохранением проверяю остаток; выполненная команда не списывается повторно. Отмена возвращает ее расход один раз.",
  "constraint": "Это исполняемая модель учета, не AI-чат: LLM, токенизация, провайдер и тарификация реальных запросов отсутствуют.",
  "steps": [
    "Подтвердить команду 20: остаток 80.",
    "Повторить ее: остаток остается 80.",
    "Выбрать команду 120: недостаточно бюджета, новая запись не создается."
  ],
  "inspection": [
    "Подтвердить команду 20: остаток 80.",
    "Повторить ее: остаток остается 80.",
    "Выбрать команду 120: недостаточно бюджета, новая запись не создается.",
    "Отменить 20: остаток 100; повторной отмены нет."
  ],
  "sample": {
    "headers": [
      "Действие",
      "Наблюдаемый результат"
    ],
    "rows": [
      [
        "1",
        "Подтвердить команду 20: остаток 80."
      ],
      [
        "2",
        "Повторить ее: остаток остается 80."
      ],
      [
        "3",
        "Выбрать команду 120: недостаточно бюджета, новая запись не создается."
      ],
      [
        "4",
        "Отменить 20: остаток 100; повторной отмены нет."
      ]
    ]
  },
  "sampleNote": "Самостоятельный проект на подготовленных исходных данных. Действия выполняются локально.",
  "caseStudy": {
    "role": "Разработка локального приложения",
    "contribution": "Реализовал учет условного бюджета, проверку достаточности, идемпотентность и возврат расхода.",
    "objective": "Расход допускается только при достаточном остатке и не повторяется для выполненной команды.",
    "problem": "Разговор об ограничении расходов ничего не доказывает без операции, которая может быть отклонена. Для стенда задан бюджет 100 единиц.",
    "result": "Команда 20 оставляет 80, команда 120 отклоняется. Можно изучить порядок учета без подключения платного API и без выдуманного ответа LLM.",
    "deliverables": [
      "Команды модели",
      "Сохраняемый результат взаимодействия",
      "Исходные данные и порядок самостоятельной проверки"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Бюджет изменяется вместе с действием",
        "text": "Сделал три команды с фиксированной стоимостью. Перед сохранением проверяю остаток; выполненная команда не списывается повторно. Отмена возвращает ее расход один раз."
      },
      {
        "type": "callout",
        "title": "Граница работы",
        "text": "Это исполняемая модель учета, не AI-чат: LLM, токенизация, провайдер и тарификация реальных запросов отсутствуют."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p29-c06/index.html",
    "label": "Открыть работающий результат",
    "files": [
      {
        "path": "/catalogue/deliverables/p29-c06/index.html",
        "name": "Интерактивный результат",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p29-c06/source.json",
        "name": "Исходные условия и модель",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p29-c06/README.html",
        "name": "Повторить проверку",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p29-c06/starter-data.json",
        "name": "Исходный набор для повторного использования",
        "mimeType": "application/json"
      }
    ],
    "summary": "Команда 20 оставляет 80, команда 120 отклоняется. Можно изучить порядок учета без подключения платного API и без выдуманного ответа LLM."
  },
  "takeaway": "Команда 20 оставляет 80, команда 120 отклоняется. Можно изучить порядок учета без подключения платного API и без выдуманного ответа LLM.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
