mirror of
https://github.com/ZhuLinsen/daily_stock_analysis
synced 2026-09-20 10:53:33 +08:00
docs: prepare v3.30.0 release (#2180)
* docs: prepare v3.30.0 release * docs: clarify default Xiaohongshu handle
This commit is contained in:
@@ -9,51 +9,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
- [修复] 固定分享图小红书二维码下方的账号文案为“小红书@昵称”,不再渲染数字 ID;历史 ID 配置不会改变分享图模板
|
||||
- [修复] 首页移动端侧栏的历史、自选与今日列表恢复纵向触摸滚动:外层卡片不再覆盖移动端滚动壳层的 `overflow`,实际滚动视口明确启用纵向手势与边界约束,桌面端继续保留卡片裁剪
|
||||
- [修复] Electron 桌面端恢复历史个股报告、市场复盘和完整报告的“分享”入口,复用安装包自带 Chromium 从本机受限 HTML 生成 PNG;Web 与桌面端在未配置自定义品牌时统一使用随包分发的小红书二维码,并在二维码下展示昵称 `@霸天土小豆`。
|
||||
- [新功能] Agent Chat 按会话持久化 Skill 选择,支持刷新和会话切换恢复,并区分省略 `skills`、显式空列表与非空选择;无持久化状态的历史会话继续使用运行时默认且不会被静默转为显式选择,复用分析 `context` 中残留的 legacy `skills` / `strategies` 也不会覆盖顶层三态或会话状态,非空但全部无效的 Skill 请求不会被当成显式空列表并清空既有选择
|
||||
- [改进] 后端 CI 在不跳过离线测试的前提下按完整测试文件分成三个独立 runner 并行执行,由单一 `backend-gate` 汇总门禁结果;实测文件耗时和首分片静态检查成本共同参与负载平衡,新测试文件自动纳入,现有 pip 安装和测试参数保持不变,避免 xdist 进程内并发的全局状态竞态。
|
||||
- [测试] 后端 CI 默认覆盖所有非 Web 改动,仅对已证明安全的纯 Web 路径跳过,并将整个 Web public 目录及前端渠道模板、设置帮助视为跨层运行合同;补充纯 Web、共享 Web 资产及 Web/非 Web 混合改动的过滤语义回归,明确 `predicate-quantifier: every` 按单文件匹配全部规则、再以任一匹配文件触发门禁。Docker CI 继续按构建输入过滤。离线测试保留稳定的串行执行与慢用例摘要,并移除重复用例和测试内真实等待。
|
||||
|
||||
- [修复] Web 分享图改为用户点击“分享”后才按需生成,不再在报告加载时自动请求
|
||||
- [修复] 将 `SCREENING_ENABLED` 及 Web 选股功能开关归入“基础设置”,选股导航入口继续由该开关控制
|
||||
- [修复] 飞书交互机器人在 `FEISHU_DOMAIN=lark` 时让 Stream 长连接与消息回复统一使用 Lark 国际版 API 域名,避免 SDK 默认连接飞书国内域名并返回 `Incorrect domain name`(fixes #937)。
|
||||
- [修复] `scripts/ci_gate.sh` 的 `offline_test_suite` 给 `pytest -m "not network"` 加 `--timeout=120 -o timeout_method=thread` 与 `-o faulthandler_timeout=300`:单个测试(含其 teardown)超过 2 分钟直接 fail,单个测试(含其 teardown)超过 5 分钟时 dump 全部线程栈到 stderr。配合 `.github/requirements-ci.txt` 新增 `pytest-timeout>=2.3.0` 依赖。issue #2131 报告过 backend-gate 在 AlphaSift hotspot 用例附近间歇性无 traceback 卡住直到被 GitHub Actions 取消,此次修复让任何未来 CI hang 都会留下可定位的失败信息或 post-mortem 栈,而不是静默消亡。同步修正 `.github/workflows/docker-publish.yml` 的 `Install backend gate dependencies` 与 `setup-python cache-dependency-path` 对齐 `ci.yml` 的 backend-gate 依赖安装方式,避免发布流程跑同一个 `./scripts/ci_gate.sh` 时因缺少 `pytest-timeout` 而直接 fail。
|
||||
|
||||
- [修复] 选股策略栏稳定展示完整中文策略列表,并保留自定义策略 ID 入口
|
||||
- [修复] 选股热点详情统一使用中文业务文案,不再显示内部类名、字段名和原始数据源错误
|
||||
- [改进] 选中热点后先展示榜单已有摘要和核心股,后台再补充完整详情,并将单次热点源等待上限收紧为 8 秒
|
||||
- [修复] 刷新热点榜单并保留当前题材时同步绕过详情缓存重拉该题材,避免新榜单继续搭配旧路线与成分股;详情质量可用且字段完整时不再展示底层数据源尝试失败
|
||||
- [改进] 热点成分股并行获取东方财富与同花顺数据,并按固定数据源优先级合并;AkShare 调用复用 DSA 的可终止子进程 timeout,同花顺 HTTP 调用设置 connect/read timeout,并以进程级并发槽限制活跃任务、在返回前回收 worker;题材详情可按需复用 DSA 原生搜索服务的数据源优先级、时效过滤、缓存与同请求合并补充安全且带链接的近期消息,真实供应商调用使用限流且可终止回收的子进程,并在本地压缩摘要以避免额外 LLM 等待与降级提示;显式搜索增强不写入热点详情共享缓存或 Web 页面缓存
|
||||
- [修复] 选股尾部轮换以分析器输入顺序为权威并保留并列分候选顺序;热点消息增强分别追加 `route` 与原始 `timeline`,同键搜索只允许缓存 owner 启动供应商链,子进程启动或清理失败也会释放全局容量;热点默认 provider 的正数超时配置覆盖板块、成分股及直接详情 fallback 并传递剩余硬截止,关闭外层预算仍保留单源安全上限;主动新闻搜索以同一绝对 deadline 覆盖缓存等待、重新竞争和 provider 执行,并区分有效空结果与运行失败
|
||||
- [改进] 精简选股页面的重复说明,将任务标识、快照统计和排序诊断折叠到运行详情
|
||||
- [新功能] SkillAggregator 基于独立满足 30 条 evaluated 门槛的真实 Skill Outcome bucket,使用 Beta 先验收缩、unable 惩罚和多周期证据加权生成有界运行时权重;缺失、低样本或异常统计保持中性。
|
||||
- [改进] 将参考 AlphaSift 实现的选股核心与策略正式纳入 DSA,统一使用 `ScreeningService`、`SCREENING_ENABLED` 和 `/api/v1/screening`,并保留 Apache-2.0 归因与来源版本记录。
|
||||
- [新功能] 选股结果按 `run_id` 持久化到 DSA 数据库,新增运行历史和数据源历史 API,接入公告事件上下文及其搜索缓存,并支持将候选连同筛选策略映射的 skill 交给单股深度分析。
|
||||
- [修复] Outcome 候选按上次尝试时间公平调度,避免持续新增的缺失 key 使旧 `pending` outcome 永久得不到重试。
|
||||
- [新功能] 新增按 skill、horizon 与 outcome engine version 独立聚合的只读 Skill Opinion 表现统计;少于 30 条 evaluated 样本时仅返回观察性计数,不输出表现指标或调整运行时权重。
|
||||
- [修复] 选股主模型返回空内容、非 JSON 或低覆盖结构时继续尝试备用模型;全部失败时明确展示确定性因子排序状态。最终 JSON 必须在 `content` 或 `output` 块中;`reasoning_content`(链式思考)被视为内部辅助,不作为最终结果。
|
||||
- [改进] Web 选股使用浏览器匿名种子与运行 ID 在最终评分后的有界近分池中生成每次运行的候选组合;Web Storage 不可用时在页面会话内存中复用同一临时种子;本地评分覆盖完整短名单,远程分析继续遵守数量上限,且只有完成相同后置分析的候选可参与轮换;原 Top-N 前半部分、明显领先候选、硬过滤、风险否决和得分保持不变。
|
||||
- [改进] 热点榜单刷新与选股长流程解除双向串行等待,热点详情改为选中后按需加载;选股默认复用 5 分钟内且数据源优先级一致的成功全市场快照,同一来源链中的后备源结果也可复用,并在后台任务中展示快照、候选上下文、LLM 重排、最终评分和新闻事件增强阶段。
|
||||
- [修复] 选股日线增强改用请求级 DSA-first fetcher 注入,不再临时替换进程级函数,避免重叠请求泄漏 wrapper 或重复执行 fallback;多个后置分析器按最新分数逐级重排,远程分析状态跟随实际提交候选,超限候选统一记录为 `skipped`,外部响应也不能改写未提交候选。
|
||||
- [修复] 统一等价股票代码的本地日线候选与同源窗口解析;冲突沪深交易所代码不再降级匹配裸码,回测仅接受快照或交易日历确认的起点,并在同一起点中优先完整的单一代码窗口。
|
||||
- [新功能] 新增按 individual SkillAgent 自身 signal、版本化 engine 与本地已存同源日线窗口计算并持久化 `skill_opinion_outcomes` 的核心服务。
|
||||
- [修复] #1970 关闭认证属于高风险操作,即使携带有效 session cookie 也强制要求再次输入当前管理员密码二次确认;后端 `auth_update_settings` 的 disable 分支统一走 currentPassword 校验,命中 rate limit 时与 enable 路径一致返回 429,前端 `AuthSettingsCard` 在关闭认证时如有缺失当前密码将阻止提交并给出内联提示。
|
||||
- [改进] 优化首页侧栏任务面板与自选股工作区:支持折叠任务摘要、自选股直接打开最新详情,并压缩头部操作以释放窄侧栏列表空间。
|
||||
- [修复] 收敛自选股行交互与今日状态语义:详情与移除操作使用独立可访问按钮,详情提示从当前行状态实时派生并区分查找中、查找失败和确认无详情,任何 stock-bar 请求及完成任务后的数据刷新都会在开始时进入待确认状态,旧 stock-bar 或 fallback 报告在重新确认或未知期间不会作为最新详情开放;刷新失败时不再把旧历史记录误标为今日分析,自选股刷新会显式重试列表、stock-bar 与逐股票详情查询,逐股票 fallback 使用固定 worker 并发上限并取消已失效的查询批次。
|
||||
- [新功能] 新增按 individual SkillAgent 自身 signal、版本化 engine 与本地已存同源日线窗口计算并持久化 `skill_opinion_outcomes` 的核心服务;本阶段不提供管理员 API、表现统计、样本充足度或权重调整。
|
||||
- [新功能] STOCK_LIST 解析新增 `parse_analysis_target()` 单条目解析契约,支持 sh/sz/bj/hk/us 前缀校验、裸码默认归股票、未命中前缀降级为股票三段语义;保留现有 `split_stock_list()`/`serialize_stock_list()` 行为不变,并对外暴露 `IndexRegistry`、`AnalysisTarget`、`ParseStatus`、`default_index_registry()` 以便上层注入自定义指数白名单(关联 issue #2063 Phase 1)
|
||||
- [修复] `parse_analysis_target()` 在显式交易所后缀输入被规范化层拒绝时(如 `600519.BJ`、`600000.HK`、`1234567.SH`、`abc.SH`),不再静默改写为 `sh<digits>` 或继续走裸码分类导致误判为 US,而是直接返回 `unsupported` 并携带可定位原因;保留 `000300.SH` / `sh000300.SH` 等已知 INDEX alias 的索引命中路径(关闭 PR #2122 review blocker OR-COR-607f1395 / OR-COR-26596201 / OR-COR-d6afd0d6)
|
||||
- [修复] `parse_analysis_target()` 收敛显式交易所后缀输入的 3 个新 correctness blocker:畸形混合 alias(如 `sh0x00300.SH`)不再被数字过滤后重建为已注册指数;dotted-prefix 形态(如 `SH.000999`)在 invalid base 时不被 strict-suffix 误拒,亦不静默降级为畸形 canonical stock,统一返回 `unsupported`(白名单交易所的合法 alias 通过 `sz399001.SZ` / `sz399006.SZ` 等命中 INDEX);外盘半显式 suffix(.T/.KS/.KQ/.TW/.TWO)非法 base 不再静默回退到 US stock,而是返回 `unsupported` 并标记外盘 suffix(关闭 PR #2129 review blocker OR-COR-d83a3580 / OR-COR-b3e32200 / OR-COR-e21e9de5)
|
||||
- [修复] `parse_analysis_target()` 在 `us` 前缀分支按 Phase 1 contract(issue #2063 maintainer clarification 2026-08-01)统一收紧:`us` 前缀本身大小写不敏感(`us`/`US`/`uS`/`Us` 均可),但 ticker base 必须为 canonical uppercase US symbol 形态(regex `^[A-Z]{1,5}(\.[A-Z]{1,2})?$`,与 `data_provider/us_index_mapping.py` 和 `stock_code_utils._normalize_code_and_exchange` 一致)。`us` 前缀输入只要 base 不 match 该 regex——含任意小写字母(`usfd` / `usm` / `usibm` / `usamd` / `usge` / `usbk` / `usaapl` / `usshop` 全小写、`Usfd` / `USibm` / `Usaapl` / `uSfd` / `USaapl` mixed-case prefix + lowercase base)、含标点(`usbrk.b` / `usshop.us` lowercase base with punctuation)、含数字(`us1` / `us1a` / `us12a` lowercase base with digits、`US1` / `US12345` all-uppercase but invalid US shape)一律直接返回 `unsupported` 并提示用户使用 uppercase base(如 `usAAPL` / `usBRK.B` / `usSHOP.US`)或 bare 大写形态(如 `USFD`)。docstring 同步更新明确「exchange 前缀大小写不敏感,但 `us` 后 base 必须 match canonical US symbol shape」契约。该 contract 一致规则同时关闭 PR #2129 review blocker OR-COR-9c3d2c44(`usfd`/`usm` 全 lower 静默大写)、OR-COR-2f0d1a7e(`usibm`/`usge`/`usbk`/`usaapl` 长度依赖剥前缀分叉)、OR-COR-7b45f5c1(`Usfd`/`USibm`/`Usaapl` mixed-case prefix + lowercase base 绕过 lowercase-only guard)与 OR-COR-us-prefix-nonalpha-guard-gap(`usbrk.b`/`usshop.us`/`us1` lowercase/non-alphabetic base 绕过早期 `raw.isalpha()`-gated guard 走到 `_split_prefix` 异常剥前缀),无需 US ticker 白名单。mixed-case `usBRK` / `UsBRK` / `uSBRK` / `usFD` / `usM`(prefix any case + upper base)与全 upper `USAAPL` 等仍按显式前缀剥前缀;`USFD`/`USM` 等 ≤5 字母全 upper 仍按 bare ticker 保留
|
||||
- [修复] `_split_prefix()` 对带 `.US` 后缀的 bare 美股代码(`SHOP.US` / `HKD.US` / `BJRI.US` / `USFD.US` / `BRK.B` / `AAPL.US`)应用与裸 1-5 字母代码(`USFD` / `SHAK` / `AAPL`)相同的 short-circuit:只要 token 严格 match canonical US symbol shape regex `^[A-Z]{1,5}(\.[A-Z]{1,2})?$`,就不进入 `_KNOWN_PREFIXES_SORTED` 扫描。此前 short-circuit 只对纯字母 (1-5 ASCII uppercase letters) 生效,导致前两字符碰巧撞上 `sh` / `hk` / `bj` / `us` 已知前缀的 dotted `.US` 代码(`SHOP.US -> sh`+`OP.US`、`HKD.US -> hk`+`D.US`、`BJRI.US -> bj`+`RI.US`、`USFD.US -> us`+`FD.US`)被错误拆分,exchange 与 canonical_id 双双错位。mixed-case 显式前缀代码(`usAAPL` / `hk00700`)仍按原 prefix 路径处理。关闭 PR #2129 round-4 review blocker OR-COR-bare-us-suffix-prefix-collision
|
||||
<!-- 新条目格式:- [类型] 描述(类型取值:新功能/改进/修复/文档/测试/chore)-->
|
||||
<!-- 每条独立一行追加到本段末尾,无需分类标题,合并时冲突最小 -->
|
||||
- [文档] FAQ 补充 macOS 桌面应用被 Gatekeeper quarantine 阻止启动时的受信任安装包临时放行步骤(refs #2113)。
|
||||
- [新功能] LLM 渠道新增显式 Chat Completions / Responses API Surface,支持 Anspire GPT-5.6 系列等 Responses-only 模型,并统一连接测试、主分析、筛选、图片识别与状态诊断路由;所有运行路径先按同一规则解析协议再校验 Surface,混合 Surface 的同名路由按未知能力保守处理;显式 Anspire 渠道独占共享 Key,非法 Surface 或协议不匹配时不会把该 Key 回退为旧版 Chat 部署,同时保留无关的 Gemini/OpenAI 等 legacy provider;本地 loopback 渠道可在图片识别路径继续无 Key 调用,远端渠道仍要求凭据;禁用渠道不会因残留 Surface 配置阻断其他兼容 fallback;Web 编辑器不会静默改写非法历史值,并允许将 Hermes 非法 Surface 修复为 Chat Completions。
|
||||
- [修复] 将 Responses 渠道的协议、模型 provider、公开 route alias 与 wire-model 构造收敛为统一路由契约,保存校验、运行时加载、状态诊断、选股入口和 Web 编辑器共同使用当前安装的 LiteLLM provider registry,拒绝 `openai` 协议下显式非 OpenAI provider 的模型、拒绝同一 alias 混用 Chat/Responses,并保留 OpenAI-compatible 网关自有的带斜杠模型 ID。
|
||||
- [修复] 长通知包含一级 Markdown 标题时按对应标题边界正确分片,避免错误递归耗尽长度预算并中断发送。
|
||||
|
||||
## [3.30.0] - 2026-08-09
|
||||
|
||||
### 发布亮点
|
||||
|
||||
- feat: LLM 渠道新增显式 Chat Completions / Responses API Surface,统一连接测试、分析、选股、图片识别与状态诊断的协议路由。
|
||||
- feat: Agent Chat 按会话持久化 Skill 选择,刷新和切换会话后可恢复,并完整保留省略、显式空列表与非空选择三态。
|
||||
- feat: Electron 桌面端恢复历史报告、市场复盘和完整报告分享图;未配置自定义品牌时,统一使用随包二维码与默认“小红书@霸天土小豆”账号文案。
|
||||
- feat: 新增单条分析目标解析契约,收紧交易所后缀、指数别名及美股代码的规范化边界。
|
||||
- fix: 修复移动端侧栏滚动、自选股详情状态、长通知标题分片及 Lark 国际域名等用户可见稳定性问题。
|
||||
- improve: 后端 CI 按测试文件分成三个 runner 并行执行,并收紧 Web 共享资产与跨层契约的门禁范围。
|
||||
|
||||
### 新功能
|
||||
|
||||
- LLM 渠道支持显式选择 Chat Completions 或 Responses API Surface,兼容 Responses-only 模型,并让连接测试、主分析、选股、图片识别和状态诊断复用统一路由契约。
|
||||
- Agent Chat 将 Skill 选择按会话持久化,刷新或切换会话后恢复;历史会话继续保留运行时默认,非法 Skill 请求不会误清空已有选择。
|
||||
- Electron 桌面端复用安装包自带 Chromium,为历史个股报告、市场复盘和完整报告生成 PNG 分享图;Web 与桌面端统一使用随包分发的小红书二维码。
|
||||
- `STOCK_LIST` 新增 `parse_analysis_target()` 单条目解析契约,并对外暴露可注入的指数注册表及解析结果类型。
|
||||
|
||||
### 改进
|
||||
|
||||
- 优化首页侧栏任务面板和自选股工作区,支持折叠任务摘要、自选股直接打开最新详情,并压缩头部操作以释放列表空间。
|
||||
- 后端 CI 按完整测试文件拆分为三个 runner 并行执行,由统一 `backend-gate` 汇总结果;继续保留稳定的离线测试语义并降低全局状态竞态风险。
|
||||
|
||||
### 修复
|
||||
|
||||
- 固定分享图小红书二维码下方的账号文案格式为“小红书@昵称”,未配置自定义昵称时默认显示“小红书@霸天土小豆”;不再渲染数字 ID,历史 ID 配置不会改变分享图模板。
|
||||
- 修复首页移动端历史、自选和今日列表无法稳定纵向触摸滚动的问题,同时保持桌面端卡片裁剪行为。
|
||||
- 长通知包含一级 Markdown 标题时按对应标题边界正确分片,避免错误递归耗尽长度预算并中断发送。
|
||||
- 收敛自选股详情与今日状态语义:刷新和查询期间不再开放过期报告,失败时不会将旧历史误标为今日分析,并限制逐股票 fallback 并发及取消失效批次。
|
||||
- 收敛 Responses 渠道的协议、provider、route alias 与 wire-model 契约,拒绝协议不匹配、同名 alias 混用 Surface 及非法历史配置。
|
||||
- 飞书交互机器人在 `FEISHU_DOMAIN=lark` 时让 Stream 长连接和消息回复统一使用 Lark 国际版 API 域名,避免连接国内域名后返回 `Incorrect domain name`。
|
||||
- 显式交易所后缀、畸形混合 alias、dotted-prefix 及外盘半显式后缀的非法输入不再静默改写或降级为错误市场。
|
||||
- `us` 前缀保持大小写不敏感,但 ticker base 必须满足规范的大写美股代码形态;非法小写、标点或数字输入直接返回 `unsupported`。
|
||||
- 带 `.US` 后缀的规范美股代码不再因前两字符碰撞 `sh`、`hk`、`bj` 或 `us` 前缀而被错误拆分。
|
||||
|
||||
### 测试
|
||||
|
||||
- 非 Web 改动默认执行完整后端门禁;纯 Web、共享 public 资产、渠道模板和设置帮助的过滤语义补充回归测试,Docker 构建继续按实际输入过滤。
|
||||
|
||||
### 文档
|
||||
|
||||
- FAQ 补充 macOS 桌面应用被 Gatekeeper quarantine 阻止启动时,对受信任安装包进行临时放行的步骤。
|
||||
|
||||
## [3.29.0] - 2026-08-02
|
||||
|
||||
@@ -2180,7 +2180,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
||||
|
||||
---
|
||||
|
||||
[Unreleased]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.29.0...HEAD
|
||||
[Unreleased]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.30.0...HEAD
|
||||
[3.30.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.29.0...v3.30.0
|
||||
[3.29.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.28.0...v3.29.0
|
||||
[3.28.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.27.0...v3.28.0
|
||||
[3.27.0]: https://github.com/ZhuLinsen/daily_stock_analysis/compare/v3.26.1...v3.27.0
|
||||
|
||||
Reference in New Issue
Block a user