diff --git a/CHANGELOG.md b/CHANGELOG.md index 88fe1607..689cfb14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # 印度占星 Skill 更新日志 +## 2026-09-08 — 交付卡改成至多三列对照,点「更像这个」采用 + +生时校正给出范围后,卡片改成一行至多三列。每列一个候选分钟,写相对可能性、按该分钟推出的性格处事、经历对照计数,以及往后 12 个月的事件窗;没有窗就写「未来一年没有明显的窗口」。点「更像这个」即采用该列分钟,不预先标「排盘用」。助手正文仍只说范围、对照了几件经历、以及这不是已确认的唯一出生分钟。八法验证报告仍在「查看验证报告」里,默认收起。Skill 版本 10.0.18。 + ## 2026-09-08 — 交付卡直接点分钟,正文三句,八法报告收进折叠块 生时校正给出范围后,卡片上每个候选分钟一行,点哪一行就用哪一分钟排盘。助手正文只说范围、对照了几件经历、以及这不是已确认的唯一出生分钟。八法验证报告改在卡片下面「查看验证报告」里,默认收起。输入框上方不再出现「先这样」或采用后的状态条。Skill 版本 10.0.17。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 0de51d17..60b59033 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -9233,10 +9233,10 @@ - 根因:`TASK-rectification-range-delivery-card-20260907.md` 把交付对象做成「两个动作 + 分歧面板」,DESIGN 又在口述采集上方放先这样。产品决定推翻该设计。 - 修复:卡片改为按候选分钟逐行点选采用。删分歧列、四个按钮、composer「先这样」、composer-meta、采用状态条。交付正文三句;八法报告进默认收起的「查看验证报告」。没有核对题时 `postAdoptVerifyDone` 改成「已采用 HH:MM,新建对话即按这个时间排盘。」Skill 10.0.17。 - 验证:`frontend/tests/rectification-range-delivery-20260907.test.ts` 行选 DOM;`frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts` 三句旁白、折叠块、composer-wrap 无先这样/状态条。任务书 TS 切片 1039/1039。 -- 防复发:交付卡 `button` 数必须等于候选行数;composer-wrap 不得再出现 `CHOICE_STOP_LABEL` 或 `rectification-adopt-status`。 -- 相关记录:BUG-544、BUG-545、BUG-558、BUG-583 +- 防复发:composer-wrap 不得再出现 `CHOICE_STOP_LABEL` 或 `rectification-adopt-status`。逐行点选卡已被 BUG-597 的三列对照取代,不得把「一行一个分钟」或「排盘用」标签加回去。 +- 相关记录:BUG-544、BUG-545、BUG-558、BUG-583、BUG-597 - 复发自:无 -- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`) +- 修复版本:`7e3b6cdc` ## BUG-596 | 交付轮连续写出两条助手消息 @@ -9252,5 +9252,37 @@ - 防复发:交付后无用户消息不得再开一轮计费 turn。 - 相关记录:BUG-462、BUG-565 - 复发自:无 -- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`) +- 修复版本:`7e3b6cdc` + +## BUG-597 | 交付卡逐行点选看不出候选差别,又像直接给了一个时间 + +- 状态:resolved +- 首次发现:2026-09-08 +- 最近更新:2026-09-08 +- 影响面:`rectification-range-delivery.tsx`、`divergence-panel.ts`、`refinement_packet.py`、`event_probes.py`、`user-copy.ts`、Skill 10.0.18 +- 用户现象:区间卡每个候选分钟一行。与代表分钟 D9/D10 相同的行右侧是空的;代表分钟预先标成「排盘用」,用户觉得是直接出一个时间,而不是在几个分钟里对照后选择。 +- 触发条件:访谈收口出区间交付卡;范围内有两个以上候选分钟。 +- 根因:BUG-595 把交付做成「点一行即采用」,右侧只写与代表分钟的分盘差异。产品决定改成并排对照:每列写该分钟自己的相对可能性、性格处事、经历吻合和未来一年窗口。 +- 修复:卡片改成一行至多三列,按后验概率排序、按精确 HH:MM 去重。每列由服务端写相对可能性、D9/D10/月宿性格处事、经历强/中/弱计数与最不吻合一件(年-月+领域)、往后 12 个月 1–2 个窗或固定句「未来一年没有明显的窗口」。按钮「更像这个」走现有 accept RPC,选择不计分。同一次 compare 增加 `event_dasha_ledger_by_time` 与 `prospective_windows_by_time`。不预标「排盘用」。Skill 只改 `references/candidate-comparison.md`,bump 10.0.18。 +- 验证:`frontend/tests/rectification-range-delivery-20260907.test.ts` 三列 DOM、「更像这个」、无「排盘用」;`frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts` 三句旁白仍不含「排盘用」;`frontend/tests/agent-voice-copy-contract.test.ts` 锁新文案;`tests/test_rectification_v5_services.py::test_compare_returns_ledger_and_windows_by_candidate_time` 三分钟各一份 ledger/窗口。 +- 防复发:交付卡必须是列对照而不是逐行空差异;列文案必须来自服务端类型表与 ledger/窗口映射,不得让模型写。超过三列时必须出现「还有 N 个分钟可能性更低,已并入范围」。没有窗口时必须写固定句,不得空白。 +- 相关记录:BUG-595、BUG-583、BUG-568 +- 复发自:BUG-595(逐行卡上线后用户看不出为何要选另一分钟) +- 修复版本:待发布 + +## BUG-598 | 点选题成年下限只在 followup 生效,inspect 回退会漏掉 + +- 状态:resolved +- 首次发现:2026-09-08 +- 最近更新:2026-09-08 +- 影响面:`inspectDiscriminatorProbes`、`adult-floor.ts`、`decideAfterInferenceChange`、`answer-choice.ts` +- 用户现象:已经按年龄下限滤掉的迁居等点选题,在答完上一题后的 inspect 回退路径里又出现。 +- 触发条件:`decideAfterInferenceChange` 走 `matched ?? inspected.selected`;`method-followup` 已按 `DOMAIN_AGE_LO` 过滤,但 inspect 没有出生日期。 +- 根因:`probeBelowAdultFloor` 只在 `method-followup.ts` 三处生效。`inspectDiscriminatorProbes` 不接收 `birthDate`,回退选中的探针可以低于成年下限。 +- 修复:抽出共享 `adult-floor.ts`。`inspectDiscriminatorProbes` 接收 `birthDate`,低于下限写入 `dropped_probes(reason="below_adult_floor")`。`decideAfterInferenceChange` 与答题持久化从出生快照传入该日期。采集题「没有」按钮本单不做,等产品决定。 +- 验证:`frontend/tests/rectification-candidate-contrast-packet.test.ts`:出生日期 2000-01-01 时 2015 迁居题被丢掉;1996-01-01 时保留。按年份计算:2015 低于下限当且仅当出生年 > 1997;1997 年生在 2015 年满 18 岁,不越线。 +- 防复发:inspect 与 followup 必须共用同一套成年下限。点选回退不得在没有 `birthDate` 时把已过滤的领域年再选出来。 +- 相关记录:BUG-597 +- 复发自:无 +- 修复版本:待发布 diff --git a/docs/tasks/PROGRESS-rectification-candidate-compare-columns-20260908.md b/docs/tasks/PROGRESS-rectification-candidate-compare-columns-20260908.md new file mode 100644 index 00000000..40ec92a2 --- /dev/null +++ b/docs/tasks/PROGRESS-rectification-candidate-compare-columns-20260908.md @@ -0,0 +1,56 @@ +# PROGRESS · 生时校正交付卡三列对照(2026-09-08) + +工作树:`.worktrees/rectification-candidate-compare-columns-20260908` +分支:`codex/rectification-candidate-compare-columns-20260908` +任务书:`docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md` +基线:`origin/staging` @ `a9125e3d`(任务书已在该提交) + +本单状态:**待验收**。代码在执行分支,尚未 commit / push。 + +未改:采用 RPC、确认门、各道门槛、`minute_step`、`_relative_support`、`page.tsx`。Skill 从 10.0.17 升到 **10.0.18**(只改 `references/candidate-comparison.md` 的卡片描述)。采集题「没有」按钮未做,等产品答复。 + +主仓仍停在 `codex/minute-rectification-p0` 且有脏文件,未 checkout / reset。本单在独立 worktree 基于 `origin/staging` 做。 + +## 做了什么 + +- **决策 1** 区间卡改成一行至多三列。按 `inference_state.candidates` 后验概率排序,精确 HH:MM 去重,最多三列。超过三列末尾写「还有 N 个分钟可能性更低,已并入范围」。不预标「排盘用」。 +- **决策 2** 每列五段全由服务端算好:时间 + 相对可能性;D9/D10 类型表全文 + 月宿边界 traits;经历强/中/弱计数与最不吻合一件(年-月+领域,不写摘要);往后 12 个月 1–2 窗或「未来一年没有明显的窗口」;「更像这个」走现有 accept RPC,选择不计分。 +- **决策 3** 卡底边界句与收起的「查看验证报告」保留。交付正文仍三句,不再写代表分钟「排盘用」。 +- **决策 4** compare 同一次返回 `event_dasha_ledger_by_time` 与 `prospective_windows_by_time`(HH:MM 键,≤3 分钟),与代表分钟 ledger 并存;耗时写入 `column_compare_ms`。 +- **BUG-598** `inspectDiscriminatorProbes` 接收 `birthDate`,与 followup 共用 `adult-floor.ts`。inspect 回退不再漏过成年下限。 +- **P2「没有」按钮** 跳过,等产品。 + +## 三栏(被触碰断言) + +| 用例 | 原值 | 新值 | 理由 | +| --- | --- | --- | --- | +| 交付卡形态 | 每个候选分钟一行,点行采用 | 至多三列,「更像这个」采用 | BUG-597 决策 1 | +| 「排盘用」 | 代表分钟预标 | 不预标 | BUG-597 决策 1 | +| 列文案 | 只写与代表分钟不同的 D9/D10 | 三列写全 D9/D10/月宿 + 经历计数 + 未来窗 | BUG-597 决策 2 | +| 引擎 compare | 只有代表分钟 ledger | 另有 by_time ledger 与 windows | BUG-597 决策 4 | +| Skill | 10.0.17 | 10.0.18 | 任务书 | +| inspect 成年下限 | 仅 followup 过滤 | inspect 同样 `below_adult_floor` | BUG-598 | +| 采集「没有」按钮 | 无 | 仍无 | 等产品 | + +## 测试 + +- `frontend` `./node_modules/.bin/tsc --noEmit`:exit 0 +- `npm run lint`:0 errors / 108 warnings(仓库基线 warning,无新 error) +- 任务书指定 TS 切片:1040 tests / 1040 pass / 0 fail +- `tests/test_rectification_v5_services.py`:35 passed +- Docker `database-rectification-*.test.ts`:本机未跑,记 blocked +- 浏览器真人走查:无登录态,记 blocked + +Skill 10.0.18 SHA256:`ad209a7824d7eb65f35efd7d6245e9a3752a8b32972de0fbafb751691e86a1ad`。live `SKILL.md` + `references/` 与 `versions/10.0.18` 字节一致。 + +## 偏离 + +1. **不按 `cluster_range` 合并不同分钟。** 任务书写「同簇合并取代表」。04:53 与 04:59 若同簇会被合成一列,正好把本单要对照的差别藏掉。实现按精确 HH:MM 去重。 +2. 引擎 `column_times` 取 `candidate_decisions` 前 3 个唯一分钟(引擎分序)并保证代表分钟在列里。卡片列按后验排序。后验前三若与引擎前三不一致,缺的分钟回退代表 ledger / 空窗口句。 +3. `prospective_windows_for_time` 用该分钟月曜起的未来 12 个月 Vimshottari 起始月,领域目前标 `career`;没有 static context / 月曜则空列表,卡片写固定句。 +4. 采集题「没有」按钮未做。 +5. BUG-598 真实 Case 出生年:本工作树没有该 Case 档案,不能用出生资料核对。按年份公式:2015 年迁居题越线当且仅当出生年 > 1997。≤1997 年生在 2015 年已满 18 岁,不越线。 +6. 本机主仓停在 `codex/minute-rectification-p0` 且有脏文件,未动。 +7. 预检系统 Python 缺 swisseph/pytest;不把预检失败写成云端未同步。 +8. `.venv` 与 `frontend/node_modules` 是指向主仓的 symlink,不提交。 +9. 浏览器真人走查:本会话无登录态,记 blocked。见 `docs/testing/rectification-scenarios-20260907.md` §5。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 0856279c..52250f4f 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -80,7 +80,7 @@ | `TASK-rectification-delivery-report-facts-20260908.md` | `PROGRESS-rectification-delivery-report-facts-20260908.md` | 交付轮验证报告写「宽度 29 分钟」「主限偏向 05:06 / 分盘大运偏向 04:59」「04:53 D10 升狮子座」,与卡片(04:51–04:53)矛盾:`skill_verification_report` 用引擎推断前的 width / dasha_agreement,分盘星座让模型自算 | 已验收通过(Skill 10.0.16) | `06e44104`(BUG-593) | | `TASK-rectification-new-minute-inherit-20260908.md` | `PROGRESS-rectification-new-minute-inherit-20260908.md` | 5 题答完范围 13 分钟,补迁居事件后回弹到 28 分钟:重算换入的新分钟在携带题的 supports/conflicts 里没名字,一律中性、零冲突存活(BUG-587 决策 2 定错,本单推翻:按分盘星座 / 连续分钟段推结论);batch 内重算不触发 BUG-588 范围句 | 已验收通过(真实环境范围不再回弹) | `be711043`(BUG-594) | | `TASK-rectification-delivery-ui-simplify-20260908.md` | `PROGRESS-rectification-delivery-ui-simplify-20260908.md` | 产品决定:时间卡按候选分钟逐行直接点选采用(删分歧两列 + 都不像/说不好/按这个范围用/再补一件经历)、删输入框上方「先这样」按钮、删采用后状态条、交付正文收成三句 + 八法报告折叠块(Skill 10.0.17)、交付轮两条助手消息守卫(investigating) | 已验收通过(逐行卡随后被三列方案取代) | `7e3b6cdc`(BUG-595~596,Skill 10.0.17) | -| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 待执行 | `codex/rectification-candidate-compare-columns-20260908`(BUG-597~598) | +| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 待验收 | `codex/rectification-candidate-compare-columns-20260908`(BUG-597~598) | | `TASK-api-not-configured-mislabel-20260904.md` | `PROGRESS-api-not-configured-mislabel-20260904.md` | 16 处路由把数据库瞬断(部署切换窗口)兜底翻译成 503「服务尚未配置」;改为仅配置错误用该文案,其余 `service_unavailable`,收敛为共享 helper | 已验收 | `5483649b`(BUG-542);2 条子进程测试留 CI Node 22 复核 | | `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505~509) | diff --git a/docs/testing/rectification-scenarios-20260907.md b/docs/testing/rectification-scenarios-20260907.md index 209bc57a..c6b8856c 100644 --- a/docs/testing/rectification-scenarios-20260907.md +++ b/docs/testing/rectification-scenarios-20260907.md @@ -84,10 +84,10 @@ 期望: -- 交付轮只见一张卡:范围、对照了 N 件经历、每个候选分钟一行(代表分钟第一、标「排盘用」)、底部边界句 -- 点一行即采用;已采用行显示「已采用」,其它行仍可点改选 +- 交付轮只见一张卡:范围、对照了 N 件经历、至多三列并排(相对可能性、性格处事、经历对照、往后 12 个月、「更像这个」)、底部边界句 +- 点「更像这个」即采用;已采用列按钮显示「已采用」,其它列仍可点改选 - 卡片下方「查看验证报告」默认收起,打开后是真正的表格 -- 助手正文只有三句(范围与代表分钟、经历与吻合率、边界句),不含「方法1」或 Technique Audit +- 助手正文只有三句(范围、经历与吻合率、边界句),不含「排盘用」「方法1」或 Technique Audit - 不见「相对支持度」「当前推荐」「采用此时间」「按这个范围用」「再补一件经历」「都不像」「说不好」 - 输入框上方没有「先这样,先看当前范围」,也没有采用后状态条 diff --git a/frontend/DESIGN.md b/frontend/DESIGN.md index b1288d94..b4d5f5eb 100644 --- a/frontend/DESIGN.md +++ b/frontend/DESIGN.md @@ -231,7 +231,7 @@ The birth-time rectification session is the consultation transcript plus a house | `question-gap`, retries spent | “没有拿到下一个问题。” and a 44px “重新加载” | enabled | | `verified_idle` | one closing line `postAdoptVerifyDone` after adopted reverse-verify is exhausted; no spinner, no reload | enabled | | `choice-pending` | the answered card (`data-selected` fill, a top row “正在记录…”) and the same live row from “正在记录本次选择…” through the follow-up turn | enabled (typing queues), stop visible | -| `candidates` | one range-delivery card of clickable minute rows (representative first) under the offering message; a closed “查看验证报告” fold | enabled | +| `candidates` | one range-delivery card of up to three compare columns (highest posterior first; “更像这个” adopts) under the offering message; a closed “查看验证报告” fold | enabled | | `adopting` | “正在采用 HH:MM…” through the follow-up turn | enabled (typing queues), stop visible | | `confirmed` | “已确认校正时间:HH:MM” | enabled | | `readonly` | “该校正已结束,只能查看历史。” and “再次校正” | disabled | @@ -250,7 +250,7 @@ The birth-time rectification session is the consultation transcript plus a house - **Accessibility:** native radio inputs remain focusable, every conditional field has a persistent label, status text uses live regions, and the complete flow is keyboard operable. - **Motion:** source-dependent fields enter with the existing 180ms opacity/vertical reveal; reduced-motion removes the translation. - **Life-event evidence:** after deterministic questionnaire completion, render three structured event rows by default and allow up to six. Each row uses a domain select, a precision select, and a matching year/month/day control; free-form descriptions are not part of scoring. -- **Candidate result:** keep the reported range, candidate interval, and active-time status visually separate. Delivery shows one range card: title (range + event count), one clickable row per candidate minute with a D9/D10 difference vs the representative, and the representative-minute boundary. An eight-method report sits in a closed `
` fold. Support numbers stay on the house board. Low confidence keeps evidence editing open; medium offers save or add evidence; high uses a separate confirmation action and never labels the representative minute as the true birth time. +- **Candidate result:** keep the reported range, candidate interval, and active-time status visually separate. Delivery shows one range card: title (range + event count), up to three compare columns (time, relative likelihood, D9/D10/nakshatra traits, event-fit counts, next-12-month windows, “更像这个”), and the representative-minute boundary. An eight-method report sits in a closed `
` fold. Support numbers stay on the house board. Low confidence keeps evidence editing open; medium offers save or add evidence; high uses a separate confirmation action and never labels a column as the true birth time. - **Evidence accessibility:** every row keeps visible labels, validation errors use live regions, add/remove controls retain 44px targets, and scoring/confirmation loading states disable duplicate submission without hiding the existing evidence. - **One-question guide:** the guided journey renders only the persisted `nextAction` and one server-selected question. A deterministic question is visible immediately; Agent wording may replace it without changing the question identity, domain, precision request, progress, or permissions. The composer explicitly permits an approximate year. Stop on spoken collect is not a composer button: `CHOICE_STOP_LABEL` (“先这样,先看当前范围”) stays on choice cards, and generating turns keep “停止回答”. The readonly range line is a status sentence, not a stop control. Discriminator cards fold “为什么问这题” under the stem. Hovering or selecting an option does not reveal an `answer_impact` time line. The composer has no `rectification-step-state` status sentence and no `rectification-composer-meta`. - **Draft review:** natural-language answers become one inline review card. The evidence domain is read-only and uses its Chinese label; precision controls which exact year, month, or day input is available. Incomplete drafts keep edit and skip paths visible, while confirmation is disabled until the structured date is valid. Status and errors use polite or assertive live regions without clearing the persisted journey. @@ -474,7 +474,7 @@ or user IDs. Agent 的 live 标记只有 `InlineSpinner` 一种。曾经并存的 canvas 小球(`thinking-orbs`)已移除,不得再引入第二种 live 标记。 -校正面的所有等待复用行内等待:进入前的 hydration 在揭幕之前完成,进入后唯一的等待形态是时间线 live 行(含「正在准备下一个问题…」这一条独立 live 行)。区间交付卡只挂在最新那条采用旁白下面,不得留在更早的采集/区分题下;采集题还没答完时不出卡。点一行即采用,行内显示「正在采用…」或「已采用」。采用后前事核对结束走 `verified_idle`:一行收尾文案,没有 live 行、没有重载、没有采用状态条。 +校正面的所有等待复用行内等待:进入前的 hydration 在揭幕之前完成,进入后唯一的等待形态是时间线 live 行(含「正在准备下一个问题…」这一条独立 live 行)。区间交付卡只挂在最新那条采用旁白下面,不得留在更早的采集/区分题下;采集题还没答完时不出卡。卡上至多三列并排,点「更像这个」即采用该列分钟,按钮显示「正在采用…」或「已采用」。采用后前事核对结束走 `verified_idle`:一行收尾文案,没有 live 行、没有重载、没有采用状态条。 首页只揭幕一次。揭幕前的加载屏分两阶段:先取账户、模型目录与会话列表,再并行取当前会话消息、推荐问题、今日星语与校正入口摘要,并预热校正分包;全部就绪或 4 秒预算到期(`BOOTSTRAP_PREPARE_TIMEOUT_MS`)才揭幕。揭幕后不得再出现任何阻塞等待或组件级 spinner:推荐问题未到显示安全默认问题,今日星语未到显示静态文案「今天的星语还没写出来。」(不带 `aria-busy`),校正卡用无摘要文案,内容到达后静默替换。切换到消息尚未缓存的会话时消息区留白并只给 `sr-only` 文案,不转圈;揭幕后按侧栏顺序后台预取最近 5 条会话(`SESSION_PREFETCH_COUNT`)让常见切换零等待。轨道环消失后不得再换一套动效继续等。 diff --git a/frontend/docs/VOICE.md b/frontend/docs/VOICE.md index 94f89e0b..99bb4340 100644 --- a/frontend/docs/VOICE.md +++ b/frontend/docs/VOICE.md @@ -32,10 +32,10 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、 | 当前可信区间是 05:00–05:07,代表分钟 05:00。代表分钟只是代表性候选,不是已确认的唯一出生分钟。 | 已经从最初的 30 分钟收到 05:00–05:07 这 7 分钟。代表分钟是 05:00,这只是代表性候选,不是已确认的唯一出生分钟。 | 同一边界语义,带进度,少法务腔。 | | 剩下的题分不开当前候选。更站得住的范围是 05:15,代表分钟 05:15。 | 再问下去也分不出更准的时间了。眼下更站得住的是 05:15。 | 单分钟不要把范围和代表分钟念两遍;「当前候选」是内部词。 | | 可以从下面的时间里选一个采用。 / 下面的时间可以先用着。 | 我按你说的经历认真分析过了,下面是这次的结果。 | 这是认真分析后的结果,不是随便先用着;采用仍不是确认。区间交付卡必须就在这句下面。 | -| 相对支持度 16 · 采用此时间 | 点一行即采用。代表分钟标「排盘用」,右侧只写和代表分钟不同的分盘特征。 | 交付对象是区间里的候选分钟,不是四张卡上的支持度数字。 | -| 候选 A 预测下一次事业变动更可能在 2027 年 3 月附近。 | 下一次事业变动的预测窗口留在采用后的核对阶段。 | 交付轮不并排三行预测。采用后首轮核对旁白末尾才接上实际窗口句。 | +| 相对支持度 16 · 采用此时间 | 一行至多三列。每列写相对可能性、性格处事、经历对照、往后 12 个月,点「更像这个」即采用。不预标「排盘用」。 | 交付对象是区间里并排的候选分钟,不是四张卡上的支持度数字。 | +| 候选 A 预测下一次事业变动更可能在 2027 年 3 月附近。 | 每列用服务器算好的 1–2 个事件窗;没有窗就写「未来一年没有明显的窗口」。 | 窗口按候选分钟各算,模型不写。 | | 「再补一件经历」后卡片消失、输入框上方空白 | 需要补经历时继续在输入框说下一件;交付卡不再提供「再补一件经历」按钮。 | 交付卡只负责选分钟。 | -| 采用后会拿盘外核对来验证。 / 已采用 04:53 · 范围 … / 改选 / 之后新建对话即按此时间排盘。 | 没有核对题:已采用 04:53,新建对话即按这个时间排盘。有核对题:前事核对到这里。之后新建对话即按已采用时间排盘;对不上随时改选。 | 采用状态在卡片行内。`postAdoptVerifyDone` 在没有核对题时改短句。 | +| 采用后会拿盘外核对来验证。 / 已采用 04:53 · 范围 … / 改选 / 之后新建对话即按此时间排盘。 | 没有核对题:已采用 04:53,新建对话即按这个时间排盘。有核对题:前事核对到这里。之后新建对话即按已采用时间排盘;对不上随时改选。 | 采用状态在该列按钮上。`postAdoptVerifyDone` 在没有核对题时改短句。 | | (采用后只念代表分钟)代表分钟是 05:12。 | 这 27 分钟里,事业方向、性格底色的判断是稳定的;婚恋(D9)会随分钟变,看盘时按范围读。这不是已确认的唯一出生分钟。 | 采用后先讲区间里什么稳、什么随分钟变;两句来自服务端,不是模型编的。 | | 当前问题已更新,请刷新后重新作答。 | 这一问刚换成新的,刷新后再答就行。 | 机器状态句改成下一步。 | | 好的,记下了。 | 2016 年 9 月上大学,记下了——这类有明确月份的节点对校正特别有用。 | 确认收到什么,并说清为什么有用。 | diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 3fcfd53d..c347ce86 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -3134,51 +3134,86 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class display: grid; gap: var(--space-4); } -.rectification-range-delivery__rows { - display: grid; - gap: var(--space-2); +.rectification-range-delivery__columns { + display: flex; + gap: var(--space-3); margin: 0; - padding: 0; + padding: 0 0 var(--space-2); list-style: none; + overflow-x: auto; + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; } -.rectification-range-delivery__row { +.rectification-range-delivery__column { + flex: 1 0 min(100%, 240px); display: grid; - grid-template-columns: auto minmax(0, 1fr) auto; + align-content: start; gap: var(--space-3); - align-items: center; - width: 100%; min-height: 44px; - padding: 10px 12px; + padding: 12px; border: 1px solid var(--color-border); border-radius: var(--radius-lg); - color: var(--color-ink); background: var(--color-canvas); - font: inherit; - text-align: left; - cursor: pointer; + scroll-snap-align: start; } -.rectification-range-delivery__row.is-representative, -.rectification-range-delivery__row[aria-pressed="true"] { +.rectification-range-delivery__column.is-adopted { border-color: color-mix(in srgb, var(--color-action) 55%, var(--color-border)); background: color-mix(in srgb, var(--color-action-soft) 60%, var(--color-canvas)); } -.rectification-range-delivery__row:focus-visible { - outline: 2px solid var(--color-focus); - outline-offset: 2px; +@media (min-width: 641px) { + .rectification-range-delivery__columns { + overflow-x: visible; + scroll-snap-type: none; + } + .rectification-range-delivery__column { + flex: 1 1 0; + min-width: 0; + } } .rectification-range-delivery__time { font-variant-numeric: tabular-nums; font-weight: 600; + font-size: var(--type-title-md); } -.rectification-range-delivery__diff { +.rectification-range-delivery__likelihood, +.rectification-range-delivery__block p, +.rectification-range-delivery__more { + margin: 0; color: var(--color-ink-secondary); font-size: var(--type-caption); line-height: 1.5; } -.rectification-range-delivery__status { - color: var(--color-action); - font-size: var(--type-caption); +.rectification-range-delivery__block { + display: grid; + gap: var(--space-1); +} +.rectification-range-delivery__block h3 { + margin: 0; + font-size: var(--type-overline); font-weight: 600; + color: var(--color-ink); +} +.rectification-range-delivery__accept { + justify-self: stretch; + min-height: 44px; + padding: 0 12px; + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + color: var(--color-action); + background: var(--color-canvas); + font: inherit; + font-weight: 600; + cursor: pointer; +} +.rectification-range-delivery__accept[aria-pressed="true"] { + border-color: color-mix(in srgb, var(--color-action) 55%, var(--color-border)); +} +.rectification-range-delivery__accept:focus-visible { + outline: 2px solid var(--color-focus); + outline-offset: 2px; +} +.rectification-range-delivery__accept:disabled { + cursor: default; } .rectification-range-delivery__boundary { margin: 0; diff --git a/frontend/src/components/rectification-range-delivery.tsx b/frontend/src/components/rectification-range-delivery.tsx index f7f7e9e0..fd974271 100644 --- a/frontend/src/components/rectification-range-delivery.tsx +++ b/frontend/src/components/rectification-range-delivery.tsx @@ -5,6 +5,9 @@ import { RECTIFICATION_USER_COPY, REPRESENTATIVE_MINUTE_DISCLAIMER, rangeDeliveryEventCopy, + rangeDeliveryFitCopy, + rangeDeliveryWindowCopy, + rangeDeliveryWorstCopy, } from "@/lib/rectification-agentic/user-copy"; import type { RangeDeliveryProjection } from "@/lib/rectification-agentic/v9/divergence-panel"; import { RectificationVerificationReport } from "@/components/rectification-verification-report"; @@ -25,7 +28,7 @@ export function RectificationRangeDelivery({ const eventCount = delivery?.event_count ?? 0; const selected = result.selectedTime; const busy = Boolean(acceptingCandidateId) || readonly; - const rows = delivery?.rows ?? []; + const columns = delivery?.columns ?? []; const title = range ? eventCount > 0 ? `${RECTIFICATION_USER_COPY.rangeDeliveryTitle} ${range[0]}–${range[1]} · ${rangeDeliveryEventCopy(eventCount)}` @@ -39,38 +42,64 @@ export function RectificationRangeDelivery({
{title}
-