Batch 1 of the scripts/ root cleanup: the closure scripts no runtime entry,
other script, workflow, deploy file, ops doc or quality gate reaches, with
their 11 test files (30 cases). Their references/ outputs stay. Scripts still
imported elsewhere, named by the gate, or listed in archived reference indexes
are kept. Root budget 452 -> 441.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unreachable from every app entry and frontend/scripts (dynamic imports
counted): chart-basics-tab, error-toast, seven unused shadcn ui files
(skeleton among them), three birth-time helpers only tests used, the motion
provider shell (it imported motion/react statically), and the two empty
people/account stores. Tests that only exercised them are removed or trimmed,
each with old/new/reason notes. Unreachable files 18 -> 3 (all kept on
purpose); npm test names drop exactly the 4 removed and 1 renamed test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Foreground gateway: a run that ended without official data is written to
the existing same-day negative snapshot store; later turns that day answer
from it without starting the gateway (second call <= 0.15 s, same fields).
Success still goes to the positive cache first; a consult-gate deferral and
a join timeout are not failures.
- /v5/vedastro-validate: a result blocked by VedAstro itself is kept in memory
for a day per (evidence fingerprint, candidate pair); evidence-decided
results are not. The whole check has 11 s (frontend waits 12 s); calls with
time to spare keep the adapter timeout, so normal output is unchanged.
- conftest also isolates the negative store and clears the check memory.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The HTML early-read script also runs on /chart, /people and /synastry:
account, people list and the current person's sessions, plus on /chart the
remembered person's chart-view (bound to that person, page deadline kept).
The model list stays home-only.
- Account and people-list early reads hand one clone to the shell and one to
the page, once each, in either order; later reloads go to the network.
- Synastry sends product-access, account, people and history together; access
is still decided before anything about people paints.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The early-read script now also sends /api/sessions/<id> when ?c= carries a
valid session id (same rule as parseSessionUrlQuery), next to the account.
Only the home bootstrap takes it, bound to that id and once: the lookup for a
conversation off the first page, or the landing fetchSessionDetail. 401/404/
error handling and notices are unchanged; a failed early read refetches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- consult_packet_view keeps the last 3 parsed packets with their shared domain
base (~30 MB each). A hit reads no file and copies nothing: attach for one
domain 0.106 s -> 0.002 s. Memory holds the file's JSON round trip, i.e.
exactly what a hit returned before; consult_card_facts sha256 equal old/new.
- Cache files are created 0600, same bytes as before.
- The consult route fires a warm for the turn's chart before reserving credit,
so the day's first question does not build the packet on the answer path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- parseBirthDate/formatBirthDate: hand-written yyyy-MM-dd with the same strict
round-trip check; equal to the date-fns version on 97,507 inputs.
- Sign-out imports the better-auth client on click.
- The share report export downloads at idle after first paint; once loaded,
share writes the clipboard inside the click exactly as before.
- page.tsx: drop the unused consultationReportMarkdown import.
gzip-9 of every referenced JS/CSS: / -29,240 B (still Static); /chart, /people,
/reports about -29 KB; /ephemeris -23.6 KB.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
page.tsx imported the whole rectification surface statically; its verification
report also imported chat-markdown-view statically, which pulled react-markdown
into / even though chat-message-content already loaded it lazily.
- Home renders a same-named lazy wrapper; openRectificationCase starts the
download with the open request and awaits it before setting the ids that
mount the surface, so it still reveals once, drawn.
- The markdown loader moves to lib/chat-markdown-loader; the home bootstrap
awaits it before revealing a conversation with messages (no plain-text flash
on ?c=). The blank home does not wait.
/ first load, gzip-9 of every referenced JS/CSS: 704,165 -> 609,606 B (-13.4%),
still Static.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
executeWindowConsultation awaited /api/declared_window_chart before sending
/api/rectification/v5/range_reading, which does not depend on it. Both now go
out at once; a failed range reading still only drops the minute-sensitive
themes. Two 150 ms stubs: ~150 ms total instead of ~300 ms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Home subscribed to the whole streamingReply object, so each animation frame of
an answer re-ran the page (header, picker, composer, overlays) and the desktop
natal panel under it. ChatStreamingTranscript now subscribes for its session
and feeds ChatTranscript; Home reads one derived boolean for the stop label.
ChatChartSplit is memoized. 100 frames: Home <=2 commits (was >=100), panel 0.
Two source-contract tests now pin the new component instead of the old names.
The onboarding typewriter still ticks at Home level (out of this ticket).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fifteen calculation fixes landed on upstream main on 10-16 that sync 8
never saw, because sync 8 took the upstream-notice branch instead.
Batch A (nine items outside the rectification freeze) goes to Grok now;
Varga and Narayana touch frozen files and wait for #137.
Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
read_full_data_domain deep-copied the shared worksheets on every call; a long
report reads five domains twice, so ten copies for read-only use. The shared
part is now copied once (full_data_domain_base) and reused for every domain's
facts and their leaf check; each domain's facts are still copied out so domains
share no objects. Long reports byte-identical on four fictional charts; with
#121, -24–29% end to end.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoz1Qk3y9buDv1mkmTu
Byte-identical to the legacy path on four fictional charts (PyJHora masked),
-19–26% end to end (median 23%). Short of the 25% written on the ticket; the
product owner chose to turn it on anyway. JYOTISH_REPORT_RENDER_FAST=0 restores
the old path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoz1Qk3y9buDv1mkmTu
- Composer cancels InputGroup's dark-mode fills too (BUG-1466 covered light only).
- Chart head controls share one 32px height, tags 28px, per the signed prototype;
the birth line moves under the name so the phone top bar is one line.
- Inspector card has one fixed height and scrolls inside.
- Chart-type sheet header is a row (SheetHeader ships flex-col).
- Restore shadcn's base border-color rule: bare kit borders were drawn in
currentColor, a white line in dark mode; the phone chart sheet pads once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoz1Qk3y9buDv1mkmTu
The birth editor on /chart now loads when the pen row is clicked (warmed on
hover/focus), the people page's add/edit form is fetched after mount, and
the people city column reads the on-demand table. /chart first load
-116 KB gzip, /people -111 KB; home +0.19%, still static. A static import
graph test keeps the table out of both pages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbBXoz1Qk3y9buDv1mkmTu
The 300 ms budget failed twice on the gate runner while the test takes about
74 ms locally. What it proves is that the line shows before the server
answers, so assert that the controllable stream has not answered yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
Rename, delete with confirmation, pin, share and reorder moved from Home's
session hook into the shared (app) shell, so /chart, /ephemeris, /reports
and /people rows get the same menu and drag as /. Home only adds its paging
cursor, what the open conversation does when deleted, and which local chats
are unsaved. BUG-1467.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
Round 3 followed the competitor screenshots instead of prototype v2.
Restored from the prototype source: page head (name, system switch,
report and chat buttons), layer row left / style right, the caption
strip with dasha chips, north board drawn from house centroids with sign
glyph + name + house number, dignity colours and " R", twelve house
theme chips with dots, wrapped antardasha chips, card hints, inspector
empty state, deep-reading hints, chevron date steps and 此刻, year axis
under the mahadasha scroll, three-column birth data. Point layers stay
in the layer group; side triangles stack bodies so nothing leaves the
frame (BUG-1465 test kept).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
InputGroup's has-disabled: classes matched the disabled send button and
greyed the whole empty composer; ChatComposer cancels both. Sortable
session rows drop the always-on grip column: mouse drags the row (6px),
touch long-presses (250ms), a drag never opens the row, and the grip
stays only for keyboard sorting, visible on focus. The row menu shows on
hover, focus or the current row on hover-capable devices.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
North board: each house gets fixed slots for its sign name, bodies, tags
and transit glyphs, so names no longer pile up at the centre and corners
and right-hand bodies stay inside the frame. Card body grid column is
minmax(0, 1fr), so the board no longer overflows the card on phones.
Board card keeps two control rows (type, one layer row incl. point
layers); north/south moves into the card header; the duplicate caption
strip is gone. House themes list occupied houses; antardashas sit in one
row; glance grid aligned; date field no longer full width; the time tab
shows only Chara/Yogini below the Vimshottari scroll.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
Accounts that already saved another person crashed on the home page because the chart list left birthTimeClue out. The list entry now starts from an empty profile, then keeps every field the API sent.
Checks: tsc exit 0; lint 0 errors (122 existing warnings); chart-library-normalize 2 pass; related tests 38 pass; npm test 5268 tests, 5235 pass, 33 fail, 0 cancelled. Those 33 are the existing Windows set, including the 13 names in windows-known-failures.txt.
Co-Authored-By: Grok (agent loop)
Adds /api/chart_points, a thin route over existing producers (upagrahas,
Swiss-Ephemeris special lagnas, Yogi points, arudha padas, friendship), and
the chart page's 数据表 (planets, upagrahas, special lagnas, arudhas,
shadbala detail, friendship) plus a 标点 layer that marks every point of one
group on the board. The ashtakavarga matrix gains the ascendant's own row.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
The chart page is now one page: board and inspector beside the nine-body
table, house themes, dasha strip and summary, with four deep-reading tabs
below (time, strength, yogas, chart book). Clicking a body or house draws its
rulership and aspect lines and fills the inspector. Shadbala, yogas and the
birth tithi come from the natal packet; ashtakavarga and house strength are a
new lazy layer; the transit layer takes any date. The chat's natal panel
carries the same board, opens by default, and is a bottom sheet on phones.
Logged two engine bugs found on the way (BUG-1462 sunrise, BUG-1463
/api/shadbala); neither is fixed here.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
The chart page now continues a case already open instead of showing a conflict. Someone else's chart no longer offers that link.
tsc exit 0. lint 0 errors, 122 warnings. Precheck and chart-page tests 56 pass. Opening tests 70 pass.
Co-Authored-By: Grok (agent loop)
The fixed opening and the model brief now say the step does not guarantee a single minute, and an opening that skips that limit falls back. Assertion updates record old value, new value, and why. Ran the opening copy tests: 0 fail. tsc --noEmit exit 0. npm run lint 0 errors.
Co-Authored-By: Grok (agent loop)
The chart header adds one sentence and a self-only rectification link. The 46px row grows only while that sentence is present. Ran tests/chart-page-view.test.tsx and tests/chat-session-url.test.ts with the precheck batch: 0 fail.
Co-Authored-By: Grok (agent loop)
The D1 segment scan runs beside the natal chart with a 3 second timeout. A failed scan omits the field and still returns the chart. Ran tests/lagna-precheck-chart.test.ts: 3 pass, and tests/chart-view-route.test.ts passed.
Co-Authored-By: Grok (agent loop)
Hospital, family, approximate, period, and unknown birth sources map to the scan window. Adopted times and legacy imports stay quiet. Ran tests/lagna-precheck.test.ts: 2 pass.
Co-Authored-By: Grok (agent loop)