createSynastryFullReport counted today's reports with .gte(), which the
self-hosted client did not implement; every create threw before any credit
was reserved and surfaced as a generic 500 (BUG-1399). The synastry create
path now uses the shared DataQueryBuilder type, and a scan test requires every
builder method used in src to exist on the self-hosted client.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Ad9rqAB8pXXvyzh7f4X8v
The add-person card, the generating wait, and the report header follow the prototype the product owner pointed at.
Co-authored-by: Cursor <cursoragent@cursor.com>
Editing a published model tried to update a non-draft row, so the save collapsed into a generic constraint error.
Co-authored-by: Cursor <cursoragent@cursor.com>
The local PostgreSQL check reads the whole feature_pricing table, so the 19-credit rows from the new migration have to be in the expected list.
Co-authored-by: Cursor <cursoragent@cursor.com>
The closed sentence was prerendered when the build had no database. The page now asks for the flag in the browser, and synastry.full is published at 19 credits.
Co-authored-by: Cursor <cursoragent@cursor.com>
The follow-up checker now rejects a shifted antardasha or English mahadasha, and the onboarding source contract matches the new sentence.
Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
A wrong antardasha or English mahadasha date still passes the follow-up checker, and the home onboarding source contract was left behind.
Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The chat stays bound to that section's saved calculation, checks each chart fact before answering, and bills like an ordinary turn.
Co-authored-by: Cursor <cursoragent@cursor.com>
The list query had been split into four reads, so older pages no longer followed one cursor. A7 was read from the wrong module, and the shell asked for the product switch on every mount.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
Renumber the synastry records to BUG-1394 and BUG-1395 so they no longer collide with BUG-1393 from issue 84.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The second review still failed on missing database and route coverage, an unmarked relationship structure, a stuck English lease, and a sidebar that fetched the product switch itself.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The review found empty sections and an English job that stayed running. Take evidence from reader briefs, retry one section, and settle before marking the report ready.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The report used the same nine-year rule as Shoola. Start from the stronger second or eighth sign and list mahadashas only.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The pair page and reader replace the leftover chat draft, and the same pair is not charged again.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The two upstream files stay verbatim in scripts/. The path helper moved into a subdirectory so the root file budget rises by only those two. Niryaana Shoola is a placeholder until its rule is corrected. Targeted tests passed.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
Move the three local glue modules into scripts/marriage_match_service and point the invocation matrix at marriage_match.py. The upstream engine file stays where it is.
Checked the file-count and oracle contracts, the marriage-match tests, and a Windows full pytest. The 176 failures are python3-missing and path-separator noise; the named contracts passed.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The western comparison layer was invoked without its files, so it stayed blocked. Navamsha and Niryaana Shoola are filled from the native rashi dashas.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
The saved row was the whole dossier twice. Keep the default and Raman match results, drop a concurrent duplicate insert back to the first row, and hide the new rows from the old history list.
Checked service tests 9/9, tsc 0, lint 0 errors, and test:db 73 pass / 13 fail matching the Windows known list.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
Sync8 changed ashtakavarga.py, dasha_analyzer.py and narayana_dasha.py,
which are in the frozen scoring identity. Sealed (20) and reported-offset
(900) replays match the scoring_perf_2026_10_13 records trial for trial,
so ERR-110 stores a new record. Prior records are kept byte-for-byte.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
Keep both changelog entries and the archive-limit board row. The marriage-match row stays on this branch for the storage fix.
Co-Authored-By: Grok (agent loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
Polar day or night left determine_daytime without a sunrise, so the whole
avasthas module failed after the PVR activity formula was wired in. Only
the Shayanadi cell is blocked now; the other four states still compute
(BUG-1390).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C