Files
adr-sml/src/layouts/BaseLayout.astro
T
Pouya LajevardiandClaude Opus 5 364b09632e fix: replace the traced infinity mark with the real artwork; add §4 Offerings
Q32 — the traced mark was a WRONG SHAPE and had shipped. Pouya compared
it against the master and rejected it. Two grounds reproduce from the
path and are verified here: all four cubic branches meet the origin at
exactly 90 degrees, so the loops are tangent rather than crossing and at
stroke-width 28 render as two kissing circles (signed crossing number 0;
the strokes fuse across 61% of the mark's height at 2rem); and the
master's ink bbox is 2668x1704 = 1.5657:1. The path is deleted, not kept
as a fallback.

Pouya's 1.23:1 figure is reconciled rather than left dangling: it is the
bounding box of the path's COORDINATES, not the curve. Control points sit
at y +/-160 where the curve reaches +/-120, so the hull is 400x320 and
with stroke 428x348 = 1.2299. A trap rather than a slip — x is monotone,
so the control points give the right width and a 33% inflated height, and
the "does the width look right" check passes.

The real artwork is now in the repo: master, tight crop (the render
source, so the file's aspect ratio IS the mark's), full lockup, and the
SVG. InfinityMark renders AVIF/WebP; a Retina device takes 3,063 B.
Favicons regenerated; favicon.svg deleted.

Q33/Q36 — Pouya accepts arbitration appointments now. §4 gains an
Offerings category: competence for an offering, permission for a
credential, with an explicit boundary so it cannot become a route around
D13. The masthead tagline is restored, and the footer designation strip
now carries "Q.Arb — commenced August 2026" so §4's paired-disclosure
condition is actually met on every page rather than only asserted.

Two conventions added to CLAUDE.md, both earned this session: anything a
spec makes a claim about must be reachable from the repo (R14 — the
traced mark survived two review passes because the artwork was not here
to compare against); and a command that did not run is not evidence of
absence (`timeout` is not installed on macOS, so four Drive reads never
executed and were reported as an empty directory).

Reviews: claims-auditor FAIL/13 and adversarial-reviewer 2 blocking, all
resolved. The severe one was self-inflicted — `flex: none` landed on the
<img> while <Picture>'s <picture> wrapper is the flex item, so the logo
compressed to 28.5x32 at 1024px with seven nav items. The page-level
overflow check passed throughout because the brand block absorbed the
deficit by crushing the mark. Harness now asserts rendered aspect ratio.

Opened: Q38, Q39. Closed: Q32, Q33, Q36. Narrowed: Q35. Added: R13, R14.
AGENTS.md entry (v) carries a RESUME HERE section.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XquaEq4BgWMCwUqLEyNkF
2026-08-26 17:30:19 -04:00

81 lines
2.7 KiB
Plaintext

---
/**
* The page shell. Every route renders through this.
*
* Metadata is not optional and not a prop this layout can default: it forwards
* whatever it is given straight to SEO.astro, which throws if the title or
* description is out of the range docs/04-seo-spec.md sets.
*/
import '../styles/global.css';
import type { Props as SeoProps } from '../components/SEO.astro';
import SEO from '../components/SEO.astro';
import SiteHeader from '../components/SiteHeader.astro';
import SiteFooter from '../components/SiteFooter.astro';
import { SITE } from '../data/site';
export type Props = SeoProps;
// SITE.locale is `en_CA` — Open Graph's underscore form. The lang attribute
// takes the BCP 47 hyphen form. One source, two spellings, no second constant.
const lang = SITE.locale.replace('_', '-');
---
<!doctype html>
<html lang={lang}>
<head>
<SEO {...Astro.props} />
{
/* No SVG favicon. The mark is a shaded ribbon, not flat vector paths, so
there is no honest SVG of it to serve — see InfinityMark.astro and
AGENTS.md Q38. The .ico carries 16/32/48, and is what crawlers request
at the root regardless of what is declared here. */
}
<link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
{
/* Only the two faces used above the fold, per docs/02. Fonts are always
fetched in CORS mode, so a preload without `crossorigin` is a second,
wasted request rather than a warmed cache. */
}
<link
rel="preload"
href="/fonts/instrument-serif-latin-400-normal.woff2?v=1"
as="font"
type="font/woff2"
crossorigin
/>
<link
rel="preload"
href="/fonts/geist-latin-wght-normal.woff2?v=1"
as="font"
type="font/woff2"
crossorigin
/>
{
/* No script tag. Not "no framework", not "minimal JS" — none.
The reveal used to be an inline IntersectionObserver here. It ran before
first paint so nothing flashed, and it took its own class back off if
anything threw. It was still wrong: docs/05-backend-spec.md specifies
`script-src 'self'` with no `unsafe-inline`, so the single script on the
site was the one thing the site's own CSP would refuse to execute — and
a per-build hash drifts from the policy that is supposed to pin it.
`animation-timeline: view()` in global.css does the same job in CSS. See
the Reveal block there for why the @supports gate is load-bearing. */
}
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<SiteHeader />
<main id="main" tabindex="-1">
<slot />
</main>
<SiteFooter />
</body>
</html>