{
  "schemaVersion": 1,
  "id": "P55-C06",
  "title": "Приложение заметок: инструкция с проверкой сохранения и повтора",
  "author": {
    "id": "P55",
    "name": "Василий Егоров"
  },
  "specialty": "Инструкции и технические руководства",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P55-C06",
    "title": "Руководство пользователя приложения",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "После нажатия «Сохранить» пользователь должен отличать запись от ошибки и неопределенного результата. Я сделал маленький журнал заметок с ключом операции и видимыми состояниями.",
  "decision": "Создание заметки требует ID, текста и успешного хранилища. Повтор ключа возвращает прежнюю запись, ошибка не увеличивает число заметок. Руководство использует эти же поля и объясняет проверку после повтора.",
  "constraint": "Хранилище локальное, на время расчета страницы. Перезагрузка не сохраняет пользовательские данные.",
  "steps": [
    "Заполните ID, текст и новый ключ операции.",
    "Выполните расчет и найдите «Сохранено: ID».",
    "Повторите тот же ключ операции.",
    "Сохраните введенный текст отдельно; повторите после восстановления хранилища."
  ],
  "inspection": [
    "Одна заметка, повтор не дублирует, две ошибки не сохраняют — проверено.",
    "Восстановление хранилища позволяет создать N2 — проверено.",
    "Пробелы не считаются текстом заметки — проверено.",
    "Пустой ключ операции отклоняется — проверено.",
    "Тот же ключ с другим содержимым дает конфликт — проверено.",
    "Новый ключ не перезаписывает существующий ID — проверено."
  ],
  "sample": {
    "headers": [
      "Ключ",
      "ID",
      "Статус",
      "Записей после"
    ],
    "rows": [
      [
        "R1",
        "N1",
        "Сохранено: N1",
        "1"
      ],
      [
        "R1",
        "N1",
        "Повтор: N1",
        "1"
      ],
      [
        "R2",
        "N2",
        "Ошибка сохранения",
        "1"
      ],
      [
        "R3",
        "N3",
        "Ошибка: заполните ID и текст",
        "1"
      ]
    ]
  },
  "sampleNote": "Это полный вход для приложенного локального инструмента. Руководство относится именно к этой версии интерфейса.",
  "caseStudy": {
    "role": "Автор технических инструкций",
    "contribution": "Я реализовал сохранение заметки с проверкой ключа, содержимого и состояния хранилища и описал повторное действие.",
    "objective": "Журнал команд показывает создание заметки, повтор запроса и отказ сохранения; текст инструкции привязан к фактическому поведению.",
    "problem": "После нажатия «Сохранить» пользователь должен отличать запись от ошибки и неопределенного результата. Я сделал маленький журнал заметок с ключом операции и видимыми состояниями.",
    "result": "Исходный журнал создает N1 один раз и возвращает его на одинаковый повтор R1. Пустой ключ, конфликт содержимого под тем же ключом и новый ключ для существующего ID дают отказ. Ошибка хранилища и пустой текст не создают запись; после восстановления сохраняется N2.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css",
      "manual.txt"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Повтор сохранения узнаётся по содержимому",
        "text": "Команда с ключом R1 создаёт N1. Повтор тех же данных возвращается к этой заметке, но другое содержимое под R1 вызывает конфликт. Новый ключ с уже существующим N1 также не перезаписывает запись молча. В инструкции эти ситуации разведены, чтобы повтор нажатия не выглядел разрешением заменить прежний текст."
      },
      {
        "type": "table",
        "title": "Руководство, версия 1.0",
        "lead": "",
        "table": {
          "headers": [
            "Условие",
            "Действие",
            "Результат",
            "Если не получилось"
          ],
          "rows": [
            [
              "Нужно создать заметку",
              "Заполните ID, текст и новый ключ операции.",
              "Строка содержит непустой текст.",
              "Пробелы без текста не принимаются."
            ],
            [
              "Хранилище доступно",
              "Выполните расчет и найдите «Сохранено: ID».",
              "Счетчик заметок увеличился, текст виден в результате.",
              "Ошибка не должна выглядеть как сохраненная запись."
            ],
            [
              "Ответ после сохранения потерян",
              "Повторите тот же ключ операции.",
              "Появляется «Повтор», счетчик не растет.",
              "Не создавайте новый ключ до проверки старого."
            ],
            [
              "Есть ошибка сохранения",
              "Сохраните введенный текст отдельно; повторите после восстановления хранилища.",
              "Текст появляется только после успешного исхода.",
              "Данные страницы исчезают после перезагрузки."
            ]
          ]
        }
      }
    ]
  },
  "deliverable": {
    "type": "document",
    "entry": "/catalogue/deliverables/p55-c06/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p55-c06/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      },
      {
        "path": "/catalogue/deliverables/p55-c06/manual.txt",
        "name": "manual.txt",
        "mimeType": "text/plain"
      }
    ],
    "summary": "Исходный журнал создает N1 один раз и возвращает его на одинаковый повтор R1. Пустой ключ, конфликт содержимого под тем же ключом и новый ключ для существующего ID дают отказ. Ошибка хранилища и пустой текст не создают запись; после восстановления сохраняется N2."
  },
  "takeaway": "Исходный журнал создает N1 один раз и возвращает его на одинаковый повтор R1. Пустой ключ, конфликт содержимого под тем же ключом и новый ключ для существующего ID дают отказ. Ошибка хранилища и пустой текст не создают запись; после восстановления сохраняется N2.",
  "capabilities": [
    "completed_document"
  ],
  "externalConnections": []
}
