Commit Graph
1077 Commits
Author SHA1 Message Date
jesse-ux 25851dd338 feat(qizheng): vendor stem-branch and expose three read-only chart APIs
Add Apache-2.0 @4n6h4x0r/stem-branch 0.8.0, a seven-governors adapter,
and POST /api/qizheng, /api/western, /api/ephemeris_events.

BUG-700 remains blocked (do not call --pillars). BUG-701 and BUG-702 are
resolved. BUG-703 is investigating (panchanga Lahiri). Skill is not bumped.
2026-09-15 16:10:21 +08:00
Jesse_ChenandClaude Fable 5 3e58e85f8f docs(tasks): P0 — tie-break entry destroys the delivery card; session list lies about rectification
两组缺陷,分两单。

会话列表单追加 BUG-700/701:全仓只有 append_consultation_question 这个
咨询 RPC 写 chat_sessions.updated_at,校正的 turn 走自己的表从不推进,于是
校正会话的 updated_at 冻结在创建时刻——连着几小时答题也不动位置。叠加
BUG-699 的改名,列表变成「名字是今天、排序是旧日期」。而 resolveBootstrap-
SessionSelection 的 ?c= 只比对当前已加载那一页(SESSION_PAGE_SIZE = 40),
翻不到就判 missing、打「该对话不存在或已被删除」并清掉 URL。查过了没有任何
删除路径被触发,会话大概率仍在库里。

新单 BUG-702~704:applyLiveCandidateOffer 遇到任何未答的 choice/collect_spoken
就把 candidateOffer 从每一条消息上剥掉,而 requestTieBreak 必然写入这样一道题
——点卡上的按钮必然丢卡。按钮亮不亮看 tieBreakPersonalityAvailable(只看
followup),题能不能画成选择题看 buildChoiceCard 的 styleOptions.ok /
canRenderYearlessChoice,两个判据不一致,于是按钮亮着、点开是裸题,卡又没了,
两条路都断。交付旁白还写了 VOICE 明令禁止的「相对支持度」,并在自称不再问
分盘题的同一屏提供分盘题入口。

产品重申 BUG-686 的原意:卡上不要参考题按钮,出卡前收集完,以卡结算。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 07:44:40 +00:00
Jesse_ChenandClaude Opus 5 4cacea8eb1 docs(tasks): brief the api server decomposition
The line-count cap is nearly spent (11314 of 11363), but counting lines
misreads the problem. Three call sites outside the HTTP layer reach the
business logic by doing JyotishAPIHandler.__new__ on an uninitialised
handler — consultation_workflow_service twice, which is what MCP calls,
plus the golden capture and the offline accuracy report. The declared
"shared boundary" module imports back into the monolith, so the
dependency arrow points the wrong way and new logic has nowhere to land
except that class.

Four phases: remove the __new__ backdoor, extract the remaining methods
over 150 lines, replace the 72-branch elif dispatch with a table, then
re-freeze the baseline with a 50-line allowance instead of 300. Pure
relocation; the 3841-line security suite is the safety net and none of
its assertions may change. Serial after the qizheng brief, which owns
the file until it merges.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-15 07:19:05 +00:00
Jesse_ChenandClaude Opus 5 6f74aa6704 docs(tasks): brief the read-only chart and ephemeris pages
Splits the remaining work into three briefs that own disjoint files so
agents can run them in parallel. The qizheng brief is widened to own
scripts/jyotish_api_server.py outright and register all three read-only
endpoints (/api/qizheng, /api/western, /api/ephemeris_events), because
the chart page needs a tropical natal route that no path exposes today
and the ephemeris page needs ingress/station scanning that /api/transit
does not provide.

The chart-page brief owns app-sidebar.tsx and adds both nav entries; the
ephemeris-page brief owns only its own route. Checking the tree changed
one plan: vedic-chart-svg.tsx is also imported by rectification-board, so
the component stays where it is instead of moving to a shared layer.

BUG ranges are pre-allocated per brief to keep parallel work from
colliding, and the panchanga Lahiri/Raman split found while prototyping
is filed as investigating rather than fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-15 07:09:23 +00:00
Jesse_ChenandClaude Opus 5 b3ccef4cbb docs(tasks): brief the native qizheng chart integration
Upstream branch codex/add-birth-time-rectification-skill a911c890 vendors
@4n6h4x0r/stem-branch 0.8.0 (Apache-2.0) and adds a seven-governors chart
adapter. Brief scopes the intake: vendored archival plus NOTICE, Node
runtime in the API image, vendor/** in gated-paths, a parameterised
adapter, and a thin /api/qizheng registration under the 11363-line cap.

Three defects were reproduced locally before filing: the four-pillars
hour branch is derived from the UTC wall clock (BUG-700, out of scope and
red-lined), ketuMode is pinned to the apogee school with no request
parameter (BUG-701), and the adapter boundary claims star spirits and
dignities that come back empty or unclosed (BUG-702).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-15 06:59:47 +00:00
jesse-ux 2d7698ead3 fix(chat): keep stored rectification titles on open
Independent Staging Quality Gate / validate (push) Successful in 11m43s
Independent Staging Quality Gate / publish (push) Successful in 2m3s
Opening a saved birth-time session no longer restamps the title or updatedAt from the wall clock. Occupies BUG-699, recurrence of BUG-553.
2026-09-15 14:48:03 +08:00
Jesse_ChenandClaude Fable 5 224244c014 docs(tasks): P0 brief — opening a stored rectification session renames and re-sorts it
openRectificationCase 构造 merged 时无条件 title: resolveSessionTitle(…) 与
updatedAt: timestamp()。同一个对象里 pinned 和 archivedAt 是从 existing 继承
的,说明作者知道这条路径会跑在已存在的会话上,只是漏了这两个字段。
resolveSessionTitle 的日期来自 new Date(),于是 9/12 建的会话被改名成
「9月15日 · 生时校正」,同名时再追加时:分。

两种损坏持久性不同,修复时要分开:persistSession 的 update 分支写 title
但不写 updated_at(BUG-553 的正确遗产),所以标题是永久写坏服务端,排序
只坏在客户端 state、刷新自行恢复。已坏的历史标题按 created_at 修回,取不到
就退回不带日期的中性标题,不猜。

复发自 BUG-553——它的防复发「updatedAt 只由对话活动推进」只是 Bug 记录里
的一句话,没有任何测试执行,且当时只覆盖元数据 PATCH 与五条客户端路径,
漏了当时就存在的校正 open 路径。本单要求把那句话变成测试。

咨询侧三处 resolveSessionTitle 都有 messages.length === 0 && 通用标题的守卫,
不受影响,明令不得顺手改。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 06:25:18 +00:00
jesse-ux ff5023a282 test(chat): restore two-layer markdown contract counts
Independent Staging Quality Gate / validate (push) Successful in 9m19s
Independent Staging Quality Gate / publish (push) Successful in 11m32s
Spoken and report layers each keep a message-markdown shell and both must call renderProse; login hard-jumps drop from 4 to 3 after the onboarding suggestion effect went away. No product code.
2026-09-15 13:27:17 +08:00
Jesse_ChenandClaude Fable 5 ca5ecafc1a docs(tasks): accept the two UI rounds and file the contract-test fix
Linux 上补了执行方在 Windows 上做不到的两项:全量 npm test 与 next build。

通过:tsc 0 错;lint 0 error / 120 既有 warning;测试总数 3214 → 3232;
next build exit 0、/ 仍是 ○ Static;首屏 JS gzip-9 585,246 → 583,660 B,
-1,586 B / -0.27%(口径同 09-02、09-06)。任务书逐条对照,删除范围与保留
范围都对,guided_topic 枚举保留、录入链路未被误删、复制仍走全文。

未通过 2 条,同一类——契约测试跟着代码漂了没更新,不是产品回归:
chat-bundle-splitting-contract 断言 message-markdown 包裹恰好 1 个,两层
可见性后是 2 个(同一 test 里 plainParagraphs(spoken) 字面量也已不存在);
chat-navigation-a11y-contract 断言 window.location.assign("/login") 恰好
4 处,删建议问题入口带走一处变成 3。基线 27 条失败与改后逐条一致,新增
的就是这两条。

执行方把全量测试记成 Windows 环境缺口(SKILL.md symlink EPERM、CRLF),
判断对他们的机器成立,也因此没机会看到这两条。修复单只改测试、禁止碰
frontend/src,要求失败数回到 27。

顺带澄清:PROGRESS 里记的 membership-page「login redirects」CRLF 失败在
Linux 上通过,不是回归。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 05:14:43 +00:00
Jesse_ChenandClaude Fable 5 4c002a084e docs(tasks): brief the settings dialog size recurrence and the nav emphasis bar
BUG-698 复发自 BUG-554。四个分区确实都映射到 .settings-modal,CSS 里
width 与 height 也都写了——但 .settings-modal 的 height/max-height 只用
dvh,没有 vh 回退。不支持 dvh 时整条声明作废,height 退回 auto,高度改由
内容决定,正是「切分区就立马缩小」。全文件 18 处 dvh 只有 sidebar-provider
那一处配了回退,本仓自己知道这个写法。

BUG-554 的防复发「设置弹窗必须同时声明 width 与 height」拦不住这次:它
检查声明存在性,不检查声明是否生效;守它的断言也只是一句 CSS 文本匹配。
本单把防线换成「height 用 dvh 必须先写 vh 回退」的全文件契约测试。

首要嫌疑不等于已证实——本会话没有浏览器。任务 1.1 要求执行方先量四个分区
的 getBoundingClientRect 并确认 height 是否被划掉,量不出来就转 investigating
交回产品,不得盲改。

另去掉设置分区菜单的左侧强调条(移动端下边框同理)。删之前必须先拆开选中态
与悬停态——它们共用同一条声明,色条是当前唯一的区分。左侧会话列表的 2px 色条
本轮保留,口径暂时不一致已授权。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 04:56:45 +00:00
jesse-ux 6c748d86b0 fix(ui): 44px coarse hits and align CSS breakpoints
Independent Staging Quality Gate / validate (push) Failing after 8m53s
Independent Staging Quality Gate / publish (push) Skipped
Touch-screen message actions get a 44x44 hit once gap and bottom margin open to 20px; fine-pointer geometry stays 27x34. Tablet CSS cuts at 1023 to match sidebarViewportForWidth. Report centre/reader join the 767 mobile cut; TOC keeps 860. Occupies BUG-695/696/697.
2026-09-15 12:46:59 +08:00
jesse-ux 8144fca27d fix(chat): fold natal reports and drop homepage topic cards
Independent Staging Quality Gate / validate (push) Failing after 9m47s
Independent Staging Quality Gate / publish (push) Skipped
Homepage no longer waits on /api/onboarding for six starter questions.
Natal answers show the spoken layer first; the Level 2 skeleton sits in a
collapsed 完整分析 block. Wide tables scroll sideways on a phone. Form
inputs are 16px so iOS does not zoom on focus.
2026-09-15 12:27:16 +08:00
Jesse_ChenandClaude Fable 5 899f955d4b docs(tasks): fold two mobile blockers into the reading-load round, brief touch targets and breakpoints
2026-09-15 的 UI 走查(web + 移动端)结果落盘。

并入 TASK-chat-reading-load:折叠层里的四列表在窄屏没有重排规则
(767 的卡片化只认三列,width:100% 又让 overflow-x 永不触发),它是
折叠能不能落地的前置;全局 input/select 是 14px,iOS 聚焦会把整页放大,
命中整条注册与资料录入漏斗。

新单 TASK-mobile-touch-and-breakpoints(BUG-695~697):消息操作按钮
命中区 27×34 且相邻只隔 1px;CSS 平板上限 900px 与 sidebar-state.ts 的
1024 不一致,901–1023 是混合态;报告域 720/760/860 三刀互不对齐,
761–860 目录已塌、正文还是桌面。含断点白名单契约测试作为防复发。

另加 docs/testing/ios-keyboard-composer-20260915.md:html/body overflow
hidden + 100dvh 外壳 + sticky 输入框 + interactiveWidget 只有 Android 认,
是键盘遮挡的风险形状,但代码断不了真假,交真机确认后再决定是否立单。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 04:02:50 +00:00
Jesse_ChenandClaude Fable 5 4147326115 docs(tasks): brief the homepage topic-card removal and the two-layer answer fold
首页「从一个主题开始」整段下线,连同它背后 /api/onboarding 的 LLM 取数
链路和 bootstrapPrepareReady 的揭幕闸门;聊天回答改成两层可见性——口语层
默认展开,第一个 H2 起的骨架进默认收起的「完整分析」折叠块。内容一字不
删,只改默认可见性与口语层形状。

记下与待验收项 BUG-630 的冲突:主题卡就是 guided_topic 的唯一发出点,
入口下线后该项走查不可执行,枚举值保留供历史会话读回。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 03:18:22 +00:00
Jesse_ChenandClaude Opus 5 ebd5ba68a2 docs: clear the timezone gap and record what actually keeps the gate red
验收 8d56d0ab:字面量锁经变异法确认(加 **.generated_by 只红这一条,恢复即
绿),生产代码零改动。timezone 那条查下来不是缺口,是验收机少装了已声明的
timezonefinder>=6.5;装上后快速门 pytest 段 740 passed / 0 failed,BLOCKED.md
该条划掉。真正让门停在 exit=1 的是 npm test 的 27 条无 Docker 失败,另记一节
并写明本机「快速门通过」的口径。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
2026-09-15 02:50:56 +00:00
jesse-ux 8d56d0ab0b test(report): lock binding exclusion allowlist literals (BUG-694)
Independent Staging Quality Gate / validate (push) Successful in 9m52s
Independent Staging Quality Gate / publish (push) Successful in 2m6s
Contract-test the D2 exclusion tuples so widening them cannot silently pass. Record the timezonefinder quality-gate gap in BLOCKED.md.
2026-09-15 10:41:10 +08:00
Jesse_ChenandClaude Opus 5 10b463b9e8 docs(tasks): lock the binding exclusion list and record the timezone gap
BUG-693/694 实现(1d2aeffa)验收通过:三次 CLI 加三个 PYTHONHASHSEED 哈希
全同,变异法验证覆盖 33/40 顶层键,耗时中位数 2737 ms(修复前 2769 ms)。
补漏单处理两个没被机制挡住的洞:排除集的「只能三类」靠的是生产者、质量门、
测试引用同一对常量,加第四类会自动放行,改为把字面量钉进合同测试;快速门
必红的 timezone inference 依赖缺口记进 BLOCKED.md(修复前同样红,非回归)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
2026-09-15 02:34:37 +00:00
jesse-ux 1d2aeffaef fix(report): bind professional report hash to the delivered packet (BUG-693, BUG-694)
Independent Staging Quality Gate / validate (push) Successful in 9m45s
Independent Staging Quality Gate / publish (push) Successful in 2m14s
Rebind after sanitize, write an explicit binding_scope, and make the quality gate recompute coverage. Wall-clock fields stay in the packet but out of the hash.
2026-09-15 10:09:26 +08:00
jesse-ux 039b0a2608 fix(rectification): say 这两分钟 only when two candidates remain (BUG-692)
Independent Staging Quality Gate / validate (push) Successful in 9m43s
Independent Staging Quality Gate / publish (push) Successful in 8m50s
Count-aware closed-pool invite, catch the five stale contract assertions, and mark M1b V1/V2 as not_measured.
2026-09-15 09:43:51 +08:00
Jesse_ChenandClaude Opus 5 416b9a693c docs(tasks): bind the professional report receipt to what is actually delivered
上游 2026-09-14 的 4 个新提交里 SKILL.md 与校正代码零改动,核"要不要抄
它的 PL9 绑定投影"时量出我们自己两个问题:result_binding 绑的是中间态包
(18/36 个顶层键、6.24 MB,交付 10.04 MB),质量门只比自洽所以恒 passed;
被哈希的载荷含墙钟 elapsed_seconds,同一输入两次跑出不同 result_hash。
任务书写末尾按交付对象重绑、排除集显式进回执、质量门补覆盖校验;上游那条
投影优化实测收益 < 0.1 秒,记为不抄。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
2026-09-15 01:29:00 +00:00
Jesse_ChenandClaude Fable 5 81f8183cc2 docs(tasks): fix the invite copy count and the five stale assertions
验收 a266b6b7 / c5fbee56:tsc、lint、新套件全绿,但 npm test 由 27 涨到 32——
4 条 exit 断言的短语表没加新交付文案、1 条公开字段深比较没加 birth_time_source,
都不是行为回归但违反红线。另有用户可见的数字矛盾:邀请语硬编码「这两分钟」,
同段话却写着「还剩 4 个候选」。本单修文案按候选数出话、两处断言跟上,并给精度
研究 M1b 追加勘误:V1/V2 三档数字与 V0 完全相同且作者自承采集走错路径,判定
作废改为未测(V3 结论保留)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-15 01:20:37 +00:00
jesse-ux dfb572fc7f docs(research): measure precision-adaptive probe gates; no variant clears the bar
Independent Staging Quality Gate / validate (push) Failing after 13m3s
Independent Staging Quality Gate / publish (push) Skipped
20 public AA cases, raman/mean. Lowering MIN_BOUNDARY_DAYS narrows ±10 from
15 to 11 minutes but drops top-1 0.80→0.75; wider radii get wider ranges.
Varga sensitivity weights (V1/V2) match production; D60 (V3) hurts ±10.
Day-precision events offset ±7 never squeeze the true minute out. Production
45/30 gate and equal varga weights stay unchanged.
2026-09-15 09:04:03 +08:00
Jesse_ChenandClaude Fable 5 d92a696768 docs(tasks): record wins by default when it falls outside the rectified range
产品 2026-09-14 拍板:用户有医院记录而校正区间不含那一分钟时,记录优先、分歧
如实呈现。依据写进任务书:holdout 上六题后头名命中只有 0.80/0.55/0.35,不足以
推翻书面记录;但医院记录也确有抄录误差,所以不能反过来否定校正结果。行为上
「记录优先」已经成立(不点采用就继续用填报时间),本单只做文案与入口:冲突时
校正区间标成证据倾向,采用按钮改成「改用校正结果」,并禁止任何「记录不准」
或「校正无效」的表述。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 15:24:58 +00:00
jesse-ux c5fbee56a6 fix(rectification): label declared birth time as record or estimate (BUG-690)
Independent Staging Quality Gate / validate (push) Failing after 8m55s
Independent Staging Quality Gate / publish (push) Skipped
Hospital records, family estimates and period-only windows now keep distinct copy on the board and range card. Scoring still uses the reported clock as the search-window centre. Hospital minutes outside the current range are stated with the offset and no preference.
2026-09-14 23:20:15 +08:00
jesse-ux a266b6b727 fix(rectification): invite another dated event instead of saying the pool is closed (BUG-689)
Independent Staging Quality Gate / validate (push) Failing after 10m16s
Independent Staging Quality Gate / publish (push) Skipped
When the seven collect lines are closed, the range card still appears, but the copy asks for one more exact-day event of any kind instead of saying the questions are finished. A new dated event after delivery stales the snapshot so the session does not stay delivered.
2026-09-14 22:56:01 +08:00
Jesse_ChenandClaude Fable 5 62803c5d01 docs: defer tightening the domain gate until the invite ships
上游 R3 要求淘汰与定案需 ≥3 领域,本仓是 MIN_ACCEPTANCE_DOMAINS=2。产品
2026-09-14 决定先不动,等 BUG-689 的补经历邀请上线、有真机数据后再评估:那时
用户更容易补到第三个领域,收紧代价更小;现在收紧会与「永远给结果」冲突。
写进 BUG-689 单的 §4b 与研究定论页的产品决策存档,并明令执行方不得顺手改常量。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:46:48 +00:00
Jesse_ChenandClaude Fable 5 b56147e524 docs(tasks): varga sensitivity weighting, and birth-time provenance labels
与上游流程对照补两处。①精度研究单加 M1b:上游有一张分盘分钟敏感度表
(D60=2 / D30=4 / D24=5 / D9=13.3 / D1=120 分钟换一次上升),而本仓 11 张分盘
等权再除以 22(且没有 D60)——20 分钟窗里 D30 和 D2 同分量,分辨率最高的盘被
稀释。测 V1 反比配权 / V2 按窗宽选盘 / V3 加 D60,并报过拟合风险。
②新任务书 BUG-690:录入已收 birth_time_source 三类,但校正链只用过一次,
推算值与医院记录等同对待、输出直称「你的出生时间」。接进投影并按来源分档措辞;
医院记录与校正结果冲突时怎么说挂给产品。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:44:15 +00:00
Jesse_ChenandClaude Fable 5 3314de2ad9 docs(tasks): ask for exact-date events first in the BUG-689 invite
上一条提交漏掉了这处改动。D1b:邀请语先请用户说记得确切哪一天的事(登记结婚、
入职第一天、手术、孩子出生、拿到录取通知),再退而求其次要年月;理由是 1 分钟
只平移约 1.1 天边界而闸门按 45 天卡,只有日精度事件才有可能分开相隔几分钟的候选。
同时明确不得承诺能定到分钟。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:36:41 +00:00
Jesse_ChenandClaude Fable 5 749c7541ad docs(tasks): research the precision-adaptive probe gate, and ask for exact dates
出生时间每差 1 分钟,Vimshottari 边界只平移约 1.1 天;而 _boundary_windows 用固定
45 天(刷新 30 天)闸门,且全文不读证据精度。20 分钟窗内候选边界全挤在三周内被
整批丢掉——这就是「六题之后引擎出不来题」的算术原因。研究单量闸门按年/月/日分档
的收益,必测 ±3/±7/±14 天记错时真值是否被挤出(挤出即不推荐)。v4 实测有 59 件日
精度事件可用。BUG-689 的邀请文案同步加 D1b:优先请用户说记得确切日期的事,但不得
承诺能定到分钟。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:36:10 +00:00
Jesse_ChenandClaude Fable 5 558d43c853 docs(tasks): invite one more dated event instead of saying the pool is closed
两轮研究定论:候选并列靠调打分拉不开,唯一有效手段是用户再给带年月的经历。
但七条固定采集线问完后,卡上只说「能问的都问完了」(BUG-687 引入),用户读完
就走——而交付后 case 仍是 candidate_ready,补经历本来就会重算收窄。产品拍板:
交付卡照出,卡上换成不限领域的补充邀请并举七条线之外的例子;不采用「并列时
先不出卡」(接近 BUG-646 禁止的门关不出结果)。补完必须可见生效,有行为测试守。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:24:01 +00:00
Jesse_ChenandClaude Fable 5 a643452b44 docs(research): closure page for the two rounds on unseparable candidates
把 09-14 两轮离线研究和上游对照合并成一页定论:加权重类改法全部不过门、
簇合并从未触发(假线索)、宽度按线上口径是 15/33/56 且真值 20/20 从未被挤出、
问答链有效(回放六题后头名命中 0.80/0.55/0.35)。剩下的唯一痛点是区间内部并列,
只能靠带年月的新经历或诚实呈现。附 KP 计分与风格题前置两条产品决策存档,
以及给下一个人的三条提醒(先确认指标口径、不要从 docstring 推断行为、
真值覆盖率优先于区间宽度)。ACTIVE_FRONTS 加索引。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 14:18:13 +00:00
jesse-ux cf972f4040 docs(research): measure why delivered range width equals the search window
Independent Staging Quality Gate / validate (push) Successful in 10m20s
Independent Staging Quality Gate / publish (push) Successful in 2m18s
Offline v4 holdout probe. Last round's width=window result was the
no-elimination metric; production still-valid ranges after six answers
are 15/33/56 minutes. Adjacent merge never fires under step-2 radii.
W1/W2 match baseline; W3 is uncertain after one coverage squeeze.
No production clustering or scoring defaults changed.
2026-09-14 22:11:47 +08:00
jesse-ux 963c147c58 fix(rectification): do not hold delivery on exhausted or closed-ceiling paths (BUG-688)
Independent Staging Quality Gate / validate (push) Successful in 10m3s
Independent Staging Quality Gate / publish (push) Successful in 3m53s
Style questions still precede a converging range card when a renderable
followup exists. Exhausted, closed-ceiling, and holdout-unavailable exits
deliver immediately. Hold at most once per Case. Restore the single-gate
exit assertion and stop treating the tie-break ack as an exit carrier.
2026-09-14 21:43:21 +08:00
Jesse_ChenandClaude Fable 5 ada2cfb15a docs(tasks): record that 6fd7925a only adapted assertions, two must be restored
6fd7925a 把 6 条红改绿:4 条是交付文案放宽(接受,有三栏说明),2 条是实质
弱化——「恰好一条交付闸」退化成短路(重复交付守卫失效)、参考题确认语「只微调
排序」被算进出口载体(BUG-656 的无题守卫被架空)。行为层根因未动,hold 仍作用于
exhausted 与 closed-ceiling 路径。修复单据此加 D4/D4b 与任务 2。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 13:12:29 +00:00
Jesse_ChenandClaude Fable 5 8f50af91e3 docs(tasks): hold-exit regression fix and the cluster-width research brief
验收 7f28bfec/d97b9e9f:tsc、lint、Python quick gate 均无新增失败,但 npm test
由基线 27 红涨到 33——6 条全是「该交付却不交付」,因为 shouldHoldForTieBreak
放宽后连 exhausted 与 closed-ceiling 收口路径也被压住(BUG-688 修复单)。

研究单接上一轮结论:五个打分改法都改不动交付区间宽度,所有方案宽度中位数等于
整个搜索窗。先查 sweep 的宽度口径是否包含淘汰,再查 cap_clusters_by_adjacent_merge
「从不丢簇」与签名层过细两条线索,量三个候选改法。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 13:11:43 +00:00
jesse-ux 2d2467dca1 docs(research): measure minute-resolution scoring; no variant clears all radii
Independent Staging Quality Gate / validate (push) Failing after 9m27s
Independent Staging Quality Gate / publish (push) Skipped
Build holdout v4 from the public AA set, correct the two v3 dates, and sweep
R1–R5 plus pairs offline. No production scoring defaults change. No
implementation brief: delivered width stays the full window on every radius.
2026-09-14 20:43:27 +08:00
Jesse_ChenandClaude Fable 5 9943a05a01 docs(research): brief for minute-resolution scoring, plus the upstream gap report
上游 b9a0ef8f..92d3a47a 的 43 个提交里生时校正零改动,没有新技法可取。候选
分不开的根因在本仓自己的打分结构:一个日精度事件里窗口内恒定的项上限 11.5
分,随分钟变化的项上限 2.125 分,约 5:1。研究单先修封存基准(v3 每例仅 3 件
事、被标 invalidated)出 v4,再离线量五个改法:分盘除数、去底座、KP 宫头子主
计分(产品 2026-09-14 拍板,推翻 BUG-325 的「不得计分」一条)、年精度事件改
边际似然、聚类签名层与计分层对齐。有收益才另立实现单。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 11:17:33 +00:00
jesse-ux d97b9e9fe6 fix(rectification): ask unused style probes before every range card
Independent Staging Quality Gate / validate (push) Failing after 9m19s
Independent Staging Quality Gate / publish (push) Skipped
Hold delivery whenever tie-break questions remain, not only on a one-point lead. Drop the event-anchor discard for varga_style; keep the two-sign split gate.
2026-09-14 18:30:40 +08:00
jesse-ux 7f28bfecbb fix(rectification): ask tie-break questions before the range card (BUG-685/686/687)
Close leads hold delivery until unused D9/D10 style questions are asked. Tie-break POST merges the new turn into the transcript. Range copy no longer lists declined lines.
2026-09-14 18:23:54 +08:00
Jesse_ChenandClaude Fable 5 1c424bf6d5 docs(tasks): drop the event-anchor gate for style probes, keep the sign-count gate
产品追问:事件题答「没有」不应连带关掉风格题。核实后 varga_style 的
unanchored_varga_style 丢弃分支(method-followup.ts:1261)确实没有道理——风格题
只看该分盘上升星座,不依赖事件。本单删除该分支。真正该留的是区分力门:候选在该
分盘上上升星座少于两种时探针本就不生成(candidate-contrast-packet.ts:610),本案
三个候选 D9 同为天蝎,所以感情风格题仍不出现属正确行为;D10 巨蟹/狮子应出现。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 10:01:14 +00:00
Jesse_ChenandClaude Fable 5 c139d5b674 docs(tasks): widen the tie-break decision to always precede the range card
产品在真机上指出「你平时做事」「感情里你倾向」这类性格题从没被问就出了卡。
D1 由「前两名分差 ≤1 才问」放宽为「带年月题问完、出交付卡之前,只要参考题可
用且没用过就先问两道」。性格题权重不变(不淘汰、只 ±1,09-09 决策与 BUG-629/
651 防复发条维持),锚点要求也不放宽:该领域没有带年月事件时那道题本就不出现。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 09:58:56 +00:00
Jesse_ChenandClaude Fable 5 a6381e029b docs(tasks): tie-break before the range card, and make the entry actually respond
参考题 POST 实际成功(ok/choiceReady/focusId),但 requestTieBreak 调的是不带
合并回调的 loadCaseSnapshot(),新助手 turn 不进 messages,题也就没有渲染位置
(BUG-685)。产品拍板方案 A:前两名 posterior 分差 ≤1 时先问两道参考题再出
交付卡,卡上收起按钮(BUG-686)。rangeNarrowHint 无视 declinedTopics,把用户
刚答过「没有/跳过」的线又列一遍(BUG-687)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 09:49:54 +00:00
jesse-ux 9da42c99d2 fix(rectification): keep tied-first from delivering while probes remain (BUG-683/684)
Independent Staging Quality Gate / validate (push) Successful in 13m48s
Independent Staging Quality Gate / publish (push) Successful in 2m6s
tied_first is only terminal when there is no dated probe and targeted collect is exhausted. An unnarrowed opening window cannot announce adopt. Delivered dead choice cards take the delivered gap instead of the repair copy.
2026-09-14 17:06:51 +08:00
Jesse_ChenandClaude Fable 5 e42a62dfac docs(tasks): regression fix brief for premature tied-first delivery
d5a8db0a 把 tied_first 早退放到 coverageBlocks 之前且没有 probe 守卫,新案子
答两题、区间仍是整个开局窗口就判 adopt_representative/can_adopt:true/代表
分钟(BUG-683)。配套测试传 discriminatorProbe: null,与实现语义不一致,所以
没拦住。另立 BUG-684(investigating):交付态下仍有画不出的死卡,delivered
终态因要求无题而不触发,界面仍印「没有拿到下一个问题」。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 08:33:17 +00:00
jesse-ux d5a8db0a4e fix(rectification): deliver range cards on tied first place instead of falling back to collect (BUG-680/681/682)
Independent Staging Quality Gate / validate (push) Successful in 17m18s
Independent Staging Quality Gate / publish (push) Successful in 13m52s
Refresh persist failures no longer count as attempts. tied_first completes with a range before stillNeedNarrowing. Delivery narration and cards share DELIVERY_OUTCOMES. The question gap gets a delivered terminal so the unavailable copy does not appear after a range is given.
2026-09-14 15:41:04 +08:00
Jesse_ChenandClaude Fable 5 e59ef9fbfd docs(tasks): brief for delivery narrated while decision falls back to collect
tied_first 并列到顶时,persistNextInterviewIfIdle 因刷新尝试「落库失败仍回报
已尝试」而在第二次计算时判交付并播出结论,GET 重算又回到 collect_evidence 且
清零交付能力(BUG-680)。交付话术闸门认 completed_with_range/provisional_range,
交付卡闸门只认 ADOPT_OUTCOMES,能说不能画(BUG-681)。缺口状态机没有终态,
兜底印「没有拿到下一个问题」(BUG-682)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 07:00:55 +00:00
jesse-ux b50a8f94ac fix(ci): update DESIGN contract after hanging spoken questions (BUG-679)
Independent Staging Quality Gate / validate (push) Successful in 10m36s
Independent Staging Quality Gate / publish (push) Successful in 7m40s
Quality gate run 2598 failed because the unwritten-evidence test still required the old persisted-question DESIGN sentence. Align the assertion with the BUG-678 hang-back contract.
2026-09-14 13:43:03 +08:00
jesse-ux 2dbcf2661b fix(rectification): hang spoken year follow-ups and drop engine representative from model tables (BUG-678/676)
Independent Staging Quality Gate / validate (push) Failing after 11m54s
Independent Staging Quality Gate / publish (push) Skipped
Spoken collect without askedTurnId now hangs on the last assistant message, remaining-candidate copy uses credible_range, and engine representativeTime no longer keeps eliminated minutes in model house tables.
2026-09-14 12:12:27 +08:00
Jesse_ChenandClaude Fable 5 a5acd535d5 docs(tasks): brief for spoken-question orphans and engine representative time
BUG-675 的挂回规则只覆盖选择题,定向补事的年份追问仍掉进 persisted_question
纯文本块,无头像裸行(BUG-678)。同屏两个范围口径:采集文案用活跃候选首尾、
时间轴用 credible_range。BUG-676 依产品提供的 candidates 收敛:前端推理自洽,
05:14 来自引擎自身排序,界面未显示,但它被 case-receipt-projection 算进活跃
时间,已淘汰分钟的宫位表因此进了模型上下文。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
2026-09-14 03:47:30 +00:00
jesse-ux d021bca5e1 fix(ci): clear leftover .venv before Python 3.14 venv create (BUG-677)
Independent Staging Quality Gate / validate (push) Successful in 12m2s
Independent Staging Quality Gate / publish (push) Successful in 2m8s
Staging gate run 2594 died in Install dependencies with FileExistsError on a reused hostexecutor .venv. Remove the leftover directory and create the venv with --clear so Python 3.14 mkdir does not abort the job.
2026-09-14 09:49:25 +08:00