Backtest (parents, 9 Rodden AA figures, blind-scored) showed the slim voice
wrote absent parents as present and warm (severe 0 -> 8, then 1 -> 5) once
the presence range was gone. Product chose the hybrid: when a person's line
carries heavy pressure, give the range once in the model's own words and
write no portrait of that person's conduct or warmth on that side.
Hybrid round: severe 3 -> 0 (std), 2 -> 0 (correction), 4 -> 2 (verbatim
question); closing asks 26/26 -> 3/27; control false positives unchanged.
Also: correction turns say which line was off and never blame the user;
jargon and varga codes are said in plain words; house-counting is a named
ban; no mind-reading when the user asks for objectivity.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
The parents answer read as house-by-house fact chains with a gloss on every
house, opened with "both lines show pressure" instead of the pattern asked
for, and copied the example's 「实际是哪一种,告诉我一句」. The model was
satisfying ~13.9k characters of writing rules stated three times (voice,
English contract, user turn) plus copyable Good/Bad examples.
- VISIBLE VOICE is now the single statement: follow the user's own
structure, open with the overall picture, explain why each placement
means what it means, gloss terms briefly; then the red lines only.
- Contract and first/follow-up user turns point at it instead of
restating it; all example answers removed.
- AFFLICTION_RANGE_RULE keeps the red line (no biographical verdicts, no
reverse reassurance) but drops the forced range and closing ask; the
question's own premise counts.
- Contract tests cap the voice at 2600 characters and lock every red line
the old tests guarded; backtest script gains --question.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
- Intake: six verbatim options (出生证明 / 户口本 / 家人记得 / 只记得时辰 /
只知道时段 / 完全不知道). Clock-time sources take an earliest / latest or
「不清楚误差」; no source maps to a fixed error any more. Twelve 时辰
picker (子时 23:00–00:59 from the filled date); the position answer is a
clue and never narrows the window.
- Validation: drop the hospital 2/2 and family 15/30/60/120 rules; a time
needs a containing range (minutes derived, may be uneven) or
uncertainty_known=false. Older 2/2 and 15–120 profiles still resave as is.
- Lagna precheck: uses the given range; without one it scans only the
stated minute and says the verbatim T4 line; ranges read as clocks.
- Migration 20261102020000 (additive): birth_time_source accepts
id_document; profiles and chart_profiles gain birth_time_record_kind,
birth_time_uncertainty_known, birth_time_shichen; chart_profiles gains
birth_time_clue; sync trigger and backfill carry them.
- BUG-1513: readProfile now reads the camelCase library record of other
people (source, stated time, window, status).
- BUG-1514: chart_profiles sync trigger is security definer, so a person
without a clock time can be saved by the people route.
- id_document reaches the frozen engine contract as approximate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Product-approved home UI cleanup (2026-11-02):
- Blank home has no 「新对话」 title; conversations keep theirs. The chat
header person control is a two-line chip (initial, full name + relation
tag, then date time · city only). Points pill reads 「N 点」 with a coin in
the action colour, 36px like its neighbours, label 「剩余 N 点,点开充值」.
- The chart panel's person switcher (issue #150) is removed; the header
chip is the only entry. Panel title stays.
- 今日星语 leaves the UI: greeting sub-line, entry pill and its captions,
binder, warm snapshot / prefetch / localStorage cache, checklist item and
its signal. Loading copy no longer mentions it. The API route and the
consultation's daily answers are untouched; starter-question signs come
from the computed chart.
- No model picker: chat and rectification composers lose it, client-side
per-session model persistence is gone, ordinary turns ask for the admin
default, and the consult route moves an older session onto the default
(persisted, so billing reads the answering model). Synastry turns keep
their session model.
- Composer: one strong hairline + soft shadow, focus only recolours the
border (input-group ring cancelled); AI notice centred under it.
Tests that pinned removed UI are replaced with ones asserting the new
behaviour (原值/新值/原因 comments). DESIGN.md, VOICE.md, CHANGELOG updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
/reports/annual opens the annual report directly. A translucent overlay
shows the range, 「某人的这一年」, the three notes, the birth-time line
(self links to rectification), the short 现状 form, 「开始写年运」 and the
price line; then sections stream in as they are saved, and a year
already written opens without the overlay. 「我的报告」 gets the annual
card. Docs: design note with every default pending astrologer review,
DESIGN.md, VOICE.md, CHANGELOG.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
Product decisions 2026-10-28 (issuecomment-36121):
- The opening's window sentence says where the reader's time came from
(出生记录时间 / 大概时间 / 你填的时间 / 时间段), still one sentence. When the
source is known the server writes the opening; unknown and legacy get none.
- When a turn recorded events, the rescore completed and it is not the
delivery turn, an exactly unchanged range gets
「这件事在现在的范围里每个时刻都对得上,分不出前后。」. It never invites
more events (BUG-1084).
- Not done, by decision: per-layer Lagna/nakshatra/dasha narration
(BUG-606/1253), precision-gated layers (scoring), voluntary/involuntary
career exits, "what would narrow it further" (BUG-1084).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The working minute is written once, on the timeline; the board's title row
no longer repeats it.
- 「看盘面」 sits in the header at every width; the board is closed by default
and opens as a right column on desktop (bottom sheet on phones).
- A distinct result (D4) leads with 最可能的出生时间 + minute + Lagna; the range
drops to the next line. Indistinct results keep the range headline (D3).
- The most likely column adopts with 「采用 HH:MM 并打开星盘」 and goes to /chart
after the server saved it; other columns stay adoptable as 「改用这个」 under
还不能排除. No confidence label. Record-conflict wording unchanged.
- 「我说错了,改一条」: confirmed events (from the case read's existing evidence
list) prefill the composer; nothing is sent by the pick. No 「再补一件事」:
the card must not invite more events (BUG-1084, issue #148 decision).
- The segment card keeps "which chart" (BUG-1151): no minute lead, same
adopt label, same actions row.
Docs: DESIGN §10/§11/§12, VOICE, CHANGELOG.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sidebar 「生时校正」 under 星盘, behind a new account `rectification` flag.
- /rectification page: status card from entry-summary (not started / in
progress with window and confirmed event count / adopted time), a short
data check, then the home rectification surface (?rectify=1, or
?rectify=new to start over; ?c=<id> to continue or view). No price on
the page.
- entry-summary gains session id, candidate range, confirmed evidence count
and adopted times (add-only migration 20261028170000).
- The offer card under a consultation answer becomes one line and a link
to /rectification; an explicit request in chat also goes there. No case
is opened from a conversation any more.
- Starter home shows a rectification prompt for self charts with an
estimated time; onboarding checklist gains 做一次生时校正 for them.
- Chart-page link points to /rectification. Shell registers its router so
home hooks can navigate client-side without useRouter in Home().
- Docs: VOICE, DESIGN, CHANGELOG, device checklist.
Self profile only; other people are issue #160.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The chart page now continues a case already open instead of showing a conflict. Someone else's chart no longer offers that link.
tsc exit 0. lint 0 errors, 122 warnings. Precheck and chart-page tests 56 pass. Opening tests 70 pass.
Co-Authored-By: Grok (agent loop)
An accepted rectification no longer counts as in progress at the chat entry, so an explicit request starts a new case and the offer card can return. An unfinished case still resumes through the case RPC. A failed lookup is logged without personal data and opens a new case.
Self-test: tsc 0, lint 0 errors, 47 targeted tests, test:db failures match the Windows list, next build with / static.
Co-Authored-By: Grok (agent loop)
Opening the export sheet now says once, at the top, why English is unavailable. Selected borders, radios and checks use the theme color while fills stay neutral.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
A finished match used to reopen the old report. Starting again now writes a new one and charges again; a report still being written is reused.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
English reports hid the analysis fold, timeline titles left out the month span, and deleting a pinned model stopped the next consultation turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
The add-person card, the generating wait, and the report header follow the prototype the product owner pointed at.
Co-authored-by: Cursor <cursoragent@cursor.com>
The chat stays bound to that section's saved calculation, checks each chart fact before answering, and bills like an ordinary turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
The review found empty sections and an English job that stayed running. Take evidence from reader briefs, retry one section, and settle before marking the report ready.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The pair page and reader replace the leftover chat draft, and the same pair is not charged again.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The trigger, the shared constants, and the limit sentence now agree, and the archive and person menus scroll instead of growing past the screen.
Co-authored-by: Cursor <cursoragent@cursor.com>
Consult, rectification turns, and report generation stop before a credit reservation when the product caps are hit. A full heavy-compute gate waits up to 8 seconds, and one consultation retries that 429 inside the same request.
Co-Authored-By: Grok (agent loop)
Generate the full-data edition (pl9_personal_long_report.v4) and remove the reader edition. English still contains Han, so the API withholds it (BUG-1272, investigating). This commit is not pushed to staging.