chore(prep): shared groundwork for batch-3 (admin/golden/cache)

第三批(T12 后台/T13 黄金集/T14 检索缓存)协调提交:
- kb:KbAssetService(登记/审核,tryon_ready 只能随 approved 打开)+ Asset 模型与 repo
- retrieval:list_gaps 缺口看板查询 + invalidate_cache() 钩子(T14 背后实现真缓存)
- 配置:ADMIN_TOKEN(空=后台 404)+ 检索缓存三参数
- pytest golden marker(默认跳过,CI 强制跑)+ Makefile golden + CI 防线 5c
- 测试隔离修复:test_auth_sms 加 autouse 清 sms:* 键夹具(频控计数跨运行
  累积会毒化后续运行——随机 IP 空间仅 254 且部分用例固定 device_id)
This commit is contained in:
xsl
2026-08-14 20:57:52 +08:00
parent 8ec8d2cefb
commit 9c1802130d
11 changed files with 236 additions and 5 deletions
+21
View File
@@ -261,3 +261,24 @@ async def record_gap(
else:
gap.hit_count += 1
gap.last_seen_at = datetime.now(UTC)
#: 进程内缓存代数:invalidate_cache() 自增,缓存键带上它即可整体失效(T-P2-10)。
#: 放 repo 而非 service,是因为 T14 的缓存模块会同文件引用,避免循环 import。
INVALIDATION_VERSION = 1
async def list_gaps(session: AsyncSession, *, limit: int = 50, offset: int = 0) -> list[RowMapping]:
"""缺口看板查询:hit_count 降序,同频次按最近出现降序。"""
from sqlalchemy import select
from packages.shared.models import KbGap
stmt = (
select(KbGap)
.order_by(KbGap.hit_count.desc(), KbGap.last_seen_at.desc())
.limit(limit)
.offset(offset)
)
result = await session.execute(stmt)
return list(result.mappings().all())