Synastry JSON Calculator
Produce one validated schema_version: "2.0" calculation artifact, then hand its exact path to $synastry-reading. Keep interpretation out of the calculator artifact.
Prepare the request
- Start from references/request.example.json.
- Assign two distinct stable subject
id values. Include a display name or pronouns only when the user supplied them; never invent an identity, salutation, gender, relationship role, or preferred location.
- Resolve each civil date and IANA timezone. For an
exact record, also resolve latitude and longitude.
- When given only a place name, consult a current authoritative source, choose a country-qualified result, state the selected place, timezone, coordinates, and source, and ask before continuing when the place is ambiguous. Never recall or default coordinates.
- Choose one declared time mode for each subject:
| Mode |
Required birth fields |
Calculation boundary |
exact |
date, time, time_accuracy_minutes from 0 through 15, IANA timezone, latitude, longitude |
Calculate one instant, houses, angles, derived values when enabled, and overlays when both subjects are exact. |
window |
date, same-date time_window.start and later time_window.end, IANA timezone |
Sample the closed interval; omit houses, angles, sect, lots, and overlays. |
date-only |
date, IANA timezone |
Sample the complete local civil day with the same restrictions as window. |
Never convert uncertainty into an exact noon chart. When the user gives an imprecise phrase, ask for a bounded window or confirm date-only instead of inventing endpoints.
Reject nonexistent civil times. For an ambiguous exact time, require timezone_fold or both a documented utc_offset_hours and utc_offset_reason. For an ambiguous window endpoint, require a reasoned offset for the interval; do not choose a daylight-saving fold silently.
- Fill every
options field. Read references/calculation-conventions.md before choosing profiles, orbs, houses, derived values, or backend policy. Keep swiss-only fail-closed unless the user explicitly accepts the recorded Moshier limitation.
- Use
privacy: "minimal" unless the user explicitly requests an archival artifact. Use privacy: "full" only after explaining that it retains the supplied local birth and location provenance.
- Record only relationship context the user explicitly supplied. When none was supplied, use a neutral description and an empty
requested_domains array; never infer context from chart data.
The request schema is closed. Remove no required field and add no undocumented field.
Run the calculator
Prefer a protected request file or standard input over inline JSON, which may remain in shell history.
python3 scripts/compute_synastry.py --request request.json --out artifacts
Use --request - for standard input or --json only when inline data exposure is acceptable. Add --ephemeris-path when Swiss data files live outside the binding default. Add --overwrite only when the user explicitly authorizes replacement of the deterministic destination.
Stop on any nonzero exit. Preserve the bounded error and resolve the request, timezone, backend, or filesystem problem instead of improvising an artifact.
Enforce JSON-only output
Retain the one path printed after wrote. Confirm that it exists, ends in .json, and names the calculated chart ID. Do not create a TXT companion, compatibility alias, prose report, or second calculation artifact.
Treat the artifact as sensitive. Report its path and material limitations without pasting birth data or chart contents into chat.
Hand off automatically
After a successful write:
- Invoke
$synastry-reading immediately with the exact JSON path.
- Pass along only the explicit relationship context and requested domains from the user or request; the calculation artifact does not authorize a relationship-specific reading module.
- Do not ask whether the user also wants an interpretation.
- Do not invoke the reader when calculation failed or the JSON path is absent.
- If the reader is unavailable, report the JSON path and the missing component instead of interpreting inline.
After the reader succeeds, report the JSON path, the validated Markdown path, and any limitation that materially constrains the reading. Keep the reply in the user's language.
Read references/examples.md for exact, date-only, daylight-saving ambiguity, and strict-backend cases.
1---2name: synastry3description: Use when two people's birth details need an uncertainty-aware JSON v2 synastry calculation, including 合盘, 星盘配对, exact times, bounded time windows, or date-only records. Not for interpreting an existing v2 artifact, legacy TXT, one-person natal charts, transits, forecasts, predictions, or compatibility scores.4license: AGPL-3.0-or-later5---67# Synastry JSON Calculator89Produce one validated `schema_version: "2.0"` calculation artifact, then hand its exact path to `$synastry-reading`. Keep interpretation out of the calculator artifact.1011## Prepare the request12131. Start from [references/request.example.json](references/request.example.json).142. Assign two distinct stable subject `id` values. Include a display name or pronouns only when the user supplied them; never invent an identity, salutation, gender, relationship role, or preferred location.153. Resolve each civil date and IANA timezone. For an `exact` record, also resolve latitude and longitude.164. When given only a place name, consult a current authoritative source, choose a country-qualified result, state the selected place, timezone, coordinates, and source, and ask before continuing when the place is ambiguous. Never recall or default coordinates.175. Choose one declared time mode for each subject:1819| Mode | Required birth fields | Calculation boundary |20|---|---|---|21| `exact` | `date`, `time`, `time_accuracy_minutes` from 0 through 15, IANA `timezone`, `latitude`, `longitude` | Calculate one instant, houses, angles, derived values when enabled, and overlays when both subjects are exact. |22| `window` | `date`, same-date `time_window.start` and later `time_window.end`, IANA `timezone` | Sample the closed interval; omit houses, angles, sect, lots, and overlays. |23| `date-only` | `date`, IANA `timezone` | Sample the complete local civil day with the same restrictions as `window`. |2425Never convert uncertainty into an exact noon chart. When the user gives an imprecise phrase, ask for a bounded `window` or confirm `date-only` instead of inventing endpoints.2627Reject nonexistent civil times. For an ambiguous `exact` time, require `timezone_fold` or both a documented `utc_offset_hours` and `utc_offset_reason`. For an ambiguous window endpoint, require a reasoned offset for the interval; do not choose a daylight-saving fold silently.28296. Fill every `options` field. Read [references/calculation-conventions.md](references/calculation-conventions.md) before choosing profiles, orbs, houses, derived values, or backend policy. Keep `swiss-only` fail-closed unless the user explicitly accepts the recorded Moshier limitation.307. Use `privacy: "minimal"` unless the user explicitly requests an archival artifact. Use `privacy: "full"` only after explaining that it retains the supplied local birth and location provenance.318. Record only relationship context the user explicitly supplied. When none was supplied, use a neutral description and an empty `requested_domains` array; never infer context from chart data.3233The request schema is closed. Remove no required field and add no undocumented field.3435## Run the calculator3637Prefer a protected request file or standard input over inline JSON, which may remain in shell history.3839```bash40python3 scripts/compute_synastry.py --request request.json --out artifacts41```4243Use `--request -` for standard input or `--json` only when inline data exposure is acceptable. Add `--ephemeris-path` when Swiss data files live outside the binding default. Add `--overwrite` only when the user explicitly authorizes replacement of the deterministic destination.4445Stop on any nonzero exit. Preserve the bounded error and resolve the request, timezone, backend, or filesystem problem instead of improvising an artifact.4647## Enforce JSON-only output4849Retain the one path printed after `wrote`. Confirm that it exists, ends in `.json`, and names the calculated chart ID. Do not create a TXT companion, compatibility alias, prose report, or second calculation artifact.5051Treat the artifact as sensitive. Report its path and material limitations without pasting birth data or chart contents into chat.5253## Hand off automatically5455After a successful write:56571. Invoke `$synastry-reading` immediately with the exact JSON path.582. Pass along only the explicit relationship context and requested domains from the user or request; the calculation artifact does not authorize a relationship-specific reading module.593. Do not ask whether the user also wants an interpretation.604. Do not invoke the reader when calculation failed or the JSON path is absent.615. If the reader is unavailable, report the JSON path and the missing component instead of interpreting inline.6263After the reader succeeds, report the JSON path, the validated Markdown path, and any limitation that materially constrains the reading. Keep the reply in the user's language.6465Read [references/examples.md](references/examples.md) for exact, date-only, daylight-saving ambiguity, and strict-backend cases.