{
  "schemaVersion": 1,
  "id": "P08-C04",
  "title": "Модель и комплектация инструмента: три SKU без склейки",
  "author": {
    "id": "P08",
    "name": "Софья Климова"
  },
  "specialty": "Наполнение больших товарных каталогов",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P08-C04",
    "title": "Каталог электроинструмента",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Код D-18 обозначает модель, а D-18-K1 — конкретную поставку. Латинская l в K l похожа на единицу, но автоматически исправлять её нельзя.",
  "decision": "Использую закрытый справочник трёх комплектов. Нормализую регистр и внешние пробелы, но не переписываю похожие символы и не превращаю модель в SKU.",
  "constraint": "Использован собственный ограниченный набор строк и явно заданные справочники. Преобразователь не угадывает отсутствующие свойства; до импорта реального каталога правила нужно согласовать с его схемой.",
  "steps": [
    "Нормализованные поля",
    "Исключения не потеряны"
  ],
  "inspection": [
    "4 записи, 2 исключения. E-101 имеет batteries=0 и charger=false; E-105 остаётся исключением.",
    "Изменить один входной объект и проверить, что результат пересчитался.",
    "Проверить, что неверный JSON даёт сообщение об ошибке, не стирая поле."
  ],
  "sample": {
    "headers": [
      "id",
      "sku",
      "model",
      "batteries",
      "charger"
    ],
    "rows": [
      [
        "E-101",
        "D-18-B",
        "D-18",
        "0",
        "false"
      ],
      [
        "E-102",
        "D-18-K1",
        "D-18",
        "1",
        "true"
      ],
      [
        "E-103",
        "D-18-K2",
        "D-18",
        "2",
        "true"
      ],
      [
        "E-106",
        "D-18-K1",
        "D-18",
        "1",
        "true"
      ]
    ]
  },
  "sampleNote": "Самостоятельный редакционный проект. Данные и конструкция заданы автором для этой работы; не являются характеристиками товара действующего производителя.",
  "caseStudy": {
    "role": "Проектирование правил, реализация преобразователя и проверка исключений",
    "contribution": "Рабочий преобразователь JavaScript, входной набор, результат, журнал исключений и страница для повторного запуска.",
    "objective": "Получить воспроизводимое преобразование товарных строк с сохранением исходных данных.",
    "problem": "Код D-18 обозначает модель, а D-18-K1 — конкретную поставку. Латинская l в K l похожа на единицу, но автоматически исправлять её нельзя.",
    "result": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
    "deliverables": [
      "Спецификация проекта",
      "Таблица исходных условий",
      "Нормализованные поля · SVG",
      "Нормализованные поля · PNG",
      "Исключения не потеряны · SVG",
      "Исключения не потеряны · PNG",
      "Исходник преобразования",
      "Исходные записи",
      "Результат и исключения",
      "Протокол проверок"
    ],
    "blocks": [
      {
        "type": "table",
        "title": "Что можно проверить",
        "table": {
          "headers": [
            "id",
            "sku",
            "model",
            "batteries",
            "charger"
          ],
          "rows": [
            [
              "E-101",
              "D-18-B",
              "D-18",
              "0",
              "false"
            ],
            [
              "E-102",
              "D-18-K1",
              "D-18",
              "1",
              "true"
            ],
            [
              "E-103",
              "D-18-K2",
              "D-18",
              "2",
              "true"
            ],
            [
              "E-106",
              "D-18-K1",
              "D-18",
              "1",
              "true"
            ]
          ]
        }
      }
    ]
  },
  "deliverable": {
    "type": "document",
    "entry": "/catalogue/deliverables/p08-c04/index.html",
    "label": "Открыть готовый материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p08-c04/specification.json",
        "name": "Спецификация проекта",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/specification.csv",
        "name": "Таблица исходных условий",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/sheet-1.svg",
        "name": "Нормализованные поля · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/sheet-1.png",
        "name": "Нормализованные поля · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/sheet-2.svg",
        "name": "Исключения не потеряны · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/sheet-2.png",
        "name": "Исключения не потеряны · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/normalizer.js",
        "name": "Исходник преобразования",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/input.json",
        "name": "Исходные записи",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/output.json",
        "name": "Результат и исключения",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c04/test-report.json",
        "name": "Протокол проверок",
        "mimeType": "application/json"
      }
    ],
    "summary": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON."
  },
  "takeaway": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
  "capabilities": [
    "completed_document"
  ],
  "externalConnections": []
}
