{
  "schemaVersion": 1,
  "id": "P08-C02",
  "title": "Резьба и корпус: отдельные поля сантехнического каталога",
  "author": {
    "id": "P08",
    "name": "Софья Климова"
  },
  "specialty": "Наполнение больших товарных каталогов",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P08-C02",
    "title": "Каталог сантехники",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Резьба G1/2 и корпус 35 мм раньше попадали в одно поле «размер». Ошибка «1/2 мм» выглядела правдоподобно после очистки.",
  "decision": "Допускаю только полностью разобранную тройку. Размер корпуса не подставляется вместо резьбы, а нулевой диаметр уходит в исключения.",
  "constraint": "Использован собственный ограниченный набор строк и явно заданные справочники. Преобразователь не угадывает отсутствующие свойства; до импорта реального каталога правила нужно согласовать с его схемой.",
  "steps": [
    "Нормализованные поля",
    "Исключения не потеряны"
  ],
  "inspection": [
    "В результате 4 записи и 2 исключения. S-105 сохраняет десятичный диаметр 32.5 мм.",
    "Изменить один входной объект и проверить, что результат пересчитался.",
    "Проверить, что неверный JSON даёт сообщение об ошибке, не стирая поле."
  ],
  "sample": {
    "headers": [
      "id",
      "thread",
      "connection",
      "bodyMm"
    ],
    "rows": [
      [
        "S-101",
        "G1/2",
        "внутренняя",
        "35"
      ],
      [
        "S-102",
        "G3/4",
        "наружная",
        "42"
      ],
      [
        "S-103",
        "G1",
        "внутренняя",
        "50"
      ],
      [
        "S-105",
        "G1/2",
        "наружная",
        "32.5"
      ]
    ]
  },
  "sampleNote": "Самостоятельный редакционный проект. Данные и конструкция заданы автором для этой работы; не являются характеристиками товара действующего производителя.",
  "caseStudy": {
    "role": "Проектирование правил, реализация преобразователя и проверка исключений",
    "contribution": "Рабочий преобразователь JavaScript, входной набор, результат, журнал исключений и страница для повторного запуска.",
    "objective": "Получить воспроизводимое преобразование товарных строк с сохранением исходных данных.",
    "problem": "Резьба G1/2 и корпус 35 мм раньше попадали в одно поле «размер». Ошибка «1/2 мм» выглядела правдоподобно после очистки.",
    "result": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
    "deliverables": [
      "Спецификация проекта",
      "Таблица исходных условий",
      "Нормализованные поля · SVG",
      "Нормализованные поля · PNG",
      "Исключения не потеряны · SVG",
      "Исключения не потеряны · PNG",
      "Исходник преобразования",
      "Исходные записи",
      "Результат и исключения",
      "Протокол проверок"
    ],
    "blocks": [
      {
        "type": "table",
        "title": "Что можно проверить",
        "table": {
          "headers": [
            "id",
            "thread",
            "connection",
            "bodyMm"
          ],
          "rows": [
            [
              "S-101",
              "G1/2",
              "внутренняя",
              "35"
            ],
            [
              "S-102",
              "G3/4",
              "наружная",
              "42"
            ],
            [
              "S-103",
              "G1",
              "внутренняя",
              "50"
            ],
            [
              "S-105",
              "G1/2",
              "наружная",
              "32.5"
            ]
          ]
        }
      }
    ]
  },
  "deliverable": {
    "type": "document",
    "entry": "/catalogue/deliverables/p08-c02/index.html",
    "label": "Открыть готовый материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p08-c02/specification.json",
        "name": "Спецификация проекта",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/specification.csv",
        "name": "Таблица исходных условий",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/sheet-1.svg",
        "name": "Нормализованные поля · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/sheet-1.png",
        "name": "Нормализованные поля · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/sheet-2.svg",
        "name": "Исключения не потеряны · SVG",
        "mimeType": "image/svg+xml"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/sheet-2.png",
        "name": "Исключения не потеряны · PNG",
        "mimeType": "image/png"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/normalizer.js",
        "name": "Исходник преобразования",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/input.json",
        "name": "Исходные записи",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/output.json",
        "name": "Результат и исключения",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p08-c02/test-report.json",
        "name": "Протокол проверок",
        "mimeType": "application/json"
      }
    ],
    "summary": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON."
  },
  "takeaway": "Рабочий преобразователь обработал 6 строк: 4 записи разнесены по полям, 2 отправлены в журнал исключений. Исходные значения сохранены; результат можно пересчитать на странице и сопоставить с JSON.",
  "capabilities": [
    "completed_document"
  ],
  "externalConnections": []
}
