🔭 review: post-merge integration — sbdb_lookup into CONFIG.proxy, era-aware BC dates in lib formatters (fable)

Merged suite: 21/21 gates in-browser incl. NEO real-orbit (err 1.16%),
Jupiter@1000BC Δ0.004 AU, 2b-proof. Deep-time readout now '1000 BC-01-15'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
monsterrobotparty 2026-07-16 10:32:38 +10:00
parent 0883cc50b8
commit b42473a055
4 changed files with 8 additions and 4 deletions

View File

@ -6,6 +6,7 @@ export const CONFIG = {
proxy: { proxy: {
horizons: 'proxy/horizons', horizons: 'proxy/horizons',
sbdb: 'proxy/sbdb', sbdb: 'proxy/sbdb',
sbdbLookup: 'proxy/sbdb_lookup',
cad: 'proxy/cad', cad: 'proxy/cad',
}, },

View File

@ -25,7 +25,7 @@ export function parseSbdbElements(j) {
export default function create(ctx) { export default function create(ctx) {
const { THREE, scene, CONFIG, lib, ui, scale, ephem, worldGroup, toLocal, makeLabel } = ctx; const { THREE, scene, CONFIG, lib, ui, scale, ephem, worldGroup, toLocal, makeLabel } = ctx;
const LD_AU = 384400 / lib.AU_KM; // one lunar distance in AU const LD_AU = 384400 / lib.AU_KM; // one lunar distance in AU
const SBDB_LOOKUP = 'proxy/sbdb_lookup'; // sibling of CONFIG.proxy.* (I don't own config.js) const SBDB_LOOKUP = CONFIG.proxy.sbdbLookup;
const N = 256; // orbit samples per NEO const N = 256; // orbit samples per NEO
const glyph = makeReticle(); const glyph = makeReticle();

View File

@ -55,15 +55,18 @@ export function worldToEcl(w, out = {}) {
// ---- formatters ---- // ---- formatters ----
const pad = (n, w = 2) => String(n).padStart(w, '0'); const pad = (n, w = 2) => String(n).padStart(w, '0');
// Astronomical year → human era label: 0 = "1 BC", 999 = "1000 BC" (deep time,
// wave 2 VESSEL — a raw getUTCFullYear() would render 1000 BC as "-0999").
const eraYear = (y) => (y <= 0 ? `${1 - y} BC` : String(y).padStart(4, '0'));
// "2026-07-15 00:00:00 UTC" from unix-ms. // "2026-07-15 00:00:00 UTC" from unix-ms.
export function formatUTC(ms) { export function formatUTC(ms) {
const d = new Date(ms); const d = new Date(ms);
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ` + return `${eraYear(d.getUTCFullYear())}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ` +
`${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())} UTC`; `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())} UTC`;
} }
export function formatUTCDate(ms) { export function formatUTCDate(ms) {
const d = new Date(ms); const d = new Date(ms);
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`; return `${eraYear(d.getUTCFullYear())}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
} }
export function fmtAU(au) { export function fmtAU(au) {
const a = Math.abs(au); const a = Math.abs(au);

View File

@ -221,7 +221,7 @@
// robust absolute tolerance (least sensitive to EMB≈Earth + two-body drift). // robust absolute tolerance (least sensitive to EMB≈Earth + two-body drift).
let best = null; let best = null;
for (const r of rows) { const dist = +r[ix('dist')]; if (!best || dist > best.dist) best = { des: r[ix('des')], jd: +r[ix('jd')], dist }; } for (const r of rows) { const dist = +r[ix('dist')]; if (!best || dist > best.dist) best = { des: r[ix('des')], jd: +r[ix('jd')], dist }; }
const j = await (await fetch(`proxy/sbdb_lookup?sstr=${encodeURIComponent(best.des)}&full-prec=true`)).json(); const j = await (await fetch(`${CONFIG.proxy.sbdbLookup}?sstr=${encodeURIComponent(best.des)}&full-prec=true`)).json();
const el = parseSbdbElements(j); const el = parseSbdbElements(j);
if (!el) throw new Error(`no elliptical elements for ${best.des}`); if (!el) throw new Error(`no elliptical elements for ${best.des}`);
const neo = ephem.smallBodyEcl(el, best.jd, {}); const neo = ephem.smallBodyEcl(el, best.jd, {});