{
  "name": "TP - Step 4: Plan Document",
  "nodes": [
    {
      "id": "webhook",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        300
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "tp-step-04-plan",
        "responseMode": "responseNode",
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "prep",
      "name": "Prepare Plan Prompt",
      "type": "n8n-nodes-base.code",
      "position": [
        260,
        300
      ],
      "parameters": {
        "jsCode": "var body = $json.body || $json;\nvar reqs = body.requirements || {};\nvar reqType = reqs.procurement_type || '\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d';\nvar extractionFailed = body.requirementsExtractionFailed === true;\nvar hasReqs = reqs.requirements && Array.isArray(reqs.requirements) && reqs.requirements.length > 0;\nif (!hasReqs && Array.isArray(reqs) && reqs.length > 0) hasReqs = true;\nvar reqStr = JSON.stringify(reqs, null, 2);\nif (reqStr.length > 40000) reqStr = reqStr.substring(0, 40000);\nvar specData = body.specData || {};\nvar ciStr = JSON.stringify(body.contractorInfo || {}, null, 2);\nvar docText = (body.documentationText || '').substring(0, 40000);\nvar targetPages = parseInt(body.targetPages) || 250;\n\n// Store FULL spec data in workflow static data for the Code Tool\nvar sd = $getWorkflowStaticData('global');\nsd._specData = specData;\nsd._requirements = reqs;\n\n// Build spec SUMMARY for the prompt (instead of full dump)\nvar specSummary = '';\nvar specKeys = Object.keys(specData);\nif (specKeys.length > 0) {\n  specSummary += '\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430 ' + specKeys.length + ' \u043e\u0441\u043d\u043e\u0432\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430:\\n';\n  for (var k = 0; k < specKeys.length; k++) {\n    var key = specKeys[k];\n    var val = specData[key];\n    if (Array.isArray(val)) {\n      specSummary += '- ' + key + ': \u043c\u0430\u0441\u0438\u0432 \u0441 ' + val.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n      if (val.length > 0 && typeof val[0] === 'object') {\n        specSummary += ' (\u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val[0]).slice(0, 8).join(', ') + ')';\n      }\n      specSummary += '\\n';\n    } else if (typeof val === 'object' && val !== null) {\n      specSummary += '- ' + key + ': \u043e\u0431\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val).slice(0, 10).join(', ') + '\\n';\n    } else {\n      specSummary += '- ' + key + ': ' + String(val).substring(0, 200) + '\\n';\n    }\n  }\n  // Add first 3 items as examples for the most populated array\n  var biggestArr = '';\n  var biggestLen = 0;\n  for (var k = 0; k < specKeys.length; k++) {\n    if (Array.isArray(specData[specKeys[k]]) && specData[specKeys[k]].length > biggestLen) {\n      biggestLen = specData[specKeys[k]].length;\n      biggestArr = specKeys[k];\n    }\n  }\n  if (biggestArr && biggestLen > 0) {\n    specSummary += '\\n\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \"' + biggestArr + '\":\\n';\n    var examples = specData[biggestArr].slice(0, 3);\n    for (var e = 0; e < examples.length; e++) {\n      specSummary += JSON.stringify(examples[e]).substring(0, 400) + '\\n';\n    }\n    if (biggestLen > 3) specSummary += '... \u0438 \u043e\u0449\u0435 ' + (biggestLen - 3) + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\\n';\n  }\n} else {\n  specSummary = '\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0435 \u043f\u0440\u0430\u0437\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u0430.';\n}\n\nvar p = '';\n\np += '# \u0417\u0410\u0414\u0410\u0427\u0410\\n';\np += '\u0421\u044a\u0437\u0434\u0430\u0439 \u0414\u0415\u0422\u0410\u0419\u041b\u0415\u041d \u041f\u041b\u0410\u041d \u0437\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u0442\u043e \u0420\u0410\u0417\u041b\u041e\u0416\u0418\u0428 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415.\\n\\n';\np += '\u0422\u0418\u041f \u041f\u041e\u0420\u042a\u0427\u041a\u0410: ' + reqType + '\\n\\n';\n\nif (extractionFailed || !hasReqs) {\n  p += '## \u0412\u0410\u0416\u041d\u041e: \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u041d\u041e\u0422\u041e \u0418\u0417\u0412\u041b\u0418\u0427\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f \u041d\u0415 \u0423\u0421\u041f\u042f\\n';\n  p += '\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044f\u043c\u0435 \u0442\u0438 \u0421\u0423\u0420\u041e\u0412\u0418\u042f \u0422\u0415\u041a\u0421\u0422 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430. \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e:\\n';\n  p += '1. \u041f\u0420\u041e\u0427\u0415\u0422\u0418 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u043d\u043e \u0446\u0435\u043b\u0438\u044f \u0442\u0435\u043a\u0441\u0442.\\n';\n  p += '2. \u041d\u0410\u041c\u0415\u0420\u0418 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435 \u0437\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435/\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0430/\u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0430.\\n';\n  p += '3. \u0418\u0417\u0412\u041b\u0415\u0427\u0418 \u0432\u0441\u044f\u043a\u043e \u043d\u043e\u043c\u0435\u0440\u0438\u0440\u0430\u043d\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0441 \u0414\u041e\u0421\u041b\u041e\u0412\u041d\u0418\u042f \u043c\u0443 \u0442\u0435\u043a\u0441\u0442.\\n';\n  p += '4. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418\u0422\u0415 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0430 \u043d\u0430 \u043f\u043b\u0430\u043d\u0430.\\n\\n';\n  if (docText.length > 0) {\n    p += '## \u0421\u0423\u0420\u041e\u0412 \u0422\u0415\u041a\u0421\u0422 \u041d\u0410 \u0414\u041e\u041a\u0423\u041c\u0415\u041d\u0422\u0410\u0426\u0418\u042f\u0422\u0410\\n' + docText + '\\n\\n';\n  }\n  if (reqStr !== '{}' && reqStr !== '[]') {\n    p += '## \u0427\u0410\u0421\u0422\u0418\u0427\u041d\u041e \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f (\u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0430 \u043d\u0435\u043f\u044a\u043b\u043d\u0438)\\n' + reqStr + '\\n\\n';\n  }\n} else {\n  p += '## \u0418\u0417\u0412\u041b\u0415\u0427\u0415\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\\n' + reqStr + '\\n\\n';\n}\n\np += '## \u041e\u0411\u0417\u041e\u0420 \u041d\u0410 \u0421\u041f\u0415\u0426\u0418\u0424\u0418\u041a\u0410\u0426\u0418\u042f\u0422\u0410\\n' + specSummary + '\\n\\n';\np += '\u26a0\ufe0f \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0418\u041d\u0421\u0422\u0420\u0423\u041c\u0415\u041d\u0422\u0410 analyze_spec \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u0443\u0447\u0438\u0448 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0432 \u0434\u0435\u0442\u0430\u0439\u043b\u0438!\\n';\np += '\u0417\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u043e \u0438\u0437\u0432\u0438\u043a\u0430\u0439 analyze_spec \u041f\u0420\u0415\u0414\u0418 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d\u0430.\\n\\n';\n\np += '## \u0418\u041d\u0424\u041e\u0420\u041c\u0410\u0426\u0418\u042f \u0417\u0410 \u0418\u0417\u041f\u042a\u041b\u041d\u0418\u0422\u0415\u041b\u042f\\n' + ciStr + '\\n\\n';\n\np += '## \u041c\u0415\u0422\u041e\u0414 \u041d\u0410 \u0420\u0410\u0411\u041e\u0422\u0410\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 0: \u041f\u0420\u041e\u0423\u0427\u0418 \u0421\u041f\u0415\u0426\u0418\u0424\u0418\u041a\u0410\u0426\u0418\u042f\u0422\u0410 (\u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0430)\\n';\np += '\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 analyze_spec \u0437\u0430 \u0434\u0430:\\n';\np += '1. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"structure\"} \u2014 \u0432\u0438\u0436 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0442\u0430 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\\n';\np += '2. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"get\", \"param\": \"field_name\"} \u0437\u0430 \u0432\u0441\u044f\u043a\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e \u043f\u043e\u043b\u0435\\n';\np += '3. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438\\n';\np += '\u0426\u0435\u043b\u0442\u0430 \u0435 \u0434\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0448 \u041f\u042a\u041b\u041d\u0410\u0422\u0410 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0448 \u043f\u043b\u0430\u043d.\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 1: \u0420\u0410\u0417\u041b\u0410\u0413\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f (\u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0430)\\n';\np += '\u041f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0448 \u043f\u043b\u0430\u043d, \u0420\u0410\u0417\u041b\u041e\u0416\u0418 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415:\\n';\np += '1. \u041f\u0440\u043e\u0447\u0435\u0442\u0438 full_text \u043d\u0430 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435.\\n';\np += '2. \u0412\u0441\u044f\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u043d\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435/\u0444\u0440\u0430\u0437\u0430 \u043e\u043f\u0438\u0441\u0432\u0430 \u041e\u0422\u0414\u0415\u041b\u0415\u041d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0430\u0439 \u0433\u043e.\\n';\np += '3. \u041f\u0440\u0438\u043c\u0435\u0440: \"\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u043d\u0438\u0442\u0435 \u0435\u0442\u0430\u043f\u0438. \u0421\u043b\u0435\u0434\u0432\u0430 \u0434\u0430 \u0431\u044a\u0434\u0430\u0442 \u043e\u0431\u0445\u0432\u0430\u043d\u0430\u0442\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u043d\u0438 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0422\u0420\u0418 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430:\\n';\np += '   \u0430) \"\u0435\u0442\u0430\u043f\u0438 \u043d\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u043e\u0442\u0434\u0435\u043b\u0435\u043d \u0435\u0442\u0430\u043f \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\\n';\np += '   \u0431) \"\u0440\u0430\u0431\u043e\u0442\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\\n';\np += '   \u0432) \"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0438\" \u2192 \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0437\u0430 \u0412\u0421\u0415\u041a\u0418 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\\n';\np += '4. \u041a\u043e\u0433\u0430\u0442\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u043a\u0430\u0437\u0432\u0430 \"\u043c\u0438\u043d\u0438\u043c\u0443\u043c N \u043c\u0435\u0440\u043a\u0438/\u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\" \u2192 \u0441\u044a\u0437\u0434\u0430\u0439 \u0422\u041e\u0427\u041d\u041e N (\u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0447\u0435) \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '5. sub_requirements \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0441\u0442\u0430\u0432\u0430\u0442 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '6. \u0424\u0440\u0430\u0437\u0438 \u043a\u0430\u0442\u043e \"\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u043d\u043e\", \"\u0432 \u0442\u043e\u0432\u0430 \u0447\u0438\u0441\u043b\u043e\", \"\u043a\u0430\u0442\u043e \u043e\u0431\u0445\u0432\u0430\u0449\u0430\" \u2192 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0431\u0440\u043e\u0435\u043d\u043e \u043d\u0435\u0449\u043e = \u043e\u0442\u0434\u0435\u043b\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442.\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 2: \u0418\u0417\u0412\u041b\u0418\u0427\u0410\u041d\u0415 \u041d\u0410 \u041f\u0420\u0410\u0412\u0418\u041b\u0410 \u0417\u0410 \u041f\u0418\u0421\u0410\u041d\u0415\\n';\np += '\u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442 \u0414\u0412\u0410 \u0442\u0438\u043f\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:\\n';\np += '\u0410) \u0421\u042a\u0414\u042a\u0420\u0416\u0410\u0422\u0415\u041b\u041d\u0418 \u2014 \u043a\u0430\u043a\u0432\u043e \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043f\u0440\u0438\u0441\u044a\u0441\u0442\u0432\u0430 \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043b\u0430\u043d\u0430\\n';\np += '\u0411) \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 \u2014 \u043a\u0430\u043a \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 writing_rules\\n';\np += '\u041f\u0440\u0438\u043c\u0435\u0440\u0438 \u0437\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438:\\n';\np += '- \"\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0434\u0430 \u043d\u0435 \u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u043d\u043e\" \u2192 writing_rule\\n';\np += '- \"\u0434\u0430 \u043e\u0442\u0447\u0438\u0442\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\" \u2192 writing_rule\\n';\np += '- \"\u043f\u043e \u0441\u0432\u043e\u044f\u0442\u0430 \u0441\u044a\u0449\u043d\u043e\u0441\u0442 \u0434\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0441\u044a\u043e\u0442\u043d\u0435\u0441\u0435 \u043a\u044a\u043c \u0441\u044a\u043e\u0442\u0432\u0435\u0442\u043d\u0438\u044f \u0435\u043b\u0435\u043c\u0435\u043d\u0442\" \u2192 writing_rule\\n';\np += '- \u0410\u043a\u043e \u0434\u0435\u0444\u0438\u043d\u0438\u0440\u0430\u0442 \u043a\u0430\u043a\u0432\u043e \u0435 \"\u0444\u043e\u0440\u043c\u0430\u043b\u043d\u043e\" \u2192 \u0432\u043a\u043b\u044e\u0447\u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u044f\u0442\u0430 \u0414\u041e\u0421\u041b\u041e\u0412\u041d\u041e \u0432 source_text \u043d\u0430 writing_rule\\n\\n';\n\np += '### \u0421\u0422\u042a\u041f\u041a\u0410 3: \u0421\u042a\u0417\u0414\u0410\u0412\u0410\u041d\u0415 \u041d\u0410 \u041f\u041b\u0410\u041d\\n\\n';\n\np += '#### \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\\n';\np += '- \u0421\u0435\u043a\u0446\u0438\u0438 = requirement IDs (1.1, 1.2, ...) \u0441 \u0422\u041e\u0427\u041d\u0418\u0422\u0415 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u044f \u043e\u0442 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430\\n';\np += '- \u041d\u0415 \u0434\u043e\u0431\u0430\u0432\u044f\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0438\u0441\u043a\u0430\u043d\u0438 \u043e\u0442 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f\\n';\np += '- \u041d\u0415 \u043f\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0432\u0430\u0439 \u0441\u0435\u043a\u0446\u0438\u0438\u0442\u0435\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u0413\u041b\u0410\u0412\u041d\u0410 \u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432 content_guidance\\n';\np += '- \u041f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435 \u0434\u0430 \u0438\u043c\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u0434\u043e 4 \u043d\u0438\u0432\u0430 \u0434\u044a\u043b\u0431\u043e\u0447\u0438\u043d\u0430)\\n';\nvar maxSubPages = targetPages > 100 ? 10 : (targetPages > 50 ? 8 : 5);\np += '- \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c ' + maxSubPages + ' \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0438 \u043d\u0430 \u043d\u0430\u0439-\u0434\u043e\u043b\u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\\n';\np += '- \u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u043e\u0431\u0449 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 (\u0441\u0440\u043e\u043a, \u0433\u0430\u0440\u0430\u043d\u0446\u0438\u0438) \u041d\u0415 \u0441\u0442\u0430\u0432\u0430\u0442 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u2014 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0430\u0442 \u0441\u0435 \u0432 \u0441\u044a\u043e\u0442\u0432\u0435\u0442\u043d\u0438\u0442\u0435\\n';\np += '- \u041b\u0438\u043d\u0435\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u043a \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0435 \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430 \u0444\u043e\u0440\u043c\u0430\\n\\n';\n\np += '#### \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0437\u0430 \u043c\u0435\u0440\u043a\u0438\\n';\np += '\u041a\u043e\u0433\u0430\u0442\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430 \u041c\u042f\u0420\u041a\u0410:\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\\n';\np += '- content_guidance \u0437\u0430 \u043c\u044f\u0440\u043a\u0430 \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0441\u044a\u0434\u044a\u0440\u0436\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430:\\n';\np += '  1. \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u044f\u0440\u043a\u0430\u0442\u0430\\n';\np += '  2. \u0421\u044a\u0449\u043d\u043e\u0441\u0442 \u2014 \u043a\u0430\u043a\u0432\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\\n';\np += '  3. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0435\u0439\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u0435\u043d\u0438\u0435\\n';\np += '  4. \u0412\u0440\u0435\u043c\u0435\u0432\u0438 \u043f\u043b\u0430\u043d \u0437\u0430 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u043d\u0435\\n';\np += '  5. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u0435\u043d \u0435\u043a\u0441\u043f\u0435\u0440\u0442 + \u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u044f\\n';\np += '  6. \u041a\u043e\u043d\u0442\u0440\u043e\u043b \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 (\u0447\u0435\u0441\u0442\u043e\u0442\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f, \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u043d\u0438 \u043b\u0438\u0446\u0430)\\n';\np += '  7. \u041e\u0447\u0430\u043a\u0432\u0430\u043d \u0435\u0444\u0435\u043a\u0442 \u043e\u0442 \u043c\u044f\u0440\u043a\u0430\u0442\u0430\\n';\np += '- \u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e \u0435 \u043e\u0431\u0435\u0434\u0438\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0438 \u043c\u0435\u0440\u043a\u0438!\\n\\n';\n\np += '#### \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0437\u0430 content_guidance\\n';\np += 'content_guidance \u041d\u0415 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e! \u0417\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f:\\n';\np += '- \u0412\u043a\u043b\u044e\u0447\u0438 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u0430\u0440\u0442\u0438\u043a\u0443\u043b\u0438, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438, \u043b\u043e\u043a\u0430\u0446\u0438\u0438)\\n';\np += '- \u0414\u0430\u0439 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \"\u041e\u043f\u0438\u0448\u0438 \u0435\u0442\u0430\u043f\u0430 \u043d\u0430 \u0434\u0435\u043c\u043e\u043d\u0442\u0430\u0436 \u043d\u0430 350 \u043c2 \u0441\u0442\u0430\u0440\u0438 \u043f\u043e\u0434\u043e\u0432\u0438 \u043d\u0430\u0441\u0442\u0438\u043b\u043a\u0438 \u0432 \u0441\u0433\u0440\u0430\u0434\u0430 A, \u0431\u043b. 3\"\\n';\np += '- \u041d\u0415 \u043f\u0438\u0448\u0438: \"\u041e\u043f\u0438\u0448\u0438 \u0435\u0442\u0430\u043f\u0430 \u043d\u0430 \u0434\u0435\u043c\u043e\u043d\u0442\u0430\u0436\" \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0430\\n';\np += '- \u041f\u043e\u0441\u043e\u0447\u0438 \u043a\u043e\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0438 \u0434\u0430 \u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442 \u0441 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u043a\u043e\u043b\u043e\u043d\u0438 \u0438 \u0434\u0430\u043d\u043d\u0438\\n';\np += '- \u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0449\u0435 \u0431\u044a\u0434\u0435 \u043f\u0438\u0441\u0430\u043d\u0430 \u043e\u0442 \u041e\u0422\u0414\u0415\u041b\u0415\u041d AI \u0430\u0433\u0435\u043d\u0442 \u2014 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0442\u0430 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0441\u0430 \u0421\u0410\u041c\u041e\u0414\u041e\u0421\u0422\u0410\u0422\u042a\u0427\u041d\u0418\\n';\np += '- \u0410\u043a\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0438\u043c\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442\u0438 \u2014 \u0426\u0418\u0422\u0418\u0420\u0410\u0419 \u0433\u0438 \u0432 content_guidance\\n\\n';\n\np += '## \u0424\u041e\u0420\u041c\u0410\u0422\\n';\np += '\u0412\u044a\u0440\u043d\u0438 \u0421\u0410\u041c\u041e \u0432\u0430\u043b\u0438\u0434\u0435\u043d JSON (\u0411\u0415\u0417 markdown \u0431\u043b\u043e\u043a\u043e\u0432\u0435):\\n';\np += '{\\n';\np += '  \"document_title\": \"\u041f\u0420\u0415\u0414\u041b\u041e\u0416\u0415\u041d\u0418\u0415 \u0417\u0410 \u0418\u0417\u041f\u042a\u041b\u041d\u0415\u041d\u0418\u0415 \u043d\u0430 [\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0440\u044a\u0447\u043a\u0430\u0442\u0430]\",\\n';\np += '  \"procurement_type\": \"' + reqType + '\",\\n';\np += '  \"total_estimated_pages\": ' + targetPages + ',\\n';\np += '  \"writing_rules\": [\\n';\np += '    {\\n';\np += '      \"rule_id\": \"WR1\",\\n';\np += '      \"rule\": \"\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u0442\u043e\",\\n';\np += '      \"source_text\": \"\u0414\u041e\u0421\u041b\u041e\u0412\u0415\u041d \u0446\u0438\u0442\u0430\u0442 \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f\",\\n';\np += '      \"instruction_for_writer\": \"\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a\u0430\u043a\u0432\u043e \u0434\u0430 \u043f\u0440\u0430\u0432\u0438 writer-\u044a\u0442\",\\n';\np += '      \"instruction_for_validator\": \"\u041a\u0430\u043a validator-\u044a\u0442 \u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0432\u0430 \u0441\u043f\u0430\u0437\u0432\u0430\u043d\u0435\u0442\u043e\",\\n';\np += '      \"violation_consequence\": \"\u043e\u0442\u0441\u0442\u0440\u0430\u043d\u044f\u0432\u0430\u043d\u0435 | \u043d\u0430\u043c\u0430\u043b\u0435\u043d\u0438 \u0442\u043e\u0447\u043a\u0438 | \u0437\u0430\u0431\u0435\u043b\u0435\u0436\u043a\u0430\"\\n';\np += '    }\\n';\np += '  ],\\n';\np += '  \"sections\": [\\n';\np += '    {\\n';\np += '      \"id\": \"1.1\",\\n';\np += '      \"title\": \"\u0422\u041e\u0427\u041d\u041e \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435\u0442\u043e \u043e\u0442 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435\u0442\u043e\",\\n';\np += '      \"requirement_id\": \"1.1\",\\n';\np += '      \"source_decomposition\": [\\n';\np += '        {\"source_phrase\": \"\u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435\u0442\u043e \u043e\u0442 \u043a\u043e\u0435\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043b\u0438\u0437\u0430\", \"structural_type\": \"etap|process|measure|table|timeline\"}\\n';\np += '      ],\\n';\np += '      \"subsections\": [\\n';\np += '        {\\n';\np += '          \"id\": \"1.1.1\",\\n';\np += '          \"title\": \"\u041f\u043e\u0434\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435\",\\n';\np += '          \"estimated_pages\": 4,\\n';\np += '          \"content_guidance\": [\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 1 \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\",\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 2...\",\\n';\np += '            \"\u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0410 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f 3...\"\\n';\np += '          ],\\n';\np += '          \"spec_data_to_use\": [\"key_quantities\", \"technical_parameters\"],\\n';\np += '          \"tables_needed\": [{\"title\": \"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435\", \"columns\": [\"\u041a\u043e\u043b1\", \"\u041a\u043e\u043b2\"]}],\\n';\np += '          \"subsections\": []\\n';\np += '        }\\n';\np += '      ]\\n';\np += '    }\\n';\np += '  ],\\n';\np += '  \"appendices\": []\\n';\np += '}\\n\\n';\n\np += '## \u26a0\ufe0f \u0426\u0415\u041b\u0415\u0412\u0418 \u041e\u0411\u0415\u041c: ' + targetPages + ' \u0421\u0422\u0420\u0410\u041d\u0418\u0426\u0418 (\u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e!)\\n';\np += '\u0426\u0435\u043b\u0435\u0432\u0438\u044f\u0442 \u043e\u0431\u0435\u043c \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0435 \u0422\u041e\u0427\u041d\u041e ' + targetPages + ' \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0438.\\n';\np += '\u0421\u0423\u041c\u0410\u0422\u0410 \u043d\u0430 estimated_pages \u043d\u0430 \u0412\u0421\u0418\u0427\u041a\u0418 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 = ' + targetPages + ' (\u00b110%).\\n';\np += '\u0420\u0430\u0437\u043f\u0440\u0435\u0434\u0435\u043b\u0438 estimated_pages \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u043e: \u043f\u043e-\u043e\u0431\u0435\u043c\u043d\u0438 \u0442\u0435\u043c\u0438 \u2192 \u043f\u043e\u0432\u0435\u0447\u0435 \u0441\u0442\u0440., \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u0438 \u2192 \u043f\u043e-\u043c\u0430\u043b\u043a\u043e.\\n';\np += '\u041c\u0430\u043a\u0441 ' + maxSubPages + ' \u0441\u0442\u0440. \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f. \u0410\u043a\u043e \u0442\u0435\u043c\u0430 \u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u2192 \u0440\u0430\u0437\u0434\u0435\u043b\u0438 \u043d\u0430 2+ \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438.\\n';\np += '\u041f\u0420\u0415\u0414\u0418 \u0414\u0410 \u0424\u0418\u041d\u0410\u041b\u0418\u0417\u0418\u0420\u0410\u0428: \u0441\u044a\u0431\u0435\u0440\u0438 estimated_pages \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438. \u0410\u043a\u043e \u0441\u0443\u043c\u0430\u0442\u0430 \u0435 < ' + Math.round(targetPages * 0.9) + ' \u2192 \u0434\u043e\u0431\u0430\u0432\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438 pages.\\n\\n';\n\np += '## \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u0418 \u041f\u0420\u0410\u0412\u0418\u041b\u0410\\n';\np += '1. \u0421\u0435\u043a\u0446\u0438\u0438\u0442\u0435 = requirement IDs. \u041d\u0415 \u0438\u0437\u043c\u0438\u0441\u043b\u044f\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430!\\n';\np += '2. \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f, \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f.\\n';\np += '3. \u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\\n';\np += '4. content_guidance \u0432\u043a\u043b\u044e\u0447\u0432\u0430 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0414\u0410\u041d\u041d\u0418 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430!\\n';\np += '5. \u0420\u0430\u0437\u043b\u043e\u0436\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u2014 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 = \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442.\\n';\np += '6. writing_rules = \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438\u0442\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430.\\n';\np += '7. \u0421\u0410\u041c\u041e JSON, \u0431\u0435\u0437 \u0434\u0440\u0443\u0433 \u0442\u0435\u043a\u0441\u0442.\\n';\np += '\u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e: \u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u043d\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438! \u0417\u0430 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u043f\u0438\u0448\u0438 \u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415 \u0438\u043b\u0438 \\'\u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415\\', \u041d\u0415 \"\u0427\u0415\u041f\u0415\u041b\u0410\u0420\u0415\".\\n';\np += '8. \u0412 content_guidance: \u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e \u0435 \u0434\u0430 \u0441\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u0445\u043e\u0440\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0432\u0430 \u043f\u0438\u0448\u0435\u0442\u0435: [\u26a0\ufe0f \u041f\u041e\u041f\u042a\u041b\u041d\u0415\u0422\u0415: \u0438\u043c\u0435 \u043d\u0430 \u0440\u044a\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b \u043e\u0431\u0435\u043a\u0442], [\u26a0\ufe0f \u041f\u041e\u041f\u042a\u041b\u041d\u0415\u0422\u0415: \u0438\u043c\u0435 \u043d\u0430 \u0435\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e] \u0438 \u0442.\u043d.';\n\nreturn [{ json: { prompt: p } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "llm",
      "name": "Plan Document",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        520,
        300
      ],
      "parameters": {
        "text": "={{ $json.prompt }}",
        "promptType": "define",
        "options": {
          "systemMessage": "# \u0420\u041e\u041b\u042f \u0418 \u0426\u0415\u041b\n\u0422\u0438 \u0441\u0438 \u0435\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0438 \u043f\u043e\u0440\u044a\u0447\u043a\u0438 \u0432 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0411\u044a\u043b\u0433\u0430\u0440\u0438\u044f. \u0421\u044a\u0437\u0434\u0430\u0432\u0430\u0448 \u0414\u0415\u0422\u0410\u0419\u041b\u041d\u0418 \u043f\u043b\u0430\u043d\u043e\u0432\u0435, \u0440\u0430\u0437\u043b\u0430\u0433\u0430\u0439\u043a\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u043d\u0430 \u0432\u044a\u0437\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044f \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415.\n\n# \u0418\u041d\u0421\u0422\u0420\u0423\u041c\u0415\u041d\u0422\u0418\n\u0418\u043c\u0430\u0448 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 analyze_spec \u0437\u0430 \u043f\u0440\u043e\u0443\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430. \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0433\u043e \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u041f\u0420\u0415\u0414\u0418 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d\u0430:\n1. \u041f\u044a\u0440\u0432\u043e \u0438\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"structure\"} \u2014 \u0432\u0438\u0436 \u043a\u0430\u043a\u0432\u0438 \u0434\u0430\u043d\u043d\u0438 \u0438\u043c\u0430 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430\n2. \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"get\", \"param\": \"\u0438\u043c\u0435_\u043d\u0430_\u043f\u043e\u043b\u0435\"} \u0437\u0430 \u0432\u0441\u044f\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u0435\n3. \u0418\u0437\u0432\u0438\u043a\u0430\u0439 {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438 (\u043d\u0430\u043f\u0440. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438, \u0441\u0433\u0440\u0430\u0434\u0438)\n\u0426\u0435\u043b\u0442\u0430: \u0421\u042a\u0411\u0415\u0420\u0418 \u041c\u0410\u041a\u0421\u0418\u041c\u0410\u041b\u041d\u041e \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 \u0414\u0410\u041d\u041d\u0418 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 content_guidance \u043d\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f.\n\n# \u041c\u0415\u0422\u041e\u0414 \u041d\u0410 \u0420\u0410\u0411\u041e\u0422\u0410 \u2014 \u0420\u0410\u0417\u041b\u0410\u0413\u0410\u041d\u0415 \u041d\u0410 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\n\u041f\u0440\u0435\u0434\u0438 \u0434\u0430 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u0448 \u043f\u043b\u0430\u043d, \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u041e \u0440\u0430\u0437\u043b\u043e\u0436\u0438 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435:\n1. \u041f\u0440\u043e\u0447\u0435\u0442\u0438 full_text \u043d\u0430 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435\u0442\u043e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415 \u041f\u041e \u0418\u0417\u0420\u0415\u0427\u0415\u041d\u0418\u0415\n2. \u0412\u0441\u044f\u043a\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435/\u0444\u0440\u0430\u0437\u0430 \u043e\u043f\u0438\u0441\u0432\u0430 \u041e\u0422\u0414\u0415\u041b\u0415\u041d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2192 \u0441\u0442\u0430\u0432\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\n3. \"\u043c\u0438\u043d\u0438\u043c\u0443\u043c N \u043c\u0435\u0440\u043a\u0438\" \u2192 \u0422\u041e\u0427\u041d\u041e N \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0437\u0430 \u043c\u0435\u0440\u043a\u0438\n4. \"\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u043d\u043e A, B, C\" \u2192 \u0422\u0420\u0418 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n5. Sub-requirements \u2192 \u0417\u0410\u0414\u042a\u041b\u0416\u0418\u0422\u0415\u041b\u041d\u0418 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n6. \u041a\u0440\u044a\u0441\u0442\u043e\u0441\u0430\u043d\u0438 \u043f\u0440\u0435\u043f\u0440\u0430\u0442\u043a\u0438 (\"\u0441\u044a\u0433\u043b\u0430\u0441\u043d\u043e \u0422\u0421\") \u2192 \u0437\u0430\u043f\u0438\u0448\u0438 \u0433\u0438 \u0437\u0430 writer-\u0430\n\n# \u0421\u0422\u0420\u0423\u041a\u0422\u0423\u0420\u041d\u0418 \u0418\u0417\u0418\u0421\u041a\u0412\u0410\u041d\u0418\u042f\n- \u0421\u0435\u043a\u0446\u0438\u0438 = requirement IDs \u0441 \u0422\u041e\u0427\u041d\u0418\u0422\u0415 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u044f \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430\n- \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\n- \u041c\u0418\u041d\u0418\u041c\u0423\u041c 3 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f\n- \u041f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0430\u0442 \u0434\u0430 \u0438\u043c\u0430\u0442 \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u0434\u043e 4 \u043d\u0438\u0432\u0430 \u0434\u044a\u043b\u0431\u043e\u0447\u0438\u043d\u0430)\n- \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c N \u0441\u0442\u0440. \u043d\u0430 \u043d\u0430\u0439-\u0434\u043e\u043b\u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f (N \u0437\u0430\u0432\u0438\u0441\u0438 \u043e\u0442 \u0446\u0435\u043b\u0435\u0432\u0438\u044f \u043e\u0431\u0435\u043c)\n- \u041b\u0438\u043d\u0435\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u043a = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430 \u0444\u043e\u0440\u043c\u0430\n\n# \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 \u041f\u0420\u0410\u0412\u0418\u041b\u0410 (writing_rules)\n\u0418\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f\u0442\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442 \u0414\u0412\u0410 \u0442\u0438\u043f\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:\n- \u0421\u042a\u0414\u042a\u0420\u0416\u0410\u0422\u0415\u041b\u041d\u0418 (\u043a\u0430\u043a\u0432\u043e \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u043f\u0440\u0438\u0441\u044a\u0441\u0442\u0432\u0430) \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 \u0441\u0435\u043a\u0446\u0438\u0438/\u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438\n- \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u0415\u041d\u0418 (\u043a\u0430\u043a \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e) \u2192 \u0441\u0442\u0430\u0432\u0430\u0442 writing_rules\n\u0418\u0437\u0432\u043b\u0435\u0447\u0438 \u0412\u0421\u0418\u0427\u041a\u0418 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438 \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0438\u044f \u0432 writing_rules. \u0412\u043a\u043b\u044e\u0447\u0438:\n- \u0414\u043e\u0441\u043b\u043e\u0432\u0435\u043d \u0446\u0438\u0442\u0430\u0442 \u043e\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430\n- \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 writer-\u0430\n- \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430 validator-\u0430\n- \u041f\u043e\u0441\u043b\u0435\u0434\u0438\u0446\u0430 \u043f\u0440\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435\n\n# \u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e \u0417\u0410 JSON \u0424\u041e\u0420\u041c\u0410\u0422\u0410\n\u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u041d\u0415 \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438 (\").\n\u0417\u0430 \u0446\u0438\u0442\u0430\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0415\u0414\u0418\u041d\u0418\u0427\u041d\u0418 \u041a\u0410\u0412\u0418\u0427\u041a\u0418 (') \u0438\u043b\u0438 \u0431\u0435\u0437 \u043a\u0430\u0432\u0438\u0447\u043a\u0438.\n\u041d\u0430\u0440\u0443\u0448\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0442\u043e\u0432\u0430 \u0427\u0423\u041f\u0418 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430!\n\n# \u0424\u041e\u0420\u041c\u0410\u0422 \u041d\u0410 \u041c\u0415\u0420\u041a\u0418\n\u0412\u0441\u044f\u043a\u0430 \u043c\u044f\u0440\u043a\u0430 = \u041e\u0422\u0414\u0415\u041b\u041d\u0410 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0441 7 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 content_guidance:\n\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435, \u0441\u044a\u0449\u043d\u043e\u0441\u0442, \u0434\u0435\u0439\u043d\u043e\u0441\u0442\u0438, \u0432\u0440\u0435\u043c\u0435\u0432\u0438 \u043f\u043b\u0430\u043d, \u0435\u043a\u0441\u043f\u0435\u0440\u0442+\u0437\u0430\u0434\u044a\u043b\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0442\u0440\u043e\u043b+\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433, \u043e\u0447\u0430\u043a\u0432\u0430\u043d \u0435\u0444\u0435\u043a\u0442.\n\u0417\u0410\u0411\u0420\u0410\u041d\u0415\u041d\u041e: \u043e\u0431\u0435\u0434\u0438\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0438 \u043c\u0435\u0440\u043a\u0438.\n\n# content_guidance \u2014 \u041d\u0415 \u0410\u0411\u0421\u0422\u0420\u0410\u041a\u0422\u041d\u041e!\n\u0412\u0441\u044f\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0435 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u041e \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430:\n\u0414\u041e\u0411\u0420\u041e: \"\u041e\u043f\u0438\u0448\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u043d\u0430 15 \u0431\u0440. \u043a\u043b\u0438\u043c\u0430\u0442\u0438\u0446\u0438 \u0437\u0430 \u0441\u0433\u0440\u0430\u0434\u0430 X \u2014 \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u043d\u0442\u0430\u0436, \u0438\u0437\u043f\u0438\u0442\u0432\u0430\u043d\u0438\u044f\"\n\u041b\u041e\u0428\u041e: \"\u041e\u043f\u0438\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0430 \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430\"\n\u0412\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u0449\u0435 \u0441\u0435 \u043f\u0438\u0448\u0435 \u043e\u0442 \u041e\u0422\u0414\u0415\u041b\u0415\u041d AI \u0430\u0433\u0435\u043d\u0442 \u2192 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u0442\u0430 \u0422\u0420\u042f\u0411\u0412\u0410 \u0434\u0430 \u0441\u0430 \u0421\u0410\u041c\u041e\u0414\u041e\u0421\u0422\u0410\u0422\u042a\u0427\u041d\u0418.\n\n# \u0421\u0422\u042a\u041f\u041a\u0418\n1. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 analyze_spec \u0437\u0430 \u0434\u0430 \u043f\u0440\u043e\u0443\u0447\u0438\u0448 \u0426\u042f\u041b\u0410\u0422\u0410 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u0432\u0438\u0434\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n2. \u0417\u0430 \u0432\u0441\u044f\u043a\u043e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435: \u0440\u0430\u0437\u043b\u043e\u0436\u0438 full_text \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u0435 \u2192 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0430\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0438\u0442\u0435 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438\n3. \u0420\u0430\u0437\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u0442\u0435\u043b\u043d\u0438 (\u2192 \u0441\u0435\u043a\u0446\u0438\u0438) \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u0438 (\u2192 writing_rules)\n4. \u0417\u0430 \u0432\u0441\u0435\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u2192 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 (\u043c\u0438\u043d. 3 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f)\n5. \u0417\u0430 \u0432\u0441\u044f\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f \u2192 \u043d\u0430\u043f\u0438\u0448\u0438 \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u0418 content_guidance \u0441 \u0434\u0430\u043d\u043d\u0438 \u043e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043c\u0438\u043d. 3)\n6. \u041c\u0435\u0440\u043a\u0438 \u2192 \u043e\u0442\u0434\u0435\u043b\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u044a\u043b\u0435\u043d 7-\u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0435\u043d \u0444\u043e\u0440\u043c\u0430\u0442\n7. \u041f\u0440\u043e\u0432\u0435\u0440\u0438: \u043f\u043e\u043a\u0440\u0438\u0442\u0438 \u043b\u0438 \u0441\u0430 \u0412\u0421\u0418\u0427\u041a\u0418 \u0438\u0437\u0440\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442 \u0412\u0421\u042f\u041a\u041e \u0438\u0437\u0438\u0441\u043a\u0432\u0430\u043d\u0435?\n8. \u041f\u0440\u043e\u0432\u0435\u0440\u0438: \u0438\u043c\u0430 \u043b\u0438 \u043f\u043e\u043d\u0435 3 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f? \u041f\u043e\u043d\u0435 3 content_guidance \u043d\u0430 \u043f\u043e\u0434\u0441\u0435\u043a\u0446\u0438\u044f?\n\n# \u26a0\ufe0f \u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e \u0417\u0410 JSON \u0424\u041e\u0420\u041c\u0410\u0422\u0410\n\u0412\u044a\u0442\u0440\u0435 \u0432 JSON \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432\u0435 \u041d\u0418\u041a\u041e\u0413\u0410 \u041d\u0415 \u0418\u0417\u041f\u041e\u041b\u0417\u0412\u0410\u0419 \u0434\u0432\u043e\u0439\u043d\u0438 \u043a\u0430\u0432\u0438\u0447\u043a\u0438 (\").\n\u0417\u0430 \u0446\u0438\u0442\u0430\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u0435\u043a\u0442\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0415\u0414\u0418\u041d\u0418\u0427\u041d\u0418 \u041a\u0410\u0412\u0418\u0427\u041a\u0418 (') \u0438\u043b\u0438 \u0431\u0435\u0437 \u043a\u0430\u0432\u0438\u0447\u043a\u0438.\n\u041d\u0430\u0440\u0443\u0448\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0442\u043e\u0432\u0430 \u0427\u0423\u041f\u0418 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430!\n\n# \u0424\u041e\u0420\u041c\u0410\u0422\n\u0418\u0437\u0445\u043e\u0434: \u0421\u0410\u041c\u041e \u0432\u0430\u043b\u0438\u0434\u0435\u043d JSON. \u0411\u0435\u0437 markdown \u0431\u043b\u043e\u043a\u043e\u0432\u0435, \u0431\u0435\u0437 \u043e\u0431\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u0415\u0437\u0438\u043a: \u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438.",
          "maxIterations": 15
        }
      },
      "typeVersion": 1.6
    },
    {
      "id": "model",
      "name": "Claude Sonnet",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        440,
        520
      ],
      "parameters": {
        "model": "anthropic/claude-sonnet-4",
        "options": {
          "maxTokens": 24000,
          "temperature": 0.2
        }
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "parse",
      "name": "Parse Plan",
      "type": "n8n-nodes-base.code",
      "position": [
        780,
        300
      ],
      "parameters": {
        "jsCode": "var raw = ($json.output || $json.text || $json.response || '').trim();\nvar result = null;\nvar parseMethod = 'none';\n\nfunction sanitize(s) {\n  return s.replace(/[\\u201C\\u201D\\u201E\\u201F\\u00AB\\u00BB\\u2018\\u2019\\u2032\\u2033]/g, \"'\")\n          .replace(/^\\uFEFF/, '');\n}\n\nfunction tryParse(s) {\n  try { return JSON.parse(s); } catch(e) { return null; }\n}\n\nfunction extractJson(s) {\n  var m = s.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n  var c = m ? m[1].trim() : s;\n  var start = c.indexOf('{');\n  var end = c.lastIndexOf('}');\n  if (start === -1 || end === -1) return s;\n  return c.substring(start, end + 1);\n}\n\nfunction fixCommon(s) {\n  return s.replace(/,\\s*([\\]\\}])/g, '$1');\n}\n\nfunction nextNonWS(s, pos) {\n  for (var j = pos; j < s.length; j++) {\n    var c = s.charCodeAt(j);\n    if (c !== 32 && c !== 9 && c !== 10 && c !== 13) return s[j];\n  }\n  return '';\n}\n\nfunction fixQuotes(s) {\n  var out = '';\n  var inStr = false;\n  var escaped = false;\n  var len = s.length;\n  for (var i = 0; i < len; i++) {\n    var ch = s[i];\n    if (escaped) { out += ch; escaped = false; continue; }\n    if (ch === '\\\\') { out += ch; escaped = true; continue; }\n    if (ch === '\"') {\n      if (!inStr) {\n        inStr = true;\n        out += ch;\n      } else {\n        var next = nextNonWS(s, i + 1);\n        if (next === ':' || next === ',' || next === '}' || next === ']' || next === '') {\n          inStr = false;\n          out += ch;\n        } else {\n          out += '\\\\\"';\n        }\n      }\n    } else {\n      out += ch;\n    }\n  }\n  return out;\n}\n\nfunction fixNewlines(s) {\n  var out = '';\n  var inStr = false;\n  var escaped = false;\n  var len = s.length;\n  for (var i = 0; i < len; i++) {\n    var ch = s[i];\n    if (escaped) { out += ch; escaped = false; continue; }\n    if (ch === '\\\\') { out += ch; escaped = true; continue; }\n    if (ch === '\"') { inStr = !inStr; out += ch; continue; }\n    if (inStr && ch === '\\n') { out += '\\\\n'; continue; }\n    if (inStr && ch === '\\r') { continue; }\n    if (inStr && ch === '\\t') { out += '\\\\t'; continue; }\n    out += ch;\n  }\n  return out;\n}\n\nfunction repairTruncated(s) {\n  var stack = [];\n  var inStr = false;\n  var escaped = false;\n  for (var i = 0; i < s.length; i++) {\n    var ch = s[i];\n    if (escaped) { escaped = false; continue; }\n    if (ch === '\\\\') { escaped = true; continue; }\n    if (ch === '\"') { inStr = !inStr; continue; }\n    if (inStr) continue;\n    if (ch === '{') stack.push('}');\n    else if (ch === '[') stack.push(']');\n    else if (ch === '}' || ch === ']') { if (stack.length > 0) stack.pop(); }\n  }\n  if (inStr) s += '\"';\n  s = s.replace(/,\\s*$/, '');\n  while (stack.length > 0) s += stack.pop();\n  return s;\n}\n\nraw = sanitize(raw);\n\nresult = tryParse(raw);\nif (result) parseMethod = 'direct';\n\nif (!result) {\n  var clean = fixCommon(extractJson(raw));\n  result = tryParse(clean);\n  if (result) parseMethod = 'extractJson';\n}\n\nif (!result) {\n  var clean = fixQuotes(fixCommon(extractJson(raw)));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixQuotes';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(extractJson(raw))));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixQuotes+fixNewlines';\n}\n\nif (!result) {\n  var clean = fixQuotes(fixNewlines(fixCommon(extractJson(raw))));\n  result = tryParse(clean);\n  if (result) parseMethod = 'fixNewlines+fixQuotes';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(extractJson(raw))));\n  var repaired = repairTruncated(clean);\n  result = tryParse(repaired);\n  if (result) parseMethod = 'repairTruncated';\n}\n\nif (!result) {\n  var clean = fixNewlines(fixQuotes(fixCommon(raw)));\n  result = tryParse(clean);\n  if (!result) {\n    var repaired = repairTruncated(clean);\n    result = tryParse(repaired);\n  }\n  if (result) parseMethod = 'rawRepair';\n}\n\nif (!result) {\n  result = { document_title: 'Parse error', sections: [], _raw: raw.substring(0, 20000), _parse_error: true };\n  parseMethod = 'FAILED';\n}\n\nresult._parseMethod = parseMethod;\nreturn [{ json: { documentPlan: result } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "respond",
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1040,
        300
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "tool_spec",
      "name": "Analyze Spec Tool",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "position": [
        600,
        520
      ],
      "parameters": {
        "name": "analyze_spec",
        "description": "\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u043d\u0430 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0430\u0442\u0430 \u043f\u043e\u0440\u044a\u0447\u043a\u0430. \u0418\u0437\u043f\u0440\u0430\u0449\u0430\u0439 JSON \u043a\u043e\u043c\u0430\u043d\u0434\u0438:\n\n- {\"action\": \"structure\"} \u2014 \u043f\u043e\u043a\u0430\u0436\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0442\u0430 (\u043f\u043e\u043b\u0435\u0442\u0430, \u043c\u0430\u0441\u0438\u0432\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u0438)\n- {\"action\": \"summary\"} \u2014 \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0438 \u0434\u0430\u043d\u043d\u0438\n- {\"action\": \"get\", \"param\": \"field_name\"} \u2014 \u0432\u0437\u0435\u043c\u0438 \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u043e\u043b\u0435 (\u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0442\u043e\u0447\u043d\u0438\u0442\u0435 \u0438\u043c\u0435\u043d\u0430 \u043e\u0442 structure)\n- {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u2014 \u0442\u044a\u0440\u0441\u0438 \u043d\u0430\u0432\u0441\u044f\u043a\u044a\u0434\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 (\u043d\u0430\u043f\u0440. \"\u043f\u043e\u0434\u043e\u0432\u0430 \u043d\u0430\u0441\u0442\u0438\u043b\u043a\u0430\", \"\u043a\u043b\u0438\u043c\u0430\u0442\u0438\u043a\", \"\u0441\u0433\u0440\u0430\u0434\u0430 \u0410\")\n- {\"action\": \"group\", \"param\": \"field_name\"} \u2014 \u0433\u0440\u0443\u043f\u0438\u0440\u0430\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043f\u043e \u043f\u043e\u043b\u0435 (\u043d\u0430\u043f\u0440. \"category\", \"section\", \"building\")\n- {\"action\": \"count\"} \u2014 \u043e\u0431\u0449 \u0431\u0440\u043e\u0439 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u043b\u0435\u0442\u0430\n\n\u041c\u043e\u0436\u0435\u0448 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u0438\u0448 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u2014 \u0449\u0435 \u0441\u0435 \u0442\u044a\u0440\u0441\u0438 \u043a\u0430\u0442\u043e \u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430.\n\u0412\u0410\u0416\u041d\u041e: \u0418\u0437\u0432\u0438\u043a\u0430\u0439 structure/summary \u041f\u042a\u0420\u0412\u041e, \u043f\u043e\u0441\u043b\u0435 get/search \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0438 \u0434\u0430\u043d\u043d\u0438.",
        "language": "javaScript",
        "jsCode": "// Tool input from agent is in 'query' variable\nvar sd = $getWorkflowStaticData('global');\nvar specData = sd._specData || {};\n\n// Parse command\nvar action, param;\ntry {\n  var cmd = JSON.parse(query);\n  action = cmd.action || 'search';\n  param = cmd.param || cmd.keyword || cmd.category || cmd.field || '';\n} catch(e) {\n  action = 'search';\n  param = query;\n}\n\n// Generic item extraction from nested structures\nfunction extractItems(data) {\n  var items = [];\n  if (!data || typeof data !== 'object') return items;\n  if (Array.isArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      if (typeof data[i] === 'object' && data[i] !== null) items.push(data[i]);\n    }\n    return items;\n  }\n  for (var key in data) {\n    if (Array.isArray(data[key])) {\n      for (var j = 0; j < data[key].length; j++) {\n        if (typeof data[key][j] === 'object' && data[key][j] !== null) {\n          data[key][j]._source_field = key;\n          items.push(data[key][j]);\n        }\n      }\n    }\n  }\n  return items;\n}\n\nvar allItems = extractItems(specData);\n\nif (action === 'structure') {\n  var result = {};\n  for (var key in specData) {\n    var val = specData[key];\n    if (Array.isArray(val)) {\n      result[key] = '\u041c\u0430\u0441\u0438\u0432 \u0441 ' + val.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n      if (val.length > 0 && typeof val[0] === 'object') {\n        result[key] += ' (\u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val[0]).slice(0, 12).join(', ') + ')';\n      }\n    } else if (typeof val === 'object' && val !== null) {\n      result[key] = '\u041e\u0431\u0435\u043a\u0442 \u0441 ' + Object.keys(val).length + ' \u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val).slice(0, 12).join(', ');\n    } else {\n      result[key] = typeof val + ': ' + String(val).substring(0, 300);\n    }\n  }\n  return JSON.stringify(result, null, 2);\n\n} else if (action === 'summary') {\n  var summary = '\u041e\u0431\u0449\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: ' + Object.keys(specData).length + ' \u043f\u043e\u043b\u0435\u0442\u0430\\n';\n  summary += '\u041e\u0431\u0449\u043e \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438: ' + allItems.length + '\\n\\n';\n  for (var key in specData) {\n    var val = specData[key];\n    if (Array.isArray(val)) {\n      summary += '## ' + key + ' (' + val.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430)\\n';\n      if (val.length > 0 && typeof val[0] === 'object') {\n        summary += '\u041f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(val[0]).join(', ') + '\\n';\n        for (var i = 0; i < Math.min(3, val.length); i++) {\n          summary += '\u041f\u0440\u0438\u043c\u0435\u0440 ' + (i+1) + ': ' + JSON.stringify(val[i]).substring(0, 500) + '\\n';\n        }\n        if (val.length > 3) summary += '... \u0438 \u043e\u0449\u0435 ' + (val.length - 3) + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\\n';\n      }\n      summary += '\\n';\n    } else if (typeof val === 'object' && val !== null) {\n      var s = JSON.stringify(val, null, 2);\n      summary += '## ' + key + ' (\u043e\u0431\u0435\u043a\u0442)\\n' + s.substring(0, 1000) + '\\n\\n';\n    } else {\n      summary += '## ' + key + ': ' + String(val).substring(0, 500) + '\\n\\n';\n    }\n  }\n  if (summary.length > 15000) summary = summary.substring(0, 15000) + '\\n...[\u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 get/search \u0437\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0434\u0435\u0442\u0430\u0439\u043b\u0438]';\n  return summary;\n\n} else if (action === 'get') {\n  // Get a specific field (supports dot notation: \"field.subfield\")\n  var parts = param.split('.');\n  var current = specData;\n  for (var i = 0; i < parts.length; i++) {\n    if (current === null || current === undefined) break;\n    // Support array index access: \"items.0\" or \"items[0]\"\n    var part = parts[i].replace(/\\[(\\d+)\\]/, '.$1');\n    var subParts = part.split('.');\n    for (var j = 0; j < subParts.length; j++) {\n      if (current === null || current === undefined) break;\n      var idx = parseInt(subParts[j]);\n      if (!isNaN(idx) && Array.isArray(current)) {\n        current = current[idx];\n      } else {\n        current = current[subParts[j]];\n      }\n    }\n  }\n  if (current === undefined || current === null) return '\u041f\u043e\u043b\u0435\u0442\u043e \"' + param + '\" \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043e. \u041d\u0430\u043b\u0438\u0447\u043d\u0438 \u043f\u043e\u043b\u0435\u0442\u0430: ' + Object.keys(specData).join(', ');\n  var r = JSON.stringify(current, null, 2);\n  if (r.length > 15000) r = r.substring(0, 15000) + '\\n...[\u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u044a\u0442 \u0435 \u0441\u044a\u043a\u0440\u0430\u0442\u0435\u043d, \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 search \u0437\u0430 \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0435]';\n  return r;\n\n} else if (action === 'search') {\n  var q = param.toLowerCase();\n  if (!q) return '\u041c\u043e\u043b\u044f, \u0437\u0430\u0434\u0430\u0439 \u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430 \u0437\u0430 \u0442\u044a\u0440\u0441\u0435\u043d\u0435.';\n  var found = [];\n\n  // Search in all extracted items\n  for (var i = 0; i < allItems.length; i++) {\n    var itemStr = JSON.stringify(allItems[i]).toLowerCase();\n    if (itemStr.indexOf(q) !== -1) {\n      found.push(allItems[i]);\n    }\n  }\n\n  // If no items found, search in top-level values\n  if (found.length === 0) {\n    for (var key in specData) {\n      var valStr = JSON.stringify(specData[key]).toLowerCase();\n      if (valStr.indexOf(q) !== -1) {\n        var snippet = JSON.stringify(specData[key], null, 2);\n        if (snippet.length > 5000) snippet = snippet.substring(0, 5000) + '...[\u0441\u044a\u043a\u0440\u0430\u0442\u0435\u043d\u043e]';\n        return '\u041d\u0430\u043c\u0435\u0440\u0435\u043d\u043e \u0432 \u043f\u043e\u043b\u0435 \"' + key + '\":\\n' + snippet;\n      }\n    }\n    return '\u041d\u044f\u043c\u0430 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438 \u0437\u0430: \"' + param + '\". \u041f\u0440\u043e\u0431\u0432\u0430\u0439 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0430 \u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430.';\n  }\n\n  var resultStr = '\u041d\u0430\u043c\u0435\u0440\u0435\u043d\u0438 ' + found.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u0430 \"' + param + '\":\\n';\n  resultStr += JSON.stringify(found.slice(0, 40), null, 2);\n  if (found.length > 40) resultStr += '\\n... \u0438 \u043e\u0449\u0435 ' + (found.length - 40) + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n  if (resultStr.length > 15000) resultStr = resultStr.substring(0, 15000) + '\\n...[\u0441\u044a\u043a\u0440\u0430\u0442\u0435\u043d\u043e]';\n  return resultStr;\n\n} else if (action === 'group') {\n  var field = param || 'category';\n  var groups = {};\n  for (var i = 0; i < allItems.length; i++) {\n    var val = allItems[i][field] || '\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e';\n    if (!groups[val]) groups[val] = { count: 0, examples: [] };\n    groups[val].count++;\n    if (groups[val].examples.length < 2) {\n      groups[val].examples.push(allItems[i]);\n    }\n  }\n  var r = JSON.stringify(groups, null, 2);\n  if (r.length > 15000) {\n    // Return just counts\n    var summary = {};\n    for (var g in groups) summary[g] = groups[g].count + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n    return JSON.stringify(summary, null, 2);\n  }\n  return r;\n\n} else if (action === 'count') {\n  var fieldCounts = {};\n  for (var key in specData) {\n    var val = specData[key];\n    if (Array.isArray(val)) fieldCounts[key] = val.length + ' \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430';\n    else if (typeof val === 'object' && val !== null) fieldCounts[key] = Object.keys(val).length + ' \u043f\u043e\u043b\u0435\u0442\u0430';\n    else fieldCounts[key] = '1 \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442';\n  }\n  return '\u041e\u0431\u0449\u043e \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u0432 \u043c\u0430\u0441\u0438\u0432\u0438: ' + allItems.length + '\\n' + JSON.stringify(fieldCounts, null, 2);\n\n} else {\n  return '\u041d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430: \"' + action + '\". \u041d\u0430\u043b\u0438\u0447\u043d\u0438: structure, summary, get, search, group, count.\\n\u0424\u043e\u0440\u043c\u0430\u0442: {\"action\": \"search\", \"param\": \"\u043a\u043b\u044e\u0447\u043e\u0432\u0430 \u0434\u0443\u043c\u0430\"} \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442.';\n}"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Prepare Plan Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Plan Prompt": {
      "main": [
        [
          {
            "node": "Plan Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude Sonnet": {
      "ai_languageModel": [
        [
          {
            "node": "Plan Document",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Spec Tool": {
      "ai_tool": [
        [
          {
            "node": "Plan Document",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Plan Document": {
      "main": [
        [
          {
            "node": "Parse Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Plan": {
      "main": [
        [
          {
            "node": "Respond",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}