Discovery

NOTE

Статус: Live (HEAD 5e4ce54, 2026-05-06). Сейчас содержит единственный sub-BC — discovery/visibility, который применяет visibility-policies в proposal pipeline. Полный discovery flow (search/match/enrich) распределён по другим BC.

discovery — зонтичный namespace для механик «обнаружения» подходящих предложений в proposal pipeline. На 2026-05-06 в нём один sub-BC — visibility, который filter’ит candidate’ов по customer/group rules (P4a + P4b).

Назначение

Применить data-visibility policy (ADR-0012 + ADR-0040) перед формированием proposal’а: какие offer’ы вообще видны клиенту, какие seller’ы заблокированы, какой preferred-seller bias.

Статус документа

Область действия

Входит:

  • discovery/visibility BC: VisibilityRule aggregate + Engine + VisibilityFilter (Layer 1.1.5) + ObservationVisibilityFilter (Layer 1.3.5, P4b).
  • Admin HTTP /api/v1/admin/visibility/* (rules CRUD).
  • Outbox publisher для policy change events.

Не входит:

  • Search через ES (это search BC).
  • Matching offer↔canonical (это matching BC).
  • Enrichment job runner (это enrichment target boundary).

Публичный контракт

Внутренний Go API

  • Engine.Filter(ctx, subject, candidates) — применить policy к candidate’ам proposal’а.
  • RuleRepo.UpsertVisibilityRule(...) / .List(...) — admin CRUD.

HTTP

  • /api/v1/admin/visibility/* — admin CRUD rules.

Внутренняя архитектура

discovery/visibility/:

  • domain/VisibilityRule aggregate, scope/subject/specificity.
  • app/Engine (cache + invalidation).
  • infra/pg/ — Repo.
  • infra/http/ — admin handlers.
  • infra/outbox/ — events publisher.
  • fx.go — Module composition.

Зависимости

  • PostgreSQLvisibility_rule.
  • outbox — policy change events.
  • search/proposal — потребитель (вызывает Engine.Filter).

Хранилище

  • visibility_rule — (scope, subject_kind, subject_id, target_kind, effect=allow|deny, specificity).

Тестирование

  • Unit: go test ./internal/core/discovery/visibility/...
  • Integration: -tags=integration + integration_test.go end-to-end через httptest.

Наблюдаемость

  • Metrics: visibility_evaluations_total{target_kind}, visibility_evaluation_duration_seconds, visibility_cache_hits_total, visibility_filtered_total{effect}.
  • Phase logs: visibility.compile.phase.

Открытые вопросы / TODO

  • Поглотит ли namespace discovery другие sub-BC (search-side discovery, enrichment) — пока только visibility.

Связанные документы