Pull Request已成功合入, 合并人@urandon
(感谢 urandon 的贡献)CI fix — canonical usage table
GitHub Actions run 30561336358 failed in the local multi-service stand because the E2E assertion queried usage_events, which is not part of the YDB schema. The authoritative table created by migration 00014 and written by the state store is usage_observations.
Commit 9bae464 updates the black-box assertion to query usage_observations by tenant and run. The telegram_delivery_ready_v2 errors visible earlier in the job log occurred while application containers were starting before dev-up completed migrations; delivery recovered after migration and those messages were not the test failure.
Verified locally:
go test -count=1 -tags=e2elocal ./test/e2e/...make cigit diff --check
The branch has been pushed. The full Compose slice remains gated by the next mirrored GitHub Actions run.


CI fix — canonical Telegram attachment name
GitHub Actions run 30563226089 reached the E2E attachment assertion and failed because the test searched for the raw filename notes.txt.
The production ingress path did not lose the file: it stores the document as a tenant-scoped blob and assigns the collision-safe manifest name attachment-01-notes.txt. Commit be97135 updates the black-box assertion to the canonical name and adds a processor unit assertion for the naming contract.
Verified locally:
go test -count=1 ./internal/telegramingressgo test -count=1 -tags=e2elocal ./test/e2e/...make cigit diff --check
The early *_ready_v2 does not exist messages in the job log were emitted while application containers were starting before dev-up completed migrations. The services recovered after migration; those messages were not the failing assertion.


Summary
make e2e-local, which starts the pinned stand, builds the one-shot worker image, and runs a credential-free two-tenant black-box slice;update_id/message_id/tenant_id/run_id/delivery_idcorrelation logs without payload or credential logging;Verification
Passed locally:
Docker is not installed on the development workstation, so no local Compose execution is claimed. The new
make e2e-localpath must pass in the mandatory mirrored GitHub ActionsLocal multi-service standjob before merge.Closes #11.