/* hero-sky.css — the procedural starfield's box. Spec: 064 §2.5, §3.

   ⚠️ ITS OWN FILE, AND THE REASON IS A MEASUREMENT. 062 §4.1 said hero.css was
   at 620 lines with ~80 of headroom against 000 §3.1's ceiling; 063 §6.1
   measured it at 675, so the real headroom was 25. Splitting is the base case
   here, not the contingency it was written as. Every .hero__sky rule lives in
   this file — including the reduced-motion one — so the layer has one home
   rather than two.

   The stack it joins is fixed by 016 §2, renumbered by 033 §3.1, reduced by
   090 §2.1 and 093 §2, and now filled at 2 and 3:

     sky/galaxy 1 · trail 2 · title/body 3 · [4 reserved] · [5 reserved] · cue 6

   The canvas takes the galaxy plate's slot at z-index 1 exactly.

   ⚠️ THIS LISTING WAS WRONG THREE WAYS UNTIL 2026-09-02 (133 §4). It said 2 and
   3 were empty — 3 has held .hero__title and .hero__body since session 9 — it
   still named `rendered 4` and `wire 5`, which 093 §2 deleted, and it predicted
   that 3 "is where whatever replaces the hero copy will land", which had already
   happened. hero.css:63 carried the same staleness independently, so the stack
   was recorded twice and both copies drifted. Neither was caught by anything
   structural; a comment describing a layout goes stale the way a measurement
   does (000 §5 entry 21). If the stack changes again, both files change. */

/* ⚠️ DELIBERATELY NOT ADDED TO hero.css:89's SHARED RULE, and this is the one
   thing in this file that would be silently wrong if copied (064 §2.5).

   That rule ends `object-fit: cover`, and object-fit APPLIES TO <canvas> —
   canvas is a replaced element. 063 §3.1 render-tested it: a 100x100 buffer
   whose top 10% is green, in a 400x100 box, shows the green stripe as the top
   10 px under `fill` and shows NO GREEN AT ALL under `cover`. So any
   buffer-to-box aspect mismatch would be silently CROPPED instead of visibly
   wrong — including the window between a rotation changing the box and the
   next resize rebuilding the buffer, which is precisely what check 14 exists
   to catch. `fill` is the initial value and is stated anyway, because the
   whole point is that a reader must not "tidy" this into the rule above it. */
.hero__sky {
  position: absolute;
  inset: 0;
  height: 100%;
  display: block;
  object-fit: fill;
  z-index: 1;

  /* ⚠️ THE SCROLL-COUPLED DRIFT IS GONE (090 §2.4), AND THE 110% IS NOT.
     The canvas used to translate with pin progress; it no longer does, so the
     sky has NO scroll coupling at all and is purely clock-driven. 000 §3.7's
     amended rule — anything driven by scroll is a pure function of progress,
     anything driven by the clock is not and must never be wired to scroll — is
     now trivially satisfied. 065 check 9, which measured the drift returning
     bit-exactly to matrix(1,0,0,1,0,0) across 0 → 1 → 0, is MOOT rather than
     failing; a later reader finding it retired should not read it as a
     regression.

     ⚠️ THE REASONING FOR NEVER FEEDING SCROLL INTO A UNIFORM HAS MOVED TO
     000 §3.7 (090 §2.4). It lived in this comment, attached to the transform
     that implemented it — so deleting the code would have deleted the warning.
     It is a standing architectural rule, not a note about a declaration.

     ⚠️ THE WIDTH IS INHERITED FROM THE DRIFT ERA AND IS RETAINED PENDING A
     SEPARATE DECISION. -5% / 110% existed for exactly one reason: at inset:0
     the element is exactly viewport-sized, so any translate would expose a bare
     edge, and widening by 10% gave 5% of headroom each side to travel into.
     With no travel there is nothing to give headroom to — and this canvas's
     DRAWING BUFFER is sized from its rect (sky/index.js:307-313), so the shader
     is asked for 10% more fragments every frame than the viewport shows.

     It is not removed here because it is not a cleanup: uResolution carries the
     buffer's aspect into the shader, so narrowing the box REFRAMES THE
     STARFIELD. That is a look change and Xinlu's under 003 §1.1 — held back as
     its own item with the fragment count measured both ways (090 §6). Do not
     "tidy" it in passing, and do not restate a drift as its justification.

     ⚠️ AND will-change BELOW IS NOW A HINT FOR A PROPERTY THAT DOES NOT EXIST.
     It is left in place deliberately rather than overlooked: 090 §2.4 removes
     the matching hint from the injected plate (hero.css) and does not name this
     one, and this canvas's compositing belongs with the width decision above
     rather than ahead of it. Unlike the plate's, this hint costs nothing
     visible — a WebGL canvas is composited regardless — so there is no reason
     to pre-empt the ruling. Raised in 091; remove it with the width or on its
     own say-so, not silently. */
  left: -5%;
  width: 110%;
  will-change: transform;
}

