httpapi: форма провода читающих маршрутов объявлена транспортом

- доменные типы internal/catalog лишились json-тегов и MarshalJSON; типы
  metricWire/layerWire/aggregationWire и перевод catalogWire живут в транспорте,
  тело отказа тоже получило объявленный тип — байты ответа не изменились
- заведён сторож: обход графа типов ответа утверждает, что домен не доезжает до
  сериализации, плюс требование json-тега на полях транспортных структур и
  заведомо красные случаи к обоим правилам
- решение с ценой обеих сторон записано в architecture.md и ADR; шаг lint в
  гейте получил свой кеш — общий на машину красил прогон находками из чужого
  worktree
This commit is contained in:
av
2026-08-04 16:18:05 +03:00
parent bd832337df
commit a834d10415
19 changed files with 1721 additions and 53 deletions
+16 -1
View File
@@ -102,7 +102,22 @@ def main() -> int:
step("build", ["go", "build", "./..."], "не собирается")
step("vet", ["go", "vet", "./..."])
if shutil.which("golangci-lint"):
step("lint", ["golangci-lint", "run"])
# Кеш линтера — СВОЙ на дерево, а не общий на машину.
#
# Общий `~/.cache/golangci-lint` отдаёт замечания, привязанные к
# путям ЧУЖОГО worktree того же модуля: конвейер задач работает в
# `tmp/wt-*`, и прогон в одном дереве красил соседнее сообщением про
# файл, которого в нём нет (воспроизведено дважды за одну задачу,
# оба раза `../…/internal/store/store.go: time.Now forbidden` — а
# исключение `^internal/(ident|store)/` на такой путь не
# распространяется). Краснота по причине, не связанной с
# изменением, приучает не читать красноту — та же цена, что у
# записи 2026-08-04 в docs/review.md.
step(
"lint",
["golangci-lint", "run"],
env={"GOLANGCI_LINT_CACHE": str((OUT_DIR / "golangci").resolve())},
)
else:
record(SKIP, "lint", "golangci-lint не установлен (task setup)")