Files
Veyra/docs/development-state.md
T

259 lines
41 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 开发记忆与交接状态
更新日期:2026-10-09。
## AI 接入与本轮部署(2026-10-09)
- 用户后来指定 GPT-6.1-Astra;实际供应商目录没有此 ID,请求 404。用户确认改用 gpt-6.1-sol,模型目录匹配且约 6.8 秒真实结构化连接测试通过;主配置已保存该模型,密钥保留。
- 用户明确要求 AI 分析/审核通过后自动发布、不逐条人工操作,并授权通过 CI/CD 部署到现有服务器。新增十五版迁移:审核策略配置与候选分析任务,所有表使用 veyra_、字符串 UUID。
- 接入 Responses / Chat Completions 结构化调用,密钥从现有 Vault 解密,禁止重定向携带密钥;主分析与独立复核严格验证证券、Schema、证据索引与文本边界。不改写价格、不生成用户计划或成交。
- 后台增加 AI 审核和自动发布开关、任务状态、处理入口、分析与复核结果;审核模型可安全复用主配置。Worker 每 30 秒检查,五分钟租约、版本去重、失败最多三次并间隔五分钟;提交时重新核对配置、授权身份、策略与候选,结果和发布/审计/Outbox 同事务。
- App 详情增加真实 AI 分析、复核与资料缺口;统一 Screen 隐藏纵横滚动条,保留滑动。完整 Go race、类型检查、管理端构建与 App 双端 Hermes 导出通过。已用现有 Vault 密钥实际调用 gpt-5.5:约 3.4 秒返回有效结构化 REJECT(明确缺少研究数据的连接测试),接口可用且没有发布测试候选。PR #3 合并 bf643b0,run 40 因源码下载截断失败,未部署;下载重试与 tar 完整性校验经 PR #4 合并 b47889c,run 41 的 verify/deploy 均成功,容器 healthy。
- iPhone 包新增 Expo 云端未签名设备 IPA 构建;只上传隔离 App 源码,不上传后端私有环境。首轮自定义步骤名称错误已修正为显式 pod install;已提交构建 e36bba44-4949-4069-a2fb-e1f491dac7f1,构建已 FINISHED;设备 IPA 已下载到 Downloads/Veyra-unsigned.ipa(10,953,223 字节),zip 完整性、cn.sundynix.veyra、iPhoneOS/arm64、内嵌 Hermes 和公开 HTTPS 地址验证通过,无签名。SHA-256 19b6650dd73712fcf612f9b84b3cd7efdc8e5470d99b3f0d17bbaabe5972a9ac。IPA 与校验文件已上传 Gitea 预发布 v0.1.0-preview.20261009;普通 Apple ID 仍需个人重签,实际安装运行待用户完成。
- 实际主分析与复核均已启用 gpt-6.1-sol,现有加密密钥保留;AI 审核策略版本 2 已启用自动发布。核对实际审计:两条已有候选在 22:11 已经人工发布,一个计划在 22:17 已确认,均早于本轮 AI 启用;App 当前可见两条候选、一个计划、原有模拟账户现金 1000.00。不能把既有人工发布称作 AI 结果;暂无待审核候选,AI 任务列表为空,后续新候选自动处理。没有创建或改写用户资金、计划、成交。
- 部署后的配置校验发现旧数据库 timeout_seconds 上限仍为 30,已新增十六版迁移匹配调用端 120 秒上限,并使用实际数据库隔离 schema 测试 120 秒配置持久化;Go race 与 go vet 通过,正在通过 PR / CI 部署修复。
## 股票名称搜索修复(2026-10-09)
- 实际 HTTPS 查询复现:名称“诺普信”无结果,但代码 002215 和名称“诺 普 信”均返回该深交所股票。数据源在名称中填充了空格,原 SQL LIKE 连续匹配漏掉无空格查询,证券并未漏同步。
- 查询统一忽略名称与输入中的空格、制表符和全角空格,保持原始源名称;转义 LIKE 通配符为字面匹配,避免输入 % 或 _ 返回全部股票。管理端无搜索结果文案与无同步数据区分。真实 PostgreSQL 隔离 schema 的 race 回归覆盖名称/代码/空格和通配符,go vet、管理端类型检查/build/embed 通过;已通过 PR #6 合并,待 CI 上线后实查。
- 按用户补充要求,管理端行情列表/详情、候选队列、审核详情/确认、总览观察与信号卡将代码与名称并列展示,代码使用等宽字形;选股、回测、策略证券列表以及 App 候选/计划/持仓/成交原已有代码,继续保留。管理端统一 StockIdentity 组件,类型检查/build/embed 通过。
- 用户最新指示先不处理 App 安装,保留已有 IPA 产物;当前优先验证名称搜索、股票代码展示与模型运行配置。
## App Expo Go 真机入口(2026-10-09)
- 真机空列表排查:公开 HTTPS 下测试用户账户列表为一个已有模拟账户;候选、计划、提醒接口均成功返回空数组。管理员候选列表两条(中洲控股、胜利股份)仍为 PENDING_REVIEW,策略 ACTIVE,尚未人工审核发布;因此 App 机会列表为空,用户也未创建计划。排查只读业务数据,没有替用户发布候选或保留资金。
- 真机反馈 `Text strings must be rendered within a <Text>`;Metro 调用栈定位机会、持仓、行情页,扫描发现六个页面八处标签间单行空格。已删除裸 JSX 空白,保留 Text/Body/Title 内合法文字;新增 JSX 原生文本约束回归检查,修复前复现失败、修复后 14 项客户端测试、类型检查、iOS/Android Hermes 导出与 go vet 通过。真机修复效果仍待重新打开确认。
- 已通过单入口 `user-set` 维护现有 App 测试身份,保留用户 ID 和账户,撤销旧会话;本机与服务器私有环境同步,公开 HTTPS 登录、me、账户列表、退出均验证 200。命令仅限 local/test 且仅能修改 USER,凭据不记录。新增集成测试覆盖环境限制、管理员保护、冲突回滚、身份保留和旧会话撤销;完整 Go race、go vet 与构建通过。
- 用户只有普通 Apple ID,目标是自己在 iPhone 使用,不上架;手机实际 Expo Go 57.0.9 支持 SDK 57.0.0。已将 App 从 SDK 55 升级至 expo 57.0.27 / React Native 0.86.3 / React 19.2.3,依照 SDK 配套依赖,不再强制与独立管理端保持 React 补丁版本一致。
- 已更新 App 私有环境和模板为 https://veyra.sundynix.cn;真实 USER 登录、me、账户列表、退出均返回 200,不记录登录凭据。管理端认证与 App USER 身份仍分离。
- TypeScript 6.0.3 显式加入 Node 测试类型;补齐 expo-font 与配置插件。类型检查、12 项测试、Expo 依赖检查、Doctor 21/21、iOS/Android Hermes 导出通过。实际 Metro iOS bundle HTTP 200,manifest SDK 为 57.0.0。
- Metro 已启动,电脑 LAN 地址 192.168.100.2,端口 8081;显式设置 REACT_NATIVE_PACKAGER_HOSTNAME,避免 VPN 网卡 198.18.0.1 被选为手机入口。扫码地址 exp://192.168.100.2:8081,二维码 /tmp/veyra-expo57-qr.png。手机需与电脑同一局域网;后端已使用公开 HTTPS 域名,Metro 仍依赖本机运行。
- 用户扫码已连到项目,但 Expo Go 要求与 CLI 同账号。用户完成本机 Expo 浏览器登录,whoami 与重启后 manifest 均确认 blizzard-zhang;Metro manifest 200 / SDK 57.0.0。二维码地址不变;用户确认 iPhone 已成功打开 App,当前进入登录步骤,业务操作尚未真机验证。账号令牌只由 Expo CLI 本机管理,不记录到配置或文档。
- 本机 Intel / macOS 14.8.2,只有 Command Line Tools,未安装完整 Xcode。当前采用手机已有 Expo Go 运行,不需要本机原生编译。独立 IPA、tag 自动上传安装包、签名安装和手机 UI 验证尚未完成;用户已确认 Expo Go 真机打开,业务操作仍待手机验证;不把 Hermes 导出称作独立安装包。
## CI 构建优化与实际部署(2026-10-09,完成)
- PR #1 已正常合并至 master,提交 abcb1c99;触发 Actions run 38。未直接推送 master。
- Runner 下载 Docker 外部 frontend 约 14 MB 耗时数分钟,属于 Docker Hub 网络瓶颈。移除不必要的 docker/dockerfile:1 frontend 引用,改为 Runner 传源码、192.168.100.132 在独立 builds/<SHA> 目录执行完整容器检查与构建,复用已有依赖缓存;构建锁与发布锁分离,镜像本地打包,不跨主机传输大型镜像。
- 新增 PUBLIC_ORIGIN 配置,明确允许指定 HTTPS 公共域名,校验 Host 和 Origin,不盲信转发协议头;HTTPS 公共域名启用 Secure Cookie。配置与 handler 验证、完整容器内 Go race(独立 PostgreSQL)已通过。服务器公共域名配置已保存,原凭据与主密钥保留。
- Nginx 实际不在部署主机,用户明确自行配置;已提供完整代理配置,目标为 192.168.100.132:8080。现已通过 https://veyra.sundynix.cn 验证实际代理生效:页面、healthz、readyz 均 200,管理员登录/me/退出均 200,Cookie Secure=true。
- 优化提交 ac936d2 经 PR #2 正常合并,master 发布提交为 825d049e325b782d742760a466de1d00a9791ca5。Actions run 39(界面 #5)verify/deploy 均成功,首次建立正式 CI 缓存总耗时 10m7s;旧 run 38 已取消,不会覆盖新版本。后续复用 Docker npm/Go 模块层与 veyra-go-test-cache,尚未实测后续部署耗时,不承诺固定分钟数。
- 192.168.100.132 上 veyra-app-1 已启动并 healthy,.current-image 指向上述完整 SHA,部署目录与日志目录正确;未影响其他既有服务。当前服务仍为 APP_ENV=local 的开发验证部署,产品正式认证与远程推送等待办不变。
- 本机仍在 dev;此次通过 PR 合并,没有直接提交或推送 master。交接事实更新只提交 dev,不额外触发 master 部署。
## 最新 CI/CD 配置(2026-10-09)
- 用户要求参考 sundynix-pets 接入自动部署,并指定先创建 dev、禁止直接提交 master、CI/CD 只由 master push(包括 PR 合并)触发。已创建 dev 并保留当天全部修改;AGENTS.md 已记录分支规则。
- Gitea 仓库 Actions 已启用;全局 sundynix-global-128 Runner 在线,标签 ubuntu-latest。已在仓库网页保存 DEPLOY_PASSWORD 与 DEPLOY_KNOWN_HOSTS Secret,不在代码或文档记录凭据。
- 已在 Gitea 创建 master 分支保护:禁用推送、禁用强制推送、管理员须遵守,无绕过白名单;保留通过 PR 合并。按用户仅 master 触发要求,不配置依赖 dev/PR 流水线的合并前状态检查。
- 部署目标为 192.168.100.132:/home/workspace/sundynix-veyra,默认端口 8080;SSH 已验证。服务器 Docker 28.2.2、Compose 2.36.2、flock 可用,检查时 8080 未监听。
- 服务器 configs/.env 已经通过 SSH 初始化为 600 权限,使用已有开发配置与加密主密钥,不覆盖已存在的服务器配置,不包含 SSH 部署字段。保持开发环境认证,不声称正式生产认证已实现。
- 新增 .gitea/workflows/ci-cd.yml、根 Dockerfile/.dockerignore 和 deploy/ 脚本与说明。Gitea token 归档检出、Docker 内验证 App/管理端/Go/独立 PostgreSQL,成功后构建完整 SHA 镜像并 SSH 传输校验包。运行镜像包含管理端 embed、Python、CA、时区,UID 10001,日志 bind 至部署目录 logs/。
- 发布脚本加锁,保留服务器配置,先建库/迁移,再等待 /readyz;健康失败回滚上一镜像与 Compose,迁移失败不替换原运行服务。数据库迁移不自动回退。脚本测试覆盖成功、迁移失败、健康失败、损坏包、缺配置与首次配置保留,共 6 项。
- 本地脚本 6 项、Go race(真实 PostgreSQL 临时 schema)、go vet、gofmt、Go 构建、管理端类型/构建/embed、App 12 项测试/类型检查/双平台导出通过;工作流 YAML、内嵌 shell 与服务器 Compose config --quiet 已校验。服务器完整 Docker 检查与最终运行镜像构建也已通过,包含容器内发布测试和独立 PostgreSQL 17 的全部 Go race 测试。服务器 proxy.golang.org 超时、goproxy.cn 返回 200,构建阶段已切换 goproxy.cn 并验证成功,不关闭 checksum。
- 运行镜像已在隔离网络、只读文件系统、临时日志目录中启动验证:内嵌管理端 200,缺少数据库/Redis 时 readyz 正确返回 503,Python 3.11.2 可执行。验证容器已清理,没有连接开发数据库或启动实际部署实例。
- 本机 Docker daemon 未运行,使用指定部署主机的独立 /tmp/veyra-verify-* 构建目录验证。CI 文件已通过 PR 进入 master 并成功触发部署,实际结果见本文件最新记录。自动筛选与股票工作台已在 dev 提交 57882ff;后续 CI 配置提交不直接操作 master。
## 最新开发状态(2026-10-09,管理端重排与真实候选联调)
- 用户要求配置并实际生成自动候选,以及重新规划管理端 UI,使其围绕股票而非服务状态。已完成可见的管理端重排与真实源验证;不再要求用户逐条录入候选。
- 总览改为 A 股研究总览:实际已同步证券数量、近期待审核/有效发布候选数量、已启用策略数、股票名称/代码/价格/行情时间、真实未复权日线与待审核信号卡片。候选与策略统计明确为最近 100 条范围,不冒充全量;没有指数、涨跌幅、成交额和行业数据,不虚构相应指标。
- 新增“股票行情”一级入口,支持代码/名称搜索、股票报价与真实日线图。导航将股票研究与运行配置分组,原 PostgreSQL/Redis/服务状态移至数据健康,模拟回放收进辅助开发区。管理端保持暖白、炭黑、焦糖橙。
- 候选审核以自动筛选为主入口,手工补录为辅助。股票卡片突出名称、交易所/代码、参考区间、风险/目标价格;详情包含真实日线、来源、版本、依据、风险与审核记录。总览信号卡可直达对应候选详情。
- 新增同源管理员 POST /api/admin/v1/strategy-screenings/run(202 异步)与 GET /api/admin/v1/strategy-screening-status。当前进程状态显示排队/运行/完成/失败、最近一批检查/生成/跳过/失败数量与时间;运行或排队中的重复请求复用现有任务,不创建新 Worker。进程状态不声称跨重启持久化,实际筛选记录与候选仍持久化。
- 选定范围配置上限扩为 100 只,每批最多 20 只,定时轮转。后台已按用户本轮要求创建并启用均线交叉研究基线修订 3:5/20 日 SMA,上涨交叉;固定取行情列表按代码排序的前 100 个有效报价中剔除名称含 ST 的 96 只。参考区间 ±100 基点、风险观察 −500 基点、目标观察 +1000 基点、有效 24 小时。此为开发研究预览参数,已保存在不可覆盖的后台策略版本,可修订;不是经过验证的投资建议或全市场自动选股。
- 真实新浪公开日线的 96 只已分五批全部完成,无跳过、无失败,生成两条 PENDING_REVIEW:中洲控股 000042、胜利股份 000407,信号日 2026-10-09。证券、依据、参考价格、来源及版本均自动生成;没有植入演示候选,没有自动审核发布。首批旧修订 2 的 20 只没有信号,记录如实保留。
- 十三版 veyra_strategy_screening 保存不可覆盖的策略版本、来源/配置版本、日线输入快照和 SHA-256;按版本/证券/日期/来源唯一去重。自动创建、提交审核、筛选记录与审计同事务,并发重复不会留额外候选。
- 只使用完整日线与实际观察时间,未复权;当日上海时间 16:00 前不筛选。报价观察须最近 24 小时,报价与日线接收时间在 10 分钟内,来源/版本与最后日线日期匹配;不把重新接收陈旧收盘价当新观察。
- 自动候选及后续人工修订保留策略版本绑定。策略暂停/切换时不能发布旧自动候选或建立新计划,App 有效列表排除它,未完成计划失效并释放预算;手工候选独立,已记录成交与持仓保留。
- 十四版公开行情报价与模拟回放分开保存;同步只为有效计划产生近期报价事件,最近一分钟实际观察可触发一次站内通知,重复时间/关闭来源/错误版本跳过。提醒不写账。五分钟同步不保证捕获瞬时变化,远程推送尚未接通。
- 开发库已应用 14 版迁移。PostgreSQL 临时 schema race 测试覆盖并发去重、输入不可覆盖、审核前 App 隔离、公开提醒不改变账本、失效来源跳过、暂停后预算释放;新增手动触发权限、重复排队、Worker 完成与取消验证。Go vet 与管理端类型检查/构建/embed通过;App 前轮 12 项测试/类型检查/双平台 Hermes 导出通过,本轮未改 App 代码。
- Chrome 已验证新版总览的 5213 条行情快照/2 条待审核信号、股票价格及 40 条实际日线;候选页已打开中洲控股,确认自动生成的依据、来源/策略版本、价格区间和审核发布/退回入口可见。页面保留在待审核详情,未执行审核发布。
- 本次预览后端 0.0.0.0:8083,管理端 http://127.0.0.1:8083;Metro 8081,电脑内网 IP 192.168.100.2,App API 指向 8083。Expo 地址 exp://192.168.100.2:8081。App 真机 UI 未验证,APK/IPA 未生成;两条候选还待人工审核,App 有效候选仍为空。
- 本段功能开发时尚未提交;后续分支与提交状态以最新 CI/CD 记录为准。昨晚交接修改保留;凭据只在私有配置,主密钥不重置。
### 接下来
1. 人工核验两条真实自动候选并决定是否发布,真机验证 App 候选 → 计划 → 提醒 → 成交及冲正。当前公开源与研究参数不替代正式市场规则。
2. 补全交易日历、复权、证券及板块交易限制;推进全市场筛选的容量、授权与增量调度,不把当前 96 只范围称为全市场。
3. AI 分析、用户偏好/关注、正式认证、远程推送及生产行情授权仍待开发。
## 2026-10-08 交接(历史,以下未实现项以最新记录为准)
- 用户已要求今天停止开发,明天再继续;未创建自动任务,不在用户未继续指示时推进开发。
- 今日代码已提交并推送至 origin/master,提交 92329dd(完整 SHA:92329ddce2860a77fc492e70c752b76799e94713);已核对远端一致。此次交接文档更新在该提交之后保存,本地尚未另行提交。
- 已完成:单 Go module / 单 main 入口、独立前端依赖、管理端 embed、供应商加密配置、App 模拟交易闭环、候选审核、计划预算、不可覆盖成交及冲正、FIFO 持仓与复盘、站内提醒、zap 文件日志、研究策略版本、Python 异步回测、可配置 A 股公开行情自动同步。
- 自动行情已实际成功同步 5213 条沪深有效报价;新浪为当前开发源,东方财富保留适配器但联调出现连接关闭。日线自动获取与回测已完成实际验证。十二版迁移已应用开发数据库。
- 自动行情尚未驱动策略筛选、候选生成或计划条件提醒;现有候选仍由后台录入/审核,条件提醒仍由模拟价格回放驱动。研究版本选用和暂停也尚未联动候选/计划,不能描述为完整自动选股产品。
- 已完成真实 PostgreSQL 临时 schema 的 race 测试、go vet、管理端类型检查/构建/embed、App 12 项测试及双平台 Hermes 导出;App 真机/模拟器界面未验证,未生成 APK/IPA。
- 最近保留的预览:后端 8083,Metro 8081;App 本地 API 地址指向电脑内网 IP 的 8083。下次先检查进程和网卡地址,不假设这些进程隔夜仍存活;需要启动时使用同一 Go 可执行文件,不新增 main 或 Makefile。常规后端配置端口为 8080。
- 配置与凭据保持本地 configs/.env;禁止写入代码、文档或提交。供应商加密主密钥不得重置。LLM 已保存连接地址和加密密钥,模型名称为空且关闭;AI 调用尚未接通。
### 下次继续顺序
1. 将已有自动行情/日线与后台策略版本接起来,生成带来源、参数版本和数据时间的候选草稿,进入审核队列;减少手工新建,不自动发布未经审核的候选。
2. 联动有效行情、策略暂停、候选版本与计划时效,接通自动条件提醒;保持提醒不产生成交或现金变动,陈旧行情不重新触发。
3. 验证 App 真机完整流程与公开数据展示,按实际验证修复问题;再推进后台配置的 AI 分析、偏好/关注和正式推送。
以上顺序为交接建议,用户明天的新要求优先。正式行情授权、完整交易规则与正式认证仍待完成。
## 产品与依据
- 产品名称「见势 · Veyra」,面向从空仓开始的 A 股投资者。
- 根目录 `hengce_fullstack_technical_design_v1.md` 为实施设计,`hengce_app_admin_prototype.html` 为双端交互与视觉参考,均保留。
- 目标闭环:偏好 → 观察候选 → 证据 → 买入计划 → 条件提醒 → 用户记录成交 → 持仓监控 → 退出 → 复盘。
- Go 负责业务、账本与风控;Python 负责量化研究与回测;App 使用 React Native + Expo。
- 首期用户自行交易,提醒不代表成交,不自动下单。
## 用户确认的硬性规则
- 后端严格遵循 Go 工程规范,采用根目录唯一入口/internal 分层、依赖注入、显式 SQL、context、错误处理及 gofmt/go vet。
- 所有数据库表以 `veyra_` 开头,字段 snake_case。
- 主键为字符串 UUID:数据库 varchar(36),Go string;外键同类型。
- 映射去前缀后 PascalCase,例如 `veyra_user` 对应 `User`。
- 管理端使用 Vite + React + Tailwind CSS + shadcn/ui,并通过 Go embed 嵌入后端。同一二进制提供页面和 API。
- PostgreSQL:192.168.100.127:5432,数据库 veyra;Redis:192.168.100.127:6379,无用户名、有密码。
- 凭据保存在本地 `configs/.env`,禁止写进 Git 或项目记忆。
## 已实现
- Go API:健康检查、结构化日志、请求 ID、超时、优雅停机。
- 独立建库与迁移命令,迁移使用事务、并发锁、checksum 和字符串 UUID 迁移记录。
- 十二版迁移已应用开发数据库,覆盖身份、配置、候选、计划、账本、通知、策略、回测与自动行情。
- local/test 开发身份初始化;密码 bcrypt 哈希、随机会话凭据、数据库只保存会话哈希。
- 管理端 Cookie 和 App Bearer 会话隔离,退出撤销、过期与状态校验、管理员权限校验。
- Redis 登录限流;管理端 Cookie 为 HttpOnly、SameSite=Strict,写操作校验同源 Origin。
- 账户创建、归属查询、账户列表;模拟资金初始化原子入账,整数分计算、金额字符串 API;真实记录账户现金未知。
- 管理端登录页、服务总览、用户列表、模型配置、行情源配置、审计日志和十个工作区入口;未实现业务页面显示建设中。
- 主模型、备用模型、审核模型与行情源由管理员配置,供应商/地址/模型/密钥初始留空并关闭,不在环境模板预选厂家。配置保存和启用均不代表真实连通性或模型能力已验证。
- 供应商密钥采用 AES-256-GCM 加密,主密钥只在本地环境保存;查询、历史 JSON 与审计不返回密钥。保留/替换/清除密钥与版本保护已实现;更换地址不能静默复用密钥。配置、历史与审计同事务保存。
- Expo App 位于 apps/mobile:SDK 55、React Native 0.83.10、React 19.2.4、Expo Router 五导航;白底、石墨黑与柔紫。开发 USER 登录、SecureStore 会话恢复/到期清理/服务端退出撤销、真实账户列表/创建/切换/现金展示已接通。
- TanStack Query 查询、Zustand 当前账户选择;账户切换中断旧查询并清理详情缓存,退出清理身份缓存,迟到响应不能影响新会话。金额保持十进制字符串。
- App 首页、机会、计划、持仓、我的与提醒入口;未接入业务准确标注尚未开放,不展示原型股票或预设盈亏。
- OpenAPI、依赖锁文件和带 PostgreSQL 集成测试服务的 CI;CI 增加 App 类型检查、客户端测试与双平台 bundle 导出。
- npm --prefix web/admin run build 构建管理端并复制至 embed;go build -o bin/veyra . 生成唯一可执行文件。
## 当前工程目录
- 用户指出旧后端目录过深,当前已改为仓库根目录的单 Go module。
- module 为 git.sundynix.cn/Blizzard/Veyra,与仓库地址一致;删除单模块 go.work。
- 用户进一步要求一个 main 函数:三个 cmd 入口已合并到根目录 main.go,初始化操作通过 -command 参数切换,默认启动 HTTP 服务。
- internal/model 放模型,internal/service 放业务,internal/repository 放 SQL 与事务,internal/handler 放 HTTP 路由和协议适配。
- internal/config、database、adminui、apperror、ratelimit 放当前实际需要的设施;避免多余嵌套和空目录。
- 管理端由 apps/admin 迁至 web/admin;embed 构建产物由 internal/adminui/dist 提供。App 保留独立 apps/mobile 目录,与后端单 module 无冲突。
- 管理端和 App 各自维护 npm 配置、锁文件与 node_modules;根目录不再使用 npm workspace 或声明 Expo Router。Metro 与 Babel 使用 App 本地依赖。App 固定 React 19.2.4,满足 React Native ^19.2.0 peer,显式排除 SDK 建议补丁版本比较;其余配套检查保留,实际设备验证仍待完成。
- Makefile 已移除,CI、npm scripts 与文档均直接使用 Go/npm 命令;原 HTTP 接口保持一致,CLI 统一到根目录。
- 原始设计报告中的 monorepo 目录仅为旧规划,当前实现以本文件、AGENTS.md 和 README 的结构为准。
- 迁移文件仅移动路径,已逐字节核对两版 SQL 与原提交一致,不影响已执行迁移的 checksum。
- 新结构已通过前端构建与 embed、Go 编译、race 检查和 go vet;本轮已补充真实数据库集成验证。
## 验证与环境事实
- 当前执行环境已允许访问内网与监听本机端口。PostgreSQL 和 Redis 均已验证可连接;以前的 Operation not permitted 属于旧沙箱限制,不能继续当作当前阻塞。
- 已在 veyra 应用全部十二版迁移,初始化本地环境指定的开发管理员。用户随后提供 LLM 连接信息,已通过后台 API 把 base_url 与加密密钥保存到主模型配置;模型名称仍为空、未启用,备用/审核/行情源未填入用户配置。此前配置表为空是接入前状态,现已变化。
- `go test -race ./...` 已带真实数据库连接执行,在随机临时 schema 中验证迁移幂等/checksum/UUID、身份事务与会话撤销、账户归属与金额、供应商加密保存/密钥保留清除/并发版本冲突/历史审计原子性、配置 API 认证和 Origin 保护。
- `go vet ./...`、前端 TypeScript 检查与生产构建、Go 入口构建通过,管理端产物已复制至 embed 目录。
- 实际 HTTP 服务验证:页面 200、readyz 200、管理员登录/配置读取/审计读取/退出均 200。测试未填入供应商或调用外部 AI/行情接口。
- Chrome 已完成候选录入表单、通知任务与行情搜索的页面验证;App 真机与模拟器界面仍未验证。
## 启动与后续
- 已初始化数据库使用 `go run . -command db-migrate` 应用后续迁移,无需重复建库。
- 管理端初始化:`configs/.env` 的 ADMIN_LOGIN / ADMIN_PASSWORD,执行 `go run . -command user-create -role ADMIN`;App 测试身份使用 DEV_USER_LOGIN / DEV_USER_PASSWORD 和 `go run . -command user-create -role USER`。
- 本地 `configs/.env` 保存开发身份配置和供应商凭据加密主密钥,管理员配置已按用户指示更新;模板不含秘密值,已有身份不会由初始化命令覆盖。加密主密钥须持久保存并随数据库备份,不能直接更换后继续读取旧密文。
- 先 npm --prefix web/admin run build 构建前端,再 go run . 启动后端;默认 http://127.0.0.1:8080,自动读取当前目录的 configs/.env。
- 当前开发密码登录仅限 local/test;正式短信登录、刷新流程、MFA 和细分 RBAC 待实现。
- 候选、计划、模拟成交、冲正、持仓和累计账本复盘已接通;后续待自动候选筛选及真实规则与授权集成。
- 自动公开行情、日线查询、Python 历史回测与 Worker 已实现;AI 调用、正式授权行情及完整产品仍未完成。
- App 初始化与启动:go run . -command user-create -role USER → 设置 apps/mobile/.env 的 EXPO_PUBLIC_API_URL → npm --prefix apps/mobile run start;npm --prefix apps/mobile run typecheck && npm --prefix apps/mobile run test 检查类型与客户端测试,npm --prefix apps/mobile run build 导出双平台 Hermes bundle。公开环境配置只放 API 地址,不放秘密。
## Git 状态
- 本轮开始时已有用户提交 bffdb38(feat: 基础框架搭建完毕),旧文档中“无提交/无 Git 写权限”是历史状态,现已失效。
- 本次提交包含供应商后台配置与后续业务实现;推送以 Git 远端记录和提交完成报告为准。
## 本轮开发状态与待办
- 用户明确要求供应商选择留空,后续在后台配置,已完成上述配置管理与审计功能;没有预选模型厂商或行情供应商。
- 候选审核草稿已整合到当前 model/service/repository/handler 目录,使用第五版迁移并复用原有审计表。
- 下一步:候选修订/审核发布 → 计划预算与确认 → 成交账本/冲正/持仓 → 条件提醒与复盘,同时落实 Expo App。
- 供应商适配器、服务端连接测试、真实行情与 AI 调用仍待实现;配置页面没有虚构在线测试结果。正式认证、策略回测、Worker/任务、细分 RBAC 仍待完成。
## App 本轮验证与待办
- App USER 测试身份已用本地环境配置创建,未写入客户端或文档凭据;真实账户未注入测试资金。
- npm ci 成功,React 补丁版本已与管理端统一,Expo Doctor 20/20 检查通过;React 建议版本比较按前述规则显式排除,其余配套检查保留。客户端 11 项测试通过,覆盖请求鉴权/取消/网络错误、会话变更隔离、安全存储写入顺序与精确金额边界。
- Android/iOS Metro 和 Hermes bundle 导出已成功;App 请求客户端对实际 Go API 的登录、身份、账户查询、退出和退出后 401 验证通过。
- 本机 xcrun 无 simctl,且无 adb;尚未进行模拟器/真机交互与安全存储实机验证,没有生成 APK 或 IPA。不能将 bundle 导出记作原生包或设备运行验证。
- 仍需接入偏好、候选证据、计划预算、成交/冲正、持仓监控、提醒与复盘页面及 API,正式手机号身份、设备推送与原生发布也未完成。
- 本轮改动纳入此次用户授权的提交;原始两个设计文件未修改。
## LLM 连接配置
- 用户明确要求只保存连接配置,禁止将供应商地址、模型名或密钥写死到代码中;已保存 base_url 与 api_key,密钥经 AES-256-GCM 加密。
- 用户最后确认本轮只使用 base_url 和 api_key;未填写模型名称、未改动备用或审核配置、未执行模型调用或连接测试。
- 配置保存后通过后台 GET 回读核对版本与 has_api_key,响应不含明文密钥或密文;临时引导环境变量已从本地环境文件清除。文档不记录密钥或真实连接地址。
- 第四版迁移仅新增可配置元数据,无供应商地址或模型种子值。后台支持协议、模型目录及响应存储/认证开关,目录地址须与接口同源;这些设置仍属配置管理,调用适配器未实现。
- 原消息中的 Codex 网络、WSL、goals 等运行参数不写入产品 LLM 连接配置。本轮不修改 Codex 自身配置。
## 单入口与管理员设置
- 用户要求一个 main 函数、不使用 Makefile,已删除 cmd/api、cmd/db、cmd/user 与 Makefile,保留根目录 main.go;仓库仍是根目录单 Go module,不引入 go.work。
- 运行 go run . 启动服务;维护操作使用 -command db-create/db-migrate/user-create/admin-set。前端构建使用 npm --prefix web/admin run build,再 go build -o bin/veyra .;IDE 可直接运行 main.go。
- 按用户指示修改现有开发管理员的登录名与密码;凭据只保存在本地环境与数据库 bcrypt 哈希中,文档不记录密码。管理员 ID 保持不变,旧会话撤销。
- admin-set 仅允许 local/test 与已有 ACTIVE ADMIN,不允许把普通用户提升成管理员;冲突事务回滚。登录创建会话时重新检查已验证的密码哈希并锁定身份,避免凭据修改后的旧验证结果创建新会话。
- 开发管理员密码范围为 8–72 字节,App 用户仍要求 12–72 字节;正式认证边界保持不变。
- 本轮验证:根目录 go run . 成功启动;管理端页面/readyz/新管理员登录/me/供应商配置回读/退出均通过实际 HTTP 校验。单入口 db-migrate 已验证幂等执行。
- 带真实 PostgreSQL 临时 schema 的 go test -race ./...、go vet 与唯一二进制编译通过;新增管理员修改测试覆盖身份 ID 保留、原会话失效、登录名冲突回滚、禁止修改普通用户与禁止生产环境使用,以及旧密码验证结果不能创建会话。
## 工程目录清理
- 后端环境文件与模板移至 configs/.env、configs/.env.example,配置值及加密主密钥保持原样;唯一入口默认读取新路径,仍支持 -env-file 与进程环境变量。
- 删除根目录 package.json、package-lock.json 和 node_modules。web/admin 与 apps/mobile 分别维护独立配置、锁文件和依赖;兼容版本约束下放到各自 package.json。
- CI、README、App 说明、AGENTS.md 与未构建管理端的提示已同步更新;构建直接使用 npm --prefix <前端目录> run build。单 Go module、单 main 函数和无 Makefile 保持不变。
- 两个前端均已在移除根目录依赖后通过 npm ci;管理端类型检查/生产构建/embed、App 类型检查/11 项测试/iOS 和 Android Hermes bundle 导出通过。Go vet、唯一二进制编译、真实 PostgreSQL 临时 schema 下的 race 测试通过。
- 根目录 go run . 已验证自动加载 configs/.env,嵌入页面、PostgreSQL/Redis 就绪、管理员登录、供应商配置回读与退出均通过;测试服务已停止。原始设计文件未修改,本轮改动纳入此次用户授权的提交。
- App 安装时 npm audit 报告 35 项依赖问题(14 moderate、21 high);未在目录清理中强制升级 Expo 依赖,后续需单独处理并复验原生兼容性。
## 模拟交易闭环(本轮进行中)
- 已实现第五至第八版迁移,第五至第八版已应用开发数据库;当前总计十二版;原始迁移保留 checksum,不修改已经执行的版本。
- 候选审核:手工模拟候选录入、独立修订、提交审核、发布、退回、撤回、时效与版本保护。发布内容保留历史,App 仅能访问曾发布修订;有效列表仅显示当前未过期发布。App 可查看撤回原因,内部审核身份与完整意见列表不返回 App。
- 计划:模拟账户买入预算预览、确认重检候选版本与时效、现金争用保护、同一预览幂等确认、取消、失效与预算释放。预览五分钟内有效。当前模拟数量规则为 100 股倍数,不代表完整真实交易所规则。
- 成交账本:模拟买入/卖出录入、实际费用、发生时间顺序与幂等保护、部分成交与计划保留额度、FIFO 批次及成本分摊、含费用已实现盈亏、最新未冲正成交的冲正。数据库触发器禁止覆盖或删除已入账成交、现金流水、分摊与冲正事实;冲正保留原记录,不自动重开原计划。
- 可卖时间由模拟成交明确输入,不根据自然日冒充交易日历或真实 T+1。真实记录账户的成交账本仍未接通,市场价格、浮盈亏与市值保持未知。
- 通知:同一后端进程中的轮询 Worker,Outbox 事务处理、手工模拟价格回放、当前快照/时效/候选/计划重检、每计划一次条件提醒、撤回或过期失效通知、本人站内列表与已读。远程推送未实现;提醒不产生交易或现金变动。
- 管理端候选审核、通知任务、数据健康中的模拟价格回放已替代占位;App 候选/证据/预算/计划/成交/持仓/冲正/站内通知及累计账本复盘已接通。
- 真实 PostgreSQL 临时 schema 下的 race 测试通过:候选并发审核、历史保护、发布与事件失败回滚、计划现金争用与取消、部分成交、偏离说明、冲正不重开计划、FIFO 舍入、重复请求、冲正失败回滚、不可覆盖成交、模拟可卖时间、过期快照、不重复提醒、提醒不改账本与复盘金额。
- 管理端类型检查/生产构建/embed、App 类型检查/12 项客户端测试/iOS 与 Android Hermes 导出、go vet/唯一二进制编译已通过;后续代码变更按需复验。
- 本机 8080 由用户 IDE 的旧进程占用,没有关闭用户进程。当时自有验证服务运行 8081,后续已改为 8083;新增管理端与 App HTTP 读接口及登录/退出已通过,不向开发账户插入候选、资金或成交。
- 本轮 Chrome 已可用,实际验证新版候选队列、空白录入表单、通知任务与模拟价格入口,未保存任何业务数据。先前无浏览器是历史环境事实;尚未验证 App 真机/模拟器。
- 待继续:策略版本管理、Python 历史回测、自动行情与供应商调用、偏好与关注、生产服务授权及正式认证/远程推送。本轮改动纳入此次用户授权的提交。
## 本轮完成:日志、研究与 A 股自动接入
- 按用户要求引入 zap;控制台使用易读编码,文件为 JSON,默认写入当前工作目录 logs/veyra.log。50 MB 轮转、保留 10 个备份及 14 天、压缩历史;LOG_DIR/LOG_LEVEL/LOG_MAX_SIZE_MB/LOG_MAX_BACKUPS/LOG_MAX_AGE_DAYS 可在配置文件修改。文件初建权限 0600,日志忽略 Git,不记录口令、请求正文、Cookie 或原始查询串。
- 策略中心支持新建研究策略、不可覆盖版本、选用研究版本、暂停和审计。研究版本管理尚未控制手工候选或既有计划,不冒充已部署自动交易策略。开发数据库已保存一个暂停的均线研究基线,可在后台修订;该基线没有性能背书。
- Python 回测使用固定策略版本、参数、输入 SHA-256 和原始数据快照。异步任务带独立 lease、过期恢复、完成保护和失败状态;使用此前完成日线生成信号、次日开盘模拟成交,整数价格/费用/滑点,保存权益序列和成本后成交结果。未实现复权企业行为、停牌、涨跌停、交易日历成交限制或样本外研究。
- 用户明确要求自动 A 股接入,已增加可配置公开行情适配器。东方财富接口首次读取得到数据,后续连接关闭;未把失败当成同步成功。现开发配置采用新浪公开接口,全部地址保存后台配置,免账号;东方财富适配器仍可选。没有静默运行时切源或覆盖失败事实。
- 自动同步沪深证券列表和有效报价,启动执行、每五分钟更新;配置变更十秒内检测,保存源配置版本、供应商行情时间、接收时间与同步记录。首次成功写入 5213 条沪深有效报价,不含北交所,不代表全部证券主数据或正式授权行情。API 查询默认最多 100 条,支持名称/代码搜索。
- 后台数据健康显示股票与同步结果;系统设置可修改适配器及列表/报价/历史地址、启停。App 机会页有 A 股行情入口,支持搜索与明确的历史快照时间;不把接收时间伪装成行情产生时间。
- 回测默认按股票、交易所与日期自动获取日线,CSV 作为复验入口保留。实际从新浪接口读取一个标的的 2025 年一季度 57 根不复权日线,回测任务完成并得到 3 条模拟成交;没有产生真实交易、资金或账户持仓。
- 真实 PostgreSQL 临时 schema 的 race 测试、行情精度/供应商时间/非法 OHLC/不可舍入价格测试、Python 无未来数据与费用计算测试通过;go vet、唯一二进制、管理端类型检查/构建/embed、App 类型检查与双平台 Hermes 导出通过。App 客户端 12 项测试通过。
- 开发预览后端保留在 0.0.0.0:8083;管理端 http://127.0.0.1:8083。App 本地公开配置为 http://192.168.100.2:8083,Metro 为 exp://192.168.100.2:8081,使用同一内网 Expo Go 查看。固定了 Metro 的网卡选择,避免发布 VPN 虚拟地址。本地常规 HTTP_ADDR 已设 0.0.0.0:8080,需要用户 IDE 重启才读取新代码;未关闭用户 IDE 进程。
- 公开源仅为开发研究接入,缺少官方服务保障和商业展示授权确认。行情自动同步还没有驱动自动候选筛选、AI 解释或计划条件触发;现有提醒仍由明确标记的模拟价格回放驱动。
- 用户要求“做完这个功能就先停止”,本轮在 A 股自动接入验证后停止开发,预览服务保留。后续待自动筛选/审核、AI 分析、偏好与关注、生产授权、正式认证和远程推送;不自动继续扩展。本轮改动纳入此次用户授权的提交,原始两份设计文件未修改。
## 本轮代码提交记录
- 用户已明确要求提交并 push,本次提交包含工程目录整理、后台配置、App 模拟业务闭环、zap 日志、策略与回测及 A 股自动接入。验证状态和未完成能力以上文最新记录为准。
- 本地环境、密钥、日志、依赖目录和构建产物不纳入提交;原始设计文件保持不变。已推送至 origin/master,提交为 92329dd,远端 SHA 已核对一致。