{
  "schemaVersion": 1,
  "id": "P08-C05",
  "title": "Левый и правый стол: артикул связан с изображением",
  "author": {
    "id": "P08",
    "name": "Софья Климова"
  },
  "specialty": "Наполнение больших товарных каталогов",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P08-C05",
    "title": "Каталог офисной мебели",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "В карточках офисных столов сторона тумбы терялась при нормализации. Красивый снимок противоположной версии делал карточку неверной.",
  "decision": "Сторону определяю только по явному суффиксу. Каждая нормализованная запись получает точный ключ собственной схемы; неподдерживаемые ширины и X не пропускаю.",
  "constraint": "Использован собственный ограниченный набор строк и явно заданные справочники. Преобразователь не угадывает отсутствующие свойства; до импорта реального каталога правила нужно согласовать с его схемой.",
  "steps": [
    "Нормализованные поля",
    "Исключения не потеряны"
  ],
  "inspection": [
    "4 записи, 2 исключения. Для каждого imageKey приложен соответствующий SVG с тумбой слева или справа.",
    "Изменить один входной объект и проверить, что результат пересчитался.",
    "Проверить, что неверный JSON даёт сообщение об ошибке, не стирая поле."
  ],
  "sample": {
    "headers": [
      "id",
      "sku",
      "widthMm",
      "side",
      "imageKey"
    ],
    "rows": [
      [
        "F-101",
        "T-140-L",
        "1400",
        "left",
        "t-140-l.svg"
      ],
      [
        "F-102",
        "T-140-R",
        "1400",
        "right",
        "t-140-r.svg"
      ],
      [
        "F-103",
        "T-160-L",
        "1600",
        "left",
        "t-160-l.svg"
      ],
      [
        "F-104",
        "T-160-R",
        "1600",
        "right",
        "t-160-r.svg"
      ]
    ]
  },
  "sampleNote": "Самостоятельный редакционный проект. Данные и конструкция заданы автором для этой работы; не являются характеристиками товара действующего производителя.",
  "caseStudy": {
    "role": "Проектирование правил, реализация преобразователя и проверка исключений",
    "contribution": "Рабочий преобразователь JavaScript, входной набор, результат, журнал исключений и страница для повторного запуска.",
    "objective": "Получить воспроизводимое преобразование товарных строк с сохранением исходных данных.",
    "problem": "В карточках офисных столов сторона тумбы терялась при нормализации. Красивый снимок противоположной версии делал карточку неверной.",
    "result": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
    "deliverables": [
      "Спецификация проекта",
      "Таблица исходных условий",
      "Нормализованные поля · SVG",
      "Нормализованные поля · PNG",
      "Исключения не потеряны · SVG",
      "Исключения не потеряны · PNG",
      "Исходник преобразования",
      "Исходные записи",
      "Результат и исключения",
      "Протокол проверок",
      "T-140-L · схема",
      "T-140-R · схема",
      "T-160-L · схема",
      "T-160-R · схема"
    ],
    "blocks": [
      {
        "type": "table",
        "title": "Что можно проверить",
        "table": {
          "headers": [
            "id",
            "sku",
            "widthMm",
            "side",
            "imageKey"
          ],
          "rows": [
            [
              "F-101",
              "T-140-L",
              "1400",
              "left",
              "t-140-l.svg"
            ],
            [
              "F-102",
              "T-140-R",
              "1400",
              "right",
              "t-140-r.svg"
            ],
            [
              "F-103",
              "T-160-L",
              "1600",
              "left",
              "t-160-l.svg"
            ],
            [
              "F-104",
              "T-160-R",
              "1600",
              "right",
              "t-160-r.svg"
            ]
          ]
        }
      }
    ]
  },
  "deliverable": {
    "type": "document",
    "entry": "/catalogue/deliverables/p08-c05/index.html",
    "label": "Открыть готовый материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p08-c05/specification.json",
        "name": "Спецификация проекта",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/specification.csv",
        "name": "Таблица исходных условий",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/sheet-1.svg",
        "name": "Нормализованные поля · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/sheet-1.png",
        "name": "Нормализованные поля · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/sheet-2.svg",
        "name": "Исключения не потеряны · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/sheet-2.png",
        "name": "Исключения не потеряны · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/normalizer.js",
        "name": "Исходник преобразования",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/input.json",
        "name": "Исходные записи",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/output.json",
        "name": "Результат и исключения",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/test-report.json",
        "name": "Протокол проверок",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/t-140-l.svg",
        "name": "T-140-L · схема",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/t-140-r.svg",
        "name": "T-140-R · схема",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/t-160-l.svg",
        "name": "T-160-L · схема",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c05/t-160-r.svg",
        "name": "T-160-R · схема",
        "mimeType": "image/svg+xml"
      }
    ],
    "summary": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON."
  },
  "takeaway": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
  "capabilities": [
    "completed_document"
  ],
  "externalConnections": []
}
