Commit Graph
425 Commits
Author SHA1 Message Date
Jesse_ChenandClaude Fable 5.1 1c95eb3979 docs(tasks): brief for secondary-page new-chat landing on last session
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 19:59:24 +08:00
jesse-uxandClaude Code 6b53d9bb5b docs: record BUG-1011 green gate and staging deployment
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 19:17:40 +08:00
jesse-uxandClaude Code 018b2b4883 fix(test): stream large report snapshot SQL
Independent Staging Quality Gate / validate (push) Successful in 11m8s
Independent Staging Quality Gate / publish (push) Successful in 3m52s
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 18:51:08 +08:00
Jesse_ChenandClaude Opus 5.5 451a58089a docs(tasks): correct how BUG-1011 must be fixed
Gate run 2857 on 36a73761 ran 3,762 tests with one failure, the report
snapshot database test, so it is the last thing between staging and a deploy.

The brief told the executor to move the shared psql and psqlAs helpers to
stdin. That instruction is withdrawn. The two helpers serve 522 calls across
29 test files, and psql -c runs a multi-statement string as one implicit
transaction. selectAsAuthenticated relies on that: it sets the JWT subject
with set_config(..., true), which lasts only for the current transaction.
Statement-at-a-time execution would run every later RLS query with no user
set, so those tests would stop testing what they claim to test. Five other
files also write their own begin, commit or rollback.

The brief now asks for a separate single-transaction stdin helper with an
explicit maxBuffer, used only by the snapshot test, with a test proving a
transaction-local set_config stays visible. It also says that if the snapshot
test then fails a real assertion, that is a product defect to report, not an
assertion to relax.

Privacy scan on this tree before push: zero findings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 17:29:44 +08:00
jesse-uxandClaude Code 8c2db6874d Merge staging gate acceptance note
Preserve the parallel staging acceptance documentation while retaining the verified run 2857 failure evidence and deployment blocker.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 17:23:53 +08:00
jesse-uxandClaude Code 15036465ee docs: record staging gate result
Record Gitea run 2857 evidence: H1-H3 pass, BUG-1011 remains the sole E2BIG failure, publish skipped, and staging is not deployed. Mark BUG-1012 through BUG-1014 resolved at the code-contract level while retaining the deployment blocker.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 17:18:09 +08:00
Jesse_ChenandClaude Opus 5.5 c91ddfcc14 docs(tasks): accept the staging gate repair
36a73761 fixes exactly the three failures the brief named and adds none:
under Node 22 the frontend goes from 3,748 tests / 26 failing to 3,750 / 23,
and the three that turned green are the breakpoint allowlist, the chat panel
scroll guard and the composer queue contract. Putting isLoading back into
inputDisabled turns the new AST assertion red on its own. The build keeps /
static, first-load gzip moves by 0.001%, and no 375px rule reaches the CSS.

The executor's reading of the real gate log before the fix shows run 2856
failed on exactly four tests, these three and the BUG-1011 database test, so
BUG-1011 is expected to be all that keeps run 2857 red. That still needs the
log to confirm.

Privacy scan on this tree before push: zero findings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 16:55:33 +08:00
jesse-uxandClaude Code 36a737616c fix(frontend): repair staging breakpoint and focus contracts
Independent Staging Quality Gate / validate (push) Failing after 12m24s
Independent Staging Quality Gate / publish (push) Skipped
Merge entry overflow rules into the existing 480px breakpoint, restore picker focus without scrolling, and sync composer and entry contracts without changing page logic. Add AST generation-state guard and both picker close-path regressions.

Validation: targeted 33/33; Chrome isolated components 145 checks; tsc and lint zero errors. Node22 full suite 3706 tests, no lost names or new failures; three target failures fixed, 88 baseline environment/contract failures unchanged. Windows build remains blocked by symlink EPERM. Changed-file privacy check: 11 files, no findings, not a full-repository pass. BUG-1011 remains separate.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 16:31:10 +08:00
Jesse_ChenandClaude Opus 5.5 93cd01dbf9 docs(tasks): brief why the staging gate has been red since 09-22
Staging has not deployed since 1bc6a954. Rerunning the shared frontend
failures under Node 22 splits them in two. Three are real, and each passes on
its parent commit and fails from the commit that introduced it: 45ec4617 adds
a 375px breakpoint outside the allowlist, and 2a3013f2 adds two focus() calls
without preventScroll inside the chat panel and changes inputDisabled without
updating the composer's source contract. The rest fail here only because this
machine has no Docker or rsync; the gate has both, so the executor must read
the gate log rather than infer from local runs.

Privacy scan on this tree before push: zero findings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 16:07:12 +08:00
Jesse_ChenandClaude Opus 5.5 88e89e10d9 docs(tasks): accept the report density fix and brief the database test repair
Acceptance of a12f2c0d against TASK-report-density-fix-20260923: F1 to F6
all pass. On the fixture the fact tables are 130 rows across 600 visible
cells with no engine key, no array index and no long decimal, and every
sourcePath resolves back into the packet. The first major period reads 18
years. Python and TS appendix cleaning are byte-identical. Removing the
writer table guard turns four of its six tests red. Under Node 22 the
frontend goes from 3,730 tests / 26 failing to 3,748 / 26 with an identical
list; the Python quick gate goes from 946 passed / 1 failed to 948 / 0.

One thing still fails: the database test for the report snapshot passes a
428,557-byte SQL string to psql as a single argument, past Linux's 131,072
byte limit, so it dies with E2BIG before reaching Postgres. The snapshot row
has never run against a real database. Recorded as BUG-1011 with a fix brief.

The real-person checklist the executor's tool refused to write is added here.

Privacy scan on this tree before push: zero findings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 15:42:29 +08:00
jesse-uxandClaude Code a12f2c0d26 fix(report): make density facts readable and printable
Independent Staging Quality Gate / validate (push) Failing after 11m4s
Independent Staging Quality Gate / publish (push) Skipped
Unify reader cleanup rules, lock writer table guards, and register the exact fictional timestamp collision. Preserve existing ordinary-report safety contracts and source-data gaps.

Validation: report Node 165/165, final safety 29/29, Python 101/101, Chrome 28/28; both PDFs retain all 130 rows. Full Node 3704 tests with the same 91 baseline failures. Privacy test: 62 passed, 1 failed due to 17 protected-file READ_ERRORs; not a green gate. Build, DB, manual checklist and controlled-login gaps remain documented. User explicitly authorized staging push with these gaps disclosed.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 15:26:25 +08:00
Jesse_ChenandClaude Opus 5.5 0d37bec15a docs(bugs): record the staging history rewrite for BUG-1008
The product owner chose to remove the leaked birth data from staging history.
The three commits after f77a1b5a were rebuilt with their original authors,
dates and messages, changing only the brief to its cleaned text: baeec66f,
f968cb21 and fcca56fe became a7f82dc2, bbd96d3b and abf28321. The new head's
tree is byte-identical to the old one and the leaked blob is absent from the
new history.

The old commits are still served anonymously by their SHA until the Gitea
server garbage-collects, so BUG-1008 stays mitigated rather than resolved.

Privacy scan on this tree before push: one finding, the fixture collision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 14:24:15 +08:00
Jesse_ChenandClaude Opus 5.5 abf2832180 docs(tasks): accept the report density round and remove birth data from its brief
Acceptance of f968cb21 against TASK-report-density-20260922. Tasks 1, 2, 4
and 5 pass; task 3 does not. Under Node 22, the gate's version, the frontend
suite goes from 3,698 tests / 26 failing to 3,730 / 26 with an identical
failure list; / stays static and first-load gzip moves by 0.007%.

Task 3 renders the ordinary report's fact tables as 948 key/value rows whose
labels are engine paths: 447 carry snake_case keys and 521 carry array
indices, down to a Julian day. The brief never specified columns, so the fix
brief does.

The quick gate's new failure is the privacy scan, and two thirds of it is
mine: the brief pushed in baeec66f carried the comparison chart's real birth
date, time and coordinates. They are removed here and recorded as BUG-1008.
The copy in baeec66f's history stays until the product owner decides whether
to rewrite staging. The remaining hit is a five-character collision inside an
engine timestamp of the fictional fixture, reproduced by regenerating from its
declared fictional input.

Privacy scan on this tree before push: one finding, the fixture collision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-23 14:07:20 +08:00
jesse-uxandClaude Code bbd96d3b6b feat(report): add dense personal report appendix
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 10:42:17 +08:00
Jesse_ChenandClaude Opus 5 a7f82dc2a6 docs(tasks): brief the report density and raw appendix round
Same-chart measurement against the upstream PL9 export: 847,632 chars and
8,044 table rows there, 309,357 and 1,478 here. The engine is not the gap --
twenty divisional charts, four KP tables, Ashtakavarga, the six Shadbala
components, Avastha, Sahams and the annual pack all compute today. The report
contract has nowhere to put them: REPORT_SECTION_KINDS has no table kind and
CHART_IDS lists nine charts.

The outgoing raw appendix also leaks 925 distinct engineering identifiers over
3,797 occurrences, including an internal function name, a third-party engine
name and a third-party product's page numbers. The comparison report scores
zero on every one of those.

The decision record states plainly that two BUG-999 guards are overridden for
the appendix channel only; the ordinary prose projection is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-22 21:42:50 +08:00
Jesse_ChenandClaude Opus 5 c6d421edba docs(tasks): 校正会话标题改写结果而非日期(BUG-1001)
BUG-988 后标题日期与副标题重复,且 BUG-929 删 uniquify 后同日多条
标题相同。产品拍板标题承载 accepted/confirmed 分钟或 candidate_range,
存量批量重算。红线:不得 bump updated_at,标题算式只能有一处实现。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-22 13:24:23 +08:00
jesse-ux 3fed71ab6d docs(tasks): record the icon audit review SHA
Independent Staging Quality Gate / validate (push) Failing after 10m0s
Independent Staging Quality Gate / publish (push) Skipped
2026-09-22 13:07:16 +08:00
jesse-ux 17c5b10cff docs(web): record the icon and motion audit without swapping icons 2026-09-22 13:07:04 +08:00
jesse-ux 90eaf24454 docs(tasks): record the starter-entry review SHA
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate (push) Canceled after 1m53s
2026-09-22 13:05:25 +08:00
jesse-ux 45ec46176d fix(web): soften the home entry pill borders 2026-09-22 13:05:07 +08:00
jesse-ux 92e79642d2 docs(tasks): mark the chat person picker ready for review
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate (push) Canceled after 5m53s
2026-09-22 12:59:20 +08:00
jesse-ux 6d06fca0d8 docs(tasks): mark four meeting implementations ready for review
Independent Staging Quality Gate / validate (push) Failing after 14m17s
Independent Staging Quality Gate / publish (push) Skipped
2026-09-22 12:16:41 +08:00
jesse-uxandClaude Code 10baeb2fa8 docs: split meeting product work into task books
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-22 11:19:35 +08:00
jesse-ux 1bc6a954c5 docs: record BUG-995 fix SHA 2503c019
Independent Staging Quality Gate / validate (push) Successful in 10m27s
Independent Staging Quality Gate / publish (push) Successful in 3m29s
2026-09-22 00:59:50 +08:00
jesse-ux 2503c0190b fix(test): passthrough stdout mocks so smalltalk TAP is visible
BUG-995: privacy tests were swallowing node:test TAP by replacing process.stdout.write without calling through.
2026-09-22 00:59:36 +08:00
Jesse_ChenandClaude Opus 5 26c1fbc6eb docs(tasks): 隐私测试接管 stdout 吞掉运行器报告(BUG-995)
consultation-smalltalk.test.ts mock process.stdout/stderr,
node:test 的 TAP 也走 stdout,四条用例只上报 1~4 条,
失败时只剩一行 not ok <文件路径>。修法是 mock 透传。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 23:10:53 +08:00
Jesse_ChenandClaude Opus 5 c954fb8e67 docs: BUG-991/992 收口,补真机走查清单
门禁 run 2837 全绿、d2cec179 已部署、retire 迁移已应用。
五条只有真人能验的写成 docs/testing 清单。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 19:40:24 +08:00
jesse-ux d2cec17995 test: stop requiring retired archive entrypoints in Python contracts
Independent Staging Quality Gate / validate (push) Successful in 11m24s
Independent Staging Quality Gate / publish (push) Successful in 3m45s
Flip archive tokens to must-not-appear on the session row and session hook only. Keep writeChatSession POST/PATCH and assert delete still uses DELETE. Grep tests/ before deleting frontend symbols.
2026-09-21 19:20:45 +08:00
Jesse_ChenandClaude Opus 5 d3e0edfd1b docs(tasks): 归档下线验收结论与修复单(BUG-992)
5a4b8738 业务三层均正确;门禁 run 2836 红在两条 Python 源码合同
仍要求归档入口存在。同类第四次(933/934/939),防复发落到
frontend/AGENTS.md 的 grep 口径。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 19:09:44 +08:00
jesse-ux 5a4b87383f fix(web): retire session archive UI and API, restore archived rows
Independent Staging Quality Gate / validate (push) Failing after 6m35s
Independent Staging Quality Gate / publish (push) Skipped
Remove archive/restore from the session menu and drop archived=1 listing. PATCH still accepts archived_at from old bundles then ignores it. A forward migration clears archived_at without bumping updated_at. Delete stays unchanged.
2026-09-21 18:49:40 +08:00
Jesse_ChenandClaude Opus 5 f8cb1dcdee docs(tasks): 归档能力整体下线任务书(BUG-991)
产品拍板下线而非装回入口:删前端链路与 ?archived=1,
迁移清空存量 archived_at(不 bump updated_at),列留待后轮。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 18:22:52 +08:00
Jesse_ChenandClaude Opus 5 11e4d5ff09 docs: 会话列表修复单验收通过,BUG-990 收口并更正影响面,新增 BUG-991
门禁 run 2833 全绿、df329fa9 已部署,987~990 回填修复版本。
归档视图的 UI 入口在 92558ee6 就已删除,BUG-990 的用户现象描述更正;
归档后无法查看与恢复记为 BUG-991,待产品决策。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 18:17:31 +08:00
jesse-ux df329fa96c fix(web): support PostgREST not(col, is) so archived session lists load
Independent Staging Quality Gate / validate (push) Successful in 10m31s
Independent Staging Quality Gate / publish (push) Successful in 3m37s
Local Postgres not() only handled eq/cs, so archived=1 threw and the sidebar archive view returned 500. Compile is not null/true/false instead of inequality.
2026-09-21 17:45:07 +08:00
Jesse_ChenandClaude Opus 5 70d595e361 docs(tasks): 会话列表重建验收结论与修复单(BUG-990)
e71e4f92 三条实现均通过独立复跑;门禁 run 2832 红在兼容层
not(col,"is",null) 未实现,归档视图自 a1956deb 起 500。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 17:33:03 +08:00
jesse-ux e71e4f9200 fix(web): keep rectification sessions listed and persist chats on first send
Independent Staging Quality Gate / validate (push) Failing after 16m52s
Independent Staging Quality Gate / publish (push) Skipped
Empty-consultation filtering is now session_type scoped so birth-time rows stay in the sidebar. Subtitles use updatedAt with sort/group/cursor. New chats stay local until the first send.
2026-09-21 16:39:32 +08:00
Jesse_ChenandClaude Opus 5 f8d65e484d docs(tasks): 会话列表重建任务书(BUG-987~989)
校正会话被 messages<>'[]' 整类过滤掉、副标题与排序不同源、
新建复用旧空草稿。产品拍板副标题改最后活动时间、第一问前不落库。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 16:11:04 +08:00
Jesse_ChenandClaude Opus 5 27a6c39b94 docs: 回填跨午夜日期锚点的合入状态与验收结论
b85c4a68 已由 Claude 独立验收后快进合入 staging。BUG-982/983 的「修复版本」
原写「本地未提交实现,未推送/部署」,与实际不符,改为记录实现 SHA 与合入
事实;两条状态仍保持 investigating,因为部署与真人验收未完成。

验收证据回填状态板:用当初复现两条 Bug 的同一探针重跑——983 的申报分钟
落回申报日、late_night 300 个候选全在同一日两段;982 的跨午夜三分钟簇由
1440 变 3,同日两段为 300 未糊成一段。非跨午夜同机 A/B 6/6 逐位相同,新
测试基线 6 红修复后全绿,Python 组 216→272 零失败,tsc 0。

同时记下遗留待确认项:无 cluster_intervals 的行仍走旧按钟点算法,需确认
除修复前旧缓存外没有别的生产路径会产生无日期行。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-21 09:25:56 +08:00
jesse-ux b85c4a686a fix(rectification): anchor candidate windows to civil dates across midnight
Independent Staging Quality Gate / validate (push) Successful in 13m27s
Independent Staging Quality Gate / publish (push) Failing after 1h0m1s
Carry explicit local date intervals instead of inferring the day from clock
order. Cluster width, delivery, adoption, and reports keep the actual civil
date; adopted date is stored separately from the reported birth_date.

Algorithm identity is scoring-9 / spec-v5. Scoring weights, confirmation
thresholds, and Skill version are unchanged. Isolated Linux final-3 gates
passed; four pre-existing Python failures remain. This is not a production
release.
2026-09-21 02:55:00 +08:00
Jesse_ChenandClaude Opus 5 3be740f84d docs(tasks): 跨午夜日期锚点单三点拍板,转待领取
D1 late_night:选 late_night 时追问一次「午夜前还是午夜后」,答不上退
同日两段 [D 00:00–03:59] ∪ [D 23:00–23:59],一律不得跨到 D+1。写明连锁
范围:退路会产生不连续候选集,枚举、聚类、簇跨度、交付区间、宽度与交付
卡都要支持两段,不得用「取两段最小到最大」糊成一段。

D2 允许窗口跨到前一天,附带义务是交付层必须说明「若落在 23:5x 则出生
日期是前一天」,不得静默改用户的出生日期。

D3 加窗口相对序号,排序取首尾算跨度一律用序号,钟点只作展示。序号入
契约会改候选身份与缓存指纹,验收必须核对 BUG-984 的身份校验并确认历史
结果只读不被重标。

让步顺序补一条:追问可先上、两段退路后上,但退路就绪前 late_night 宁可
只搜后半夜并说明,也不得搜到用户没申报过的日期。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 20:24:09 +08:00
Jesse_ChenandClaude Opus 5 8aa5f6a444 docs(tasks): 跨午夜日期锚点与簇跨度任务书(BUG-982 + BUG-983)
两条 Bug 都实测复现,合并成一单,因为根因相同:契约只传钟点、日期不在
契约里,后端按钟点大小猜哪端跨日。

BUG-983 是静默算错盘:_candidate_datetimes() 把起始钟点无条件绑在申报
日期上,前端零补偿。实测申报 00:10 / 申报日 2000-06-15,申报分钟本身
落到 06-16 00:10,整套盘算在错误日期上。late_night 更重:其 00:00–03:59
共 240 分钟全部落在用户没有申报过的日期上。983 不修,BUG-981 的候选级
日期修复在这批人身上等于没上线。

BUG-982 影响面比原记录大:同缺陷在 _cluster_span、unionStillValidRange、
indistinguishableWidthMinutes 三处出现,原记录只写了 Python 两处。实测
跨午夜三分钟簇被报成 1440 分钟,且该链直达交付卡的「范围 X 分钟」。

三个待决点:late_night 的语义(按出生证明口径两段都在同一日,现行实现
一半落在次日)、申报贴近午夜时允不允许窗口跨到前一天、日期怎么进契约。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 20:15:30 +08:00
jesse-uxandClaude Code 8d0359fc62 fix(rectification): enforce trusted result identity and preserve receipt provenance
Independent Staging Quality Gate / validate (push) Successful in 10m4s
Independent Staging Quality Gate / publish (push) Successful in 10m26s
Unify minute and block cache identity, keep unverifiable historical results read-only across server tools and write entrypoints, and aggregate completed receipt sources chronologically through a compatible function migration.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 18:03:38 +08:00
jesse-uxandClaude Code d575e89a83 fix(rectification): stop stamping pending receipts and document aggregate blocker
Implement BUG-984 F2 option A and reproduce mixed completed identities through real tools. Stop at the required SQL authorization boundary; F1/F3/F4 remain pending.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 15:55:09 +08:00
Jesse_ChenandClaude Opus 5 f09f3d809a docs(tasks): 把 F2 的 engine_version 聚合缺陷查清并定序
复核结果写进 F2:engine_version 一个字段被两种含义共用——started/failed
行写前端常量(部署声称的版本),completed 行写实际产出结果的版本(命中
旧缓存即旧版本)——而聚合用与版本先后无关的字符串 max 跨行取值。

该缺陷此前一直撞对:改动前 started 写 rectification-v5,短于 completed
的 ...scoring-7,max 恰好选中正确的那行。aa46da10 把 v9EngineVersion()
缺省改成 ...scoring-8 之后,started 行在字符串序上反超,回执遂显示第 8 版
而分数实际来自第 7 版缓存。已核部署未设该环境变量,走缺省,是真实行为。

第二个缺陷:max("...-10","...-9") 实跑得到 "...-9",聚合在第 10 版静默
反向,当前第 8 版。

定序 A 先上(started/failed 不再写版本,应用层)、B 兜底(聚合改取成功
结果那一行,只改函数体)、C 拆列本单不做;第 10 版前必须解决。A 的已知
漏洞要求实测取证,不得以「应该不会」结案,并新增一条针对版本 10 反向的
回归。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 15:34:49 +08:00
jesse-uxandClaude Code 3f39bafc4a docs: record staging authentication blocker before BUG-984
Independent Staging Quality Gate / validate (push) Successful in 12m48s
Independent Staging Quality Gate / publish (push) Successful in 14m50s
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 15:15:52 +08:00
jesse-uxandClaude Code b27d4de963 merge: accept cross-midnight gate fix and sync approved cache task
Resolve BUG-985 using independent third-environment review recorded in 0ca3871d. Retain staging's complete BUG-984 task and approved read-only policy.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 15:13:59 +08:00
Jesse_ChenandClaude Opus 5 a3577ce2fa docs(tasks): BUG-984 的 F3 策略拍板选 b,四项全部可开工
产品 2026-09-20 拍板:版本接口取不到可信身份时,旧缓存只读展示并显著
标注「按旧算法产出」,不拒绝重算(否决 a)、不照常复用(否决 c)。

写入 b 的三条边界:只读结果必须由服务端拒绝采用/确认且要有定向用例
(入口靠删不靠藏);标注必须用户可见并对照 VOICE.md,涉界面同提交更新
DESIGN.md;回执来源身份仍须是产出它的版本,不被开始阶段版本覆盖。

SQL 迁移不放开:F2 优先应用层解决,做不到先在进度记录写明原因并停下
报告,获准后再做且必须向后兼容并真跑 test:db。

F3 解锁,本单四项全部可开工。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 15:09:10 +08:00
Jesse_ChenandClaude Opus 5 0ca3871dd8 docs(tasks): BUG-984 补单转待领取 + gate-fix review 通过结论
review 25232ce4 通过:F1 改为同进程 A/B(在 helper 调用边界剥掉
candidate_at 走生产既有 legacy 回退),另加两道防空转保险。独立复核:
写死哈希 0 残留;第三套环境(Linux + Python 3.13)定向 18 条全绿,两机
验收闭环;回退日期修复探针同日 3 绿、跨午夜 4 红,两种性质已真正分开;
快速门 glob 200 passed/0 failed → 216 passed/0 failed,零新增失败。
建议 BUG-985 由 blocked 改 resolved。

BUG-984 补单按产品放行转待领取:F1/F2/F4 可立即开工,F3 卡在一条未拍板
策略(版本接口取不到可信身份时旧缓存拒绝重算还是只读展示),已列三方案
与代价并给出建议 b。补单文件原只在分支上,本次以分支最新版为底写入
staging,分支合并时该文件取 staging 版即可,不会丢内容。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 15:05:45 +08:00
jesse-uxandClaude Code 25232ce4ce test(rectification): compare same-day scores against legacy path in process
Replace machine-specific float hashes with strict score and matrix byte comparisons. Keep quick bridge coverage and document duplicate collection. Verify Windows/Linux float behavior and in-memory candidate-date reversal; record the separate-machine acceptance gap and BUG-984 end-to-end blocker.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 14:38:29 +08:00
jesse-uxandClaude Code 777bd53d7e merge: sync staging task sheet into cross-midnight gate fix
Preserve both the reviewed implementation and latest staging records. No production scoring changes beyond aa46da10.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 14:19:17 +08:00
Jesse_ChenandClaude Opus 5 1b646659e7 docs(tasks): 跨午夜 review 修复单(BUG-985)+ aa46da10 review 结论
review aa46da10:核心修复通过。修复后整窗打分与逐候选独立重算 21/21 一致;
非跨午夜分数基线与修复逐位不变(半径 10 六例 + 半径 60 三例,执行方证据
覆盖 19 例 2299 候选);打分常数一个未动;确认门仍关闭;决策 C 执行正确。

P1 阻塞:新增回归把 121 个浮点分数的 SHA-256 写死成字面量。在本机 ordinal
2/3 红,且基线与修复分支同样红,不是修复所致。该组 121 个分数全无浮点尾噪,
差异是第 4 位真的不同,靠改序列化消不掉。它经 gate bridge 落入快速门 glob,
同 glob 基线 214 passed/0 failed、aa46da10 4 failed,推 staging 会让门禁红。

根因是把相对不变量实现成了绝对不变量。F1 改用生产代码已有的 legacy 回退
路径做同机 A/B 对照,验收要求两台浮点环境不同的机器各跑一次。F3 查证
block_scan 重算是否经过被修 helper,它决定 BUG-984 是否为 BUG-981 的阻塞项。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
2026-09-20 14:07:23 +08:00