Skip to content

[Website] Add GraphQL Federation and Fusion Product pages - #10391

Merged
rstaib merged 572 commits into
mainfrom
rst/graphql-federation-page
Oct 27, 2026
Merged

rstaib merged 572 commits into
mainfrom
rst/graphql-federation-page

Conversation

@rstaib

@rstaib rstaib commented Sep 14, 2026

Copy link
Copy Markdown
Member

No description provided.

@rstaib rstaib self-assigned this Sep 14, 2026
@rstaib
rstaib marked this pull request as draft September 14, 2026 14:12
@github-actions github-actions Bot added 📚 documentation This issue is about working on our documentation. 🌶️ website labels Sep 14, 2026
…opy band

buildColumnSilhouette and paintColumnLayer's signatures changed (they
now build from the drawn column tiles and take the band's own
projected y for the gradient anchor); update index.tsx's call sites.

On mobile/stacked, featherCopyClearZone's own erasure clears the
WHOLE live canvas above the band, including the column layer this
frame just stamped in, so it never read as structure continuing
behind the copy -- only ending abruptly at the band. Re-stamp the
column under that erased result (destination-over, clipped to the
erased region) so it shows through there again at its own low
bandFade alpha, without touching the plasma layers or its own
copy-clear guarantee.
The wall's own floor rows are already cut by the section bottom (row 1's
back arc lands at y 801 on the 792px-tall canvas at 1440), so keeping the
bottom rim's front arc inside the canvas forced a rim far too small to
match the wall's own tile scale, leaving the bottom bridging row (wall
row 1 -> bottom rim) about 2x taller than the wall's own row-1-to-row-2
pair -- exactly the overlay symptom the planner's ruling calls out.

Per the planner's ruling (ticket comment 334) and the orchestrator's
relay (335), the bottom rim's front arc may now sit below the canvas,
the same way the wall's own floor already does; what matters is that the
VISIBLE part of the junction reads true. wqa-rim-search.cjs was extended
to drop the "front arc in canvas" constraint on the bottom rim and to
compute the tile-height/seam-gap/depth checks over the bridging row's
in-canvas tiles only (a tile counts as in-canvas if any of its 4 corners
projects inside the frame), then to grid-search a single canonical (y, z,
r) rim triple that passes at 1280, 1440 and 1920 jointly, tie-broken
toward the smallest radius change from the (unchanged) top rim so the
hourglass keeps reading symmetric.

The chosen bottom rim (SIDE_BOTTOM_RIM_Y/Z/R = -270/230/236) ties the top
rim's own radius exactly and lands within the 15% tile-height and 1px
seam-gap bars on every in-canvas bridging tile at all three widths, with
no depth<=1 corner. Only the three SIDE_BOTTOM_RIM_* constants (and their
doc comment) change in sceneLayout.ts; the top rim, waist, ring, wall
builder/painter and the mobile/stacked scene are untouched.
…-frozen bridging rows

Planner ruling comment 345/346 (option B on the flare): only the wall's
two bridging rows (1 and 17) may move in radius, z and spacing to meet a
larger rim -- rows 2-16 and the painter stay at pixel parity with
8c545c4. Grows the top rim to a radius/y/z that clears the numeric
flare target (rim projected width >= 1.5x the waist's at 1440/1920,
>= 1.4x at 1280; measured 1.90/1.77/1.63) with the front arc still fully
inside the canvas below the 72px header at 1440, and re-searches the
bridging rows (test-results/wqa-flare-search2.cjs, not checked in) so the
column's own rim-adjacent pair matches each new bridging row within ~1%
tile height and well under 1px seam gap. The column's own row spacing
moves from 14 rows/spacingPower 1.3 to 9 rows/spacingPower 1.2 (near-
linear): 5-6 rows first closed the height gap but left visible scalloping
in the silhouette envelope at this run's much larger rim (a bigger
per-row radius jump than that guidance was tuned against); 9 rows keeps
the envelope smooth while still matching the bridging rows closely. The
bottom rim's own three constants are unchanged from the accepted option B
fix (comment 338); only its bridging row (1) needed re-matching to the
column's new spacing.
…ap seam inset by scan axis

Review 3 prep (orchestrator relay, comment after fix 2): rv3-fringe.cjs
read 33-89px of exposed black on the left/right edges at 1440 after the
flare route, against the ~2.7px seam-width bar.

Root cause 1 (buildColumnSilhouette): the black base was a per-scanline
min/max-x envelope pooled across ALL drawn column tiles. That is only
exact when the column's own cross-section is a single convex lobe at
every screen row; the flare's much larger per-row radius jump produces
enough foreshortened, overlapping-in-y tiles that the pooled envelope
bridged clean across real gaps between unrelated tiles/limb clusters,
exposing flat black where no tile was actually drawn (confirmed directly:
a pixel probe found exact (0,0,0) alpha 255 runs with zero variation,
never a shaded tile's own colour). Rebuilt as the TRUE union of every
drawn tile's own `rawPoly` quad: one path, all quads, filled once with
the canvas' default nonzero winding rule -- it can no longer overshoot a
tile or bridge a gap between two that do not touch.

Root cause 2 (insetQuadPx): even with an exact base, a fixed *perpendicular*
seam inset on a near-horizontal or near-vertical tile edge (the column's
own most-foreshortened limb tiles) moves that edge's intersection with a
FIXED scanline by `insetPx / |sin(edge angle from that axis)|` -- rv3-
fringe.cjs's own horizontal/vertical scan amplifies a sub-pixel inset into
a 28-89px run. Added a per-edge axis-scan cap (only engages within ~8.6
degrees of perfectly horizontal/vertical, so ordinary tilted edges keep
their full inset and F2's seam-visibility bar is not broadly weakened)
and a miter-limit/bevel fallback for the rare acute corner a straight
line-intersection can spike past its own edges' offsets.

Also fixes l92-column-opaque.cjs's (gitignored) mobile/stacked seam alpha
expectation: a seam pixel is never covered by a tile's own fill (that is
what makes it a seam), only by paintColumnLayer's ONE base gradient, so
its expected alpha is that gradient's value at the seam's own screen y
(replicated from paint.ts exactly), not a naive round(255 * that row's
own bandFade) -- the old formula was comparing against the wrong layer.
…are, flicker, surges, filament forks, sparks)

Amends hc-0-540's decision log ruling on the user's "I'd like to see more
action in the light animation": the live streak subset, orbit/twist/breathe
speed, per-streak flicker, a periodic sweeping surge, the filament's reseed
with a brief forking second thread, and a small pool of tangential sparks
are all raised together, tuned against real 30-frame motion-metric,
10-random-frame exposure and 300-frame budget measurements at 1440x900,
1024x900 and 375-wide (motion metric >=3x the starting commit's own
baseline at both required widths, frame budget under the 4ms avg/6ms p95
ceiling at 1440x900 and 1024x900, exposure within the pre-ticket band's own
margin at every required width). A single `energetic` flag, resolved once
from `matchMedia` at mount, switches the whole scene between this build and
a byte-for-byte reproduction of the starting commit's own formulas and
streak population (verified pixel-identical, header masked, at both
widths) -- so reduced motion keeps its exact pre-ticket still frame.
…ytic side-by-side right-limb

Planner comment 287 on hc-0-540, carried over from hc-0-wkf's own review
(comment 285): fallbackZoneRight's w<=1152 branch was dead (computeLayout
only ever calls it from the sideBySide branch, w>=1280); measureCopyRect's
silent `?? copyEl`/`?? bottomEl` substitutions were dead the same way, now
an explicit null return instead. Tried replacing the positional child
selection with a single data-hero-copy query (a Range over the block's own
contents); measured against the real DOM it moves zoneRight enough to fail
the header-masked reduced-motion parity gate at 1440 (403738 px), so kept
the positional selection -- recorded as NEEDS-PLANNER on the ticket.

Also exports analyticRingRightLimb from sceneLayout.ts: the side-by-side
right-limb containment criterion, computed from the ring's own torus
surface at the camera's base scale (the same basis index.tsx's own
ringWidthPx already uses) instead of a rendered-pixel probe that includes
the stray-streak population and bloom halo hc-0-wkf's own review found
sitting past w-16 by design, not as a regression.
…wire copy-block measurement to dedicated attributes

Review 1 majors: sparkRuns now stroke on the glow pass (glowCtx) exactly
like the filament's fork runs, so every luminous mote carries a soft
halo instead of a bare white dash; the radial fling that projects each
spark is capped at 1 + pp * 0.6 so it stays adjacent to the band.
SURGE_BOOST_GAIN raised to 0.5 (peak 1.5x, matching the docstring),
paired with a DESKTOP_ALPHA_TRIM trim to 1.25 so every 1440 exposure
sample stays under the 15% ceiling.

Planner-ruled housekeeping (comments 370/371, option b): FusionHero.tsx
now marks the teaser paragraph with data-hero-teaser and wraps the
button row with a data-hero-actions div (ButtonRow itself takes no
extra props, so the attribute lives on a plain wrapper instead); the
Tokamak copy-block measurement queries those attributes directly and
drops the positional p/lastElementChild selection and its NEEDS-PLANNER
comment. Reduced-motion parity re-verified pixel-identical (maxDelta 0)
against the starting commit at both required widths.
…h/coherent graph

Replace the spec terms 'source schema(s)' with 'subgraph(s)' and 'composite
schema' with 'coherent graph' (or 'the graph'/'one graph') across the Fusion
page's hero teaser, body sections, feature grid, and metadata description and
keyword, rewriting each sentence to read naturally with both substitutions.
Update the Mission Control visuals (FlightRecorder, SpecPatchbay,
PreflightChecklist, TelemetryStrip) and the hero LayeredDiagram's
COMPOSITE_LINE to say 'subgraph(s)' and 'coherent graph' instead of 'source
schema(s)' and 'composite schema', including the two-line COMPOSITE/SCHEMA
panel header in SpecPatchbay that a plain-text grep for the phrase misses.
… wall's row rhythm

Replaces the single, oversized bridging row at each junction
(SIDE_TOP_ROW17, SIDE_BOTTOM_ROW1 -- about 8x the neighbouring tile
height) with a buildBridgeRows() sequence that interpolates y, z and
radius from the frozen wall row to the rim along a smooth monotone
curve, continuing the hourglass flare into the ceiling and floor
instead of jumping in one step. This removes the plain, untextured
"buffer" the user reported between the room's ceiling grid and the
pillar's top rim, and the matching one at the bottom.

steps/powerYZ/powerR for each junction are the best candidate from a
joint grid search against the real projection (project()/ringPoint())
at 1280/1440/1920 (test-results/gar-bridge-search.cjs, not tracked):
the bottom junction clears the 1.3x consecutive-tile-height rhythm bar
with margin (worst ratio 1.13-1.17); the top junction's own frozen row
16 and rim sit on opposite sides of the wall's own y trend (row 16
keeps flaring outward while the rim sits back in near the column's
axis), so no row count or power pair found under this curve family
gets every step under 1.3x -- its worst step lands at 1.50-1.53 across
all three widths, still a >5x improvement over the single row's own
~8x jump.

Wall rows 2-16, the camera formula, the rim constants, the waist/collar
ring, the base construction and the painter are all unchanged (verified
byte-identical against the pre-fix layout at 1280/1440/1920). Mobile
and stacked keep their own band-sized hourglass construction unchanged:
their rims sit off canvas at standard viewport heights (verified via
capture at 375/768), so there is no bridging-row buffer to fix there.
…e junction fix can't shift it

buildInstrumentLights picked its candidate rows via rows.slice(2, rows.length - 2), so growing wallRows from 19 to 22 (the top/bottom bridge-row sequences) shifted which frozen wall rows the mulberry32 draw could land on, moving 3 of 6 lights outside the junction regions. TokamakLayout now carries an explicit wallLightRowRange ([2, 17) on side-by-side, matching base.slice(2, 17); unchanged [2, wallRows.length - 2] on mobile/stacked), so the candidate set is pinned to the wall's own frozen rhythm rows regardless of how many rows are spliced in at either end.
…te i)

Route (i), ratified by the planner: the wall's frozen row 16 -> bridge ->
rim sequence now also draws its near-facing half (a chamber.ts culling
exception, faceOverride: "near"), so the ceiling folds down in front of
the column's top the way reference-tokamak-pillar.png shows, instead of
projecting entirely behind the opaque column on the far arc. The mirrored
bottom junction gets the same exception, though its own near arc never
enters the canvas at any side-by-side width (option B, unchanged).

The near-facing tiles are their own small static layer (paint.ts's
paintBridgeLayer, an opaque black base plus the wall's tile face) stamped
over the column layer every frame (index.tsx), since they sit nearer the
camera than the column's own top/bottom rows.

Re-tuned the bridge row count/curve against the near arc specifically
(gar-bridge-near-search.cjs / gar-bridge-front-search.cjs, not the old
far-arc search): a first pass measured the ring-wide median height per row
pair and looked clean, but that hid a severe blow-up right at the column's
own centre line (row 16's near-side projection lands far off-screen, so a
single bridge row produced one tile spanning 600-900px there); re-measured
on the front arc specifically and landed on 21 inserted top rows so every
front-arc tile lands in the wall's own established size range. Also found
and fixed a matching seam defect: the near-facing exception's tiles sit at
the column's own front pole, where the wall's fractional seam inset (never
exercised there before) produced a 200px seam fringe along an
axis-grazing edge; it now reuses the column's own axis-capped pixel inset.

Rows 2-16, the painter, the rim constants, the camera, the waist/collar,
the base construction and the plasma are unchanged.
…at 375

Every SVG label in the Fusion page's Mission Control visuals (FlightRecorder,
PreflightChecklist, QueryTrack, SpecPatchbay, TelemetryStrip) rendered at
about 6px on a 375px viewport, because their 640-unit viewBoxes scale down to
about 333px there and the label font sizes scale with them, well under the
site's 11px floor.

Adds a viewport-aware label scale (mechanism a): useSvgLabelScale measures
each SVG's rendered-width / viewBox-width ratio, and svgLabelSize sets each
label's font size in viewBox units to max(base / scale, base) so the
rendered pixel size never drops below its TYPE token's value; at scale >= 1
(desktop, where a visual already renders at or above its native size) this
returns the base unchanged, so 1440 stays pixel-identical. A companion
svgLabelWidth pins each boosted label's rendered width back to its
unboosted footprint via textLength/lengthAdjust, and svgLabelGap widens the
gap between two stacked lines only by however far they grew, so growing the
font does not overlap, clip or wrap adjacent labels; a few rows (SpecPatchbay's
seven-channel strip, PreflightChecklist's roster) that had no headroom for a
full proportional boost cap growth at the same absolute 11px floor as any
other label instead.

useSvgLabelScale only boosts once the viewport itself has narrowed past a
1024px breakpoint, so a panel whose desktop layout already renders it
narrower than its own viewBox (TelemetryStrip's sidebar slot) never has its
desktop render nudged by this mechanism.

The LayeredDiagram hero measured already compliant (plain HTML text, no
viewBox scaling) and needed no change.

Verification: a Playwright label walk of every <text> across all five
visuals plus the diagram confirms 11px minimum at 375 (160 labels, smallest
five now MOBILE, ONE QUERY, ONE ENDPOINT · QUERY PLAN, product.name and
→ CATALOG, all exactly 11px, versus about 5.2-6px before); an overlap/clip
walk finds zero intersecting label boxes and zero labels outside their SVG
at 375 across all five visuals; pixel diffs of all six panels' 1440
captures against their pre-edit references report maxDelta 0 and overCount
0; tsc --noEmit, eslint on visuals/ and hero/, and yarn format:check all
pass clean; /products/fusion still answers 200.
…io override

Review 1 on hc-0-bri found the 11px label floor was met by pinning every
boosted label back to its pre-fix rendered width with textLength +
lengthAdjust="spacingAndGlyphs", condensing glyphs to 0.29-0.48em per
character against the mono face's natural ~0.6em and leaving legibility
unimproved. tokens.ts drops svgLabelWidth and MONO_ADVANCE (svgLabelSize
and svgLabelGap are still used); the mobile re-flow that replaces the
pinning needs a visual to grow its own Scene stage taller than the
desktop ratio below 1024px. Scene.tsx adds a SceneRatioContext and a
useSceneRatio(override) hook a child can call to replace the stage's
aspect-ratio at runtime; a null override (every caller today) leaves
Scene rendering exactly as before, so FusionPage.tsx stays untouched and
the 1440 render stays byte-identical.
…lumn

Below 1024px each of the five Mission Control visuals (PreflightChecklist,
FlightRecorder, QueryTrack, SpecPatchbay, TelemetryStrip) now renders a
second, mobile-only layout instead of squeezing the desktop layout's
textLength-pinned labels into a narrower box: a single-column viewBox
sized to this panel's own measured rendered width at 375px (333 units for
the four 640-viewBox visuals, 267 for TelemetryStrip's narrower aside),
driven by a Scene ratio override so the stage grows to fit. Every label
renders at its natural glyph advance (no textLength/lengthAdjust anywhere
in these five files now), and rows that don't fit their old two-column
positions re-flow: PreflightChecklist's roster stacks above the checklist,
FlightRecorder's deck rows grow to as many lines as their client/operation/
detail text need, QueryTrack's stations stack below the gateway, and
SpecPatchbay's channel strip stacks above the bus. TelemetryStrip's five
columns per row become three stacked lines (label+latency, meta+errors,
bar).

Five strings are wider than the mobile viewBox even at 0 letter-spacing
(confirmed by the review-1 verifier's own measurements) and don't fit on
one line no matter how they're re-flowed: PreflightChecklist's and
FlightRecorder's " · "-joined footer banners, FlightRecorder's deck header
and header composition line, and TelemetryStrip's footer caption. These
now split into stacked <tspan> lines at their " · " separators (each line
keeping its leading separator, so the lines' concatenated textContent is
the original string again, byte for byte) — the planner-ratified
resolution for hc-0-bri's NEEDS-PLANNER question on comment 402.
FlightRecorder's deck header needed a second, word-boundary split beyond
that single " · " (comment 402 anticipated only one split point); the same
byte-preserving technique also covers PreflightChecklist's conflict
caption ("Product.price: Float (Catalog) vs String (Billing)", also over
width and also not one of the five banner strings the ratification named)
and the dynamic replay operation/detail text in FlightRecorder's deck rows,
which is wrapped by a small word-boundary helper for the same reason:
recorded as NEEDS-PLANNER: does the "5 banner strings ... at their ' · '
separators" ratification cover a sixth over-width caption and dynamic
per-row content the same way, or only the five named strings? | chose the
same byte-preserving stacked-tspan technique for all of them, since the
alternative is a label rendering below 11px or clipped, both worse under
Rule D.

1440 renders pixel-identical to the pre-edit references (maxDelta 0,
overCount 0 on all six panels including LayeredDiagram, which needed no
change — it's plain HTML text, not SVG-viewBox-scaled, and was already
compliant per the review-1 implementer's report).
…geometry

The mobile branch drew the gateway latency trace with the desktop path
(TRACE_D, generated from the 560-unit TRACE geometry) while its panel rect
used MOBILE_TRACE, so at 375 the trace spanned x 16..544 inside a 267-unit
viewBox and sat more than half outside its panel. Extracted tracePoints/
tracePath(trace) helpers that build the same sawtooth shape from any
{x, y, w, h}; the desktop branch keeps TRACE_D = tracePath(TRACE), byte-
identical to before (1440 diff confirms maxDelta 0 on all six panels), and
the mobile branch now draws MOBILE_TRACE_D = tracePath(MOBILE_TRACE), which
fits inside its panel.
…y width

TelemetryStrip's own aside slot renders narrower than its viewBox at every
desktop width from 1024 to 1920, not just below 1024 — useSvgLabelScale
was clamping that render ratio back to 1 at desktop widths so it would
never trigger the mobile re-flow, which incidentally suppressed the label
boost too, leaving labels as small as ~6.5px at 1024 and ~9.4px at 1440.

useSvgLabelScale now always reports the SVG's true rendered-width /
viewBox-width ratio; a new useNarrowViewport hook takes over deciding when
a visual switches to its narrower mobile layout, so that switch stays keyed
to the viewport alone. TelemetryStrip's own desktop row layout widens its
label/meta column gap in proportion to the boost, and re-flows to a
two-line row (still its own W-wide viewBox, not the mobile layout) once a
boost that large no longer fits a single line; its footer wraps the same
way. At 1440 the fix is pixel-identical everywhere except the now-legible
label text itself.
…ed floor

The same every-width label boost (previous commit) also applies at desktop
widths for the Fusion page's other console visuals whenever their own
FeatureRow slot renders narrower than their design width — true from 1024
up to roughly 1280 for PreflightChecklist and QueryTrack, briefly widening
labels enough to collide with fixed-width neighbours:

- PreflightChecklist: the roster's "SUBGRAPH · LANGUAGE" / "RUNTIME PLUGIN"
  header no longer fits side by side once boosted, so it stacks instead;
  the roster box widens into the roster/list gap so a boosted row's meta
  line still clears it; the conflict caption and footer banner wrap onto
  several lines the same way their mobile layout already does, growing the
  panel's own height to hold them.
- QueryTrack: a station card's "PARTIAL RESULT RETURNED" status line wraps
  onto two lines once boosted, instead of running past the SVG's own right
  edge (a real clip, not just past its decorative card).

Both re-flows are gated on the same narrow-slot condition the boost itself
uses, so nothing changes at 1280 and up (1440 stays pixel-identical).
…mpty band

Housekeeping carried over from hc-0-bri's review: TelemetryStrip,
PreflightChecklist and FlightRecorder each defined their own copy of the
same ` · `-separator line-splitter; FlightRecorder's deck header also
reimplemented wrapWords inline instead of calling the helper it already
uses for its replay rows. Both now live once, in a new visuals/lines.ts
(not tokens.ts, which holds design values, not string helpers).

SpecPatchbay's mobile bus panel also reused the desktop BUS.h (400) for a
column that, stacked below the channel strip instead of beside it, only
needs about 300 units for its own content — leaving an empty band of about
120px above its "COMPOSED IN THE BUILD" footer at 375. Its height now fits
that content; 375 labels and containment are unaffected (only downstream
page flow shifts up), and desktop is untouched since it still uses BUS,
not BUS_M.

FlightRecorder also picks up the useNarrowViewport swap from the first
commit here, since it needed no other change for the label floor itself
at any width.
…d to the labels it missed

Review 1 found that the boosted desktop label size (any scale < 1, not
just a specific width band) pushed six labels out of their own panel
rects at 1024 and worsened a pre-existing QueryTrack overflow at 1180:

- QueryTrack: `crowded` now engages at any boost (`scale < 1`, not just
  `< 0.9`), so it reliably wraps at 1180 too. The GATE card's "ONE
  ENDPOINT · QUERY PLAN" subtitle and each station card's
  "<language> · <spec>" line now wrap onto two lines via `dotLines` once
  crowded, same as the status line already did; the three plan rows (and
  only those — LATENCY keeps its fixed slot near the card's bottom) shift
  down by the subtitle's own wrap gap, and each station card's rect grows
  by its spec line's extra line.
- SpecPatchbay: gained the same `crowded` gate other visuals already had.
  Its footer caption ("COMPOSED IN THE BUILD" / "NO CUTOVER NEEDED") wraps
  via `wrapWords` once crowded, growing upward from the bus rect's fixed
  footer baseline so the last line never runs past it.
- FlightRecorder: gained a `crowded` gate for its 55-character deck header,
  which wraps via `dotLines` past roughly scale 0.9 (1024 renders at
  ~0.801). The replay rows, the deck's own height and the footer banner
  all shift down by that one wrapped line's gap, and the viewBox itself
  grows (via `useSceneRatio`, the same mechanism PreflightChecklist uses)
  to still hold it.

Re-run at all eight widths: under11 = 0, underAdv (advance < 0.55em) = 0
and outOfPanel is now empty at 1024 and 1180, leaving only the three
pre-existing "PARTIAL RESULT RETURNED" margins at 1280/1368/1440/1920
(-11.51/-12.56/-12.6/-12.6, unchanged from before this fix) — a residual
soft overflow past a small decorative card, out of this fix's scope.
375 stays byte-identical to hc-0-bri's own walk and bounds output.
1440 stays pixel-identical (maxDelta = 0) for all five of these visuals;
TelemetryStrip's own label-floor change from an earlier commit is
untouched here.
…ds its card

Extend the station card's "PARTIAL RESULT RETURNED" / "SUBGRAPH STANDING
BY" status line wrap past the crowded (boosted) gate: it now also wraps
via wrapWords whenever the line's estimated width (char count times the
mono face's measured natural advance plus its own letter-spacing) exceeds
the card's own available room, independent of the crowded boost. This
closes the residual overflow at 1280/1368/1440/1920 (previously
-11.51/-12.56/-12.6/-12.6 viewBox units) left after the crowded gate fix,
while 1024/1180 (already wrapped via crowded) and 375/768 (mobile layout,
untouched) are unaffected. The station card's existing height formula
already grows by the extra line, so no other geometry changed.
hc-0-b8z checkpoint 1. The top junction's rim (y/z/r) now mirrors the
bottom's accepted SIDE_BOTTOM_RIM_* constants exactly about the band's
y=0, replacing the withdrawn flared-dome top rim and the asymmetric
SIDE_TOP_RIM_* constants (planner comment 426 supersedes the earlier
top-rim-inside-canvas ruling). The top rim's front arc now runs above
the canvas the same way the bottom rim's runs below it, so no dome,
cap or ledge shows inside the canvas at the top at any side-by-side
width.

The top bridging sequence keeps the bottom's own buildBridgeRows
construction (interpolated from the rim toward frozen wall row 16,
then reversed into wall-to-rim order, mirroring bottom's rim-to-row2
construction exactly) but is NOT given the bottom's own step count:
frozen wall row 16 has near-facing tiles at wide theta that intrude
close to the canvas top edge regardless of the bridge's other
endpoint (verified directly against a bare (row15,row16) pair, with
no bridge/rim involved at all), unlike row 2's own near side, which
is never in frame. Re-ran hc-0-gar's own front-arc search methodology
against the new rim and landed on 8 steps (powerYZ=powerR=1.1): front-
arc tile heights stay under 300px with every consecutive ratio inside
[0.77, 1.3] (worst 1.09-1.23 across 1280/1440/1920), avoiding the
single oversized 'buffer' tile a literal 2-step mirror would put at
the visible corner.
hc-0-b8z checkpoint 2. The stacked mode's bandCenterY was weighted to
0.58 of the band area's height (a bias toward artTop for the rendered
ring's own bloom extent); this ticket's centre requirement measures
the band's projected centre directly against the band area's middle,
which the 0.58 weighting missed by 8% of the band height. Moved to
the exact midpoint (0.5), matching mobile's own construction, which
was already exact. Side-by-side and mobile were already exactly
centred by construction (project(torus centre) lands on originY,
which is h*0.5 and artTop+(h-artTop)/2 respectively) -- unaffected.

Re-verified the ring's own containment/exposure targets (rvv-ring.cjs,
rvw2-exposure.cjs) and the copy-clear zone (wkf-zone.cjs) are
unaffected by the shift.
…rofile

hc-0-b8z correction (F1/F2/F3): the checkpoint-1 fix world-mirrored the
top rim's y/z/r, but the camera's tilt makes a world-mirrored point
project asymmetrically -- the column-only half-width sweep came out
15-63% off at the canvas edge instead of within the 5% bar. Replaces
SIDE_TOP_RIM_Y/Z/R with a bounded search result (Y=227, Z=11, R=174)
that matches the top limb's PROJECTED profile to the bottom's, and
re-tunes SIDE_TOP_BRIDGE_STEPS/POWER_YZ/POWER_R (5, 0.9, 0.9) against
the new rim's front-arc rhythm. Bottom constants, waist, rows/side and
spacingPower are untouched.
hc-0-b8z correction (F3): the checkpoint-1 bridge retune (steps=5) was
measured against a per-pair nearest-visible-segment method that diverges
from rv2g-rhythm.cjs's own fixed-segment convention -- the ticket's
actual rhythm gate -- just enough to miss [0.77, 1.3] (worst 1.30-1.40)
at the new rim. Re-tunes SIDE_TOP_BRIDGE_STEPS/POWER_YZ/POWER_R
(4, 0.82, 0.82) directly against rv2g-rhythm's method: worst ratio 1.14,
max front-arc tile height 283.6px, both with margin.
@rstaib
rstaib marked this pull request as ready for review October 26, 2026 21:44
@rstaib
rstaib merged commit f54edcf into main Oct 27, 2026
156 of 157 checks passed
@rstaib
rstaib deleted the rst/graphql-federation-page branch October 27, 2026 09:19
This was referenced Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📚 documentation This issue is about working on our documentation. 🧰 maintenance 🌶️ website

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant