From 34f65ae414f435ae204d6fb863015c2b780b2052 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 09:05:31 +0000 Subject: [PATCH] Swing the card's interior door about its hinge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The social card's interior door took the arc's other candidate centre, so the swing bowed back into the hinge instead of away from it — the door mark drawn backwards, beside a front door that was already right. A door swing is an arc of the leaf's own radius about the hinge; both centres give the same endpoints, so the sweep flag alone decides it. tests/site.test.ts now recovers each swing's centre from the SVG arc parameters and asserts it is the hinge, at the leaf's own length. The committed raster also trailed the registries it advertises, stating 110 symbols where the editor now carries 82. renderOg() records the counts it rendered with, and the suite fails on that drift rather than leaving the card to advertise a figure the editor no longer has. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Wj4oF7sWCM1cduVPMamsFN --- assets/og.counts.json | 1 + assets/og.png | Bin 21825 -> 28642 bytes assets/og.svg | 7 +++++-- scripts/render-og.ts | 16 ++++++++++++++++ tests/site.test.ts | 33 ++++++++++++++++++++++++++++++++- 5 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 assets/og.counts.json diff --git a/assets/og.counts.json b/assets/og.counts.json new file mode 100644 index 0000000..08bce42 --- /dev/null +++ b/assets/og.counts.json @@ -0,0 +1 @@ +{"symbols":82,"openingTypes":27} diff --git a/assets/og.png b/assets/og.png index 790f9f0a089f371fb2941015df33e1c1cae5734b..1a7c32ba0861781bf3b07b3ec995074460d0487d 100644 GIT binary patch literal 28642 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 literal 21825 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 - + - + diff --git a/scripts/render-og.ts b/scripts/render-og.ts index aebe768..16932ea 100644 --- a/scripts/render-og.ts +++ b/scripts/render-og.ts @@ -14,6 +14,21 @@ export function ogSvg(source = readFileSync("assets/og.svg", "utf8")): string { .replaceAll("{{OPENING_TYPE_COUNT}}", String(OPENING_TYPE_COUNT)); } +// assets/og.png is a committed raster rendered by hand, so it goes stale the +// moment a symbol is added. Recording the counts it was rendered with is what +// lets tests/site.test.ts fail on that drift rather than the card advertising +// a figure the editor no longer has. +export const OG_STAMP_PATH = "assets/og.counts.json"; +export type OgStamp = { symbols: number; openingTypes: number }; + +export function ogStamp(): OgStamp { + return { symbols: SYMBOLS.length, openingTypes: OPENING_TYPE_COUNT }; +} + +export function renderedStamp(): OgStamp { + return JSON.parse(readFileSync(OG_STAMP_PATH, "utf8")) as OgStamp; +} + function run(command: string, args: string[]): void { const result = spawnSync(command, args, { stdio: "inherit" }); if (result.error) throw result.error; @@ -30,6 +45,7 @@ export function renderOg(): void { run("rsvg-convert", ["-w", "1200", "-h", "630", svg, "-o", png]); run("magick", [png, "-strip", "-colors", "64", `PNG8:${optimized}`]); renameSync(optimized, "assets/og.png"); + writeFileSync(OG_STAMP_PATH, JSON.stringify(ogStamp()) + "\n"); } finally { rmSync(work, { recursive: true, force: true }); } diff --git a/tests/site.test.ts b/tests/site.test.ts index 5da7181..ef47ebe 100644 --- a/tests/site.test.ts +++ b/tests/site.test.ts @@ -9,7 +9,7 @@ import { FURNISHING_PRESETS } from "../src/model/furnishing"; import { WINDOW_KINDS, DOOR_KINDS, type Opening, type PlanDoc } from "../src/model/doc"; import { resources, changeLanguage } from "../src/i18n"; import { DOC_PATHS, DOC_IDS as LINK_IDS, docHref, SITE_ORIGIN } from "../src/links"; -import { ogSvg } from "../scripts/render-og"; +import { ogSvg, renderedStamp } from "../scripts/render-og"; let fail = 0; const ck = (n: string, c: boolean, d = "") => { if (!c) { fail++; console.error("FAIL " + n + " " + d); } else console.log("ok " + n); }; @@ -24,6 +24,37 @@ ck("social card uses the current opening count", socialCard.includes(`${WINDOW_KINDS.length + DOOR_KINDS.length} deur- en raamtypen`)); ck("social card has no unresolved count", !socialCard.includes("{{")); +// The card ships as a committed raster; the stamp says what it was rendered from. +const stamp = renderedStamp(); +ck("social card raster is rendered from the current registries", + stamp.symbols === SYMBOL_TYPES.length + && stamp.openingTypes === WINDOW_KINDS.length + DOOR_KINDS.length, + `assets/og.png states ${stamp.symbols} symbols and ${stamp.openingTypes} opening types; ` + + "run npm run assets:og"); + +/* A door mark is the leaf from its hinge plus a swing of the leaf's own radius + ABOUT THAT HINGE. Both candidate centres yield the same endpoints, so the + sweep flag alone decides whether the arc bows away from the hinge or back + into it, the second being the mark drawn backwards. */ +const swings = [...socialCard.matchAll( + /\s*/g)]; +ck("social card draws both door swings", swings.length === 2, `found ${swings.length}`); +for (const [i, m] of swings.entries()) { + const at = (g: number): number => Number(m[g]); + const [hx, hy] = [at(1), at(2)]; // hinge: where the leaf starts + const [x1, y1, r, sweep] = [at(4), at(5), at(6), at(7)]; // open leaf tip, and the arc from it + const [x2, y2] = [x1 + at(8), y1 + at(9)]; // far jamb: the closed leaf + // SVG endpoint -> centre parameterisation, for rx = ry and the small arc. + const [px, py] = [(x1 - x2) / 2, (y1 - y2) / 2]; + const k = Math.sqrt(Math.max((r * r) / (px * px + py * py) - 1, 0)) * (sweep === 1 ? 1 : -1); + const [cx, cy] = [(x1 + x2) / 2 + k * py, (y1 + y2) / 2 - k * px]; + ck(`social card door ${i + 1} swings about its hinge`, + Math.abs(cx - hx) < 0.5 && Math.abs(cy - hy) < 0.5, + `arc is centred on (${cx}, ${cy}), hinge is (${hx}, ${hy})`); + ck(`social card door ${i + 1} swings at the leaf's own length`, + Math.abs(Math.hypot(x1 - hx, y1 - hy) - r) < 0.5); +} + /* ── schema ── */ ck("validates the demo plan", validate(schema, seedDoc()).length === 0, validate(schema, seedDoc()).join(" | "));