/api/chart, /api/dasha and the analysis layer, daily guidance and the KP
monthly packet used compute_vimshottari_timeline, which hands
build_dasha_timeline only the birth date, so periods started at midnight;
cmd_dasha (reports) starts from the birth clock and lays antardashas from the
full parent with float days. scripts/chart_dasha/birth_moment.py reproduces
cmd_dasha; 60 standard charts: MD and AD 60/60 equal (old chart path 9/60),
51 charts move by at most one day. Frozen scoring files are untouched, so
rectification probes keep the day start (left for a product decision).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 0 of every turn could only call rectification-read-case with the
default projection, a result the server can compute. The runner now runs the
agent's own read-case tool after the Skill is bound (same tool, receipts and
projection), passes the call and result to the model as the turn's opening,
and gives step 0 the full tool set. Synthetic chunks go through the same loop
(case.loaded, activity and Skill receipt once each) but not into step timings.
The synthetic call carries a short reasoning line: thinking-mode DeepSeek
rejects a prior tool call without reasoning_content (checked live). read-case
stays callable for resume / full_diagnostics. Agents without listTools keep
the step-0 read. The Skill package has no "read first" text; prompts updated.
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>
- 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>
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>
- 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