Commit Graph
989 Commits
Author SHA1 Message Date
jesse-uxandGrok (agent loop) 78c34c09ab feat(ondemand): transit window — ingress, stations, retrograde loops, target longitude (#174, BUG-1817)
按 #173 的合同加第二个按需工具,只做后端:

- scripts/ondemand_calc/transit_window.py:四类事件(ingress / station /
  retrograde_loop / target_longitude),黄经与日速度来自
  _calc_sidereal_planets_for_jd(先配星历路径),口径由调用方显式传
- 事件二分到 ≤1 分钟;逆行往返给两个停滞、retrograde_span、影子期进出,
  区间外每侧最多 400 天并标 outside_requested_window
- 节点不报停滞:partial + node_station_not_supported 的 gap
- 位置口径 mean 阻塞;缺项返回 blocked 信封并点名,不编任何日期
- registry 加两行注册

Tests: tests/test_ondemand_transit_window_20261109.py 17 条;连同 transit_date、
contract、api growth 共 47 条全过。2026 水星逆行停滞与直接 SwissEph 速度二分
相差 1.41 分钟。

Co-Authored-By: Grok (agent loop)
2026-11-09 14:18:39 +08:00
ClaudeandClaude Opus 5.5 afac4ea92f fix(accept): #179 module moves into scripts/ondemand_calc (scripts-root budget)
Independent Staging Quality Gate / validate-frontend (push) Successful in 6m51s
Independent Staging Quality Gate / validate-python (push) Successful in 8m26s
Independent Staging Quality Gate / publish (push) Successful in 3m1s
test_python_hygiene_budget forbids new root-level scripts/*.py; the brief named
scripts/muhurta_search_api.py. Same code at scripts/ondemand_calc/muhurta_search.py;
route, CLI import and tests follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 10:07:39 +08:00
ClaudeandClaude Opus 5.5 c84d143088 fix(accept): #173 natal Moon is never the transit Moon; unknown ayanamsa blocks
transit_date counted house_from_moon from the transit Moon when the caller gave
no natal Moon; the natal reference is now only what the caller supplied.
resolve_profile now refuses an unsupported ayanamsa name instead of passing it
to the engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 09:58:59 +08:00
Claude 8213aadad6 merge: codex/ondemand-transit-date-20261109 into acceptance batch 1109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8

# Conflicts:
#	docs/BUG_HISTORY.md
#	scripts/jyotish_api_server.py
2026-11-09 09:58:55 +08:00
Claude 5967b394eb merge: codex/counterexamples-20261109 into acceptance batch 1109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8

# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-09 09:58:54 +08:00
Claude 1860b74e84 merge: codex/muhurta-20261109 into acceptance batch 1109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8

# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-09 09:58:54 +08:00
Claude 137b964d80 merge: codex/dasha-dates-engine-only-20261109 into acceptance batch 1109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8

# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-09 09:58:54 +08:00
Claude c723f7333d merge: codex/reports-no-web-wording-20261109 into acceptance batch 1109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8

# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-09 09:58:53 +08:00
jesse-uxandGrok (agent loop) 99273b8ec2 fix(muhurta): per-day windows, per-window verdicts, per-day offsets (#179 round 2, BUG-1822)
按 FIX-muhurta-1 改掉打回的四点:

- 候选日不再由「日出 + 6 小时」单点分数筛选:每天单独取当天报告,用
  _select_recommended_windows 取候选;单点分数只留在 legacy_reference(not_final)
- 每个时段在起止两端各调一次 check_activity_muhurta,写 verdict_at_start /
  verdict_at_end / window_verdict;两端不同写 mixed 并点名变化要素;每天写
  rejected_windows(不吉时段、判定不宜、被 time_window 裁掉)
- 跨夏令时:每天用自己的偏移取日出与当天报告;profile 改为 tz_policy=per_day
  + first_day_offset
- time_window 生效并校验格式;删掉死代码
- CLI 打印时区策略与每段判定

Tests: 20 条(+6),api_server_growth_contract 9 条;pytest -k muhurta 122 过
5 败(5 条为基线既有失败,已在基线 commit 复现)。

Co-Authored-By: Grok (agent loop)
2026-11-09 09:21:11 +08:00
jesse-uxandGrok (agent loop) 8dcc6537af feat(ondemand): shared on-demand calculation skeleton + transit on a date (#173, BUG-1816)
产品 2026-11-09 拍板 C 方案:本单只做后端共用模块与信封,前端另开单。

- scripts/ondemand_calc/contract.py:信封 jyotish.ondemand_calc.v1;必填校验不猜
  默认值;节点/位置口径缺省用产品默认值 mean/apparent 并标 profile_source;
  输入指纹 sha256;失败只留缺口,不回显推断日期
- registry.py:TOOLS + ondemand_calc_api 分派;未知 tool 阻塞并点名
- transit_date.py:九曜黄经/星座/度数/星宿与 pada/逆行/日速度,按传入的本命
  参考算宫位,UTC 与当地时间都给;position_mode=mean 返回 blocked
- 薄路由 /api/ondemand_calc(_load_local_module,无新增类方法)

Tests: contract 8 条、transit 12 条、api_server_growth_contract 9 条全过。

Co-Authored-By: Grok (agent loop)
2026-11-09 09:09:16 +08:00
jesse-uxandGrok (agent loop) 28c719cbde feat(muhurta): location-exact on-demand muhurta search (BUG-1822)
原做法把参考时刻当 UT 12:00、不用地点、五要素只取「日出 + 6 小时」一个点。

- 新增 scripts/muhurta_search_api.py:必填 activity/日期/地点/tz 或 timezone_id/
  岁差/交点,缺一项报错;每天取实际日出日落,取不到整天 blocked;每个候选时段
  在起止两端各取一次五要素与 Hora,时段内变化标出变化时刻;现有单点评分放进
  legacy_reference 并标 not_final
- 薄路由 /api/muhurta_search(_load_local_module,无新增类方法)
- CLI 加 --lat --lon --tz --timezone-id --ayanamsa --node-mode;无地点时首行写明
  近似值、不给推荐时段,并去掉 int(hour_from_sunrise + 6) 冒充 UT
- 全局时区推断收紧为「lat/lon 都给了才推断」,否则择时不给地点会崩

Tests: tests/test_muhurta_search_api_20261109.py 14 条;
test_api_server_growth_contract 9 条通过;pytest -k muhurta 116 过 5 败,
5 条在基线 b453505d 上同样失败(无关)。

Co-Authored-By: Grok (agent loop)
2026-11-09 08:50:19 +08:00
jesse-uxandGrok (agent loop) 74a739b2dc feat(card): seven acceptance counterexamples end to end (BUG-1812)
- career layer gets the D1 longitudes, so the paksha has one source (Obama
  base vs career mismatch fixed)
- card carries movable_lagna_moon.reason, Narayana ad_status / ad_reason and
  the mahadasha cycle_index; running line says "sub-period undecided"
- engine keeps the MD when the AD is undecided; timingFollowing skips
  zero_duration rows explicitly
- timingKeys allowlist: adstatus / adreason / cycleindex / zeroduration
- fixtures + capture script, 16 engine tests, 7 card tests, PROGRESS, BUG-1812

Co-Authored-By: Grok (agent loop)
2026-11-09 08:38:56 +08:00
jesse-uxandGrok (agent loop) 152b298dd3 fix(chart): Chara dasha dates come from the engine, not the page (BUG-1811)
占星师 2026-11-08 第五轮裁定 5:所有大运日期必须由原生大运引擎生成,显示层
不得自己按年数比例重算。BUG-1752 只修了星盘页的 Vimshottari 轨;Chara 轨仍在
浏览器里按 365.25 天/年从出生日推大运、按年数比例切分运,与报告页的公历周年
口径最多差一天。

- 新增 scripts/chart_dasha/chara_dates.py:给 jaimini 的十二段与每段十二个
  分运写 start / end(本地日历日)与 start_ts / end_ts(UTC 秒);[start, end),
  末段终点钉在父段终点,0 年段保留 start == end,平年 2 月 29 日落 28 日。
- /api/dasha/chara 返回前写这些字段并带 date_basis。
- rashi_dashas_native._chara 改读同一模块(报告输出不变,已与旧版逐段对照)。
- 星盘页 charaTrack 只复制引擎日期;删掉 addYears;没有日期的行不显示。
- 文案 CHARA_ANTARDASHA_DATE_NOTE 改为「与大运同一套边界」。
- 两份真实引擎响应 fixture 的 chara 段用 _compute_chara_dasha 重抓。
- BUG_HISTORY BUG-1811;PROGRESS-dasha-dates-engine-only-20261109。

验证:pytest 新用例 6 passed,相关 63 passed;node --test 新用例 4 pass、
既有 105 pass;tsc exit 0;lint 0 error。

Co-Authored-By: Grok (agent loop)
2026-11-09 08:32:21 +08:00
jesse-uxandGrok (agent loop) 2e9ca2d73a fix(reports): drop web-verification wording from user-visible report text (BUG-1810)
产品负责人 2026-11-08:用户看到的报告文字不出现「联网 / 外部资料 / 外部核验 /
MEVG / 真实案例 / Real Case / Global Web」,后台记录保留。

- 个人报告写作提示词:依据与边界改为「没有用户经历可对照」,置信度封顶 B 不变
- 年报:技法执行情况跳过 MEVG / Real Case 两行;没有纳入的删掉对应条目
- 合盘:技法执行情况删掉「外部资料与真实案例核对:未进行」整行
- 产品导出审计章节:这两行不再渲染,证据边界同类一句删除,packet 原样保留
- 质量门:只要求 Functional Benefic/Malefic 渲染;新增后台检查,要求 packet
  仍带这两行且它们没有出现在 markdown 里

Tests: 新增 frontend/tests/report-no-web-wording-20261109.test.ts(4)与
tests/test_report_no_web_wording_20261109.py(3);更新年报、合盘、审计章节、
质量门既有断言(原值/新值/原因已注明)。

Co-Authored-By: Grok (agent loop)
2026-11-09 08:20:50 +08:00
ClaudeandClaude Opus 5.5 ae714e0349 fix(narayana): default strength scope back to seed_only_v0 pending the astrologer (BUG-1784)
Owner 2026-11-09: the R2 widening is on hold until the astrologer rules on it.
STRENGTH_SCOPE_DEFAULT returns to seed_only_v0. All R2 code stays: local
propagation, the selected / equal / unresolved statuses, and
seed_ad_start_p43d_v1 as a named non-default profile. profile_config and the
cache keys record strength_scope = seed_only_v0. R1 and R3 are unchanged.
Tests that pinned the widened scope now pass it explicitly, with
原值 / 新值 / 原因 notes. Evidence-card golden recaptured (TTL=0; only the
profile labels changed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 00:21:12 +08:00
ClaudeandClaude Opus 5.5 b7ba7f4e4f fix(consult): R3 witness fields and Narayana profile_config reach the real card (BUG-1786, BUG-1783)
Found in the round-7 cross-branch check: on public charts (Zidane, Obama)
the Neecha Bhanga row never reached yogas_detail. The compact detector entry
dropped formation_evidence, and the row sat past the 30-row cap. Keep the
witness fields when compacting and never cut a row that carries them (the
cap stays 30). The card's Narayana method_status also dropped the engine's
profile_config (timing key allowlist); carry it through.

Evidence-card golden recaptured with TTL=0 (Obama: row 30 is now Neecha
Bhanga); the load-dependent VedAstro closure reason is kept as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 00:03:21 +08:00
ClaudeandClaude Opus 5.5 8aa0d0cbcd merge: codex/round7-rect-kp-1108 into round7 integration (BUG-1801..1804)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 23:41:07 +08:00
ClaudeandClaude Opus 5.5 43d99de64b fix(rectification-api): never raise the engine's can_apply=false (BUG-1802)
The high-rigor path overwrote can_apply with the technique contract's
confirmation_allowed, so a passing external validation could turn a
low-confidence or provisional engine result into an applicable one.
Both must now agree; otherwise the contract continues rectification
with local_engine_cannot_apply.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 22:41:31 +08:00
ClaudeandClaude Opus 5.5 0df8a3283f fix(rectification): provisional vs comparable leader under unequal coverage (BUG-1801)
Raw totals are only compared when every candidate computed the same
(event, layer) evidence units. Otherwise winning_segment stays the raw
leader (provisional_leader) and comparable_leader re-ranks over the
units all candidates share; a missing unit is dropped for everyone,
never scored 0. The live stage Python engine now skips an event whose
Narayana is unavailable instead of scoring it 0, repeated facts count
once, and the stage labels an unequal-coverage leader as provisional.

占星师 2026-11-08 验收清单 §6 / §9 / §10.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 22:41:31 +08:00
ClaudeandClaude Opus 5.5 d784e99867 feat(narayana): round-6 R1 default AD direction, R2 strength scope and local propagation, R3 self-reference
- R1: default AD direction rath_p50_md_parity_v1 (start parity kept as a research
  profile); full profile config + algorithm version on every Narayana output, cache
  keys (consult, api chart, probes, long report, synastry) and the rectification run.
- R2: one strength profile at the seed, AD start and p.43 (d); selected / equal /
  unresolved kept apart; unresolved nodes block only what depends on them (seed
  candidates kept, dated MDs before an unresolved length kept, AD-only loss in
  rectification keeps the MD).
- R3: Neecha Bhanga witness fields (reference, relative_house, self_reference,
  independent_confirmation_allowed, self_reference_only) from the main detector to
  the evidence card yogas_detail rows; self-reference-only never counts as support.
- Sync her b54812c3 KP clock validation; port her round-5 / round-6 tests.
- BUG-1783..1787; golden recaptured with TTL 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 22:38:00 +08:00
Claude 528eaefb6a Merge branch 'codex/round6-engine-1108' into codex/round6-fixes-1108
# Conflicts:
#	docs/BUG_HISTORY.md
#	frontend/tests/fixtures/consult-evidence-card-golden.json
2026-11-08 16:52:48 +08:00
ClaudeandClaude Opus 5.5 fbbc4c7c21 fix: Narayana N1-N5, KP K1, functional K2/K3 per astrologer round-5 item reply
- seed rath_highest_occupant_dignity_v1 (named convention; equal tier below own sign blocks the seed)
- AD direction profiles rath_p50_md_parity_v1 / rath_stronger_lord_start_parity_v1 (default, pending choice)
- Saturn+Ketu in seed / MD sign blocked; PyJHora Ketu priority only as named reference profile
- 0-year MD rows flagged, never current, skipped on the annual timeline; years profile rath_table8_phalita_dignity_v1
- KP DBA year_days 365.25 default, parent/AD/full/visible fields, boundaries equal main Vimshottari
- functional profile pvr_table30_v1 (aliases), Moon-only blocked without paksha; profile through API,
  cache keys, audit; rectification asserts one profile per run
- golden recaptured with TTL=0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 15:20:45 +08:00
ClaudeandClaude Opus 5.5 d610756966 fix: chart dasha exact boundaries as UTC seconds (BUG-1752 privacy marker collision)
The first exact-boundary format printed local clock times; a generated
hour:minute collided with a private marker the repo scan forbids. Boundaries
are now start_ts / end_ts (UTC epoch seconds) beside the engine's local days;
no time string is printed. Goldens recaptured (evidence card TTL=0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 15:11:10 +08:00
ClaudeandClaude Opus 5.5 d676292343 fix: astrologer acceptance for BUG-1758/1763/1752 (source ledger, audit acceptance, engine boundaries)
- BUG-1758: the card's affliction layer is a source ledger: one entry per fact
  with its input, effect (conflicts / not_executed) and every house it bears
  on; a fact shared by two houses is one source, never two votes.
- BUG-1763: output acceptance after the one repair: a professional answer
  without the Technique Audit Table, or any answer without the engine audit
  rows (plain mode's evidence entry), fails as incomplete (kept text, no charge).
- BUG-1752: engine rows carry exact local start/end with UTC offset, parent
  start, cycle, and a meta block (365.25-day years, zone, [start, end)); the
  chart page copies them. Tests: midnight crossing, birth balance, second
  cycle, zero-length rows and 0-year Narayana / Chara MDs never current.
- Goldens recaptured (evidence card TTL=0; chart-view dasha from the engine).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 14:59:50 +08:00
ClaudeandClaude Opus 5.5 dd2cd83c3e fix: affliction sources not counts, audit-table backstop, chart page engine AD/PD (BUG-1758, BUG-1763, BUG-1764, BUG-1752)
- BUG-1758: the model card drops affliction_evidence.houses.*.signal_count
  (backend field kept); S-09, the pressure basis line and the professional
  voice name the sources and never a count.
- BUG-1763: a professional answer that stopped on its own without the
  Technique Audit Table gets one table-only continuation.
- BUG-1764: the backtest harness passes the answer mode (agent context,
  user-turn shape, length continuation); CONSULT_BACKTEST_ANSWER_MODE=plain.
- BUG-1752: /api/chart carries dasha.antardasha_timeline from
  chart_dasha.birth_moment.sub_period_timeline; the chart page copies the
  engine AD/PD rows and no longer cuts periods by year proportions.
- Goldens: chart-view golden dasha recomputed from birth_moment; evidence-card
  golden recaptured with TTL=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 14:43:50 +08:00
ClaudeandClaude Opus 5.5 17d932a517 fix(rectification): PVR functional default + source-version Narayana, reseal round5_pvr_narayana_2026_11_08 (BUG-1759)
Product approved 2026-11-08 (astrologer round-5 rulings 1, 3; same basis as
the report and the chat card):
- functional roles: drop the bphs_exception_profile pin at the three scoring
  call sites (+ research mirror); default pvr_table_30 with Moon paksha.
- Narayana: narayana_rath.calc_narayana_rath (two cycles) / antardasha, ages
  via narayana_age from the candidate birth moment; probes date from the birth
  moment. A blocked source step makes the layer unavailable, never the old
  algorithm. Blocked count on all three datasets: 0.
- Reseal: sealed 20, offset 900, live v5 231 under the new tag; identical to
  measurement variant (c) trial by trial. float_split / 166d kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 13:12:03 +08:00
ClaudeandClaude Opus 5.5 00b5c92097 Merge branch 'codex/narayana-profiles-1108' into codex/functional-pvr-1108
Combines BUG-1741..1743 (Narayana named profiles) with BUG-1746..1752
(PVR functional table, Shadbala, KP first segment, Mudda wording).
BUG_HISTORY entries kept in number order; runtime contract keeps the
round-5 Mudda sentence and the profile-based Narayana rule; evidence-card
golden recaptured with TTL 0 / PYTHONHASHSEED=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 12:00:41 +08:00
ClaudeandClaude Opus 5.5 5d64f71b81 fix: astrologer round-5 rulings 2/3/4/5/10/13 (BUG-1746..1752)
- Functional default = PVR Table 30 (functional_profile=pvr_table_30); the former
  product table is bphs_exception_profile, scored only when named (rectification
  names it, scores unchanged). profile_divergence shows both roles side by side;
  movable-lagna Moon by the table's paksha note; dual-lordship note; prior rulings
  BUG-1570/1590/#166 Q4 checked against Table 30.
- Shadbala: six open items labelled parameter_sensitive; every option combination
  computed; only planets whose pass/fail flips get minimum_check=parameter_sensitive.
- Vimshottari AD/PD rows carry parent_period_start / visible_period_start; the
  consult card cuts the balance MD from its full parent and clips at birth.
- KP DBA: full first parent, clipped at birth (no balance rescale).
- Mudda: balance fields + balance_method (angle default, time comparison apart),
  nominal_year_days, her crossing wording; Harsha combined blocked reason lists items.
- D30 _meta describes the unequal parts (as her r40).
- Golden recaptured with TTL=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 11:57:22 +08:00
ClaudeandClaude Opus 5.5 0404d0a07c fix(narayana): split into five named source profiles with per-step comparisons (BUG-1741..1743)
Astrologer round-5 ruling 1 (2026-11-08, B3/B4): seed, years, dual lord,
AD direction and start are separate named profiles (Sanjay Rath source
version). Each comparison profile is recomputed with one step swapped; the
step is disputed when the running MD/AD changes, blocked when the source
cannot decide. method_status names exactly those steps with her round-5
sentence; B3/B4 open item removed. Undecided years now block the layer.
The narayana-dasha CLI passes the birth moment. Engine values on the three
public charts are unchanged; Drig and rectification scoring unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 11:46:12 +08:00
Claude 05a11cefbf Merge branch 'codex/rectification-float-split-1108' into codex/phase2-chat-merge-1107
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m18s
Independent Staging Quality Gate / validate-python (push) Successful in 6m40s
Independent Staging Quality Gate / publish (push) Successful in 2m48s
2026-11-08 10:38:08 +08:00
ClaudeandClaude Opus 5.5 0f8be4c815 fix(narayana): B3/B4 open-item text no longer names seed/years (BUG-1732 follow-up)
The r2 re-eval showed 14/70 answers naming 起运/年数 as this chart's
undetermined step, copied from the open-item sentence, while the card said
unknown or ad_direction. The sentence now names no step and says not to
infer one. Golden recaptured with TTL=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 10:36:35 +08:00
ClaudeandClaude Opus 5.5 20fafa3c29 fix(consult): receipt section cap, calendar year and Narayana method status on the card, answer-first (BUG-1729..1733)
- BUG-1729 (P0): the execution receipt capped methodologySections at 12 while
  the loader allows 32; a wealth turn delivers 14 and every receipt failed.
  The cap now lives in consultation-methodology-limits.ts and both read it;
  a sweep of all 2509 domain combinations x 3 questions passes the receipt.
- BUG-1730 (tooling): the offline model-input manifest moves to
  tests/helpers (scripts must not import tests, BUG-1140); the fact-checker
  reads the timing route's nested slow_transits.
- BUG-1731: the card carries the engine's calendar_year (both Tajika years
  and the splitting return); runtime contract rule A-08 (her Q2).
- BUG-1732: narayana_method_status names the undetermined / disputed step
  (seed, years, dual_lord, ad_direction) from the engine, "unknown" when it
  cannot; B3/B4 recorded as open; chat_use single_system_candidate /
  no_judgment; her Q1 sentence in the contract; B-02 rewritten.
- BUG-1733: the conclusion's first sentence answers the question; the
  frozen time range follows it (her Q5).
- Golden recaptured with TTL=0 (method_status; VedAstro offline reason is
  environment-dependent).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 07:28:00 +08:00
ClaudeandClaude Opus 5.5 37383ec6a4 docs(research): float_split_2026_11_08 sealed / offset replay records; BUG-1720 fixed-pending-verify
Sealed 20 and reported-offset 900 rerun with the protocol's own scripts
(exported from c1a69445^, baseline reproduced 166d 20/20 and 900/900),
overlay recorded in the .patch. Old 166d records kept. Live astrologer
stage v5 77x3 sensitivity script added. Sensitivity numbers, not accuracy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 07:11:48 +08:00
ClaudeandClaude Opus 5.5 0bf8deea49 fix(rectification): birth-moment start and float sub-period split end to end (BUG-1720)
Product approved 2026-11-08. _active_vimshottari, the candidate context
timeline, chart_choice astrologer and every event_probes Vimshottari start
now use birth_moment.mahadashas from the candidate birth moment and
birth_moment.split_period for AD/PD, replacing build_dasha_timeline
(00:00 of the birth date) and the integer-day build_antardasha. Frozen
dasha_analyzer.py / domain_calculation_service.py unchanged. Research
mirrors follow. A bare date string now raises TypeError.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-08 07:11:48 +08:00
ClaudeandClaude Opus 5.5 ba70305a5e docs(functional): name PVR Table 30 as a separate reference profile (astrologer Q7)
Product profile is BPHS ch.34 general rules + sign overrides, not PVR Table 30;
Virgo Sun/Saturn neutral agrees; 6 cells differ and are listed. No
classification changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:47:33 +08:00
ClaudeandClaude Opus 5.5 1ae97ce727 fix(upagraha): BPHS eighths as the main part-ruler profile per astrologer Q8 (BUG-1721)
8th part lordless; night starts from the lord of the 5th weekday; Gulika at
the start of Saturn's part; weekday from the period start. PVR Table 10 /
PyJHora order kept as a named alternative profile; Maandi midpoint marked a
separate method not approved by the ruling. Kaala / Mrityu / Artha Praharaka /
Yama Ghantaka move on 12 of 14 rows; Saturn's part unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:46:48 +08:00
ClaudeandClaude Opus 5.5 6277f0b873 fix(annual): keep raw Mudda whole; clip only a labelled view to the report coverage interval (BUG-1722)
(a) raw_periods / raw_antardasha_periods untruncated (ten groups);
(b) nominal_year 365.25 d and its end; (c) coverage_interval = actual solar
return -> next actual return. periods is the view over (c) (原值: cut at the
365.25-day end, 5-15 min before the next return). Annual package, report facts
and consult card carry the view label and the astrologer's crossing-segment
wording; consult layer adds the calendar-year span over two Tajika years.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:45:04 +08:00
ClaudeandClaude Opus 5.5 d73280e9ca fix(upagraha): derive day/night share rulers and Saturn share from one rule (BUG-1721)
Tables unchanged in value (equal to PyJHora const and PVR Table 10); the
lordless-share position (BPHS 8th vs PVR after Saturn) is recorded as an open
ruling; 14 weekday x day/night cases tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:35:39 +08:00
ClaudeandClaude Opus 5.5 295d23bf57 fix(dasha): float sub-period split on every non-frozen AD/PD path (BUG-1719)
reference_transparency_contract: birth-moment MDs + birth_moment.antardashas
instead of the date-anchored frozen service + integer-day build_antardasha.
KP monthly: elapsed years from the full-precision MD start (total_seconds).
birth_moment.split_period: generic float split, last end pinned to parent.
Frozen dasha_analyzer / domain_calculation_service untouched; rectification
scoring keeps the integer split pending a product decision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:35:38 +08:00
ClaudeandClaude Opus 5.5 493868dd18 feat(sync): astrologer r40 8c775cd0 — EN variable-house sentences, yoga diagnostic category
jyotish_engine applicable-yoga filter: equivalent (diagnostic rows never enter detected_yogas).
report_source_translation: ported into pl9_full_data_export EN sanitizer.
yoga_engine category: ported to not_implemented and evaluation_failure rows.
Kalachakra appendix patch: not applicable (her local renderer only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:28:26 +08:00
ClaudeandClaude Opus 5.5 a26645fb48 fix(consult): card Vimshottari AD/PD ends equal engine cmd_dasha (BUG-1718)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m4s
Independent Staging Quality Gate / validate-python (push) Successful in 6m36s
Independent Staging Quality Gate / publish (push) Successful in 3m3s
- _consultation_dasha_sub_periods rebuilds mahadashas from the birth moment
  (only when they reproduce the chart's shown periods) and cuts antardashas with
  chart_dasha.birth_moment.antardashas instead of the frozen
  dasha_analyzer.build_antardasha (integer days from midnight starts).
- Pratyantar cut from the antardasha's full-precision clock; the merged-field
  bridge keeps that ready timeline. Output shape unchanged.
- Regression test against cmd_dasha for two public charts; golden recaptured.
- BUG_HISTORY: BUG-1715..1718.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 23:02:10 +08:00
ClaudeandClaude Opus 5.5 198208ac5b feat(sync): astrologer handoff 2e5485f5 — Sodhita entry, Narayana strength profile, 71 unimplemented yogas, Argala tie, Bhava relative points
- A1: ashtakavarga_shodhana.calc_sodhita_av (her entry; ashtakavarga.py frozen),
  level=not_calibrated + prediction_scoring_allowed=False on the chain; legacy
  subtraction stays removed (BUG-1209).
- A2: select_narayana_seed_sign strength_profile rath_empty_sign_lord_strength_v1,
  shared by source-aware seed, MD and AD (matches her function on 6000 draws).
- A3: preflight of logical branches; placeholder not an implementation;
  reference_only rules listed; 71 not_implemented; cmd_yoga not_implemented_count.
- A4: neechabhanga_kendra name/category per her handoff.
- 9e971559: Vimshottari AD record lord and native current PD in dasa convergence.
- B10: Argala equal count stays strength_comparison_required (no Narayana borrow).
- B11: full-reading bhava_bala.reference_relative_points, labelled
  product_relative_points_not_traditional, no bands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 22:46:04 +08:00
ClaudeandClaude Opus 5.5 62d3da37fe feat(yoga): sync astrologer Yoga rule batch (733a931b / 30dee7b0 / 1307bf69)
产品 2026-11-07 同步占星师 Yoga 规则批次:
- lord(a) != lord(b) guard on ten two-lord rules (raja 1_4, 1_10, 4_9, 5_9,
  7_9, 2_10, 2_7; dhana 5_11, 2_5; kalatra 7_1); Jobs raja_yoga_1_10 and
  Presley dhana_yoga_2_5 no longer form, matching her output.
- 23 rules become structural_observation "(Observation)" rows; old effects
  move to traditional_effects; engine rows carry claim_kind, legacy_name,
  condition_evidence, strength 'observation', strength_basis.
- formation contracts + assess_yoga_formation, formation_checks /
  formation_assessment / strength_factors on every JSON-rule row;
  participants_expr support; natal yoga context chart_type D1.
- consultation: compact rows, sieve hits and yoga_conditions carry
  claim_kind / formation / formation_checks; observation status is
  structural_observation; card yogas_detail copies them plus formation_rule.
- reports: personal report never lists an observation as a formed
  combination; annual facts rank observations last and the evidence lists
  them under 结构观察, not 格局; PL9 tables print 结构观察 for strength /
  category and group observations as mixed.
- governed rules (BUG-1207, 1205, 1187/1206, 1596/1624, 1597/1625, 1571)
  untouched; Parvata stays disabled; 69 not_implemented unchanged.
- card golden recaptured.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 21:58:06 +08:00
ClaudeandClaude Opus 5.5 cd07b3e018 fix: sync astrologer handoff 99076dad (Ashtottari cycle gap, Bhava MC frame, Narayana coverage, compatible fields)
Ported from handoff/product-parity-20261107 (28823446, 99076dad):
- Ashtottari: cycle index counts from the balance-shifted first MD (no
  gap before the 108th birthday); dasha_balance_at_birth / dasha_at_birth /
  timeline_basis now emitted (the report already read them).
- Bhava Chalit MC in the natal frame (_bhava_midheaven_in_natal_frame).
- Narayana current lookup: no modulo replay outside the two generated
  cycles; status selected / outside_generated_timeline.
- Bhava Bala: no unvalidated absolute level; _meta.score_unit = Virupas.
- Field names lined up with hers: required_strength_pct (+ semantics
  marker, via shadbala_display sidecar; shadbala.py stays frozen),
  Harsha missing_inputs / score_range, cmd_yoga evaluation_error_count.
Already equivalent: yoga failures (BUG-1571), Drik determinism (BUG-1576),
standalone transit ephemeris path, Chara dignity location (BUG-1566), Harsha
max 20 / unknown day-night. Tests: tests/test_handoff_99076dad_sync.py.
Golden recaptured (Narayana status field only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 21:17:30 +08:00
Claude 7cc1ab42b8 merge codex/fix-r3-1107 into upstream-full integration (finance Sodhita bridge: listed with scale, never scored; producer restrictions survive) 2026-11-07 20:37:14 +08:00
ClaudeandClaude Opus 5.5 da6230aa81 refactor(timeline): move timeline_boundaries into scripts/chart_dasha (root script budget)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 20:35:55 +08:00
ClaudeandClaude Opus 5.5 66aab1cba4 fix(consult): label Shadbala, Argala and Tajika verification scope downstream; recapture card golden
Astrologer third-round review 2026-11-07, items 4b-4d.
- Shadbala: the ratio total rupas / minimum is labelled a sufficiency
  ratio (not auspiciousness, not ishta_phala) on the card, in the annual
  package (sufficiency_ratio_pct, rank_by_total_rupas), the report facts
  (ranking_basis, ratio_meaning, ranking_by_ratio) and the annual report
  text. Chesta reference packet rows carry values_scope on every row.
- Argala: the layer and card say supported is a structural intervention
  only; ties broken by the Narayana strength selector carry
  ruling_pending / tie_break_ruling_pending (behaviour unchanged).
- Tajika: each annual pack field lists what partial_verified covers
  (formula / order / boundary_dates / full_chart); dates_verified is false
  and the consultation layer projects it.
The consultation evidence card golden is recaptured for the new layer
fields (start_at / end_at, not_evaluated, verification scope, labels).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 20:29:43 +08:00
ClaudeandClaude Opus 5.5 79d256510c fix(sync-d09f): machine-evidence transit section only on finance routes
Upstream ba8e36ec adds sections.transit for every route. Here the annual route
promises a "transit" label; a real but ungated section broke the evidence-gate
parity test. The section stays for finance/wealth, where the finance support
review reads it; the health override is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 20:21:46 +08:00
ClaudeandClaude Opus 5.5 6e15a0367f feat(timeline): one boundary rule, full instants and continuity checks for every period table
Astrologer third-round review 2026-11-07, item 3. timeline_boundaries
checks end == next start on full timestamps (start inclusive, end
exclusive) and lists every gap or overlap. The solar-return report and
annual pack expose the real return interval (this return to the next
actual return, computed), the Mudda 365.25-day year and the shown window
separately. The annual package checks the year chain, each year's Mudda,
Patyayini, monthly and Varsha Narayana rows, natal Vimshottari / Narayana,
and Mudda across years (a ~8-minute hole the fixed year leaves before the
next return). Consultation dasha rows gain start_at / end_at with the
birth offset and a per-system continuity check; the card carries
continuity_issue only when a table is not continuous.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 20:14:01 +08:00
ClaudeandClaude Opus 5.5 b0e93904c5 fix(tajika): unknown day/night leaves Harsha incomplete instead of scoring 0
Astrologer third-round review 2026-11-07, item 2. With is_daytime unknown
the fourth Harsha component is None (status unknown), the total is
withheld and only the known three-component sum (out of 15) is given.
The annual pack, report facts, interpretation rows and the parity
strength table carry the incomplete state instead of a full score.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-07 20:04:47 +08:00