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
81 lines
2.7 KiB
Plaintext
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>
|