---
title: "Chart and inputs"
description: "How /chart and n9life_profiles store birth date, names, coordinates, timezone, and UTC, and when Human Design snapshots are reused."
locale: "en"
---
# Chart and inputs

`/chart` is a pack page (`ring-presets/evolvement/web/app/[locale]/chart/page.tsx`). It renders `ChartInputsForm` and the labeled system cards. Time and place fields appear only when `evolvement.systems` includes `human_design` (`showTimePlace={config.systems.includes('human_design')}`).

On this clone, saving the form does **not** write `users.data.evolvement`. L3 overwrites `features/evolvement/services/chart-inputs.ts` so reads and writes go to **`n9life_profiles`**. `birth_date` on that table wins once set.

## Fields

| Field | Stored as | Used by |
|-------|-----------|---------|
| Birth date | `birth_date` (date) | Numerology, Destiny Matrix, chertogi, Personal Day, HD civil date |
| Given, surname, patronymic | text columns / JSON | Anthroponymics layers |
| Full birth name | optional override | Expression / Soul Urge / Personality |
| Common name | optional | Labeled Chaldean layer |
| Birth time | `HH:mm` or `HHmm` | Human Design local wall clock |
| Birth place label | text | Display only |
| Latitude, longitude | `birth_lat`, `birth_lng` | Human Design + tz-lookup |
| IANA timezone | `birth_tz` | `localBirthToUtc` |
| Birth UTC | `birth_utc` timestamptz | HD Personality instant; snapshot reuse key |

Migration `data/migrations/002_n9life_hd_match.sql` adds `birth_lat`, `birth_lng`, `birth_tz`, `birth_utc`. Apply that migration on the n9life database before expecting HD or match tables in production.

## Save path

Pack default (`users.data.evolvement`) still exists for other evolvement clones. N9Life `saveChartInputs` maps the form to `upsertN9LifeProfile`. If lat and lng are present and tz is empty, server-side `tz-lookup(lat, lng)` fills `birthTz`. `localBirthToUtc(date, time, tz)` uses a two-pass `Intl.DateTimeFormat` offset probe so historic Soviet offsets in tzdata are respected.

Crisis language on the form is handled by pack `CrisisCallout` (`detectCrisisKeywords`, including Ukrainian phrases). That pause is ethics UX. It is not a chart input.

## Recompute versus snapshot

`calendarFromProfile` / `buildTodayForUser` **recompute date-only engines on every request** (numerology, matrix, anthroponymics, chertogi). They do **not** trust a stale `charts_by_system` snapshot for those systems.

Human Design is expensive (ephemeris + Design solver). The HD snapshot is reused only when `birth_utc`, latitude, and longitude are unchanged. If any of those three change, `calculateHumanDesign` runs again. Missing time, tz, or coordinates keep the placeholder: `pending_inputs` or `pending_tz`. `status: 'ready'` is the only status that shows Type / Strategy / Authority as computed values. The HD page maps `ready` to `t('status.ready')`, not pending.

`OwnerJsonExportButton` can download the member's own JSON. JSDoc on `computeCharts` forbids diary or aspiration text in that payload.

## Place picker on /chart

Pack `BirthPlaceFields` dynamically imports `LocationMapModal` with `persistProfile={false}`, hidden `birthLat` / `birthLng` inputs, and a timezone select. The Cosmic Mirror panel uses the same contract through `BirthPlacePicker`.

> **Tip**
> Birth place is not "current city". Cultural address on the Ring profile and HD birth coordinates are different writes. The map modal default remains `persistProfile={true}` for profile-address flows elsewhere in Ring.

  
- [n9life/cosmic-mirror](/docs/n9life/cosmic-mirror.md) — Same-workflow: panel save uses the same fields

  
- [n9life/human-design](/docs/n9life/human-design.md) — Next-step: what those coordinates compute

  
- [n9life/name-code](/docs/n9life/name-code.md) — See-also: name layers stored here
