Commit Graph
1261 Commits
Author SHA1 Message Date
jesse-uxandGrok (agent loop) b8a56c48ed fix(ondemand): beyond_next_return compares on one time basis (#175 round 2, BUG-1818)
打回:Mudda 原始段是返照地点的本地时刻,覆盖区间终点却拿 utc 去比,差一个时区偏移。

- 比较两边都改用 coverage.end.local(没有 local 时退回 utc + 返照地点偏移)
- 新增 4 条测试(北京 +08 与纽约 −05 各 ±3 小时);旧代码上 2 条失败
- 未改 scripts/solar_return.py 或任何冻结文件;既有 16 条未动

Tests: 本文件 20 条,连同 transit_window/transit_date/contract/api growth 共 70 条全过。

Co-Authored-By: Grok (agent loop)
2026-11-09 17:47:07 +08:00
ClaudeandClaude Opus 5.5 4651a7a486 docs(task): FIX-ondemand-solar-return-1.md — #175 review fail: beyond_next_return compares local time with UTC
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 17:33:42 +08:00
jesse-uxandGrok (agent loop) 54adb99073 feat(ondemand): solar return for any target year, location chosen by the caller (#175, BUG-1818)
只做后端:

- scripts/ondemand_calc/solar_return.py:target_year(1900–2100、不早于出生年);
  返回地点 birth_place / current_location,没选才回退出生地并写 fallback_note,
  current_location 缺项一律 blocked 且不回退
- 岁差必填、节点与位置口径显式传,position_mode=mean 阻塞
- 输出三层:mudda_raw(原始十段,每段标 beyond_next_return)、nominal_year
  (365.25)、coverage(到下一次实际回归);harsha_bala 恒 blocked
- 星历降级与引擎抛错都 blocked,不输出任何估算日期
- registry 加两行注册

Tests: tests/test_ondemand_solar_return_20261109.py 16 条;连同 transit_date、
transit_window、contract、api growth 共 66 条全过。合成盘两地返照时刻差 0 秒、
上升不同;覆盖终点与下一年返照时刻差 0.0 秒。

Co-Authored-By: Grok (agent loop)
2026-11-09 15:48:02 +08:00
ClaudeandClaude Opus 5.5 c7f8b6a623 docs(task): brief for ondemand-solar-return (#175, 2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 15:37:45 +08:00
Claude 7505c841b2 Merge remote-tracking branch 'origin/codex/basis-candidate-status-20261109' into codex/accept-grok-batch2-1109
# Conflicts:
#	docs/BUG_HISTORY.md
2026-11-09 14:41:30 +08:00
jesse-uxandGrok (agent loop) 09a67aad5a fix(consult): 解读依据的格局行按卡上状态说话,不再写成成立 (#181, BUG-1824)
- 新增 yoga-status-words.ts:conditions_not_met → 不成立;candidate → 候选;
  computed → 未确认;其他 → 未标状态;结构观察不进这一行
- yogaLine 逐个名字到 card.base.natal.yogas_detail.rows 取状态词并按状态分组
  (候选:A、B;未确认:C),没有可列的写「本题没有检测到相关格局」
- 「格局」兜底文案改为「盘上检测到的格局已列出各自状态」(三栏注释)
- 数据卡、回执 schema、行状态判定、页面组件都不动

Tests: 新增 consult-basis-candidate-status-1824.test.ts(8 条);
consult-technique-evidence-1793 / consult-answer-basis-receipt-20261108 /
consult-answer-mode-ui-20261108 继续通过;tsc 0 错,lint 0 error。

Co-Authored-By: Grok (agent loop)
2026-11-09 14:33:47 +08:00
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 21b1fe1aae docs(task): brief for basis-candidate-status (2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 14:03:27 +08:00
ClaudeandClaude Opus 5.5 636b24f081 docs(task): brief for ondemand-transit-window (2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 14:03:27 +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
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
ClaudeandClaude Opus 5.5 2726b96a1b docs(task): fix brief FIX-muhurta-1 for #179 (review fail on 28c719cb)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 09:09:35 +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
ClaudeandClaude Opus 5.5 53b0609846 docs(task): #173 decision — backend shared module only (option C), explicit product defaults, mean position blocked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 09:03:41 +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 7cdf83106a docs: task brief for #179 muhurta (2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 07:18:34 +08:00
ClaudeandClaude Opus 5.5 f5356c62c1 docs: task brief for #173 ondemand-transit-date (2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 07:18:29 +08:00
ClaudeandClaude Opus 5.5 41862634f3 docs: task brief for #169 counterexamples (2026-11-09)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 07:18:12 +08:00
ClaudeandClaude Opus 5.5 8feabcc588 docs(task): brief for dasha-dates-engine-only-20261109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 00:14:47 +08:00
ClaudeandClaude Opus 5.5 9c7b35ef63 docs(task): brief for reports-no-web-wording-20261109
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyn7Hj3LCW3BUs5bZ8
2026-11-09 00:14:42 +08:00
ClaudeandClaude Opus 5.5 228df0f7fb feat(ephemeris): personal month calendar on 星历 (BUG-1666, BUG-1667)
Independent Staging Quality Gate / validate-frontend (push) Successful in 5m12s
Independent Staging Quality Gate / validate-python (push) Successful in 5m48s
Independent Staging Quality Gate / publish (push) Successful in 3m27s
The 星历 page gets a month calendar for the chosen person: every day is
吉 / 平 / 凶 with two or three life themes from transits against their own
chart, the selected day opens to its themes and "为什么", and below it
「接下来要留心」, 「这几天」 and 「回看」 (owner, 2026-11-07: A's grid plus
C's lower half).

Engine: scripts/personal_calendar.py joins existing calculators on one
date axis (one call, <0.5 s for 45 days): Panchanga in the subject's own
ayanamsa, Tara / Chandra bala, Moon house from Lagna and Moon,
Ashtakavarga SAV + Moon BAV, transit conjunctions with natal points,
functional benefic / malefic, activity verdicts with native inputs,
ingress / station / combustion / eclipse / Vimshottari AD+PD boundaries,
and a month backdrop (Vimshottari MD/AD/PD, Narayana, Sade Sati / Kantaka,
slow-graha contacts, Jupiter+Saturn double transit). New endpoint
/api/personal_calendar.

BUG-1666: check_activity_muhurta ignored Vishti karana, Vyatipata /
Vaidhriti and an avoided Chandra bala, so a Vishti day could be 大吉.
BUG-1667 (closes BUG-703 / BUG-707): /api/panchanga_range now honours the
requested ayanamsa; the day view asks for the subject's own and drops the
Lahiri note.

Frontend: /api/ephemeris/month (own rate-limit bucket, cached),
/api/ephemeris/checks + migration 20261107010000_ephemeris_day_checks
(answers kept with the birth declaration they were made under). Copy is
life-first with the sky events folded under 为什么; draft wording pending
the astrologer. TASK-ephemeris-page decisions 4/6 and hard lines 3/7/9
superseded per the owner; DESIGN.md §16 updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXozbkyFNqbu8pVEtZ7W
2026-11-07 00:44:37 +08:00
ClaudeandClaude Opus 5.5 8f83eb2c25 fix(report): Kalachakra uses the classical sign periods from the Moon longitude (BUG-1656)
The full reading and the dasha registry called the Kalachakra module without
the Moon longitude, so BUG-1487's PVR ch.24 sign periods never ran in the
product. The report printed the legacy approximation (planet lords, 7..18
years) under a "simplified model" label.

Both callers now pass the Moon longitude. The dasha family carries
method_profile. Classical results keep their own AD/PD rows instead of the
rotated simplified table, and the reader and research tables list signs.
The PyJHora comparison was rerun: majors now agree, sub-period division still
differs (documented).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-06 17:23:21 +08:00
ClaudeandClaude Opus 5.5 a6f5ffbb4f docs(sync10): record sync 10 in the ledger, changelog and progress note
Ledger entry for upstream 5fb8379c with target 9d69cd56 and rollback list.
The progress note has the inventory, what was not ported and why, test
results, and the status of the two 2026-10-03 upstream issues. Both are
fixed upstream: KARAKA_8 now follows BPHS order, and Narayana profiles now
reach calc_narayana_mahadasha.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-04 12:08:51 +08:00
ClaudeandClaude Opus 5.5 a861d26977 feat(chart): per-item birth-window stability, verify-first prompt, explicit calc settings (issue #165)
Part 2 of #144.
- The varga-segments scan gains opt-in stability_items: lagna degree, Sripati
  cusp signs, Moon sign / nakshatra / pada / house per minute, plus a
  historical-timezone check. The precheck requests D1/D9/D10 with it.
- Chart page shows nine computed items (一致 / 有变化) only for a range the
  user gave, the verbatim comparison sentence, a verify-first block for the
  conditions stored data can show, and the verbatim Dasha boundary sentence.
- Precheck sends the chart's ayanamsa and node mode and drops replies with
  other settings; the endpoint honours node_mode. candidate_time_sensitivity_scan
  and flexible_birth_time_profile take no defaults (BUG-1515).
- 只记得时辰 third question, stored in birth_time_clue; no migration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-03 10:39:18 +08:00
jesse-uxandGrok (agent loop) 5213a861d4 docs(tasks): record the #144 database verification run (agent loop, issue #144)
Independent Staging Quality Gate / validate (push) Successful in 19m5s
Independent Staging Quality Gate / publish (push) Successful in 3m45s
Verify-only run on the intake branch: tsc 0 errors, lint 0 errors, the ten
changed frontend test files 105/105, and test:db 98 tests with 82 passing.
All 13 known Windows failures still fail; three tests in
database-segment-saved-native.test.ts fail only because the Windows Python
alias returns 9009, and they pass 3/3 when PYTHON points at the repo venv.

No source, test or migration changes. Flagged for a decision instead of
fixing, per the brief.

Co-Authored-By: Grok (agent loop)
2026-11-03 02:22:06 +08:00
Jesse_ChenandClaude Opus 5.5 d63757a736 docs(tasks): verify-only test:db brief for #144 part 1 (Grok)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:50:37 +08:00
ClaudeandClaude Opus 5.5 27af81de9b docs(tasks): birth-time source intake part 1 progress, changelog, device checklist
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-02 23:39:15 +08:00
a2f80de505 docs(tasks): birth-time source intake brief, part 1 (agent loop, issue #144)
jesse chose A: keep asking for the source, stop mapping a source to a
fixed error, let the user give earliest/latest or "error unknown", and
add the columns needed (additive only). Part 2, per-item stability over
the range, is a separate queued issue.

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
2026-11-02 22:36:31 +08:00
ClaudeandClaude Opus 5.5 ca8d63b5b6 feat: chart terms and board overlays per the astrologer's #163 answers 4-8
Shadbala (Q4): one rule everywhere, total / the body's own BPHS minimum.
100 % or more is 达标 (light green), below is 未达标 (light warm tint), a
body the engine left out is grey 未计算, never 0. The 120 % / 90 % strong /
medium / weak tiers are gone from the inspector, 命盘速览, 能量图谱, the board
星力 tags and the data card.

Dasha (Q5): MD 大运, AD 小运, PD 细运 across the chart page, 深读, inspector,
命盘速览, the data card, board chips and the consult / report-reading model
prompts. The board keeps the wash on the houses the period lord rules, adds
an outline on the house it sits in, drops the lines between period lords,
and gets a 「从运主起算」 toggle that renumbers the houses from the lord with
a 「宫位从某星起算」 chip. Chara marks the lord the engine used (co-lords as
returned) and outlines its house from the engine's lord_in_sign.

敌友 (Q6): the centre defaults to the lagna lord (the Moon with a chip when
the lagna may change), remembered per browser; the seven grahas only;
natural, temporary and compound side by side plus the reverse direction;
the board says which relationship it shows.

瑜伽 (Q7): highlight only, no array-order lines (the yoga rows carry no
relation data).

Names (Q8): 八分法 (title 八分法(Ashtakavarga)), BAV / SAV labels,
Arudha 映射.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-02 20:36:18 +08:00
Jesse_ChenandClaude Opus 5.5 4dbaf51857 feat: preset-question menu beside the chat composer (#151)
Independent Staging Quality Gate / validate (push) Successful in 15m7s
Independent Staging Quality Gate / publish (push) Successful in 4m20s
Twelve domains x five astrologer-reviewed prompts fill the composer and
select the first blank. Phone bottom sheet, desktop popover; hidden for
synastry, rectification and incomplete profiles. No extra model call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 18:21:35 +08:00
ClaudeandClaude Opus 5.5 46273a169e docs: rectification for other people (issue #160)
CHANGELOG, DESIGN, VOICE, onboarding red line 11 lifted, pre-work
ledger entry for this session's blocked checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
2026-11-01 17:26:04 +08:00
jesse-uxandGrok (agent loop) 3bc82acba6 research(d60): ship the G2/G5 script and report per-switch flips (issue #149)
The G2 precheck and the G5 noise floor had only a results file; the script
that produces them is now in scripts/research/d60_two_way_g2_g5.py, with
a test that reproduces the committed JSON byte for byte.

G5 is now reported per switch, with the ayanamsa offset in arcminutes.
Against the Raman baseline all three alternatives flip 77/77. Between the
alternatives themselves the number follows the offset: Lahiri to KP 21/77
(27.3%, 5.81'), KP to True Chitra 19/77 (24.7%, 5.02'), Lahiri to True
Chitra 2/77 (2.6%, 0.83'). The report says so and no longer claims that
any frame change flips every chart; the registered gate is baseline
relative and still triggers.

The report also states that G2's "not evaluable" comes from the registered
same-day answer policy, not from a measurement that D60 does not help.

Co-Authored-By: Grok (agent loop)
2026-10-29 16:32:54 +08:00
Jesse_ChenandClaude 09620c6e0a docs(tasks): D60 study second half, first rejection (agent loop, issue #149)
The G2-G5 results came without the script that produced them, so G5's
77/77 ayanamsa flip cannot be replayed. Commit the script, report G5 per
alternative ayanamsa, and say that G2's zero questions came from the
same-day scoring rule the planner chose.

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
2026-10-29 16:14:25 +08:00
jesse-uxandGrok (agent loop) 028992257b research(d60): G2 not evaluable, G5 trips the noise floor (BUG-1497, issue #149)
The registered same-day answer policy needs an event dated on the birth day;
the v5 holdout has none in any of the 77 cases, so group B adds no question
and is identical to group A. G2 is therefore not evaluable by construction,
not a measured zero, and no placebo test has a lift to check.

G5 is measurable and decisive: switching the ayanamsa from Raman to Lahiri,
KP or True Chitra changes the ascendant D60 sign in 77 of 77 cases (100%,
threshold 20%). Under the registered stop rule any minute-level wording is
forbidden.

Recommendation: do not adopt. D60 stays reference-only and the external copy
does not claim seconds. BUG-1497 is closed_by_design; the mapping fix itself
is BUG-1500 and already merged.

Co-Authored-By: Grok (agent loop)
2026-10-29 15:48:08 +08:00
jesse-uxandGrok (agent loop) 129313e175 fix(varga): count D60 from the sign itself for every sign (BUG-1500, issue #149)
Independent Staging Quality Gate / validate (push) Successful in 20m59s
Independent Staging Quality Gate / publish (push) Successful in 4m25s
The production D60 branch added one sign to 1-based even signs, with no
source, while the repository's own guide and the vedastro mapping count
from the sign itself. PyJHora agrees with the latter: 33/77 recorded times
before, 77/77 after.

- scripts/varga.py: D60 is (si+pi)%12 for odd and even signs; other
  mappings and the vedastro mode are untouched.
- tests/test_d60_varga_mapping.py: 12 signs x 60 parts against
  PyJHora, plus the even-sign first part.
- scripts/research/d60_two_way_run.py: the G1 reconciliation that found
  this, now in the repository with a test; G1 passes 77/77.
- scripts/varga.py is part of the extended frozen identity, so the sealed
  holdout and the reported-offset sweep were re-frozen per ERR-110. All
  20 and 900 trials match the upstream_sync9b records on every field and
  the metrics and summary are unchanged.

Co-Authored-By: Grok (agent loop)
2026-10-29 14:30:57 +08:00
jesse-ux a21c9ec163 merge: bring staging into the D60 research branch (issue #149) 2026-10-29 13:33:42 +08:00
Jesse_ChenandClaude 124ff8e0ba docs(tasks): D60 mapping fix brief, option 1 (agent loop, issue #149)
Product chose 1: fix production D60 (count from the sign itself for odd
and even signs) before continuing the two-way study. Renumber the
branch's D60 bug BUG-1498 -> BUG-1500 to clear the staging collision,
and settle the D60 boundary scoring rule as same-day events only.

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
2026-10-29 13:21:49 +08:00
Jesse_ChenandClaude Opus 5.5 68670b2819 Consult classification runs beside reserve and append (issue #162, BUG-1499)
Independent Staging Quality Gate / validate (push) Successful in 16m28s
Independent Staging Quality Gate / publish (push) Successful in 4m15s
Classification only needs the question, history, name and session model,
so it now starts in beforeReserve once moderation passes and is awaited
after the question is written. Billing is unchanged: smalltalk is still
reserved and refunded by complete_consultation_free, and an unused early
call (reserve refused) is capped at the classifier's 3 s fail-open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 11:54:49 +08:00
Jesse_ChenandClaude Opus 5.5 435c8e19f9 Answer step defaults to low reasoning effort (issue #134)
Independent Staging Quality Gate / validate (push) Successful in 24m29s
Independent Staging Quality Gate / publish (push) Successful in 4m17s
Product chose A after the A/B: low cut answer-step reasoning tokens ~45%
and answer time 34s -> 22s with no quality loss. Unset now means "low";
CONSULT_ANSWER_REASONING_EFFORT=off restores the pre-change request body,
and the old "unset keeps the body" guarantee moves to "off".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 11:00:22 +08:00
jesse-ux 98be2649ac research(d60): G1 stops on a production mapping mismatch (BUG-1497, BUG-1498, issue #149)
The D60 ascendant of the production classical_local mapping agrees with
PyJHora on 33 of 77 recorded times (42.9%). All 44 mismatches are 1-based
even signs and differ by exactly one sign; the repository's own vedastro
mode agrees with PyJHora on 77 of 77.

So G1 fails the 95% gate, but the cause is the production mapping rule in
scripts/varga.py, not a missing D60 signal. BUG-1498 records the
inconsistency as investigating. G2-G5 did not run and no scoring rule was
registered.

jyotishganit is not installed here and VedAstro was not called, so the
reconciliation is single-engine and says so.
2026-10-28 20:02:43 +08:00
jesse-ux 3bbf58e984 docs(d60): register BUG-1497 and record the two-way pre-work (issue #149)
Environment checks are done: swisseph 2.10.03, PyJHora importable with a
shashtyamsa chart, the v5 holdout present, and the four baseline test
files green (98 passed). jyotishganit is not installed, so G1 ends up with
PyJHora as the only external engine.

The B-group scoring rule cannot be implemented as written: the six-question
replay answers date-level boundary questions, while a D60 change happens
every couple of minutes inside one day. Two workable options are recorded
in PROGRESS and posted to the issue; nothing is scored before the rule is
preregistered.
2026-10-28 19:00:54 +08:00
jesse 88a03808a9 docs(tasks): D60 two-way comparison brief for local Grok (issue #149)
Nadi/D150 seconds were falsified in BUG-1240; this brief only tests D60 as a
discriminator: production V9 vs V9 + D60 segment boundaries on the 77-case v5
holdout, both directions (help and harm), preregistered gates G1-G5, plus a
20-case model-in-the-loop conversation comparison. Offline, no production or
frozen-file changes. Reserves BUG-1497.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 7f7321b77725c8798292f184fc038fcfaf8c11ff)
2026-10-28 18:55:56 +08:00
jesse-uxandGrok (agent loop) cbe665107f test(freeze-guard): keep the sync8 freeze paths in the forbidden list (issue #159)
The sync9b edit replaced the two sync8 entries in
IDENTITY_FORBIDDEN_PREFIXES instead of appending after them, so the guard
covered two records instead of four while still passing. Restore the
sync8 pair under its own comment and keep the sync9b pair after it.

The freshness test passes again (9) and the frontend confirmation-gate
test for the moved sealed report passes (8).

Co-Authored-By: Grok (agent loop)
2026-10-28 17:01:31 +08:00
Jesse_ChenandClaude 8015e8efb7 docs(tasks): upstream sync 9 batch B first rejection (agent loop, issue #159)
The freshness test's IDENTITY_FORBIDDEN_PREFIXES list is append-only;
the branch replaced the two sync8 entries instead of adding the sync9b
ones after them, which weakens the identity guard. Restore them.

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
2026-10-28 16:47:37 +08:00