Commit Graph
1308 Commits
Author SHA1 Message Date
Jesse_ChenandClaude Opus 5.5 ae18952e51 fix(report,chart): blank columns — drop Kranti, split Ashtakavarga house SAV, ascendant nakshatra, engine varga dignity, no duplicate charts (BUG-1199..1203)
Independent Staging Quality Gate / validate (push) Successful in 15m27s
Independent Staging Quality Gate / publish (push) Successful in 3m42s
- Report p33 table: no Kranti column (no producer; materials.kranti stays blocked).
- Report p53 table: the "SAV" column was the with-Lagna total (386). Split in the
  reader into SAV / Lagna BAV / SAV + Lagna with a totals row; ashtakavarga.py is
  untouched (frozen rectification identity, ERR-115).
- /api/chart ascendant carries nakshatra / pada / lord (_nakshatra_fields shared with
  the nine bodies); chart cache schema 4 -> 5.
- /api/varga_full bodies carry dignity_level from varga_dignity_level, the function
  the Vimsopaka path now shares (A/B identical); the chart page shows the D1 status
  wording and no longer derives a three-level dignity itself.
- Report page draws each chart once: the trailing block skips charts the body already
  fenced (same rule as the export); the birth-time caveat moves under the body's
  chart heading.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-03 09:11:15 +08:00
Jesse_ChenandClaude Opus 5.5 c05d9e7e3d test(rectification): confirmation gate reads the sync5 re-freeze record
Independent Staging Quality Gate / validate (push) Successful in 14m12s
Independent Staging Quality Gate / publish (push) Successful in 3m36s
The sync5 re-freeze (1029cbaa) moved the product holdout's current-tree
record to sealed_holdout_rerun_upstream_sync5_2026_10_02.json; the test
still read the sync4 file. Three-column note added.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 01:17:49 +08:00
Jesse_ChenandClaude Opus 5.5 917e18a066 test(consult): regenerate biography backtest golden after upstream sync 5
capture_consult_biography_backtest_golden.py run twice (PYTHONHASHSEED=0,
chart cache TTL 0), byte-identical. Only change: one figure's retrograde Venus
is no longer combust in the graha drishti layer (retrograde orb 8 deg, U3
combustion table). consult-evidence-card-golden.json regenerated twice as
well and is byte-identical to the committed file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 00:15:59 +08:00
Jesse_ChenandClaude Opus 5.5 758fee954b feat(rectification): range delivery needs 4 dated events across 3 domains (R1, BUG-1193)
Product decision 2026-10-02 (TASK-upstream-sync5 R1): a time range is offered
only with at least 4 dated, primary-scoreable events covering 3 domains,
counted on all of them (training + reserved holdout). Was 3 training events /
2 domains in three TS copies and the Python acceptance gate while the policy
file already said 4/3.

- One definition: references/rectification_policy.v1.json
  (minConfirmationEvents / minConfirmationDomains). TS core/types MIN_DATED_*,
  rectification-decision MIN_STANDALONE_*, evidence-model MIN_ACCEPTANCE_*,
  the convergence evaluator and the post-inference trainingGateOpen all read
  it; Python decision_policy MIN_ACCEPTANCE_* alias MIN_CONFIRMATION_*.
- Python receipt counts all scoreable events / domains for event_quality and
  domain_diversity; decision policy identity v3 -> v4 (candidate UUIDs carry
  it). Candidate scores unchanged (77 v5 cases A/B identical), so the
  algorithm stays rectification-v5-matrix-scoring-10.
- Memoization golden v3 written by write_golden; v2 frozen by sha256 with a
  test that its scores equal v3 and only the receipt policy moved.
- Collect gap copy names the exact gap ("再来两件……其中至少一件不是……")
  instead of always "再来一件"; VOICE.md updated. Legacy life-events form copy
  4/3 as well.
- 30 frontend test files, 4 Python tests: fixtures extended to the same
  scenario at 4/3, or assertions changed with 原值/新值/原因 notes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-03 00:08:00 +08:00
Jesse_ChenandClaude Opus 5.5 26d4c204b0 test(rectification): confirmation gate reads the upstream_sync4 re-frozen rerun (ERR-110)
Original / new / reason recorded in the test. Shadow trials identical; gate
behaviour and thresholds unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 14:50:35 +08:00
Jesse_ChenandClaude Opus 5.5 8ae4cef7a6 fix(consult): marriage card drops the 7th-house "(对宫主)" twin rows to stay inside the 12,000-character budget (BUG-1185)
For house 7 the event lord and the opposite lord are the same planet, so
every double-transit hit arrived twice. With the corrected aspect count the
Taylor marriage turn reached 12,040 characters (budget 12,000, test
consult-condensed-checklist "size"). The card now keeps the "(宫主)" row and
drops its "(对宫主)" twin; values stay engine values (the "nothing rewritten"
contract holds), the budget assertion is unchanged (BUG-1155 precedent:
compress the format, not the budget). Taylor marriage 12,040 -> under 11,922.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 14:50:35 +08:00
Jesse_ChenandClaude Opus 5.5 79efaf83f4 test(consult): regenerate evidence-card and biography goldens for upstream sync 4
Both captured with their scripts (PYTHONHASHSEED=0, chart cache TTL 0), twice,
byte-identical. Changes against a18f8d4e: lunar/solar yoga hits and names
(five-planet rule, retired duplicates), double-transit conclusions and active
houses (aspect count from 1, stable order), and Shadbala Sun min_required /
ishta % / level (BPHS 6.5: all nine backtest figures drop one level).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 14:50:35 +08:00
Jesse_ChenandClaude Opus 5.5 dae2b99fe2 test(rectification): confirmation gate reads the 10-02 re-freeze report (BUG-1181)
Same procedure as 406d81b8 (BUG-1088): the contract's current_tree_scorer
now points at sealed_holdout_rerun_functional_v2_2026_10_02.json; release
keys and the closed gate are unchanged. 原值/新值/原因 in the test comments.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 12:54:41 +08:00
Jesse_ChenandClaude Opus 5.5 7806c72f2c feat(consult): cards carry functional profile v2; close round-4 backtest residue (BUG-1158, BUG-1176, BUG-1182)
- Evidence-card and biography-backtest goldens regenerated with the capture
  scripts (PYTHONHASHSEED=0, cache TTL 0; byte-identical twice); only the
  functional-role fields change.
- CAREER_FIELD_ASK_RULE: A10 / AL / Sun / 10th lord in 4/6/8/12 say
  resistance or cost only, never "not on stage / go deep", and houses are not
  translated into fields.
- AFFLICTION_RANGE_RULE: no portrait of an afflicted person from the lord's
  house or a benefic occupant ("managing / arranging / cares about your
  future"), actions do not presuppose reaching them, one ask per answer.
- Examples that paired "4th lord in 10th" with "her attention is on your
  future / close" now state the line is unafflicted (Monroe's chart had that
  exact placement and copied it). Retrograde line also bans "drags on".
- Backtest script: several follow-up domains in one run.
Changed assertions carry 原值 / 新值 / 原因 in the test comments.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 12:32:02 +08:00
Jesse_ChenandClaude Opus 5.5 3733b9787b fix(rectification): bump scoring identity to scoring-10 for functional profile v2; dated contract by generation (BUG-1181)
Functional roles feed the *_functional_*_auxiliary rules, so 57782aea changes
candidate scores for identical input (memoization fixture 12:00: 8.6274 ->
8.4977). Per the "scoring semantics change => bump ALGORITHM_VERSION"
precedent (scoring-7 -> 8 -> 9), the identity moves to scoring-10; policy v3,
input contract v5 and Skill versions are unchanged, history is not relabeled.

Five frontend sites and one SQL guard tested `=== "...scoring-9"` for the
dated candidate-window contract; they now use isDatedScoringAlgorithmVersion /
a generation regex (>= 9). Migration 20261002010000 only recreates
validate_dated_rectification_candidate (one-line guard change).

Memoization golden v2 written by the test's own write_golden; v1 (scoring-8)
frozen by sha256. Real-engine scoring-10 cross-midnight golden added. Research
records re-frozen per ERR-110 (label functional_v2_2026_10_02) and
scripts/functional_benefics.py added to the frozen production identity
(ERR-114: 57782aea changed scores without tripping it).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 12:31:50 +08:00
Jesse_Chen f85794661b Merge remote-tracking branch 'origin/staging' into codex/consult-career-yoga-functional-20261002
Independent Staging Quality Gate / validate (push) Successful in 15m8s
Independent Staging Quality Gate / publish (push) Successful in 3m37s
# Conflicts:
#	CHANGELOG.md
#	docs/BUG_HISTORY.md
2026-10-02 10:11:46 +08:00
Jesse_ChenandClaude Opus 5.5 6a02e5e91e feat(consult): career answers don't guess the field — strength/resistance/timing + one ask; follow-up reads a stated job (BUG-1176 decision); goldens regenerated; rubric round-4 pass lines; backtest script career follow-up
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 09:12:06 +08:00
Jesse_ChenandClaude Opus 5.5 3bbe65a215 fix(rectification): out-of-window event dates no longer fail every rescore; future dates refused at intake; corrections revise without a focus (BUG-1178, BUG-1179)
Independent Staging Quality Gate / validate (push) Successful in 13m37s
Independent Staging Quality Gate / publish (push) Successful in 3m37s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-02 09:03:22 +08:00
Jesse_ChenandClaude Opus 5.5 dd817c8eb8 feat(consult): career list reads field and public/behind-the-scenes from chart evidence (BUG-1176); opener keeps the affliction rule (BUG-1177)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 08:32:11 +08:00
Jesse_ChenandClaude Opus 5.5 c74bfcc06b feat(consult): rule engine always runs and merges with chart yogas (BUG-1174); closed-list traditional_yogas on general/career/wealth cards (BUG-1175)
Goldens regenerated by the capture scripts (PYTHONHASHSEED=0, cache TTL 0; two runs byte-identical).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 08:32:11 +08:00
Jesse_ChenandClaude Opus 5.5 6987875b84 feat(rectification): post-adopt verdict says whether the adopted time still fits and offers 改用 HH:MM; renumber BUG-1170→1172 (BUG-1173)
Independent Staging Quality Gate / validate (push) Successful in 14m56s
Independent Staging Quality Gate / publish (push) Successful in 3m23s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-02 07:40:30 +08:00
Jesse_Chen f361365a2a Merge remote-tracking branch 'origin/staging' into codex/consult-no-presupposition-backtest-20261001
Independent Staging Quality Gate / validate (push) Successful in 17m11s
Independent Staging Quality Gate / publish (push) Successful in 3m23s
# Conflicts:
#	CHANGELOG.md
#	docs/BUG_HISTORY.md
2026-10-02 07:17:06 +08:00
Jesse_ChenandClaude Opus 5.5 066558a665 feat(consult): affliction signals read as pressure signs with a range, never a biographical verdict (product decision 2026-10-02)
- AFFLICTION_RANGE_RULE (one definition, consultation-thinking-plan.ts):
  pressure / distance signs + evidence + a range of realities, no verdict on
  facts the user knows better, no opposite reassurance, one ask per answer;
  quoted by the shared reading (line 3) and NATAL_SECTION_RULE
- parents line 2, marriage line, health line 1 follow it; career gets a
  'lifetime career shape first' line and neutral three layers (no 面试/职位)
- follow-up correction rule: map only lines that fit; say 盘本身分不出这一点
- voice / VOICE.md parents example rewritten to the range form
- contract tests updated with 原值/新值/原因

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 06:49:17 +08:00
Jesse_ChenandClaude Opus 5.5 ec06d422d3 feat(consult): annual and timing turns get the shared reading and annual list (product budget decision 2026-10-02)
Annual / timing single-domain turns take the career / marriage / wealth budget:
contract + card <= 12,000, total with the checklist <= 18,000.
CONSULT_READING_BUDGET_BLOCKED removed; size assertions and the pinned
blocker test changed (原值/新值/原因 in the tests and brief 2's progress record);
BUG-1160/1161 resolved, BLOCKED.md entry struck through.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:46:59 +08:00
Jesse_ChenandClaude Opus 5.5 071a196d11 fix(research): backtest correction turn passes typed history messages
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:46:48 +08:00
Jesse_ChenandClaude Opus 5.5 955bab691a feat(consult): sections presuppose nothing, examples carry no reading rule or job shape, corrections are acknowledged
- natalAnswerShapeBody: NATAL_SECTION_RULE replaces 「这个人是什么样、你们怎么相处、
  事情会怎么走」; the shared voice quotes the same constant (BUG-1164)
- product-voice / VOICE.md: no 逆行 in examples, parents example leads with the
  affliction and asks to confirm, married-presupposing Good example removed (BUG-1165)
- follow-up shape: a user correction is acknowledged, never defended (BUG-1166)
- career examples carry no job shape (升职 / 专业能力 / 做深现有工作) (BUG-1168)
- biography backtest golden regenerated with the real engine so the card carries
  brief 1's aspects, combustion, yoga domains and saturn_from_moon_house;
  backtest script gains --correction follow-up turns

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:38:01 +08:00
Jesse_Chen 585c7370f8 Merge remote-tracking branch 'origin/staging' into codex/consult-no-presupposition-backtest-20261001 2026-10-02 00:31:49 +08:00
Jesse_ChenandClaude Opus 5.5 42ff82916e feat(rectification): an answered post-adopt check says whether it fits the adopted time (BUG-1170)
Independent Staging Quality Gate / validate (push) Successful in 14m16s
Independent Staging Quality Gate / publish (push) Successful in 3m36s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-02 00:21:36 +08:00
Jesse_ChenandClaude Opus 5.5 401796509a feat(consult): shared affliction-first reading, lists for every domain, health renamed
- T1 (BUG-1160): 「通用读法 · 先看受冲」 opens every turn's methodology once.
- T2 (BUG-1161): Chinese lists for parents, children, education, migration,
  family, annual, general, health; health replaces the English route in the
  web consultation only.
- T3 (BUG-1162): career / marriage / wealth each gain an affliction line.
- T4 (BUG-1163): health label 健康, prompt asks about the constitution first.
- Single-domain annual / timing turns keep the pre-brief method
  (CONSULT_READING_BUDGET_BLOCKED): they would exceed the 12,000-character
  assertions, which this brief may not change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:14:54 +08:00
Jesse_ChenandClaude Opus 5.5 691ee440e3 feat(research): consult biography backtest harness and pre-change baseline
Independent Staging Quality Gate / validate (push) Successful in 16m20s
Independent Staging Quality Gate / publish (push) Successful in 3m54s
TASK-consult-no-presupposition-and-backtest-20261001 T4 infrastructure only
(T1-T3 untouched). New files only, so it merges cleanly with the parallel
evidence-card brief.

- capture_consult_biography_backtest_golden.py: same handler/body/trim as the
  evidence-card golden; nine public AA charts x parents/marriage/health/career.
- consult-biography-backtest-golden.json: real engine output, byte-reproducible.
- consult_biography_backtest_rubric.json: facts with sources, must_not,
  expected_signals per figure x domain.
- consult-biography-backtest.mts: runs the product's real agent, tools, card,
  methodology, user-turn shape and streamAgentResponse; deterministic checks only.
- Baseline on 9b937c4a: 39/72 severe biography conflicts; all five audit cases
  reproduce in both runs.

BUG-1170 is registered when brief 3 lands.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:10:06 +08:00
Jesse_ChenandClaude Opus 5.5 19802a4874 feat(consult): card carries aspects, co-tenants, combustion; yogas by domain
TASK-consult-card-affliction-data-20261001 T1-T4 (BUG-1154~1157, BUG-1159 mitigation).

- Engine layer graha_drishti (aspects.calc_house_aspects; combustion via the
  full reading's own rule, extracted as jyotish_engine.is_combust, orbs
  unchanged); yoga_domains (fixed Raman packet table by rule_id, with the
  sieve's hit); slow_transits.saturn_from_moon_house.
- Card: planets get aspected_by / conjunct_with / combust (true only);
  domain house rows get aspected_by; parents roles get lord_rows and
  significator_rows with functional class, D12 house lord and its sign;
  health houses [1,6,8,12], education [4,5,9]; annual copies
  saturn_from_moon_house; yogas filtered by domain tag with hits.
- Budget (D6): antardashas as [lord, start, end], D9 vargottama only when
  true; all 12,000-char assertions unchanged.
- Golden regenerated by the real engine; jyotish_api_server.py untouched.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 23:56:18 +08:00
Jesse_ChenandClaude Opus 5.5 2d620fb4ad fix(identity): staging fixed-code sign-in skips the first-password step (BUG-1152)
Independent Staging Quality Gate / validate (push) Successful in 12m25s
Independent Staging Quality Gate / publish (push) Successful in 3m56s
On the staging test-OTP channel, 验证码登录 with a fresh mailbox no longer
stops at 设置登录密码; it records consent and enters the app. 注册账号 still
sets a password, second factor still comes first, and production (no
IDENTITY_TEST_OTP) is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 22:43:34 +08:00
Jesse_ChenandClaude Opus 5.5 279650a684 fix(rectification): delivery gate turn skips text the last reply already said (BUG-1153)
Independent Staging Quality Gate / publish (push) Canceled after 0s
Independent Staging Quality Gate / validate (push) Canceled after 8m58s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 22:34:35 +08:00
Jesse_ChenandClaude Opus 5.5 b62308c4ad fix(rectification): segment verification report drops the minute leaderboard (BUG-1151)
Independent Staging Quality Gate / validate (push) Successful in 33m11s
Independent Staging Quality Gate / publish (push) Successful in 3m46s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 21:14:57 +08:00
Jesse_ChenandClaude Opus 5.5 28f4df0e07 fix(rectification): adopt/gate turns use uuid request ids; post-adopt checks carry the state probe id (BUG-1149, BUG-1150)
Independent Staging Quality Gate / validate (push) Failing after 13m1s
Independent Staging Quality Gate / publish (push) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 19:38:10 +08:00
Jesse_ChenandClaude Opus 5.5 dc45fde613 feat(home): warm older-sister greeting voice; daily line says why, plainly
Independent Staging Quality Gate / validate (push) Successful in 12m47s
Independent Staging Quality Gate / publish (push) Successful in 3m47s
Late night no longer remarks on being awake (产品 2026-10-01); every daypart,
weekday and returning line reworded in the same caring voice. Daily line:
each house sentence names where the Moon is in plain words, then one concrete
sentence; no stacked hedges. Sign-fallback moods rewritten the same way.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 19:34:16 +08:00
Jesse_ChenandClaude Opus 5.5 fa6d026f12 fix(consult): Chinese-only terms, one name per thing in answers (BUG-1148)
Independent Staging Quality Gate / validate (push) Successful in 12m47s
Independent Staging Quality Gate / publish (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 19:21:28 +08:00
Jesse_ChenandClaude Opus 5.5 282455cc83 fix(rectification): post-adopt check gets its own message and keeps its buttons; segment bubble copy (BUG-1146, BUG-1147)
Independent Staging Quality Gate / validate (push) Successful in 13m59s
Independent Staging Quality Gate / publish (push) Successful in 3m49s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 16:59:32 +08:00
Jesse_ChenandClaude Opus 5.5 c0f059125b fix(consult): progress timeline shows only real steps, not the answer outline (BUG-1145)
Independent Staging Quality Gate / validate (push) Successful in 14m43s
Independent Staging Quality Gate / publish (push) Successful in 3m46s
The answer outline (think.plan / thinking.section) was drawn as four think
rows and ticked done as soon as the chart calculation started. The reducer
now keeps the outline only as calculate-row detail; live and history views
share it. Product chose option B on 2026-10-01.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 16:40:27 +08:00
Jesse_ChenandClaude Opus 5.5 f1a169cb93 feat(rectification): segment-gain order on by default up to 61 minutes after the health-focus fix; records and replay evidence (BUG-1143, BUG-1144)
Independent Staging Quality Gate / validate (push) Successful in 13m28s
Independent Staging Quality Gate / publish (push) Successful in 3m31s
The 77-case persisted replay after the BUG-1143 fix keeps every truth segment
at both 21 and 61 minutes with segment order on, so the default envelope moves
from 21 to 61 minutes. Bug numbers follow staging (BUG-1142 was taken).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 13:15:36 +08:00
Jesse_ChenandClaude Opus 5.5 564eede340 fix(rectification): health distinguish focuses persist again; segment-gain order on by default for windows <= 21 minutes (BUG-1142, BUG-1143)
BUG-1142: distinguish focuses wrote the planner domain verbatim, and
health_pressure is not in the focus table's target_domain check. The write
failed inside a swallowed retry and the session went straight to delivery
although tap cards remained. Every focus write now goes through
focusTargetDomain (persistableFocusDomain, BUG-672), and focus-to-probe
matching uses sameCollectDomain.

BUG-1143: segmentOrderEnabledFor turns segment-gain probe order on by default
when the scanned window is at most 21 minutes, where the 77-case persisted
replay gained head hits with no lost truth segment. RECTIFICATION_SEGMENT_ORDER
=off disables it; =on keeps the 61-minute research envelope.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 11:47:04 +08:00
Jesse_ChenandClaude Opus 5.5 04c09cbf4d fix(consult): five-minute answer clock as a hang guard; general mode runs on it from the start (BUG-1142)
Independent Staging Quality Gate / validate (push) Successful in 13m22s
Independent Staging Quality Gate / publish (push) Successful in 3m46s
The 70s answer clock was sized for a non-reasoning writer; thinking tokens
come out of the same clock and deepseek-v4-pro took 77s on a parents answer.
Product 2026-10-01 chose five minutes. The general / no-birth-minute loop has
no tools, so it now starts on the answer clock instead of the 110s tool clock.
Tool phase and domain budget unchanged; maxDuration 240 -> 480.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 11:12:01 +08:00
Jesse_ChenandClaude Opus 5.5 c968c904e6 docs(rectification): records for message cleanup — BUG-1135..1137, BUG-917 revision, changelog, design, voice, checklist, progress
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:40:29 +08:00
Jesse_ChenandClaude Opus 5.5 9d302e515c feat(rectification): the server writes the evidence recap — 「记下了 N 件事」 with the ledger list collapsed under it (BUG-1136)
- Evidence turns whose batch accepted items: the body is the server recap
  built from those items (two or fewer listed inline, more as a count);
  the model no longer restates them (both prompt sets updated).
- The case snapshot carries each assistant turn's recorded evidence from
  the ledger (rejected/superseded excluded); the message shows it in a
  collapsed <details> list when more than two.
- Chinese date labels read straight into the event phrase (2016年入学);
  ISO labels keep their space.
- Assertions updated with original/new/reason notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:40:29 +08:00
Jesse_ChenandClaude Opus 5.5 408b22749e fix(rectification): settled replies carry no 「已完成 N 步」 receipt; steps stay the waiting state (BUG-1137)
Consultation replies keep their receipt (scope-lock test). Two source/DOM
assertions updated with original/new/reason notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:40:29 +08:00
Jesse_ChenandClaude Opus 5.5 bdf4c31bc4 fix(rectification): one stem on screen — a replaced focus draws nothing and the live one takes its slot (BUG-1135)
- GET attach: a live hanging focus replaces a superseded-unanswered focus
  linked to the last assistant turn instead of falling to a standalone copy.
- Client placement: a dead question on the latest message is replaceable,
  and the stem the body still ends with is stripped (stripQuestionSentences).
- Chat view: a dead question no longer turns the gap into 「没有拿到下一个问题」
  while the case has a different live question.
- Message entry: a superseded or replaced unanswered choice draws nothing
  (no stem without options); the current question keeps its stem while busy.
- Copy text skips a dead question.
- Three DOM tests reproduce 「stem, stem」 and 「dead stem + unavailable」, red then green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:40:29 +08:00
Jesse_ChenandClaude Opus 5.5 8e901125a9 fix(rectification): judge chart reliability against the saved minute, not the result's head (BUG-1138 review)
A chart is reliable only when its tier is not blocked/indistinct and the saved
minute (provenance window_offset_minutes) sits in that chart's head segment, or
the chart never changes in the window; a missing offset is not reliable. The
saved minute does not move with later results, and D7 falls back to the D1 head
midpoint when heads do not intersect, so the tier alone could name a sign the
saved minute does not have.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 87719a6c84 docs(rectification): chart-tier caveats records — BUG-1138/1139, changelog, voice, design, device checklist, progress (T4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 f8b4f46d0d test(db): real PostgreSQL read of an adopted segment's chart tiers via the service client (BUG-1138/1139)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 2004a6edc1 feat(reports): a line under D9/D10 chart and table sections when the adopted segment left them undetermined (BUG-1139, T3)
Applied before the longform snapshot is hashed, Chinese and English bodies.
The engine payload is unchanged; legacy and unrectified reports store the
engine text byte-for-byte. Chart cards keep their grid (the line becomes the
card caption).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 7f39c9346d feat(consult): adopted segment charts that cannot be determined reach the model as policy and one plain sentence (BUG-1138, T2)
The shared range loader attaches unreliableVargas for segment-v1 adoptions;
the consultation tool input carries it, runConsultationWorkflow strips it from
the engine payload and writes answer_policy.unreliable_vargas,
deterministic_claims_forbidden_for and a user-facing limitation. Legacy and
unrectified profiles are byte-identical (request, context, packet).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 35b89bdf21 feat(rectification): read the adopted segment result's unreliable charts for reports and chat (BUG-1138, T1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 10:15:10 +08:00
Jesse_ChenandClaude Opus 5.5 44cdd9c9b9 docs(consult): plain answer records — VOICE, BUG-1132~1134, progress, device checklist
Independent Staging Quality Gate / validate (push) Failing after 13m27s
Independent Staging Quality Gate / publish (push) Skipped
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 09:48:51 +08:00
Jesse_ChenandClaude Opus 5.5 2ec2762dcf feat(consult): plain answer shape — conclusion first, one section per person, no word caps (BUG-1132~1134)
Retire the 09-17 opener shape (coined pattern name, push/tidy periods,
play-a-role) that produced riddles; one shape definition in
consultation-thinking-plan; parents card names mother/father roles with MK;
empty-house rule; thinking bar closes the opener at any H2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-01 09:42:35 +08:00
Jesse_ChenandClaude Opus 5.5 96f83bb435 fix(build): move the persisted-replay research harness out of frontend/scripts; guard runtime sources against tests/ imports (BUG-1140)
The staging publish job built the web image without frontend/tests, and
next build type-checks every .ts under frontend/, so the harness importing
../tests/helpers/postgres-fixture.ts failed with TS2307. The harness depends
on the test fixture, so it now lives in frontend/tests/research; the Python
driver points there. A new test fails if src/ or scripts/ import tests/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-01 09:37:00 +08:00