| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| | |
|
| |
|
|
|
|
| |
[新增功能] probe/测试同步 round5:metric-value/capital-reporting 选择锚点、18/18 三档零溢出、docs 迁移矩阵
[实现方案] resultsAccounting/metricRow/round2Dashboard 选择器迁移;probe 断言 radiusOk/capital、shadcn 挂载点
[影响范围] scripts/ui-auth-shots.mjs、src/lib/*.test.ts、docs/ui-redesign-round5.md、artifacts/ui-shadcn-round5
|
| |
|
|
|
|
| |
[新增功能] 12 页面组件全量 shadcn:Card/Button/Table/Tabs/Select/Alert;375 底部 Tab Bar 改用 Tabs 组件实现
[实现方案] 页面级手写 class 全部移除(.btn/.banner/table.data/.badge/.tabs/.metric-row/.m-tile/.hint 等改为 shadcn + tailwind 工具类);Modal/DatasetWizard/DatasetCard/DiffView/CodeEditor/Status/Layout 同步
[影响范围] src/pages/*.svelte、src/components/*.svelte
|
| |
|
|
|
|
| |
[新增功能] round5 主题基线重置:shadcn preset b6t6C6CTw CLI init、app.css 仅保留 tailwind + shadcn 主题变量层
[实现方案] 删除 round3 自定义 token/布局原语/legacy 别名;theme.ts 删除;mobileCss 守门测试重写
[影响范围] src/app.css、components.json、lib/utils.ts、lib/theme.ts、测试
|
| |
|
|
|
|
| |
[新增功能] round3 迁移矩阵文档:legacy 选择器→shadcn 组件映射、主题 token 来源、验证口径
[实现方案] docs/ui-redesign-round3.md
[影响范围] docs/
|
| |
|
|
|
|
| |
[新增功能] 测试与 probe 同步:mobileCss round3 断言、resultsAccounting .m-tile、strategyTab 超时放宽、probe radius 断言
[实现方案] probe cardRadiusOk 校验 --radius≥0.75rem 且组件计算圆角一致;88/88 vitest 全绿
[影响范围] src/lib/*.test.ts、scripts/ui-auth-shots.mjs
|
| |
|
|
|
|
| |
[新增功能] round3 页面组件全量迁移 shadcn-svelte(12 页面 + Modal/DatasetWizard/DatasetCard/Status)
[实现方案] .btn→Button、.banner→Alert、table.data→Table.Root、.badge→Badge、.tabs→Tabs.Root、.metric-card/form.card→Card.Root;ProjectStrategyTab div 配对修复
[影响范围] src/pages/*.svelte、src/components/*.svelte
|
| |
|
|
|
|
| |
[新增功能] round3 主题基建:shadcn preset CLI init(mira)+ app.css 重写 + theme.ts 双主题
[实现方案] 无 legacy 组件选择器的全新 app.css(mint/amber 双 token 组、--radius 0.75rem、保留布局原语);theme.ts 持久化 .theme-amber;utils.ts 本地 cn 实现
[影响范围] frontend/src/app.css、src/lib/theme.ts、utils.ts、package.json
|
| |
|
|
|
|
|
| |
产物哈希附录与最终实测记录
[变更性质] 交付文档补充,产物不入库(历史一致性)。
[新增内容] 附录七:投入口径 reporting 推导口径(锚点 run 26e9c9ab:投入12029.09/估值10846.00/-9.84%)、dist 三文件 sha256 前24位、18/18 probe 实测(tabbar@375=true)、权限无变更说明。
|
| |
|
|
|
|
|
| |
[变更性质] 页面集成,任务 A1/A2 前端口径统一。
[新增功能] 结果页 metric 区新增累计投入/最终持仓估值/投入回报率三卡(data-testid=capital-reporting,注明"不含初始账户闲置现金"口径),复用现有 .metric 与 formatMoney 数字格式、不加新字色;实验记录页条件差异表新增同口径三行(逐 run 对照,动作同步深化到 status/time 之后)。
[实现方案] 共享 capitalReporting 推导;resultsAccounting.test 断言更新为 9 张 metric 卡并新增三卡 DOM 实测断言。
[影响范围] ProjectResultsTab、RunsPage、resultsAccounting.test;vitest 84/84。
|
| |
|
|
|
|
|
|
|
| |
推导函数(资本三件套:投入/持仓估值/回报率)
[变更性质] 新增纯函数推导层,任务 A3。
[新增功能] capitalReporting:累计投入=首日cash−末日cash(2位);持仓估值=Σ末日positions×closes;投入回报率=估值/投入−1(带正负号百分号);未投入/无数据返回 null 不除零。
[实现方案] 纯前端推导,零后端改动;测试锚点取现网 run 26e9c9ab(投入 12029.09 / 估值 10846.00 / -9.84%)真实账目,另有多 symbol/未建仓/空数据等 9 用例。
[影响范围] frontend/src/lib/capitalMetrics.ts + 新增测试,vitest 84/84。
|
| |
|
|
|
|
|
|
| |
根因、前置条件与实测值表
[变更性质] 交付文档返工。
[新增内容] 第三条返工记录:tabbar=false 根因(probe 打生产旧构建)与修复;metricCards/sparks 断言条件(#/projects、projects=4/runs=3/withEquity=2);AI 用量 totals.requests 复核结论;375/768/1440 tabbarAttached+Visible+metricCards+sparks+面包屑实测表。
[影响范围] docs/ui-redesign-round2.md。
|
| |
|
|
|
|
|
| |
[变更性质] 文案/注释更正(Leader 验收问题 3),无行为变化。
[问题说明] 复核 server/src/ai.rs list_ai_usage:端点本就返回 totals.requests(ai_usage COUNT);前端 dashboardMetrics 一直消费该字段,此前 doc-todo 文案误称后端缺字段。
[修复方案] 更正 metric 卡 data-todo 与 dashboardMetrics 注释;占位 - 仅在端点未返回 totals 时兜底;本轮生产 usageRequests=0 → 显示"0 次"。
[影响范围] ProjectMetricRow.svelte、dashboardMetrics.ts 注释;vitest 75/75 不变。
|
| |
|
|
|
|
|
| |
[变更性质] 验证脚本返工(Leader 验收问题 1/2)。
[问题根因] 旧版默认打生产站点:生产仍为旧构建(无 Tab Bar),导致 Leader 复跑 18 组合全 false;另固定 waitForTimeout 可能早于挂载。
[修复方案] 默认先 npm run build 再启动本地代理(输出所服务资产哈希);waitForSelector 条件等待挂载;断言输出 tabbarAttached/tabbarVisible 与面包屑文本两套 DOM 事实;每轮先验 /api/auth/me=200;projects/runs/usage 前置条件随 JSON 记录,projects=0 时显式 SKIP 而非恒假断言。
[影响范围] frontend/scripts/ui-auth-shots.mjs;实测 375 tabbarVisible=true、metricCards=4、sparks=2,18/18 bad=0。
|
| |
|
|
|
|
| |
[变更性质] 测试补充,归入第二轮验证件。
[新增内容] mock listProjects/listDatasets/listRuns/getAIUsage 后渲染 ProjectsPage,断言 4 张 metric-card 与 2 处 sparkline-cell 的真实 DOM 输出。
[影响范围] frontend/src/lib/round2DashboardIntegration.test.ts(2 用例)。
|
| |
|
|
|
|
| |
[变更性质] 交付文档。
[新增内容] ui-redesign-round2.md:四项任务实现明细、验证证据(75 测试/30+6+18 组合验证/截图清单)、6 commit 清单与遗留项(AI 用量 requests 占位、面包屑测试覆盖说明)。
[影响范围] docs/。
|
| |
|
|
|
|
|
| |
[变更性质] 验证工具,配合前端重设计第二轮交付。
[新增功能] ui-auth-shots.mjs:以生产站点实名登录获取会话,经本地 dist + /api 反向代理(修补 accept-encoding/set-cookie 转发)在 375/768/1440 截 projects/runs/datasets 与项目 data/strategy/results 六页,断言 overflow=0、pageerror=0、375 底部 Tab Bar 可见、项目页 sparks/metricCards 真渲染。
[实现方案] 饼式会话复用(HttpOnly+Secure cookie 通过 addCookies 注入本地),密码从不落日志。
[影响范围] frontend/scripts;产物输出至 artifacts/ui-shadcn-round2/。
|
| |
|
|
|
|
|
|
|
| |
质感打磨——微过渡、卡片悬停、登录页留白与字阶
[变更性质] 视觉打磨,前端重设计第二轮之四。
[新增功能] 全局 150ms transition 层;hover:hover 且 768px+ 卡片 hover 上浮;登录/注册页留白重排(2rem/2.4rem 按宽度断点);h1/h2/h3 字阶统一(1.55/1.18/1.02)。
[实现方案] 单层 app.css 聚合,动效仅在支持 hover 的桌面指针设备生效,避免移动端粘滞态;清理 .hint 重复规则。
[影响范围] app.css、AuthPages.svelte;无行为变化。
|
| |
|
|
|
|
|
|
|
| |
当日净值/回撤、回测区间阴影带
[变更性质] 图表层能力扩展,前端重设计第二轮之三。
[新增功能] Chart 网格线使用主题 border 色;hover 手柄提示补充"当日净值+回撤";回测区间 belowMarks 渲染半透明阴影带(bandShaded 可关);series 支持 dashed/opacity,Area 填充渲染;equity 行内合并回撤列,drawdown 图改为百分比格式化。
[实现方案] 基于 layerchart marks/belowMarks 泳道与自定义 tooltip snippet(lcExtras 透传绕开字面量类型检查),宽度扩展点保持 resolvedWidth 合同不变。
[影响范围] Chart.svelte、ProjectResultsTab.svelte;图表 probe 断言(svgs 渲染、溢出为 0)不变。
|
| |
|
|
|
|
|
| |
[变更性质] 新增移动端导航形态,前端重设计第二轮之二。
[新增功能] ≤767px 呈现底部 Tab Bar(projects/datasets/runs/account 徽标+标签+aria-current)与窄标题栏(品牌/面包屑/账户),≥768px 原桌面布局不变;ProjectPage 顶部新增"我的项目/项目名/功能页"面包屑。
[实现方案] matchMedia('(max-width: 767px)') 反应式驱动的 (Safari <14 兼容addListener 回退),tests 以 matchMedia stub 驱动真实渲染断言;保留 900px 既有断点结构以兼容 mobileCss.test.ts 正则。
[影响范围] Layout.svelte、ProjectPage.svelte;新增 mobileTabbar.test.ts。
|
| |
|
|
|
|
|
| |
[变更性质] 页面集成,属于前端重设计第二轮功能延展。
[新增功能] ProjectsPage 引入 ProjectMetricRow 顶部指标卡,表格新增"最近回测"列内嵌 sparkline(无回测的项目不渲染)。
[实现方案] records 并行拉取 listDatasets/listRuns/getAIUsage 经 Promise.allSettled 容错;sparkline 按项目 id 懒取最近 result.equity。
[影响范围] ProjectsPage.svelte;新增真实渲染断言测试 projectSparkline.test.ts。
|
| |
|
|
|
|
|
|
|
| |
sparkline(前端重设计第二轮之一)
[变更性质] 新增能力,不动后端。
[新增功能] dashboardMetrics 聚合(项目/数据集/实验/AI 用量统计 + 最近回测首末净值),实盘数据优先、缺数以占位符 '-' 兜底;ProjectMetricRow 渲染 4 张 metric-card;Sparkline 组件输出 up/down 方向线段与端点圆点。
[实现方案] 聚合逻辑与展示组件分离,sparkline 仅依赖 first/last 两个字段,无图表库依赖。
[影响范围] frontend/src/lib 与 components;配套 5 组单测(dashboardMetrics/sparkline/metricRow)。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
纯文档更新,无运行时逻辑。
[文档内容]
docs/ui-shadcn-handoff.md 增加部署记录一节:deploy 幂等拒证
(runtime.env 已 pin image r3,退出码 1 no-op)、生产二进制/
前端资产一致性核对、健康检查 200、上线 375/1440 截图路径与
rollback id(release-backups/20260917-132928)。
[更新方案]
leader 要求的部署时间/image id/rollback id 三要素均已落实到
部署记录小节,其余内容不变。
[影响范围]
文档渠道;审阅入口不变。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
纯文档提交,无运行时逻辑。
[文档内容]
补齐此前各轮未入库的交接/验收文档:backend-auth/backend-domain/
domain-authorization-user(认证与授权域)、etf-recovery-release-
handoff(ETF 修复 + ops 演练定稿与生产部署命令)、recovery-* 系列、
frontend/parent-ui-findings(UI 迁移上下文)、worker/integration 等,
以及本轮 docs/ui-shadcn-handoff.md(shadcn-svelte 迁移交接,含
Chart.svelte 契约、runes $state 踩坑记录与 375/768/1440 验证证据)。
[更新方案]
按主题分文;每份文档只记录可复现的命令、验证结果与语义边界,
不导出密钥或生产敏感路径。
[影响范围]
文档渠道:后续 leader/client 审阅入口;与代码提交一一对应便于回溯。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
维护性变更:把已通过 84 场景演练的运维脚本纳入版本控制。artifacts/
目录按仓库政策 ignore(本地证据),本提交按 Leader 指令以 -f 显式
加入,未包含任何密钥(脚本扫无 secret/token/password)。
[维护内容]
此前 ops/deploy.sh、rollback.sh 与 ops-drill2.sh 仅存在于本地
artifacts/(被 .gitignore 排除),生产依赖它们但仓库内无源码可审计。
[实现方案]
deploy.sh:deploy.lock 防并发、阶段化备份(env/二进制/前端/DB,
manifest 原子化写入 0700 目录)、显式 rc helper、零停机 swap、失败
路径自动 restore、健康与 sha256 校验;restore 兼做手动回滚。
rollback.sh:stop -> 替换 -> start -> 锁 + health + hash 强校验。
ops-drill2.sh:84 场景故障注入演练(备份/swap/restore 阶段注入矩阵、
RA/RB1/RB2 恢复分支),PASSED=84 FAILED=0 exit 0 为执行合约。
用法见 docs/etf-recovery-release-handoff.md 第 3 节。
[影响范围]
脚本本身未改(与演练定稿版本一致),仅入库;回滚目标记录在
manifest(previous_worker_image 等)。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
新增验证脚本,非产品代码。
[测试目标]
Leader 要求每个页面在真浏览器 375/768/1440 三档下零横向溢出、零
pageerror,且迁移后的 layerchart 图表须在含数据状态下渲染并遵循
同一溢出约束(空态验证无法覆盖)。
[测试方案]
scripts/ui-verify.mjs:静态服务 dist + Playwright chromium,按路由×
宽度断言 document overflow=0、pageerror=0、bg/fg 主题成立,输出
overflow-probe.json 与全页截图。scripts/chart-overflow-probe.mjs:以
page.route mock /api(含 /api/auth/me、runs 列表带 result、结果单),
勾选两个已完成回测触发对比曲线,真实渲染 svgs 并断言宽度内渲染。
证据存 artifacts/ui-shadcn/(30 组合全 OK,图表 6 组合全 OK)。
[影响范围]
仅验证工具链,node frontend/scripts/... 手动运行;不影响构建产物。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
四个业务标签页与数据集卡片迁移 shadcn 组件,图表消费切换到
layerchart 长格式 API,功能与数据语义不变。
[新增功能]
结果页权益曲线(策略权益/现金/基准,基准可缺省)与回撤曲线(desc
面积)改由 Chart.svelte data/series 渲染;实验记录页多回测归一对比
曲线改为快速长格式行构造。空数据行允许 undefined 列(基准缺口),
Chart data 类型放宽 [key:string]: string|number|undefined。
[实现方案]
RunsPage:查看入口改 shadcn Button(href 语义保留 hash 路由),
对比图数据由 compareOption(echarts option)化为 compare。
ProjectResultsTab:图表开关、日志折叠用 Button;equityData/
drawdownData $derived 计算峰值回撤。ProjectStrategyTab:快照输入、
冲突/AI/版本操作迁移 Button/Input。ProjectDataTab 与 DatasetCard:
shadcn 组件 + 保留 banner error/warn/info、retry-row 等 legacy class,
"使用相同请求重新获取"重试入口与 onRecreated 逻辑不变,配套
datasetCardRetry/datasetCardWarnings/projectDataTabRecreated 回归
测试。resultsAccounting.test.ts:layerchart 在 jsdom 挂载约 3 秒,
suite 全量下易撞默认 5s 超时,首测提高至 20s。
[影响范围]
npm run check 0 error、58 tests 全绿、npm run build 通过;真浏览器
375/768/1440 图表页零溢出(artifacts/ui-shadcn 截图与探针 JSON)。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
API)
[变更性质]
图表渲染引擎替换,渲染输出保持同等信息(曲线/图例/轴),删除
echarts 在后续页面迁移后正式退场。
[新增功能]
新 Chart.svelte 封装 layerchart LineChart,API 为长格式 data(
{i, date, ...columns})+ series(key/label/value/color/dashed/area)。
[实现方案]
宽度语义与旧 echarts 包装一致:ResizeObserver 实测宿主宽度优先,
width prop 只是初始/测试尺寸,640 为无布局回退——SVG 永远跟随宿主,
绝不粘滞桌面宽度。runes 模式的关键坑:measured 必须 $state,否则 RO
回调触发的宽度更新不会重渲染(旧 echarts 版本为命令式 API 无此问题)。
chartResize.test.ts 以 layerchart 真渲染重写 4 个合同用例:jsdom 真实
SVG、width prop 跨视口变更、无重挂载的 in-place RO 收缩、零布局宿主
RO 回调不抛错。test-setup.ts 增加 window.matchMedia shim(layerchart
settings 上下文需要)并移除因此失效的 @ts-expect-error。
[影响范围]
回测结果/对比曲线等消费方在后续页面提交中切换到本 API;svelte-check
对 layerchart 复杂泛型以 as never 收口,0 error。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
本提交为 UI 迁移与移动端布局修复,产品功能不变。
[新增功能]
Leader 第 2 轮验收的失败项:AuthPages 在 375px 视口横向溢出 47px,
原因为 .auth-card 固定 400px 宽度。
[实现方案]
AuthPages:.auth-wrap 改为 flex 包裹,.auth-card 改用
width:min(400px,100%),三档视口下登录/注册/重置均零溢出。
Layout.svelte 重写为 shadcn Button(退出按钮)+ Tailwind 主题变量,
同时保留 .layout/.content/.navlink/.brand 等 legacy class 以维持
mobileCss.test.ts 的断言语义。ProjectsPage 迁移 shadcn Card/Table 等
(保留 p-name 链接语义),新增 projectsPageLoad.test.ts 回归项目列表
加载失败时的错误呈现。
[影响范围]
frontend/src/components/Layout.svelte、pages/AuthPages.svelte、
pages/ProjectsPage.svelte;视觉验证覆盖 375/768/1440 全零溢出。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[变更性质]
本轮为维护性依赖与配置初始化,不改变业务页面(页面迁移见后续提交)。
[维护内容]
按 Leader 返工指令,前端 UI 组件库全量迁移 shadcn-svelte,图表渲染
从 echarts 换为 layerchart,需要一次性引入配套依赖与构建配置。
[实现方案]
package.json/pnpm-lock.yaml:tailwindcss@4、@tailwindcss/vite、
tw-animate-css、shadcn-svelte、bits-ui、tailwind-variants、clsx、
tailwind-merge、@lucide/svelte、layerchart、@fontsource-variable/inter
与 @types/node;echarts 保留至页面迁移完成后移除。pnpm-workspace.yaml
声明 allowBuilds(esbuild、@tailwindcss/oxide)。components.json 采用
mira preset,别名 $lib。tsconfig 新增 $lib paths;vite.config.ts 加入
tailwindcss 插件、$lib alias(vitest 需要)与 test 环境配置。
src/lib/components/ 为 shadcn 生成的 UI 组件源码(button/input/label/
card/badge/alert/select/table/tabs/separator/chart),src/lib/utils.ts
为 cn 工具。app.css 引入 tailwind 与 shadcn CSS 变量并调整为 teal
主题(primary #0f766e、radius 0.375rem、双主题 chart-1..5),保留
legacy 选择器(banner/beat/table.data/metric 等),mobileCss.test.ts
依赖其语义断言。
[影响范围]
构建链与主题变量;后续页面提交逐步消费这些组件,npm run check/test/
build 已全绿验证。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[问题原因]
前端手动录入表单保存的 market 字段是 SH/SZ/BJ 原文,但 worker 的
split_identity 只接受 market:"cn" 并按代码前缀推交易所,导致
market:"SZ" 的 159399 在发起任何网络请求前就报 unsupported_market。
同时 server 为非 root 容器(uid 65534)准备挂载时,完整文件挂载从不
被 chmod,且所有 chmod 失败都被静默吞掉,worker 容器读数据集可能
Permission denied 且不易定位。
[问题根因]
身份契约在 server 持久化层与 worker 适配层不一致;挂载权限处理是
best-effort 静默吞错,缺少最小作用域约束。
[修复方案]
worker/data.py: market 原样映射 IDENTITY_EXCHANGES(SH/SZ/BJ),
"cn" 保持代码前缀推断(SH=3/6/9 开头,否则 SZ),未知市场仍显式拒绝
绝不猜测;sina 数据源的警告文案改为只陈述可证实事实(无日期参数、
不除权、成交量单位为股且不换算),删除与其它 provider 的 100x 换算
断言。server/src/worker.rs: prepare_mounts 严格化——独立文件挂载仅在
"只读 + /data/ 前缀"范围内 chmod 0644,拒绝符号链接,目录挂载保持
0755/0777,所有 chmod 失败作为错误返回而非吞掉。tests/worker/
test_data.py 新增身份契约用例:SZ/SH 原文、cn 推断不变、SZ 直达
sina provider 的端到端 fetch。
[影响范围]
worker 数据获取链路与 server 任务编排;server/target/release 二进制
已含本改动(2026-09-17 构建);pytest 数据模块全绿。
|
| |
|