{
  "schema_version": 1,
  "diagram_type": "architecture",
  "meta": {
    "title": "Ранжирование: где теряется требование",
    "quality_profile": "showcase",
    "viewBox": [
      1210,
      740
    ],
    "repository": {
      "url": "https://github.com/krus210/freelance-marketplace",
      "revision": "7a6f26a63b8fc24355f30ee026a0fb8f047a3965"
    }
  },
  "components": [
    {
      "id": "plan",
      "type": "backend",
      "label": "План: рейтинг первичен",
      "sublabel": "Расстояние — при равных рейтингах",
      "pos": [
        55,
        110
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "docs/plans/2026-06-11-smart-task-reassignment.archplan.md",
          "line": 261,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "rank",
      "type": "backend",
      "label": "buildCandidates",
      "sublabel": "Сначала рейтинг ↓",
      "pos": [
        480,
        110
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/usecase/matching.go",
          "line": 155,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "resort",
      "type": "backend",
      "label": "SortCandidatesByGeo",
      "sublabel": "Весь список: расстояние ↑",
      "pos": [
        905,
        110
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/usecase/matching.go",
          "line": 201,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "test",
      "type": "backend",
      "label": "matching_geo_test.go",
      "sublabel": "Тест без рейтинга",
      "pos": [
        905,
        420
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/matching-service/usecase/matching_geo_test.go",
          "line": 30,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "city",
      "type": "backend",
      "label": "task seed: city-msk",
      "sublabel": "ID задания",
      "pos": [
        55,
        420
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/task-service/repository/memory.go",
          "line": 31,
          "label": "Открыть код / документ"
        }
      ]
    },
    {
      "id": "geo",
      "type": "backend",
      "label": "geo seed: moscow",
      "sublabel": "Другой набор идентификаторов",
      "pos": [
        480,
        420
      ],
      "size": [
        250,
        82
      ],
      "sources": [
        {
          "path": "services/geo-service/repository/memory.go",
          "line": 14,
          "label": "Открыть код / документ"
        }
      ]
    }
  ],
  "connections": [
    {
      "to": "rank",
      "label": "реализует",
      "from": "plan"
    },
    {
      "to": "resort",
      "label": "пересортировка",
      "from": "rank"
    },
    {
      "to": "test",
      "label": "тестирует функцию",
      "from": "resort",
      "labelAt": [
        1030,
        290
      ]
    },
    {
      "to": "geo",
      "label": "ID не найден",
      "from": "city"
    }
  ],
  "cards": [
    {
      "dot": "amber",
      "title": "Два независимых дефекта",
      "items": [
        "Geo доступен: рейтинг теряется в пересортировке.",
        "Seed ID не совпали: geo возвращает ошибку, tie-break не работает."
      ]
    }
  ]
}