Work Tracker

📊 Daily Overview

Total Activity: 13 commits + 3 merges across 2 repositories


🚀 GitHub Activity

1. VipinKaushik 🔒 — 9 commits + 3 merges

feat(sky-mandala): single-script i18n, glyph labels, light palette, sunrise-anchored muhurta · 6914cef

  • i18n: entire sky-mandala section renders only the active language. New
    lib/i18n/panchanga-names.ts maps every API value (16 tithis, 27 nakshatras,
    27 yogas, 11 karanas, 7 varas, 12 rashis, pakshas) Sanskrit ↔ Devanagari;
    HH:mm + longitude convert to Devanagari digits via toDevaDigits. Affects
    SkyMandala, PanchangaPanel, ElementBoxes, ElementDetail, SunArcWidget,
    MuhurtaWindows, LocationChip, PlanetInfoPanel, PanchangaStrip. English
    prose descriptions fall back to “हिन्दी विवरण शीघ्र” in hi mode rather
    than leaking English.

feat(sky-mandala): moon default, pada highlight, muhurta accordion, mobile polish · 4242378

  • Default-select Moon on load; hovered planet highlights its specific pada
  • Panchanga nakshatra row only highlights for moon’s nakshatra (not other planets)
  • Muhurta descriptions move from timeline tooltip to per-row accordion (en/hi from API)
  • Collapse SunArc into MuhurtaWindows on non-desktop (values only, no arc)
  • Mobile compaction: smaller sun-arc stage, PIP repositioned for visibility
  • Vara translation accepts English weekday keys from API (Sunday → रविवार)
  • Bump font-size/weight for Devanagari times so HI numerics read peer to EN

refactor(panchanga): drop dead good_for/avoid, color rows by quality · e274f86

  • Remove tithi/yoga/karana/vara good_for + avoid fields end-to-end (types,
    panchang.service, sky-today.service); zero UI consumers, dead weight on the wire
  • Surface quality on each panchanga row via data-quality (auspicious/inauspicious/
    mixed); 2px left rail + tinted value, reusing the muhurta saffron/teal palette
  • Active-state accent bar still wins over the quality rail on hover/focus

fix(sky-mandala): reserve scrollbar gutter so muhurta column doesn’t contract on expand · 5621826

Opening a muhurta row pushed the left rail past the viewport, the scrollbar
appeared, and the column visibly lost ~12px of width. scrollbar-gutter: stable
reserves the strip up front so width stays constant whether the scrollbar is
visible or not.

fix(muhurta): wrap long names instead of overflowing the 220px rail · 472d656

After the scrollbar gutter reservation reclaimed ~14px, longer names like
“Yamaghantaka Kaala” pushed the time column off the row. flex: 1 with
min-width: 0 + overflow-wrap lets the name break to a second line; the time
stays nowrap on its own line. align-items: flex-start so the time sits at
the top of a wrapped row, not next to the last line of the name.

fix(sky-mandala): widen left rail to 260px so muhurta name + time fit one line · ad757df

Reverts the wrap-on-overflow stopgap. Left rail now 260px (was 220) — enough
for the longest Sanskrit names (“Yamaghantaka Kaala”) + mono time +
chevron + scrollbar gutter on a single baseline-aligned line. Panchanga
panel stays at 220. Panels read their grid track via width:100% instead of
the old hardcoded 220.

feat(hero): real CTA button — Vipin’s feedback on soft byline not converting · 45c5bc0

Replace the underlined “When you’re ready →” link with a primary-button CTA
(“Book a consultation” / “परामर्श बुक करें”). Verb stays neutral — no “now”,
no urgency, no scarcity — per the workspace hard rule against pushing
consultation. Discoverability goes up, push tone stays out.

Arrow nudges right on hover to telegraph the in-page jump to book.

feat(vipin-gate): polish login surface + harden endpoint · 16385c9

Gate page now shares the admin topbar (brand + theme + lang toggle) instead
of the public site shell, so the locked door reads as part of the admin
building, not a public page. Card adds Practitioner Dashboard / Vipin
Kaushik heading, readonly “vipin” username (autoComplete=username for
password-manager binding), bilingual labels, lucide eye toggle, Loader2
spinner, and a dedicated 429 rate-limit branch.

/api/vipin/login now applies an 8-attempts-per-60s-per-IP rate limit and
returns 429 — closes the brute-force gap the client already had copy for.
Cookie flags (httpOnly + secure-in-prod + sameSite=strict) were already
correct.

refactor(i18n): split lib/i18n/dict.ts into per-page colocated modules · be8ead3

The 1381-line dict.ts kitchen-drawer is gone. 37 namespaces now live in
17 colocated dict files organized by their real owner:

  • lib/i18n/shell.ts — shared chrome (wordmark, nav, a11y, footer, skip,
    errors, profile, archived brand/learn/panchang)
  • lib/i18n/booking.ts — booking flow strings shared between public form
    and admin (bookingForm, book, bookingStatus, lifeArea, *Status, appointments)
  • lib/i18n/content.ts — seed-fallback strings consumed by lib/content.ts
    and scripts/seed-content.ts (hero, howItWorks, session, trust, faq).
    Layered so lib/ never reaches into app/.
  • app/(site)/sections//.dict.ts — 8 per-section files for
    homepage strings whose only consumer is…

Merges:

  • Merge pull request #43 from Rupali59/feature/vipin-gate-polish
  • Merge pull request #45 from Rupali59/feature/dict-split
  • Merge pull request #44 from Rupali59/feature/dict-split

2. astroacharya 🔒 — 4 commits

chore(core): extract _birth_date_ut, add canonical hash + swisseph version check · a8c4c4a

  • birth_time.py: shared birth_date_ut (was inline in horoscope.py)
  • birth_canonical.py: hash-stable canonical form of BirthDetails for
    content-addressed kundli identity. Decimal coord rounding, Olson timezone
    string, swisseph version captured in inputs.
  • main.py lifespan: assert swisseph version matches pyproject pin (warn dev,
    raise prod). Unknown-version case warns and proceeds so tests with mock
    swisseph still boot.

Surfaced by adversarial findings F3 + F11 in the kundli skeleton
plan-eng-review (2026-05-31). No behavior change to /horoscope.

feat(kundli): persistent natal-chart bundles with hash-dedupe rectification · 03916c2

  • app/models/kundli.py: Bundle, KundliSummary, KundliCreate models.
    BUNDLE_VERSION starts at 1; migration policy in module docstring.
  • app/services/kundli_store.py: content-addressed kundlis collection
    keyed by (client_id, hash(canonical_birth_inputs)). Many kundlis per
    client (rectification). is_current flag, demoted in same transaction
    as new insert. Falls back to non-atomic insert+demote with warning if
    Mongo is standalone.
  • docker-compose.yml: run Mongo as single-node replica set (—replSet rs0)
    so kundli_store transactions are supported.

feat(kundli): API surface — 6 endpoints + kundli scope gate · 2bbebc8

POST /clients/{client_id}/kundli create + retrieve (idempotent on hash)
GET /kundli/{id} cheap summary
GET /kundli/{id}/horoscope composite (back-compat shape)
GET /kundli/{id}/placements D1 positions + divisional sign maps
GET /kundli/{id}/aspects graha drishti + rashi drishti
rahu_ketu_aspects:null pending Vipin call
GET /kundli/{id}/dasha?at= vimshottari MD/AD; pre_natal flag for
at<birth so rectification can run dasha
backward against life events
GET /kundli/{id}/gochar?at=&anchor=moon|lagna|sun
t…

test(kundli): canonicalization, store, API auth, parity regression · a0a2bee

  • test_birth_canonical: hash stability across time precision (HH:MM vs
    HH:MM:SS), coord precision (5dp vs 4dp), timezone formats; differs
    across clients and swisseph versions.
  • test_kundli_store: idempotent create, rectification (different birth
    time new kundli is_current, prior demoted), divisional_ascendants
    present for all Shodashavarga, invalid ObjectId returns None.
    In-memory async Mongo stub — no live Mongo needed.
  • test_api_kundli: auth gate (open dev mode lacks ‘kundli’ scope 401
    on every kundli endpoint, including 404-shaped ids).
  • test_kundli_parity: REGRESSION-CRITICAL — bundle placements match
    raw ephemeris numbers; D9 ascendant matches navamsa of natal lag…

📈 Development Analytics

Daily Summary

MetricToday
Commits13
Merges3
Skill runs0
Decisions0
Eurekas0
CEO plans0
Notes touched0

Decisions logged today

None today.

Eurekas

None today.

Strategic plans authored

None today.

Notes touched

None today.

Running totals (as of this date)

Active days last 90:           65 / 90  (substantive)
Days with any signal last 90:  68 / 90
Skill runs (since 2026-03-25):  75
Commits this year (authored):  1147
Decisions logged this year:    0
Eurekas this year:             5
CEO plans authored this year:  12
Projects touched this year:    54
Top projects last 90:          portfolio (25d), VipinKaushik (21d), Mothership (18d), motherboard-shared (10d), astroacharya (9d)

💭 My Notes

[Your own thoughts, observations, or context for this day — this section is never overwritten by automation]