Commit Graph
2352 Commits
Author SHA1 Message Date
Claude 945e86911a Merge remote-tracking branch 'origin/staging' into codex/consult-dasha-horizon-20261105
Independent Staging Quality Gate / validate-python (push) Successful in 6m24s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m28s
Independent Staging Quality Gate / publish (push) Successful in 2m37s
2026-11-06 01:12:14 +08:00
ClaudeandClaude Opus 5.5 c0860e9638 fix(chat): queued question and 开新对话 survive leaving Home (BUG-1642 follow-up 2)
- The question queued during a reply lives in the session store, keyed by
  chat and by the reply it waits for. A mounted Home sends it to that chat
  once the reply completes, or puts it back in that chat's composer; nothing
  is sent from another page with a stale Home closure.
- The full-chat notice's 开新对话 records a carry-over in the store and
  returns to Home if needed; the mounted Home opens the new chat with the
  question, linked to the full chat.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-06 00:33:55 +08:00
ClaudeandClaude Opus 5.5 378e875d9d docs(bug-history): BUG-1643 ships to staging
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-06 00:29:37 +08:00
Claude 84960c6c52 Merge remote-tracking branch 'origin/staging' into codex/consult-dasha-horizon-20261105
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-06 00:29:29 +08:00
ClaudeandClaude Opus 5.5 cf04be2ace docs(bug-history): BUG-1643 dasha horizon on the consult card, with blind eval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-06 00:28:41 +08:00
ClaudeandClaude Opus 5.5 e478280596 fix(chat): a run's error and handed-back question reach the Home the user is on (BUG-1642 follow-up)
- requestError and replyOutcome move from Home state into the session store;
  a Home remount keeps them, a new session-list provider drops them.
- A stop or an uncommitted reservation hands its question back through the
  store (composerRestore); use-composer-restore puts it into that chat's
  composer whenever the chat is open, on the Home mounted now or later.
- While a stop is still being confirmed the question stays with the stopped
  chat, so switching rows no longer loses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-06 00:15:17 +08:00
Claude a190d0660b Merge remote-tracking branch 'origin/staging' into codex/chat-background-run-20261105
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-06 00:01:29 +08:00
ClaudeandClaude Opus 5.5 a01289515d fix(chat): other chats open while a reply generates; coming back attaches to the live reply (BUG-1642)
- Sidebar rows always open; a reply in flight locks only their menu and drag.
  新建对话 is no longer locked by generation.
- The in-flight run's refs live in lib/consultation-run-refs.ts instead of
  Home's useRefs; a Home remount keeps the store's run fields while a run is
  live, so the Home that mounts on return attaches to the same stream instead
  of starting a second recovery that the first closure then cleared.
- Completion drops the tab's pending-consultation record for that request.
- One reply at a time is unchanged (client send guard and queue).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 23:59:31 +08:00
ClaudeandClaude Opus 5.5 efceab8a2a feat(reports): report queue lanes — two at once with a short-report lane, waiting screens show the expected wait
Independent Staging Quality Gate / validate-frontend (push) Failing after 4m38s
Independent Staging Quality Gate / validate-python (push) Successful in 6m35s
Independent Staging Quality Gate / publish (push) Skipped
Every report type already queued in personal_report_jobs, one at a time per
server. The worker now runs PERSONAL_REPORT_WORKER_CONCURRENCY lanes (default
2); the second takes only annual and synastry reports so they never wait
behind long personal reports. claim_personal_report_job gains an optional
report-type filter; personal_report_queue_view (owner-only, security definer)
gives the wait, shown as a single line on the annual, personal and synastry
waiting screens. Also keeps the privacy whitelist line numbers in
personal-report-api.test.ts unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 23:41:31 +08:00
ClaudeandClaude Opus 5.5 6c11dfd335 fix(reports): paid reports have no daily or hourly cap; a failed run is never counted (BUG-1641)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 23:29:17 +08:00
ClaudeandClaude Opus 5.5 f0aab44065 docs(bug-history): BUG-1632 / BUG-1633 ship to staging
Independent Staging Quality Gate / validate-python (push) Successful in 6m34s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m33s
Independent Staging Quality Gate / publish (push) Successful in 4m10s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 22:44:05 +08:00
Claude cf08be14c0 Merge remote-tracking branch 'origin/staging' into codex/consult-career-field-20261105
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-05 22:43:59 +08:00
ClaudeandClaude Opus 5.5 b1775a4439 docs(bug-history): BUG-1632 / BUG-1633 with the blind eval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 22:19:04 +08:00
ClaudeandClaude Opus 5.5 ca35ef2061 feat(annual): plain voice — life-first copy from a plain-language layer, one paragraph per area, months allowed (BUG-1640)
The writer now reads houses as parts of life, turning points as plain sky
sentences and months instead of dates; a one-page guide with passages from
the approved sample replaces the ban list, and each section sees what the
earlier ones said. Areas are one paragraph plus a 记住 line; window cards
show topic and action with a folded plain 为什么.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 22:12:50 +08:00
ClaudeandClaude Opus 5.5 1ef62f30ec feat(chart): 盘面数据 fills its card — 八分法 spans the width, every yoga shows with what it needs (BUG-1639)
Independent Staging Quality Gate / validate-python (push) Successful in 6m30s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m24s
Independent Staging Quality Gate / publish (push) Successful in 2m57s
The 八分法 table is width 100% with fixed columns and full-width 32px cells (a
640px minimum keeps the drag on phones). The 瑜伽 tab lists all eight classical
yogas as a two-column grid: formed ones first and still a pick on the board,
the rest muted with their classical condition, in place of one sentence and a
collapsed 「未满足 N 条」.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 18:31:44 +08:00
ClaudeandClaude Opus 5.5 7bdad0f147 docs(ledger): ERR-118 staging gate red only because the CI Postgres container did not start
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 18:12:47 +08:00
ClaudeandClaude Opus 5.5 1698837486 fix(annual,chart): 年运 starts a new run instead of reopening the last; chart type picker centred on desktop (BUG-1637, BUG-1638)
Independent Staging Quality Gate / validate-frontend (push) Failing after 2m10s
Independent Staging Quality Gate / validate-python (push) Successful in 6m28s
Independent Staging Quality Gate / publish (push) Skipped
- 年运: the page no longer opens the finished report of the same range; only a
  run still being written opens by itself. The server reuses only that in-flight
  run; a finished year no longer blocks a new one, which is charged once like
  any report. The start card says 「这一年已经写过一份,再写一份会另扣 N 点」
  with a link to the last one; history still opens from 过往的报告.
- 星盘类型: from 768px the picker is a centred dialog (560px, full radius);
  phones keep the bottom sheet. The body and the select / close logic are shared.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 18:04:05 +08:00
ClaudeandClaude Opus 5.5 6f24b41381 feat(annual): 这一年怎么走 timeline (option B); body copy drops dasha jargon and method talk (BUG-1636)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-python (push) Canceled after 2m51s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 2m52s
The remaining phases and the windows render as one timeline: phases carry
the program's lean, each window is pinned to its phase, passed ones fold.
Window fields are capped so cards fit without an inner scroll; reports
written earlier keep the old layout. Writer rules and the gate keep dasha
and functional-role words, the counting method and the material itself
out of the body.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 17:53:59 +08:00
ClaudeandClaude Opus 5.5 f4f38f1a54 fix(annual): no more 有顺有紧; windows and 年尾 get the program's lean (BUG-1635)
Lean v2 is a weighted sum (AD 2, Narayana AD 2, PD 1; a tie follows the
Vimshottari AD) with only 偏顺 / 偏紧 / 平稳. Phases with both sides keep a
counterweight limit. Window, domain-window, year-end and remember evidence
carry the lean; the gate rejects mixed wording and a window lean that
contradicts the program.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-05 17:45:38 +08:00
ClaudeandClaude Opus 5.5 876018e127 fix(reports): export sheet redesign; an English export lists itself in English (BUG-1634)
Independent Staging Quality Gate / validate-python (push) Successful in 6m34s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m36s
Independent Staging Quality Gate / publish (push) Successful in 3m33s
The sheet is now a top-to-bottom column with the footer pinned: 导出报告 and
the file type, a full-width 中文 / English segment, two equal radio cards for
整篇 / 自选 (outline and dot only, per issue #90), and in 自选 a title filter
with 全选 / 清空 above a tighter list with sticky group heads. The group names
and the summary follow the chosen edition (Chapters / Charts / Tables, 「95
chapters · 21 charts · 8 tables」); the sheet's own controls stay in the app's
language. Rows in the scrolling body no longer shrink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 17:32:37 +08:00
ClaudeandClaude Opus 5.5 c5331e5530 feat(reports): the full report leads 我的报告, 年运 ranges are radio cards, the reader has one bar (BUG-1631)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 48s
Independent Staging Quality Gate / validate-python (push) Canceled after 57s
Product picked A / B / A on the canvas.
- 我的报告 (A): the full natal report is the one large card with a solid
  生成报告; 年运 is a single row link under it. A report row's hover and focus
  band now spans the link and its ⋯ menu, so a row no longer looks split.
- 年运 start (B): 生日年度 / 公历年 / 未来十二个月 are three single-choice
  cards with a dot, a one-line hint, and the picked card's dates.
- Reader (A): SecondaryHeader gains `back` (‹ 我的报告 /) and the language
  switch and 导出 move into it (ReportActions placement="header"); the second
  bar is gone, the text is no longer in a card on screen (print unchanged),
  the reading column is 720px and the contents rail opens only the current
  chapter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 17:17:29 +08:00
ClaudeandClaude Opus 5.5 3fa0bc574b fix(reports): 生成报告 shows the curtain and opens the report; 年运 veil fills the page (BUG-1630)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m36s
Independent Staging Quality Gate / validate-python (push) Successful in 7m35s
Independent Staging Quality Gate / publish (push) Successful in 2m49s
The report center passed onCreated={() => void load()}, so a successful create
only re-read the list below: no move, no notice, a faint 「正在创建…」 at most.
The button now holds the page curtain while it submits and opens the created
report, whose page shows the writing progress; an error drops the curtain and
says why. The 年运 page took the content's height inside the start-aligned
page grid, so its veil stopped short of the window bottom; it now fills the cell.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 16:59:48 +08:00
ClaudeandClaude Opus 5.5 484b653ce3 feat(rectification): open the case from the click, the home only takes it (BUG-1629)
Independent Staging Quality Gate / validate-python (push) Successful in 7m21s
Independent Staging Quality Gate / validate-frontend (push) Successful in 7m29s
Independent Staging Quality Gate / publish (push) Successful in 3m24s
Direction B for 「为什么不能直接进入生时纠正对话」. The open request, the case
read, the source lookup and the surface chunk now start at the click that
leads to the rectification chat (the /rectification page's 开始 / 继续上次 /
新建一次 / 看结果, and a 生时校正 row in the sidebar off the home), while the
app navigates. The home's openRectificationCase takes that in-flight open
(same target, once, within 30 s) instead of asking again; errors are handled
exactly as before. The offer card inside a conversation still asks itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 16:38:08 +08:00
ClaudeandClaude Opus 5.5 ebb12108b1 docs(bug-history): BUG-1621 career boundary line ships to staging
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 3m3s
Independent Staging Quality Gate / validate-python (push) Canceled after 4m1s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 16:34:19 +08:00
Claude af0c51b387 Merge remote-tracking branch 'origin/staging' into codex/consult-career-line-20261105
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-05 16:33:43 +08:00
Claude d20c802e74 Merge remote-tracking branch 'origin/staging' into codex/astrologer-166c-20261105
Independent Staging Quality Gate / validate-frontend (push) Canceled after 0s
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-python (push) Canceled after 42s
2026-11-05 16:32:28 +08:00
ClaudeandClaude Opus 5.5 ba735aef0a fix(rectification): open a case behind the page curtain, never over the blank home (BUG-1628)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-python (push) Canceled after 6m32s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 6m28s
The /rectification page's 开始 / 继续 go to `/?rectify=…`; the home painted its
blank starter (「正在打开生时校正…」 in the composer) until the case opened
over the network, and a `?c=` rectification session showed the home the same
way until its surface opened. The rectification hook now knows a queued open
from the first render until it settles, and while a case is opening the home
holds the page curtain at once (new `immediate` hold, no 140 ms show delay) and
renders nothing. A failed open drops the hold and shows its error as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 16:26:38 +08:00
Claude d9598e9319 Merge remote-tracking branch 'origin/staging' into codex/astrologer-166c-20261105
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-05 16:25:40 +08:00
ClaudeandClaude Opus 5.5 a9d0edffe4 docs(bug-history): BUG-1621 career boundary line and BUG-1620 follow-up with the blind eval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 16:25:32 +08:00
ClaudeandClaude Opus 5.5 db0acb2a21 feat(chart): give the board the card's area — two control rows, drawing up to 720px (BUG-1627)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate-frontend (push) Canceled after 5m57s
Independent Staging Quality Gate / validate-python (push) Canceled after 6m2s
Direction A from the layout canvas. The visible 北印度盘 title row goes (the
name stays for screen readers); row one keeps the chart type strip; row two
puts the caption (D1 · ascendant · degree) on the left and the 图层 menu plus
a compact 北 / 南 switch on the right. The caption loses its tinted 44px strip,
the degree never yields to the dasha chips (they shrink, then hide under
600px), and the drawing may grow to 720px. The skeleton follows the same two
rows; skeleton motion is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 16:17:11 +08:00
ClaudeandClaude Opus 5.5 e54fb6f35c test: repoint the composer handler slices after the home curtain hold (BUG-1613)
Independent Staging Quality Gate / validate-python (push) Successful in 6m41s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m49s
Independent Staging Quality Gate / publish (push) Successful in 2m56s
Three contracts cut page.tsx's Enter handler at "\n\n  if (!hydrated",
which became "const booting = …" when the home started holding the shell's
page curtain. Two failed in the staging gate (run #2196); the IME contract
passed only because indexOf returned -1 and sliced to the end of the file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 15:41:14 +08:00
ClaudeandClaude Opus 5.5 7827d9aff0 chore(rectification): re-freeze after the BUG-1622..1626 renumber (ERR-110)
The renumber (093da446) changed comments in shadbala.py and both replay
scripts, so the frozen identity moved. On top of staging 849343cd:
FREEZE / REPORT constants first, --freeze, then replay:
astrologer_166d_2026_11_05; contract rotated with previous =
astrologer_166c_2026_11_05 (kept byte-for-byte).

Versus astrologer_166c_2026_11_05 and astrologer_166b_2026_11_04: sealed 20
and reported offset 900 all identical, metrics and summary identical,
historical changed_trial_count 10 / 731. Still scoring-15; no tuning.
BUG-1622 records the second re-freeze.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:35:31 +08:00
ClaudeandClaude Opus 5.5 093da4468d docs: renumber this branch's records BUG-1613..1617 -> BUG-1622..1626
Another session shipped a different BUG-1613 (loading curtain) to staging.
Mapping in order: 1613->1622, 1614->1623, 1615->1624, 1616->1625,
1617->1626, in BUG_HISTORY headings and bodies, CHANGELOG, ledger, research
notes, code comments, rule text, test notes and the holdout contract text.
Text only. shadbala.py and the two replay scripts are in the frozen identity,
so an ERR-110 re-freeze follows in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:32:05 +08:00
ClaudeandClaude Opus 5.5 7174fda7a9 refactor(arudha): move the PVR dual-lord selector into scripts/arudha_reference/ (BUG-1617)
The quick gate's tests/test_python_hygiene_budget.py caps root scripts at 441
("locally written files must not increase"); the new module made it 442.
Moved to the subpackage scripts/arudha_reference/pvr_dual_lord.py; CLI
import tries both import styles; tests, BUG-1617 and the status table updated.
No frozen file touched; behaviour unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:31:51 +08:00
ClaudeandClaude Opus 5.5 d2f65211a7 docs(bug-history): BUG-1613..1617 for the #166 2026-11-05 astrologer reply; ledger and CHANGELOG
BUG-1613 Saptavargaja Moolatrikona provisional label, D9 in-varga label,
V.P. Jain provenance; BUG-1614 Mercury nature relabel, Drik Mercury / Jupiter
label, 26.11-12 endpoints; BUG-1615 strict Gajakesari malefic Mercury;
BUG-1616 Matrunasa labels and 199 text; BUG-1617 opt-in PVR Arudha
dual-lord selector. Re-freeze astrologer_166c_2026_11_05 recorded under
BUG-1613 (replay identical to astrologer_166b_2026_11_04).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:31:51 +08:00
ClaudeandClaude Opus 5.5 3c81ebf3cf chore(rectification): re-freeze sealed holdout and offset sweep for the #166 2026-11-05 labels (ERR-110, BUG-1613..1617)
shadbala.py (frozen identity) changed in 5ffef30a: labels, comments and the
shared mercury_malefic_companions() helper, no value change. Scoring identity
stays rectification-v5-matrix-scoring-15; no ALGORITHM_VERSION bump.

FREEZE / REPORT constants first, --freeze, then replay (after all code
commits of this branch, 09fd3a42): astrologer_166c_2026_11_05; contract
rotated with previous = astrologer_166b_2026_11_04 (kept byte-for-byte).

Versus astrologer_166b_2026_11_04, trial by trial:
- sealed 20: all identical; metrics identical (top-1 0.40, top-3 0.45, mean
  minute error 6.95); historical changed_trial_count still 10.
- reported offset 900: all identical; summary identical (top-1 hits at
  +-15/30/60 4/3/0, top-3 31/34/30, delivery coverage at +-15 219, mean top-1
  minute error 20.52); historical changed_trial_count still 731.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 6e10c7242e docs(moolatrikona): label the in-varga D9 Moolatrikona as pending; correct the V.P. Jain provenance (BUG-1613)
Astrologer 2026-11-05 (#166 comment 39249, item 1). No calculation change.

- jyotish_engine.VARGA_MOOLATRIKONA_BASIS = in_varga_degree_band_pending_review:
  a D9 Moolatrikona is decided by the in-varga degree inside the D1 band;
  whether / how Moolatrikona applies in vargas is pending. Written on each
  d9_navamsa_expanded row (moolatrikona_basis) and on the consultation D9
  summary (not copied to the evidence card).
- "V.P. Jain example" corrected to "PyJHora test transcription"
  (pvr_tests.py::shadbala_VPJainBook_tests, no edition or page) in the data
  audit notes and the competitive analysis (ERR-081 recurrence).
- astrologer_questions.md: status table of the seven 2026-11-05 items.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:31:43 +08:00
ClaudeandClaude Opus 5.5 849343cd21 feat(ui): one loading curtain for every page entry, drawn as a North Indian chart (BUG-1613)
Independent Staging Quality Gate / validate-frontend (push) Failing after 4m52s
Independent Staging Quality Gate / validate-python (push) Successful in 6m55s
Independent Staging Quality Gate / publish (push) Skipped
- New ChartDrawLoader (direction B from the loader canvas): outer square,
  diagonals, inner diamond drawn in turn, the lagna house lights, repeat.
  Still under prefers-reduced-motion.
- PageCurtain moves into the app shell: in the server HTML, full window over
  sidebar and page, held by usePageCurtain. Cold load shows it from the first
  paint; in-app navigation shows it only after 140 ms (pages already in memory
  never flash it), keeps it at least 650 ms, fades in 360 ms; one hold lets go
  after 12 s. The main.app-loading DOM contract is kept for the first-paint
  fallback and stale-client recovery on every page.
- Held by: home (with the natal panel), chart (first entry only), people,
  reports list, opening a report, ephemeris, annual, rectification entry,
  synastry picker. Home's own curtain (boot-curtain.tsx) is removed.
- The in-page waits that remain (dasha layer, people dropdown, birth editor,
  birth-time assessment, report and synastry writing) use the same motion at
  small size. Skeletons keep their motion: switching person, system or layer
  on the chart still shows them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 15:29:37 +08:00
ClaudeandClaude Opus 5.5 5ec2ac8424 revert(consult): ship health only; career rule and checklist back to staging wording (BUG-1621)
The career rewording did not clear the blind-eval bar (severe 43 -> 36, CI
includes 0; claims moved to 「不在台面上」). CAREER_FIELD_ASK_RULE, the AL
checklist line and their test go back to 928aa5c6. BUG-1620 is marked for
staging, BUG-1621 stays investigating (next: a server card line).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:24:54 +08:00
ClaudeandClaude Opus 5.5 270b908dc1 docs(bug-history): BUG-1620 test count
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:21:09 +08:00
ClaudeandClaude Opus 5.5 fd03665ded docs(bug-history): BUG-1620 / BUG-1621 with the four-round blind eval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 15:20:38 +08:00
ClaudeandClaude Opus 5.5 172a270b69 feat(home): one boot curtain over all three columns; natal panel ready at reveal (BUG-1613)
- The cold-boot loader now covers the whole window (sidebar, chat, natal
  panel) and fades off the finished page instead of cutting to it.
- The natal panel's code and chart load behind the curtain and count in the
  reveal gate (same 4 s prepare budget); the home HTML sends the chart read
  in its first round, and ChatChartFrame takes the preloaded module in its
  first render.
- Before the viewport is measured the shell frame is "pending" and sized by
  media query plus the remembered width (sync <head> script), not by its
  content, so the sidebar no longer starts ~184px wide and jumps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 14:46:10 +08:00
ClaudeandClaude Opus 5.5 928aa5c62b docs(bug-history): BUG-1603 / BUG-1604 ship to staging after the four-round blind eval
Independent Staging Quality Gate / validate-python (push) Successful in 6m27s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m34s
Independent Staging Quality Gate / publish (push) Successful in 3m0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 12:53:22 +08:00
ClaudeandClaude Opus 5.5 c41cd4b848 docs(bug-history): BUG-1603 / BUG-1604 round-2 fixes and the four-round blind eval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 12:53:08 +08:00
ClaudeandClaude Opus 5.5 29b97336d3 docs(bug-history): BUG-1603 answer shape and leaked phrases, BUG-1604 age line for marriage and career
Status investigating: the blind eval completed round 1 only (the model API
returned 402 Insufficient Balance from round 2 on).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 12:53:02 +08:00
ClaudeandClaude Opus 5.5 2057538c81 fix(skills): create the skill runtime alias root on first use and remove it at exit (BUG-1612)
Independent Staging Quality Gate / validate-python (push) Successful in 6m27s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m31s
Independent Staging Quality Gate / publish (push) Successful in 2m58s
Every node process that imported skill-package-registry left a
jyotisha-skill-runtime-* directory in the OS temp dir (9,933 on the shared
host, most of them empty), which helped exhaust inodes (ERR-117).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 12:04:26 +08:00
ClaudeandClaude Opus 5.5 365f86ff33 fix(annual): a run that fails halfway keeps the sections it wrote (BUG-1611)
Independent Staging Quality Gate / validate-python (push) Successful in 6m23s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m27s
Independent Staging Quality Gate / publish (push) Successful in 2m53s
The page swapped the saved partial snapshot for the skeleton as soon as the
report turned failed. Render the snapshot whenever it exists; unwritten
sections say so instead of shimmering. Log the error class before the
section failure is folded into model_unavailable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 11:45:32 +08:00
ClaudeandClaude Opus 5.5 d655e6975c docs(ledger): ERR-117 shared machine ran out of inodes from stacked worktrees
Independent Staging Quality Gate / validate-python (push) Successful in 6m26s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m33s
Independent Staging Quality Gate / publish (push) Successful in 2m58s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 11:32:44 +08:00
ClaudeandClaude Opus 5.5 6a2600f035 fix(markdown): bold that ends on CJK punctuation renders instead of showing ** (BUG-1610)
CommonMark will not close `**` after punctuation when a CJK character
follows (`**…这两件事。**火星`), nor open it after a letter before
punctuation (`说**「…」**`); with two such spans in a paragraph it pairs the
wrong runs. New in-repo remark plugin `remarkCjkStrong` (no new dependency)
runs after remark-gfm in the chat, learn and personal-report views: it
re-pairs leftover `**` runs in reading order into strong nodes, spanning
links and inline code but never a line break, `*` or another strong. Lone
`**`, escaped asterisks, inline code and code blocks are untouched. One
linear pass per parent that still holds a `**`.

Tests: 11 cases through the real chat renderer, including 20 real backtest
answers (public figures) that render with no literal `**`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-05 11:28:00 +08:00
ClaudeandClaude Opus 5.5 1ef3caa453 fix(people): the add / edit person dialog can be clicked again, rebuilt to the approved prototype (BUG-1602)
Independent Staging Quality Gate / validate-python (push) Successful in 6m25s
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m29s
Independent Staging Quality Gate / publish (push) Successful in 2m47s
The user reported the 「添加一个人」 dialog could not be clicked or typed into.
Reproduced in headless Chrome with real CDP input: elementFromPoint over the
name field returned the last birth-time-source radio. RadioGroupItem enlarges
its hit area with `after:absolute after:-inset-*`; globals.css forced that radio
to `position: static` and the card was unpositioned, so every radio's ::after
spanned the fixed dialog and 「完全不知道」 took every click (from 728ead88, #110).
Not a BUG-968 recurrence: the dialog is portalled to body and nothing is inert.

- Card and radio positioned; the sr-only legend no longer stretches 100%
  (horizontal scrollbar); the body is the legend's containing block (hidden
  vertical overflow that could push the header away).
- Hover is a quiet wash inside @media (hover: hover); focus shows a ring; only
  the selected card has the action border + soft fill (ayanamsa and time source
  hovers used the selected colours).
- Prototype (https://claude.ai/artifact/4herLiTdD3fmYoMB62bnBE, approved
  2026-11-05) in ChartProfileForm, shared by the people dialog, the chart
  page's birth editor and (time block) onboarding: fixed header with its own
  close and fixed footer with a 「还差:…」 hint; groups 基本信息 / 出生日期与地点
  / 出生时间; 「如何称呼 TA」 for others; ayanamsa folded into a <details>
  「高级设置」; bottom sheet at <=640px. Class prefix person-form-dialog
  (.profile-dialog is a retired sheet name a test keeps out).

Verified: headless Chrome at 1440 / 390 on all three surfaces (every control
hit-tests to itself, typing works, scrollWidth == clientWidth, header/footer
fixed). New tests/add-person-dialog-20261105.test.tsx; profile-gender test
order updated with 原值/新值/原因. Full npm test failures identical to staging
3d10a5bc (28, env / DB), tsc clean, ESLint 0 errors, pytest quick gate passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-05 10:52:14 +08:00