Запись реализации Source Flow Debugger
Дата создания: 27 июня 2026 г.
Цель
Этот документ — запись о том, как был реализован и проверен поток, описанный в docs/roadmaps/2026-06-27-source-to-ast-input-flow.md, в реальном веб‑отладчике.
Ключевые моменты, проверенные сегодня, следующие.
Ввод проекта Godot
-> Развёртывание файлов по относительному пути
-> Определение типа файла
-> .gd разбивается на фрагменты кода с характером AST
-> .godot, .tscn такие текстовые ресурсы разбиваются на прямые чанки
-> Отображать только chunkText каждого chunk как ввод Retriever
-> Предоставить кнопку поиска docs_chunks / api_mapping / label_prototypes под chunk
-> Соединить найденный JSONL со структурой, которую можно прикрепить к запросу проверки QwenЭто реализация не завершённого Retriever, а веб‑отладчик для визуального отслеживания взаимодействия между Retriever и вводом AST. То есть, прежде чем оценивать качество поиска в базе данных, он служит для предварительной проверки, какие файлы разбиваются на какие фрагменты и какой текст попадает в ввод поиска Retriever.
Реализованный веб‑поток
Веб‑отладчик был запущен по адресу http://127.0.0.1:8010/.
Области, видимые на экране, следующие:
- Область ввода конечной точки БД
- Область ввода проверки Qwen
- Область ввода исходного подсказки
- Область ввода расширенного источника
- Показатели резюме файлов/чанков
- Результаты включения/исключения по файлам
- Оригинальный текст по чанку, ввод Retriever, кнопка поиска в БД, предварительный просмотр запроса Qwen
Экран, проверенный сегодня, выглядит следующим образом.

Проверка ввода проекта Godot
Тест проводился в виде небольшого проекта Godot.
Входной файл выглядел следующим образом.
minidodge/project.godot
minidodge/scripts/player.gd
minidodge/scripts/enemy.gd
minidodge/scenes/player.tscn
minidodge/README.mdПосле загрузки внутренний ввод разворачивается в следующем виде.
# minidodge/project.godot
config_version=5
[application]
config/name="Mini Dodge Upload Test"
run/main_scene="res://scenes/player.tscn"
# minidodge/scripts/player.gd
extends Area2D
signal hit
@export var speed = 400
...# <상대경로> Заголовок используется для отслеживания. В Retriever этот заголовок не включается.
Анализ результатов
В этом тесте резюме, показанное веб‑отладчиком, выглядит следующим образом.
| Пункт | Значение |
|---|---|
| Files | 5 |
| Included | 4 |
| Excluded | 1 |
| Chunks | 14 |
| AST | 9 |
| Direct | 5 |
| Retriever Inputs | 14 |
Файловый вывод был следующим.
| Файл | Оценка | Обработка |
|---|---|---|
minidodge/project.godot |
included | project_config, direct chunk |
minidodge/scripts/player.gd |
included | gdscript, AST chunk |
minidodge/scripts/enemy.gd |
included | gdscript, AST chunk |
minidodge/scenes/player.tscn |
included | scene, direct chunk |
minidodge/README.md |
excluded | исключить файл документа в режиме source‑analysis |
Обработка файлов .gd
Файлы .gd попадают в логику, выполняющую роль AST‑парсера.
Например, player.gd был разделён следующим образом.
extends Area2D
signal hit
@export var speed = 400
var screen_size
func _ready():
func _process(delta):
func start(pos):Фактический chunk включает тело функции.
Например, функция _process сохраняется как один chunk.
func _process(delta):
var velocity = Vector2.ZERO
if Input.is_action_pressed(&"move_right"):
velocity.x += 1
if Input.is_action_pressed(&"move_left"):
velocity.x -= 1
if velocity.length() > 0:
velocity = velocity.normalized() * speed
$AnimatedSprite2D.play()
else:
$AnimatedSprite2D.stop()
position += velocity * delta
position = position.clamp(Vector2.ZERO, screen_size)В enemy.gd я обнаружил, что код, который может быть подсказкой для Godot 3, также разделяется на чанки.
extends KinematicBody2Dfunc _physics_process(delta):
velocity = move_and_slide(velocity)direct chunk обработка
project.godot не отправляется в AST Parser, а делится на секции настроек.
Пример: следующий контент — прямой фрагмент.
[application]
config/name="Mini Dodge Upload Test"
run/main_scene="res://scenes/player.tscn"Также player.tscn не отправляется в AST Parser, а делится на блоки ресурсов.
Для примера следующий контент является прямым фрагментом.
[node name="Player" type="Area2D"]
script = ExtResource("1")Причина такой разбивки в том, что файлы .tscn, .godot также необходимы для определения проекта Godot, но они не являются объектами парсинга на уровне функций AST, как функции .gd.
Проверка ввода Retriever
На текущий день ввод Retriever состоит только из одного chunkText.
Например, ввод Retriever для чанка extends KinematicBody2D выглядит следующим образом.
{
"chunkText": "extends KinematicBody2D"
}Не включайте путь к файлу, номер строки, подсказку, предполагаемое имя таблицы в ввод Retriever.
Путь к файлу и номер строки — это информация для отслеживания человеком в UI. Сам поиск должен выполняться по тексту чанка.
Кнопка поиска в БД по чанку
Сначала можно было разместить выбор таблицы как глобальную опцию, но на практике таблица, по которой нужно искать, может различаться для каждого чанка.
Поэтому кнопка размещена под чанком.
Поиск docs_chunks
Поиск api_mapping
Поиск label_prototypes
Validate JSONLПоток был установлен следующим образом.
текущий chunkText
-> нажмите кнопку таблицы ниже
-> Поиск в этой таблице
-> JSONL кандидат отображение
-> prompt + chunkText + проверка Qwen с помощью JSONLЗдесь prompt не является вводом Retriever. Prompt используется только на этапе проверки Qwen.
Что проверено сегодня
Сегодня было проверено четыре основных момента.
Удалена проблема, когда на пустом экране автоматически вставлялся пример кода. Раньше при открытии страницы автоматически загружался пример
Mini Dodge, и даже после загрузки пустой папки казалось, что предыдущий контент остался. Теперь сразу после обновления вводsourceпуст.При повторной загрузке того же файла или папки браузер снова генерирует событие
change, потому что значение поля загрузки очищается в момент клика.Чтобы во время разработки не оставался статический кэш JS, к ответу локального сервера добавлен заголовок
cache-control: no-store.При загрузке проекта Godot выяснилось, что файлы
.gdобрабатываются как AST‑chunk, а.godotи.tscn— как direct‑chunk, что подтверждено на веб‑странице.
Что ещё осталось
Разбиение на чанки, кажется, выполнено в достаточной мере.
Завтра продолжим работу над тем, как выполнять поиск в базе данных.
Особенно нужно проверить следующие части:
- Что возвращает JSONL при поиске
docs_chunksтолько поchunkText. - Правильно ли определяется переход Godot 3 → 4 при поиске
api_mappingтолько поchunkText. - Корректно ли находятся примеры использования функций/шаблоны вызовов при поиске
label_prototypesтолько поchunkText. - Как отбрасывать результаты в этапе проверки Qwen, если поиск ничего не нашёл или вернул нерелевантные данные.
- В каком виде отображать найденный JSONL на экране, чтобы было удобно оценивать результаты.
Созданный сегодня веб‑отладчик служит инструментом наблюдения для проверки следующего шага. Теперь видно, как файлы разбиваются на части, и в дальнейшем нужно будет отслеживать, какие основания каждый чанк получает из базы данных.