docs/24 是客服阶段的总结,正文保留为当时的事实,本次做两件事: 1. 刷新"当前状态"表的数字:mypy 113→137 文件、unit+contract 497→664、 integration 29→33、active 发布 181(5 项)→201(10 项:9 条 agent_tools + 1 条客服 闲聊提示词)。数字由 tools/probe_release_state.py 只读查库得到,证据留档 docs/evidence/release-state.json。 2. 追加第七节"后续更新",记录阶段总结写完之后的变化:两件待决策事项已落地(闲聊 提示词已按继承语义发布、适当性两侧口径复核通过)、风控合并后的处理要点、以及 三个仍然开着的口子(热线占位符、like %% 全表扫、offset 游标并发跳行)。 登录端点:**不改**。docs/05 §11 明确"JWT 签发、刷新、注销由统一身份认证模块负责, Agent 平台不重复实现",本平台只做校验(app/core/security.py)。第五节第 8 条据此改写, 同时把第 7 条"风控尚未启动"标记为已完成。 顺带修正"已知缺口"里的一条:列表接口的 next_cursor/has_more 风控侧已补齐,客服侧仍待办。
91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
"""只读探查:当前 active 配置发布与配置项数量(用于同步 docs/24 的"当前状态"表)。
|
||
|
||
只做 SELECT,结果写 `docs/evidence/release-state.json`:
|
||
|
||
python tools/probe_release_state.py
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import asyncio
|
||
import json
|
||
from pathlib import Path
|
||
from typing import Any
|
||
|
||
from sqlalchemy import text
|
||
|
||
from app.infrastructure.db import SessionFactory
|
||
|
||
OUTPUT = Path("docs/evidence/release-state.json")
|
||
|
||
|
||
async def collect() -> dict[str, Any]:
|
||
report: dict[str, Any] = {}
|
||
async with SessionFactory() as session:
|
||
report["recent_releases"] = [
|
||
dict(row)
|
||
for row in (
|
||
(
|
||
await session.execute(
|
||
text(
|
||
"""
|
||
SELECT id, release_no, title, status, created_at, activated_at
|
||
FROM config_release
|
||
ORDER BY id DESC
|
||
LIMIT 5
|
||
"""
|
||
)
|
||
)
|
||
)
|
||
.mappings()
|
||
.all()
|
||
)
|
||
]
|
||
report["active_items"] = [
|
||
dict(row)
|
||
for row in (
|
||
(
|
||
await session.execute(
|
||
text(
|
||
"""
|
||
SELECT i.namespace, COUNT(*) AS items
|
||
FROM platform_config_item i
|
||
JOIN config_release r ON r.id = i.release_id
|
||
WHERE r.status = 'active'
|
||
GROUP BY i.namespace
|
||
ORDER BY i.namespace
|
||
"""
|
||
)
|
||
)
|
||
)
|
||
.mappings()
|
||
.all()
|
||
)
|
||
]
|
||
report["active_prompt_versions"] = (
|
||
await session.execute(
|
||
text(
|
||
"""
|
||
SELECT COUNT(*) FROM prompt_template_version p
|
||
JOIN config_release r ON r.id = p.release_id
|
||
WHERE r.status = 'active'
|
||
"""
|
||
)
|
||
)
|
||
).scalar_one()
|
||
return report
|
||
|
||
|
||
async def main() -> None:
|
||
report = await collect()
|
||
OUTPUT.parent.mkdir(parents=True, exist_ok=True)
|
||
OUTPUT.write_text(
|
||
json.dumps(report, ensure_ascii=False, indent=2, default=str),
|
||
encoding="utf-8",
|
||
)
|
||
print(f"wrote {OUTPUT}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|