{
  "schema_version": 1,
  "diagram_type": "architecture",
  "meta": {
    "title": "Подбор: данные и границы",
    "quality_profile": "showcase",
    "viewBox": [
      1260,
      800
    ],
    "repository": {
      "url": "https://github.com/krus210/freelance-marketplace",
      "revision": "7a6f26a63b8fc24355f30ee026a0fb8f047a3965"
    }
  },
  "components": [
    {
      "id": "analyzer",
      "type": "backend",
      "label": "skill-analyzer",
      "sublabel": "AnalyzeText: первичный подбор",
      "pos": [
        40,
        320
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "proto/skill-analyzer/v1/analyzer.proto",
          "line": 1,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "matching",
      "type": "backend",
      "label": "matching-service",
      "sublabel": "Первичный подбор и попытки",
      "pos": [
        500,
        320
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/usecase/matching.go",
          "line": 141,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "facade",
      "type": "backend",
      "label": "worker-facade",
      "sublabel": "Профиль, портфолио, верификация",
      "pos": [
        960,
        320
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/worker-facade/usecase/facade.go",
          "line": 38,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "review",
      "type": "backend",
      "label": "review-service",
      "sublabel": "Рейтинг: прямой вызов",
      "pos": [
        500,
        70
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/gateway/review.go",
          "line": 1,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "geo",
      "type": "backend",
      "label": "geo-service",
      "sublabel": "GetDistancesBatch: новый вызов",
      "pos": [
        500,
        570
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/gateway/geo_service.go",
          "line": 1,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "config",
      "type": "backend",
      "label": "config-service",
      "sublabel": "Есть в стенде; вне этого потока",
      "pos": [
        960,
        570
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/config-service/main.go",
          "line": 1,
          "label": "Открыть код / документ"
        }
      ]
    }
  ],
  "connections": [
    {
      "to": "analyzer",
      "label": "gRPC",
      "from": "matching"
    },
    {
      "to": "facade",
      "label": "gRPC",
      "from": "matching"
    },
    {
      "to": "review",
      "label": "gRPC",
      "from": "matching"
    },
    {
      "to": "geo",
      "label": "gRPC",
      "from": "matching",
      "labelAt": [
        625,
        485
      ]
    }
  ],
  "cards": [
    {
      "dot": "amber",
      "title": "Первый подбор и повтор",
      "items": [
        "Sonnet сохраняет список кандидатов при первом подборе.",
        "На отказе берёт snapshot[attempt], не вызывает соседей заново."
      ]
    }
  ]
}