/* =====================================================================
   DEVIATION LOG — home page

   THE SECOND PAGE-LOCAL REGISTER OPENED UNDER THE DISTINCT-PREFIX
   CONVENTION, and naming that makes it a convention rather than two
   one-offs. Three registers already existed — why-longitude.css,
   utilities.css, privacy-policy.css — and the `D` prefix was
   overloaded by deploy unit names, so `D7` resolved three different ways.

   A COUNT THAT STOOD HERE WAS REMOVED RATHER THAN CORRECTED, B4 2026-08-17.
   This sentence used to say why-longitude.css ran "1-17, now 1-20". By B3 it
   was 1-22 plus WL-23..WL-26, so the figure had been wrong twice over. **IF
   YOU NEED THAT COUNT, COUNT THE REGISTER IN why-longitude.css** — the file
   where its convention lives. A cross-file count in a comment goes stale
   every time the other file grows and nothing warns you; a number that cannot
   go stale beats one corrected for the fifth time. Same class as §44 and as
   the four figures this session found already wrong.
   UTIL-1 was the first entry to take a distinct prefix in answer to that.
   HOME-1 is the second. A homepage decision filed in another page's log is
   filed where nobody looking for it would stand.

   HOME-1 · CLIENT-APPROVED COPY REUSED IN A NEW PLACEMENT. R2,
   2026-08-13. Not a copy departure — the string is unaltered — but the
   same class of decision as R1's CTA labels: text approved for one
   position now appears in another, which is the director's call and not
   the build's.

   WHAT AND FROM WHERE. The visible link beneath the film band's video
   carries the video's title as it already ships in the hub page's second
   row. It was COPIED PROGRAMMATICALLY out of that file, not retyped, and
   verified after writing: byte-identical, 52 characters, one apostrophe at
   index 31 as U+0027 per the 9ah Insights-row ruling, no non-ASCII.

   THE DESTINATION IS THE HUB ROW'S OWN OUTBOUND URL, not the nocookie
   embed address the frame uses. The nocookie ruling governs the EMBED,
   which loads without the reader doing anything; a deliberate click is a
   different act, and the embed address is a bare player rather than a
   landing page. One destination for one video across both placements, and
   no new URL form enters the tree.

   CONTRAST, MEASURED, SO NOBODY RE-DERIVES IT. The link takes .cta-line
   unchanged, which is --accent on this band's --ground-dark:

       --accent #696FE8 on --ground-dark #292631  =  3.5594

   .cta-line is 19px/700 (components/buttons.css:78-84), which clears the
   18.66px bold boundary, SO ITS APPLICABLE THRESHOLD IS 3.0, NOT 4.5. It
   passes by 0.5594 and is used at its own threshold deliberately, rather
   than restyled to --on-dark (13.0839) — which would have authored a
   colour and made this one CTA look unlike every other in-body CTA.

   THIS IS A DISTINCT CASE FROM THE SITE-WIDE FORECLOSURE. That one bars
   --accent on LIGHT grounds, where it measures 3.9310 and 3.6759 against a
   4.5 that does apply. Dark ground, larger type, different threshold.
   HOME-2 · A COMMISSIONED SECTION IS REMOVED, AND THE VIDEO IS RESIZED.
   CLIENT-REQUESTED, DIRECTOR-APPROVED (R3, 2026-08-13). Two changes, one
   unit, because they share an edit set.

   (A) THE FILM BAND'S CAP GOES 100vh -> 65vh. A sizing decision from the
   client — the video read too large. Figures and the 462px floor are
   recorded at the rule itself, further down this file, not repeated here.

   (B) THE STAT WHEEL SECTION IS DELETED IN FULL. `section.photo` and
   everything inside it: the pinned track and stage, the photograph, the
   connector arc, the five figure nodes and the headline bar. It was
   commissioned and built across 9aj, 9al and 9am — all three sealed THE
   SAME DAY it was removed. Their notes hold the mechanism; the complete
   pre-rework markup is preserved in
   _archive-checkpoint-9am-2026-08-13/.

   EVERY CLIENT-SUPPLIED STRING IT CARRIED, RECORDED HERE BECAUSE THIS IS
   NOW THE ONLY PLACE SOME OF THEM EXIST:

       bar headline   A scaled platform, built on shared strength.
                      (an <em> wrapped "A scaled platform,")
       figure labels  member systems / combined net patient revenue /
                      hospitals / states / utilities
       full readings, from the aria-labels, which carried the figures the
       animated counters rendered visually:
                      5 member systems
                      $100B+ combined net patient revenue
                      250+ hospitals
                      20 states
                      5 utilities
       list label     Longitude Health at a glance
       photograph alt Clinicians from different health systems in consultation

   THE ALT TEXT IS THE ONLY DESCRIPTION OF THAT PHOTOGRAPH ANYWHERE IN THE
   TREE and it leaves with the markup. The image file itself is retained in
   src/assets; only its built copy is dropped, because nothing references
   it any more.

   THREE FILES ARE NOW ORPHANED AND ARE DELIBERATELY LEFT ON DISK,
   UNLINKED: components/stat-arc.css (0 of 45 rules match any element on
   any page now), js/stat-wheel.js, and js/counter.js — which lost its last
   consumer with .fnum and .pbub, the only ones in the tree. Their tags
   were dropped from index.html in this unit; shipping a 42,686 B sheet
   that matches nothing is a defect, not a tidiness question. The FILES
   stay: the client removed a section commissioned hours earlier and the
   rework is still running page by page, the tree already retains
   rollbacks as standing practice, and unlinked files cost nothing at
   runtime. Deleting them is REMOVED 6 (src+dist x3) and its own unit.
   js/hero-sphere.js STAYS LINKED — #herosphere is in the hero.

   MEASURED BEFORE REMOVING, so no one re-derives it: only ONE <link> for
   stat-arc.css ever existed, on index.html. The "14 pages" figure carried
   in the handoff was a grep over source text matching comments — see the
   §25 amendment. File reach and behaviour reach were both 1.

   GROUND SEQUENCE, LOGGED AND NOT RESTYLED AROUND. This band was dark and
   gave a hard break on BOTH sides. Without it the page runs
   cream -> paper -> slate with no dark band after #film, and #members ->
   #utilities is a soft tonal step of 5/8/12 per channel. That is the same
   class of seam R1 created after the hero (checkpoint-9an) and R2 closed
   with the film band (checkpoint-9ao) — read those three entries together;
   the ground-sequence history is one thread across R1, R2 and R3.

   HOME-3 · THE QUOTE-BAND TREATMENT LEAVES THIS SHEET. R6, 2026-08-14.
   Not a copy and not a deletion — a relocation, recorded here because this
   file is where anyone looking for it will start.

   The five `.band-slate.quote-feature` rules, and both comment blocks that
   documented them, moved to components/quote-block.css. NOTHING ABOUT THE
   QUOTE BAND REMAINS IN THIS FILE — verified by count: zero occurrences of
   "quote" and zero of "band-slate".

   WHY THEY WENT. They lived here because the homepage was the only
   consumer, and living in a one-page sheet gave them a second, accidental
   barrier. why-longitude.html now carries the same band from the same
   partial, and both pages already linked quote-block.css — so the modifier
   now sits beside the component it modifies, in the file both consumers
   load. Keeping it here would have meant either a duplicate or a page sheet
   reaching a second page.

   KEYED TO THE SELECTOR, NOT TO A PAGE. In its new home the scope note
   reads: applies wherever `.band-slate.quote-feature` appears, which is
   wherever the partial that sets the class is included. The old headers
   said "HOMEPAGE ONLY" and went stale the day a second page adopted it. NO
   ROSTER WAS WRITTEN IN ITS PLACE — a roster is stale the moment the next
   page adopts it.

   THE COMPOUND IS WHAT MADE THE MOVE SAFE. In this sheet the rules loaded
   after quote-block.css; in it they load before their own base rules. They
   still win because `.band-slate.quote-feature` out-specifies
   `.band-slate` — specificity, not order. MEASURED: 54 computed values on
   index.html identical before and after, at 1440, 760 and 390.

   HOME-4 · THE QUOTE PARTIAL IS FORKED AND THE HOMEPAGE GETS ITS OWN.
   2026-08-15. index.html now includes partials/components/quote-home.html;
   why-longitude.html keeps quote-block.html, unchanged, still carrying Pete
   McCanna. ONE PARTIAL SERVED TWO PAGES while its own header claimed
   "HOMEPAGE ONLY" — the fork removes that mis-scoping rather than
   re-documenting it. Only the homepage changes; the other page's rendered
   output is byte-for-byte what it was.

   THE HOMEPAGE QUOTE IS NOW VISHAL AGRAWAL. Attribution follows the
   existing `Name · Title, Org` cite pattern and takes the §6 LEADERSHIP
   title form from our-team.html — "Vishal Agrawal, MD" / "Chief Executive
   Officer, Longitude Health". NOT the §4 board form: "(Ex-Officio)" is a
   governance qualifier and does not belong on a quote attribution.

   LOGGED COPY DEVIATION — ENCLOSING QUOTATION MARKS REMOVED. The supplied
   string opened U+201C and closed U+201D. Both were STRIPPED under Ruling F,
   because `blockquote::before` already renders a U+201C ornament — 160px
   gold at this size — and marks plus ornament render the quotation TWICE.
   This is the same handling as our-team.html §4 and the inverse of the memorial
   in our-origins.html, which keeps its typed marks precisely because it has
   no ornament. **IF THE ORNAMENT IS EVER REMOVED FROM THIS BAND, THE MARKS
   COME BACK IN THE SAME EDIT.** The two curly apostrophes inside the string,
   in "isn't" and "It's", are U+2019 and were NOT touched — only the two
   enclosing double marks were removed.

   THE PORTRAIT IS BELOW THE 2x STANDARD AND THAT IS ACCEPTED, NOT MISSED.
   assets/leadership/Vishal.jpg is 400x400 into a 300px slot: 1.333x at 1x
   and 0.667x at DPR 2 — below native. Accepted by ruling as a known
   deviation. THE REMEDY IS NAMED: a higher-resolution original has been
   requested from the client, and the swap will be ONE FILE with no markup
   change, because the slot is fixed-basis and the image is object-fit:cover.
   DO NOT UPSCALE TO CLOSE IT. The file this replaced, lh-portrait-mccanna.jpg
   at 500x500, already failed the same gate at 0.833x — the deviation is
   inherited, not introduced.

   OPEN, LOGGED, NOT ACTED ON: quote-block.html is now why-longitude's
   page-specific partial while carrying a generic name, beside quote-home.html
   and quote-utilities.html which are named for their pages. A generic name on
   a page-specific file is exactly how the "HOMEPAGE ONLY" claim went stale.
   Renaming it to quote-why-longitude.html needs why-longitude.html edited and
   is ITS OWN UNIT.

   HOME-5 · THREE CTA DESTINATIONS AND FIVE LOGO WIDTHS. CLIENT-REQUESTED
   (BugHerd #1 and #2), DIRECTOR-RULED (B4, 2026-08-17). Two tickets, one
   entry, because they land in the same unit on the same page.

   ── #1, AND THE FIRST OF THE THREE IS A CORRECTION, NOT A REDIRECTION.

   The hero CTA read `href="#problem"`. **`id="problem"` EXISTS ON ZERO PAGES**
   — measured across all 20 built pages, control `id="utilities"` returning
   index.html and utilities.html. R1 moved index's `#problem` section to
   why-longitude.html and **the id did not survive anywhere, on either page.**
   The hero's primary call to action has therefore pointed at a non-existent
   fragment since R1, silently: a dead same-page anchor does not error, it just
   does nothing. **Repointing it to why-longitude.html fixes a live defect. Do
   not read this row as a preference.**

     section.hero      .btn "See the model →"        #problem   -> why-longitude.html
     section#members   .cta-line "See how it works →"           -> our-approach.html
                       relabelled "Learn about Longitude →"
     section#utilities .cta-line "Explore what we're building →"   NO-OP, untouched

   THE THREE STRINGS IN THE TICKET ARE SECTION HEADINGS, NOT CTA LABELS, and
   reading them as labels is what made the third row look like a change. They
   are the h1/h2 of the three sections — "Solving together what no health
   system can solve alone.", "Built by health systems. For health systems.",
   "A growing ecosystem of health system-built utilities." — and each
   identifies which section its instruction applies to. **The third row already
   pointed at utilities.html, so it was reported as a NO-OP and NOT edited.** No
   change was manufactured to match the shape of the other two.

   TWO CTAs ARE DELIBERATELY EXCLUDED AND ARE NAMED SO THE OMISSION IS NOT READ
   AS AN OVERSIGHT: `.btn` "Join Us" -> #join, and `.cta-line` "Solving What
   Health Systems Can't Solve On Their Own" -> the off-site youtu.be link. Five
   CTA-class elements render on this page and the ruling addressed three.

   THE .html FORM IS THE SITE CONVENTION, COUNTED NOT ASSUMED: **26 `.html`
   page hrefs across src/pages and src/partials, 9 distinct targets, and ZERO
   extensionless page hrefs.** The 11 extensionless hrefs are newsroom article
   DIRECTORY links carrying a trailing slash, a different pattern. Both
   repoints take `.html`, matching the untouched third CTA and the header's
   nine. **An extensionless page link here would have been the site's first.**
   `cleanUrls` may well redirect `.html` to extensionless at the edge —
   firebase.json is ⌘4's and was not opened — but **what the edge does to a URL
   does not change what the source should say.**

   FRAGMENTS AFTER THE REPOINTS, REPORTED AND DELETED NEITHER. `#problem` is
   now wholly unreferenced and its target never existed to begin with, so
   there is nothing to remove. `#utilities` is now unreferenced from this page
   **but its target element remains** — it is the section's own id and
   utilities.html carries one too. Leaving an unreferenced id is not dead code:
   it is an addressable landmark, and deleting it would break any external or
   bookmarked link.

   ── #2, AND THE WIDTH CHANGE HAS THREE DEPENDENTS, NOT ONE.

   All five member logos go +10%: 157 -> 172.7, 121 -> 133.1, 110 -> 121,
   124 -> 136.4, 113 -> 124.3. Every one stays far under its ~500px intrinsic
   width; the binding headroom is Baylor at 2.896x, and 1.448x at DPR 2, still
   above native. No image file was opened, moved or re-encoded.

   `--cx` SCALES x1.1, AND THE REASON IS THE NOUN. The first measurement asked
   whether the dots MOVE when the logos grow. They do not — `.mem` is
   `flex:1 1 168px` under `space-between`, so the box is sized by the flex
   algorithm and not by the logo, and the box widths held at 196.8px to two
   decimals. **That measurement is true and answers the wrong question.** `--cx`
   corrects each dot onto its logo's OPTICAL CENTROID, and the note at the
   declaration records that Novant and Providence carry their ink weight ~8px
   left of bbox centre. Scale the artwork and that offset scales with it: at
   +10% the dot is left 1.08px behind on Novant and 1.03px on Providence.
   **The dot not moving is not the dot still being aligned.** Recomputed at the
   file's existing 2-decimal precision: -0.04, -0.43, -11.85, -11.28, -0.19.

   THE ANIMATION DELAYS ARE THE THIRD DEPENDENT AND THE SHEET SAYS SO. The
   delay for each logo is its dot's fraction of the drawn line x the line's
   duration, and the note there instructs re-measurement if `--cx`, the widths
   or the row's justification change. All three triggers fired, so the
   fractions were re-measured against the FINAL 2-dp `--cx` values rather than
   derived. The figures and which delays moved are recorded beside the delays
   themselves, where whoever edits them will be standing.

   THE 84px ZONE IS THE CEILING AND +10% IS INSIDE IT. `.mem .lg` is a fixed
   84px band so no tall mark can push its name below the short ones — every
   name baseline lands on one line. Michigan is tallest at 70.50px, reaching
   **77.55px at +10% with 6.45px to spare. The zone is reached at about +19.1%**,
   so a future "make them bigger again" of +20% would overflow it and break that
   shared baseline. **Measure the zone before granting a second increase.**

   our-team.html DOES NOT MOVE AND WAS NOT EDITED. Its logo row is a COPY of
   this component under a different selector family — `.gm-strip`/`.gm-mem.g-*`
   against `.mstrip`/`.mem.m-*` — with no shared selector between them. The
   `--cx` values were identical only because one was copied from the other, and
   our-team.css's own banner warns the copy does not follow the original.
   **They are now deliberately different, and aligning them is not a tidy-up.**

   ── THIS UNIT WROTE INSIDE ANOTHER SHELL'S LIVE GRANT.

   `src/pages/index.html`, `src/css/pages/home.css` and
   `src/css/components/member-strip.css` are all on the **HOMEPAGE SHELL's**
   enumerated grant — the first two on the base list, the third by the
   2026-08-07 amendment. **That delegation has never been recorded as closed**
   and this unit did NOT close it: closure would assert the homepage change
   list is finished and no record establishes that. Written on the `8w`
   precedent, where the BUILD SHELL — which issued the delegation and holds the
   write lock — wrote the same two paths. **The authority is not in question;
   the collision risk is, and a declaration cannot detect a collision (§35).**

   THE PROTOCOL, EXECUTED IN ORDER: hash, byte count, mtime and delimiter
   baseline recorded for ALL NINE grant paths before any edit, the JS members
   enumerated by measurement rather than by name; `src` confirmed quiescent
   against the 9bg seal with the freshness probe controlled against 9bf;
   hashes re-compared IMMEDIATELY BEFORE THE BUILD, not only at the start; and
   every untouched grant path verified byte-unchanged at exit.

   QUIESCENCE EVIDENCE, MEASURED NOT ASSUMED: index.html unchanged at
   `435858e8e96f76e1` across NINE checkpoints, 9ay through 9bg, mtime
   2026-08-15 10:49:04. member-strip.css untouched since 2026-08-07 16:44:16 —
   **the day the grant was issued.** Nothing had written either file in ten
   days. **If the HOMEPAGE SHELL is still live it must re-read all three before
   writing any of them; its copies are now stale.**
   ===================================================================== 
   HOME-6 · THE #film CTA IS RE-GROUNDED TO GOLD. CONSEQUENCE OF THE --accent
   TOKEN MOVE. C2, 2026-08-17.

   `#film .film-cta .cta-line` takes `--gold` instead of the inherited
   `--accent`. **Colour only — one added declaration, no copy, no geometry.**

     before   --accent #2B61C9 on --plum   2.5821   19px/700 LARGE, thr 3.0  FAIL
     after    --gold   #F0B83F on --plum   8.2161   19px/700 LARGE, thr 3.0  PASS

   ── WHY THIS IS A CONSEQUENCE AND NOT A NEW DECISION.

   C1 moved `--accent` #696FE8 -> #2B61C9 at client request. On light grounds
   every instance improved; on `--plum` the same move took this link from
   3.5594 to **2.5821, below its 3.0 threshold.** **See TOK-1 in tokens.css for
   the 55-instance census — that entry and this one are ONE decision recorded in
   two places**, and C1 shipped this failure knowingly rather than widen its own
   manifest. C2 closes it.

   ── `--gold` IS NOT A BESPOKE VALUE. IT IS ALREADY THE DARK-GROUND ACCENT.

   `h2.tlw-h2` on our-approach measures **8.2161 on plum — the identical
   figure**, because it is the identical pair of colours. This sheet is adopting
   an established treatment, not inventing one. Rejected alternatives, measured:

     --ink-on-dark   8.6943   clears, but is the dark-ground BODY colour
     --cream         13.0839  clears, but is the dark-ground BODY colour
     --slate          3.0421  clears by 0.0421 — not a margin
     --pill-hover     2.8600  fails

   **The two that clear most easily are the colours body text already uses on
   dark grounds, so a CTA wearing them stops reading as a link.** Legibility is
   not the only thing being measured here.

   ── ⚠ THIS DOES NOT GRANT R4, AND MUST NOT BE READ AS A PRECEDENT FOR IT.

   **R4 is the client asking for gold on the `h1 em`, which sits on `--paper`.
   Gold on paper measures 1.7030 and fails even the 3.0 large-text threshold.
   That request stands REFUSED.** This is gold on `--plum` at 8.2161. **Same
   colour, different ground, opposite verdict** — a 4.8x spread between the two
   figures. A future reader finding "gold approved, 2026-08-17" in this log is
   reading about a DARK ground only. The ground is the variable, not the colour.

   ── SCOPING, BECAUSE `.cta-line` IS A SHARED CLASS.

   Nine `a.cta-line` render site-wide and **seven sit on light grounds, passing
   at 5.0671 or 5.4187 — they must not move.** The base colour is declared once,
   at `components/buttons.css:78`, as `color:var(--accent)`; **neither page sheet
   declared it, so this is an ADDED scoped rule, not a swap.** Section-scoped to
   `#film`, which contains exactly one `.cta-line`. §46.

   The cascade was enumerated rather than assumed (§65): the only rules setting
   `color` that match this element are `a{color:inherit}` and
   `.cta-line{color:var(--accent)}`. **No `:hover`, `:focus` or `:visited` rule
   for `.cta-line` exists in any sheet**, so there is no second state to carry.
   The new rule is (1,1,0) against (0,1,0) and wins on specificity alone.

   
   HOME-7 · THE FILM EMBED MOVES FROM YOUTUBE TO WISTIA. CLIENT-DIRECTED,
   V1, 2026-08-18.

   `<iframe src="youtube-nocookie…">` is replaced by Wistia's
   `<wistia-player media-id="o9g52qvaol">` custom element, plus two async
   scripts from fast.wistia.com. **Markup and CSS only — no copy, no
   geometry.** The inline `<style>` block Wistia supplies was NOT used:
   zero `<style>` blocks exist in any source markup and this did not become
   the first.

   ── ⚠ THE SELECTOR AT :523 WAS KEYED TO THE TAG AND WOULD HAVE ORPHANED.

   `#film .film-frame iframe{position:absolute;inset:0;width:100%;
   height:100%;border:0;display:block}` is the rule that makes the video
   fill its frame. **It named the `iframe` TAG.** Swapping the element for
   `<wistia-player>` without renaming it drops every one of those
   declarations — the CSS still parses, nothing errors, and the player
   collapses to an unstyled inline box. **It was the only `iframe` selector
   in the tree, so nothing else warned.** Renamed with the declarations
   untouched, and verified by COMPUTED VALUE on the built page rather than
   by reading the file: position absolute, inset 0px on all four sides,
   896x504, border 0px, display block.

   ── RATIO: ONE MECHANISM, NOT THREE.

   The supplied snippet carried `padding-top:56.25%` and the element carries
   `aspect="1.777…"` — both 16:9, on a frame that already sets
   `aspect-ratio:16 / 9`. **`padding-top` was dropped.** `.film-frame` also
   sets `max-width:calc((65vh - var(--film-head)) * 16 / 9)`, a deliberate
   viewport-HEIGHT cap so the video never outgrows the fold; a padding-top
   ratio box fights that cap rather than cooperating with it. Measured after
   the build: `aspect-ratio 16 / 9`, `max-width 896px`, **`padding-top 0px`**.

   ── COOKIES, AND THE RULING THIS REVERSES.

   The old comment recorded the nocookie host "with no query string at all",
   chosen so the embed set no cookies. **Wistia sets its own cookies and runs
   its own analytics. The client has accepted this and is handling the
   privacy policy internally — not a build task.** Measured: the page makes
   **17 requests to Wistia hosts** on load, and one to
   `distillery.wistia.com` — the analytics beacon — which aborted in the
   probe environment but is a live call in the field.

   ── ⚠ NOTHING ENFORCES THE THIRD-PARTY BOUNDARY AT THE HEADER LEVEL.

   **There is no Content-Security-Policy anywhere on this site** — not in
   `firebase.json`, not in `build.mjs`, and no `meta http-equiv` on any of
   the 20 built pages. Confirmed by reading all three surfaces. So the swap
   could not have shipped blocked, and equally: **the nocookie posture was
   always a source-level choice, never an enforced one.** If a CSP is ever
   added it must name `fast.wistia.com` for scripts and
   `embed-fastly.wistia.com` plus `fast.wistia.net` for media.

   ── ⚠ referrerpolicy IS GONE AND WAS NOT REPLACED.

   The iframe carried `referrerpolicy="strict-origin-when-cross-origin"` as
   an ATTRIBUTE. **It left with the element.** A custom element takes no such
   attribute, so the equivalent control is a header, and there is no header
   layer. **No replacement was authorised in V1. Flagged, not fixed.**

   ── CAPTIONS: RULED NOT NEEDED, AND THE MEDIA HAS NONE. BUT ITS NAME SAYS
      OTHERWISE, WHICH SOMEONE SHOULD SEE.

   The client ruled captions are not required on this media. Measured on the
   live player rather than assumed: **`captionsLanguages` returns `[]` —
   zero caption tracks** — and `captionsEnabled` is false. **The ruling and
   the asset agree.**

   **But the media is named "LONGITUDE V5 - wGRFX + CC", and "+ CC" reads as
   closed captions.** The name claims something the served asset does not
   carry. That is not a build defect and nothing here depends on it — it is
   recorded because a client who believes captions shipped, and an asset
   named as though they did, is a combination worth someone checking.

   **WHETHER THIS MEDIA HAS AN AUDIO TRACK IS NOT DETERMINABLE FROM THE
   BUILD SIDE, and a first attempt to answer it was wrong.** Testing the
   media JSON's asset TYPE names for /audio/ returned false — but those names
   are container formats (`mp4_video`, `hd_mp4_video`), and audio rides
   inside them, so the probe was measuring the wrong noun. The player
   reports `volume 1` and `muted false`, which are defaults and not evidence
   of content. **WCAG 1.2.2 binds only if there is audio; that question is
   open and is the client's to answer, not this build's.**
   Duration measured: **100.101s.**

   ── WHAT DID NOT CHANGE.

   `hub.html` still links the same video at `youtu.be` and was not opened —
   **the two placements now sit on different platforms**, recorded in the
   markup comment. The `.film-cta` link below the player is still the
   youtu.be destination. The permanent-visible-link reasoning survives and
   its ground got firmer: an undefined custom element fires no error event
   either, so the onerror pattern still cannot transfer here.

   
   HOME-8 · TWO COPY EDITS ON index.html, AND THE FILM CTA STOPS BEING A
   LINK. CLIENT-REQUESTED (BugHerd #14, #15), N1, 2026-08-18.

   ── #14 · ⚠ AN EM DASH IS DOWNGRADED TO A HYPHEN-MINUS, AS SUPPLIED.

   `<p class="lead">` loses the clause "none could create as effectively
   alone" and its dash changes character:

     before   …shared infrastructure none could create as effectively
              alone U+2014 one connected platform…
     after    …shared infrastructure U+002D one connected platform…

   **U+2014 EM DASH -> U+002D HYPHEN-MINUS. Written exactly as the client
   supplied it, NOT normalised.** Logged as a client-directed deviation
   against `longitude-v14-copy-spec-2026-08-03.md`, which is where this
   sentence was harvested from. **Do not "fix" the hyphen back to an em
   dash** — it is the requested string, and the record is here so a later
   reader does not mistake it for a transcription slip. −41 B.

   ── #14 · THE META DESCRIPTION IS DELIBERATELY LEFT DIVERGENT.

   `index.html:7` carries a SHORTER variant of the same clause —
   "…building the shared infrastructure none could create as effectively
   alone." The ticket did not name it and **director ruling left it
   unchanged; it is flagged to the client.** So the page copy and the meta
   description now say different things about the same idea, on purpose.
   **Verified byte-identical after this unit.** If a later unit is asked to
   "make the description match", that is this divergence, and it is a copy
   decision rather than a tidy-up.

   ── #15 · ⚠ THE DESCENDANT SELECTOR FORCED THE STRUCTURE, AND THE
      FALLBACK IS WORSE THAN IT LOOKS.

     before  <p class="film-cta"><a class="cta-line" href="…youtu.be…"
             target="_blank" rel="noopener noreferrer">Solving What Health
             Systems Can't Solve On Their Own</a></p>
     after   <div class="film-cta"><h2 class="cta-line">Watch the Longitude
             Health story</h2></div>

   Gold comes from `#film .film-cta .cta-line{color:var(--gold)}` — a
   DESCENDANT selector, so **the two classes must stay on two elements.**
   Collapsing them onto a single `<h2 class="film-cta cta-line">` stops the
   selector matching. **Tested before writing rather than reasoned about:
   `matches()` returns false and the computed colour falls back to
   rgb(43,97,201) — `--accent`, because buttons.css's own `.cta-line` rule
   sets `color:var(--accent)`.** That is **2.5821 on this plum ground: the
   exact failure C2 was created to fix.** The obvious simplification would
   have silently reintroduced a closed defect. An `<h2>` inside a `<p>` is
   also invalid, so the wrapper could not stay a `<p>` either.

   ── `.cta-line` NOW NAMES SOMETHING THAT IS NOT A CTA LINE.

   It is a heading. **The class is NOT renamed** — renaming it touches
   buttons.css, home.css and every other consumer of `.cta-line`, and the
   name is inherited from a role this element no longer plays. Same
   handling as the violet/blue naming drift in TOK-1 and `--pill-hover` in
   TOK-2: **stated once, here, not swept.** Read the rules, not the name.

   ── WHAT WAS LOST ON PURPOSE, AND WHAT WAS LOST AS A CONSEQUENCE.

   The `<a>` went with its href, target and rel. `cursor:pointer` and
   keyboard focusability come from the UA's `a[href]` and are **correctly
   gone — the element is no longer interactive.** No `:hover`,
   `:focus-visible`, `:visited` or `:active` rule exists for `.film-cta` or
   `.cta-line` anywhere, so nothing orphaned.

   **NO youtu.be OUTBOUND REMAINS ON THE HOMEPAGE — measured, comments
   excluded: zero.** `hub.html:171` still carries the same string and its
   own youtu.be link, deliberately: that placement was always an outbound
   row and was not opened. **The two pages now differ on purpose.**

   ── THE FALLBACK REASONING THIS REMOVES WAS REAL, AND IT IS NOT ANSWERED.

   The link existed because an embed can fail silently — no HTML fallback,
   no `onerror`, and a custom element that never upgrades is no better.
   **The client's position is that a player rendering in place does not need
   an escape hatch. That is a product decision, not a measurement, and the
   failure mode it covered still exists.** Recorded so the trade is visible
   rather than implied. The V1 comment that argued the other way has been
   rewritten in the markup rather than left reading as live.

   */

/* =====================================================================
   HOME PAGE — hero, problem band, pivot
   Page-level only. Anything reusable lives in css/components/.
   ===================================================================== */

/* ---------------- HERO ---------------- */

/* HEIGHT IS CONTENT-DETERMINED. The `min-height:92vh` that stood here is
   gone (2026-08-07, client change list) — the hero is now as tall as its
   copy and its stage, plus padding, at every width.

   PADDING-TOP IS 190px AND THAT IS 110 + 80, NOT A NEW SPACING VALUE.
   `section{padding:110px 34px}` in base.css is the page's rhythm, and the
   header is `position:fixed` at 80px tall, so the hero's first 80px of
   padding sits UNDERNEATH the header and is not visible space. 190px is
   what renders a visible 110px gap — the same gap every other section on
   the page shows.

   THE OLD 80px WAS HEADER CLEARANCE AND NOTHING ELSE, and it read as
   adequate only because `min-height:92vh` plus `align-items:center` meant
   the content never actually sat at the padding edge. Removing the
   min-height without moving this number would have put the copy hard
   against the header at 1440 and 1199. Bottom padding is inherited from
   `section` unchanged and is deliberately not restated here. */
.hero{display:flex;align-items:center;padding-top:190px}
.hero .in{display:flex;align-items:center;gap:5vw;max-width:1320px}
.hero .copy{flex:1 1 auto;max-width:760px}
.hero .lead{margin-top:22px;font-size:17px;color:var(--on-page-body);max-width:48ch}

/* EYEBROW, HOME PAGE ONLY. The base rule is `.kick` in base.css:76, which
   utilities.html also loads AND uses (one element, "Member-led, health
   system-owned collaborative."). Editing it there would have moved both
   pages, so the 14px is scoped here instead.
   `.hero .kick` is (0,2,0) against base's (0,1,0) — it wins on specificity
   rather than on load order, so re-ordering the stylesheet links cannot
   silently undo it. letter-spacing is deliberately NOT restated: base sets
   it as `.26em`, so it tracks the font-size on its own (11px -> 2.86px
   became 14px -> 3.64px, measured). */
.hero .kick{font-size:14px}

/* THE CANVAS SURFACE IS 1:1 WITH ITS STAGE AND ANSWERS NO QUESTION ABOUT
   WHAT IS DRAWN ON IT. The element is this size whether it has drawn a
   full sphere or nothing at all — every geometric property it exposes
   describes the SURFACE. The only instruments that see drawn content are
   getImageData statistics and direct pixel sampling. */
/* STAGE STEPPED UP ~9%: min(34vw,440px) -> min(37vw,480px). BOTH TERMS
   MOVE TOGETHER, and that is the point — the px term caps the desktop
   size, the vw term governs everything below ~1297px, and raising only one
   would have grown the sphere at some widths and not others. 37/34 = 1.088
   and 480/440 = 1.091, so the step is uniform across the range.
   Nothing about the drawing changed: motion, colour and point count all
   live in js/hero-sphere.js and are untouched. The canvas is width/height
   100% of this box, so its backing store follows on its own. */
.hero .stage{position:relative;flex:0 0 min(37vw,480px);width:min(37vw,480px);aspect-ratio:1;z-index:1}
.hero .stage canvas{position:absolute;inset:0;width:100%;height:100%}

@media(max-width:1199px){h1 .lb{display:none}h1{text-wrap:balance}}
@media(max-width:920px){
  .hero .in{flex-direction:column;align-items:flex-start}
  /* ONLY THE px CAP MOVES HERE: 320px -> 350px. The 72vw term is a FIT
     GUARD, not a size — at 320px viewport the section's 34px side padding
     leaves 252px of content width and 72vw is 230.4px, so raising it would
     spend the entire remaining margin. The cap governs 920px down to
     ~486px; below that the vw term takes over and the stage is unchanged
     from before this edit. */
  .hero .stage{flex-basis:auto;width:min(350px,72vw);align-self:center;margin-top:26px}
}

/* The .close rule that stood here is deleted (Unit 7E). It sized the
   join-form section when that section lived in the index page body; the
   form now renders in the global footer and carries .jband from
   css/components/join-form.css instead. Measured before deleting:
   0 elements matched .close on either built page, and utilities.html
   never loaded this stylesheet at all. .u-close on the utilities page is
   a different class and is untouched. */

/* ---------------- FILM BAND (R2) -------------------------------------

   ID-SCOPED FROM THE FIRST LINE, DELIBERATELY. This band is dark and the
   obvious move was `.band-plum`, which would have handed it
   components/bands.css's UNSCOPED `.band-plum .in{display:flex;gap:5vw;
   align-items:center}`. The unit immediately before this one retired an
   unscoped rule on a shared class for causing exactly that collision on
   the other page; adopting the class here and then restating the
   container would have re-armed the same trap in mirror image. The ground
   tokens are the ones bands.css:9 uses — no new colour values.

   THE TEXTURE IS COPIED, NOT RE-DERIVED. Values taken verbatim from
   #fragmentation's ::before in pages/why-longitude.css, which is where
   this treatment moved under R1. Same asset, 18px tile, --slate, .10.

   FULL-BLEED BY RELEASING .in's CAP, NOT BY LEAVING .in. The element
   stays in the markup so the paint-order guard has something to sit on
   and so the structure matches every other band; only its max-width and
   the section's side padding are released. The vertical rhythm is
   untouched.
   --------------------------------------------------------------------- */
#film{
  background:var(--ground-dark);
  color:var(--on-dark);
  position:relative;
  padding-left:0;padding-right:0;
}
#film::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:var(--slate);
  -webkit-mask-image:url(../../assets/longitude-texture.svg);
          mask-image:url(../../assets/longitude-texture.svg);
  -webkit-mask-size:18px 18px;     mask-size:18px 18px;
  -webkit-mask-repeat:repeat;      mask-repeat:repeat;
  -webkit-mask-position:top left;  mask-position:top left;
  opacity:.10;
}
/* the content rides above the overlay — the ::before is a later sibling
   in paint order and would otherwise cover it. */
#film > .in{position:relative;z-index:1;max-width:none;width:100%}

/* THE HEIGHT CAP IS EXPRESSED AS A max-width AND THAT IS NOT A DETOUR.
   With `aspect-ratio:16/9; width:100%`, a `max-height` clamps the HEIGHT
   while the width stays 100% — the box stops being 16:9 and the frame
   letterboxes inside it. Capping the WIDTH instead lets aspect-ratio
   derive the capped height and the ratio survives.

   Measured under 65vh: the cap engages at every desktop height — 1039.28 x
   584.59 at 1440x1024, 896 x 504 at 1440x900, 734.22 x 412.98 at 1440x760.
   It does NOT engage at 390 wide, where the container width binds first and
   the box is unchanged at 390 x 219.38.

   65vh IS A CLIENT SIZING DECISION, NOT A DERIVED VALUE. It replaced 100vh
   because the video read too large, and it is not the answer to any
   measurement in this file. Do not "restore" it to 100vh as a bug fix.

   LOGGED CONSEQUENCE, NOT A DEFECT: on a 390-wide viewport the cap starts
   binding below 462px of height — the crossover where
   (0.65*vh - 81) * 16/9 drops under 390. Below it the video renders
   NARROWER than the text column: 318.22 x 178.98 at 390x400. Landscape
   phones and split-screen. It degrades continuously rather than collapsing,
   and nobody has seen it yet.

   81px IS NOT A MAGIC NUMBER AND IS NOT HARD-CODED AS ONE. The header is
   position:fixed, so a band's first rows sit underneath it. Its bar is
   `height:80px` (components/header.css:58) and it carries a
   `border-bottom:1px` (components/header.css:16), so the occluding
   border-box is 80 + 1. Both terms are named below rather than summed.
   NOTE for whoever revisits the hero: the 190px = 110 + 80 convention
   recorded at the top of this file uses the BAR height and is therefore
   1px short of the actual occlusion. Not corrected here — it predates
   this unit and moving it is a spacing change, not a comment fix. */
#film .film-frame{
  --film-head:calc(80px + 1px);
  width:100%;
  max-width:calc((65vh - var(--film-head)) * 16 / 9);
  aspect-ratio:16 / 9;
  margin:0 auto;
  position:relative;
}
#film .film-frame wistia-player{
  position:absolute;inset:0;width:100%;height:100%;border:0;display:block;
}
/* THE PRE-DEFINITION PLACEHOLDER. Between first paint and the moment
   fast.wistia.com's module upgrades the element, <wistia-player> is an
   unknown inline element with no box. This paints Wistia's own swatch for
   this media in the meantime so the band is not a dark hole.
   NO padding-top HERE, DELIBERATELY. The supplied snippet carried
   `padding-top:56.25%`, which is 16:9 stated a third time — `.film-frame`
   already sets `aspect-ratio:16 / 9` AND a `max-width` derived from 65vh so
   the video never outgrows the viewport height. A padding-top ratio box
   fights that cap. The aspect-ratio above is the single source of ratio. */
#film .film-frame wistia-player:not(:defined){
  background:center / contain no-repeat url('https://fast.wistia.com/embed/medias/o9g52qvaol/swatch');
  display:block;
  filter:blur(5px);
}

/* THE LINK CARRIES ITS OWN SIDE PADDING because the band's is zero. #film
   releases padding-left/right so the video can go full-bleed, which would
   otherwise put this text hard against the viewport edge at every width.
   34px is base.css's own section inset, restated here rather than invented
   — the link lines up with every other page edge on the site. */
#film .film-cta{margin:0;padding:0 34px;text-align:center}
#film .film-cta .cta-line{color:var(--gold)}
