Skip to content

overhaul: cutover pre-flight, parity records, legacy removal - #28

Merged
CS-5 merged 15 commits into
overhaul/10b-carson-fixesfrom
overhaul/11-cutover
Sep 26, 2026
Merged

CS-5 merged 15 commits into
overhaul/10b-carson-fixesfrom
overhaul/11-cutover

Conversation

@CS-5

@CS-5 CS-5 commented Sep 6, 2026

Copy link
Copy Markdown
Member

Phase 11 of the stacked overhaul (plan/11-cutover.md), stacked on #27 per D23. This is the top of the stack: merging it cascades every layer below into staging.

What this does

Phase 11 is mostly dashboards and a deployed URL. This PR is the half a repository can do, so that what remains for the owner is a checklist rather than an investigation.

Parity pass, by hand, recorded in plan/11-cutover.md § As built. Every URL the Next.js site served was requested against the production preview of this build: all thirteen answer 200, an unknown path gets the branded 404.html, and _redirects and _headers both reach dist/ (Pages reads them from there). Every on-site redirect target is a built page, and no redirect source collides with built output. Visible copy was diffed per route against the legacy TSX and compiled into one table.

Three copy differences no earlier phase logged, now in plan/todo.md for a keep-or-revert decision:

  • The homepage hero reads "Robots are in Franklin County. So are we."; legacy read "Robots are cool. So are we." (introduced in the Phase 06 commit, unrecorded).
  • The Programs panel lost legacy's two program taglines ("A Hands-On Approach to STEM Learning", "Combining the excitement of sport with the rigors of science and technology").
  • The footer lost its sponsor logos and "Special thanks to our sponsors for powering our mission."

Also flagged: /programs/fll is the one page whose copy is new rather than ported, because legacy had only an under-construction placeholder there. Everything else on the list was logged in the phase that made it.

legacy/ is deleted (second commit, separable), with every exclusion that guarded it: tsconfig.json, knip.jsonc, .prettierignore, .vscode/settings.json, the ESLint global ignore and no-restricted-imports pattern, the @source not line in global.css, and the AGENTS.md row. The plan's §5 sequences this after launch; D11 says "deleted at cutover", the stack lands as one cascade, and git history keeps the old site, so it is here. If you would rather hold it until after the staging soak, drop the second commit.

Dependency audit: the lockfile carries no React, HeroUI, framer-motion, embla, Biome, or Next. The only name match is css-to-react-native, a transitive dependency of satori. knip is green without the legacy/** ignore.

README rewritten for the Astro site: what it is, mise install && pnpm install, where to read next, the Pages deploy model.

Not done here, and why

  • No automated route or redirect check in CI, by the owner's decision during this session; the parity pass is a recorded table instead.
  • Lighthouse was not re-run locally; nothing under src/pages/ or src/components/ changed, and the CI job runs it on this PR.
  • The redirect rules' live behaviour, the Pages build settings, the staging soak, launch, and the post-launch watch all need a deployment or a dashboard. plan/todo.md § Cutover lists each with what is already in the repository waiting for it.

Seen in passing

Astro preserves <!-- --> comments from component templates in the built HTML: eleven ship on the homepage from Navbar, Hero, and friends. Developer notes, a few hundred bytes per page. Noted in plan/11 as a follow-up, not changed here.

Verification

pnpm check (typecheck, lint, format, knip) and pnpm build green on the final commit; check:meta verifies all 16 pages. Built under Node 22 in this environment; CI runs the mise pin.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Vaq66ucygSHc84MJXz1cac


Generated by Claude Code

@CS-5
CS-5 force-pushed the overhaul/11-cutover branch 2 times, most recently from e76b0b3 to b35d431 Compare September 7, 2026 00:58
Phase 11's repository half. Every legacy URL requested against the
production preview and tabulated in plan/11, with the _redirects rules
checked as far as a build can (every on-site target is a built page, no
source collides with built output). Visible copy diffed per route against
the legacy TSX and compiled into one summary, including three differences
no earlier phase logged: the hero heading, the Programs panel taglines,
and the footer's sponsor block. README rewritten for the Astro site, and
plan/todo.md gains the cutover steps only an owner can take.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vaq66ucygSHc84MJXz1cac
The Next.js site has served its purpose as the parity reference; git
history keeps it. With the directory go the legacy entries in tsconfig,
knip, Prettier's ignore, the VS Code search exclude, ESLint's global
ignore and the import ban, the @source exclusion in global.css, and the
architecture row in AGENTS.md. The dependency tree carries no React,
HeroUI, framer-motion, embla, Biome, or Next.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vaq66ucygSHc84MJXz1cac
@CS-5
CS-5 force-pushed the overhaul/11-cutover branch from b35d431 to 5fbad8e Compare September 7, 2026 00:58
…mers

/_astro/* gets a year-long immutable Cache-Control (mirrored in the
Lighthouse server); ics.ts keeps one Intl.DateTimeFormat per zone and
holds EXDATEs in a Set; the countdown stops ticking once passed; the
navbar reads its breakpoint from a build-time data attribute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
- site.ts: frc.teamNumber, location.street/postalCode, named nav routes
  (programs, robots, contact, about); pages, llms.txt, og-cards and the
  donate address read them instead of retyping.
- programPhotos.ts holds each program's photo and alt; ProgramCard wraps
  FeatureCard for the home and programs pages; RobotFigure is the robot
  photo with its corner logo, and the FRC page takes its feature from the
  frcRobots collection.
- Hero renders a compact text-only header and has a logo slot; the
  calendar and 404 pages use it. Section takes srTitle for a hidden
  heading. programTrail() builds program breadcrumbs.
- Unused props removed: Seo ogType/canonical, Section and CtaBanner
  headingLevel, Callout side. SeoProps lives in lib/seo.ts.
- ambient-pool-neutral sets only --pool-tint; prose-copy and title-rule
  apply measure and accent-rule.
- functions: one res() helper; the calendar page imports the response
  types. isExternal lives in lib/links.ts. verify-meta folds its title and
  description checks; the Lighthouse server caches response bodies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
- ics: all-day DATE values resolve to midnight in the site's zone, so
  they group under their own day and stay upcoming through it; cancelled
  RECURRENCE-ID overrides still suppress their series instance; WEEKLY
  steps from WKST (default MO); text unescaping is one pass.
- calendar page: day headings carry the local date in datetime; the
  Google embed link uses the decoded calendar address.
- form submit: a malformed body is a 400; missing secrets and a failed
  Slack post are errors instead of "received"; Turnstile no longer falls
  back to the always-pass test secret. docs/tooling.md covers .dev.vars.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
@CS-5
CS-5 added this pull request to stack #20 September 24, 2026 20:39
claude and others added 10 commits September 24, 2026 21:13
- Eyebrows take primary-bright (fill-vs-text law); one carrying a
  numeral takes the spec-label voice.
- The closing tagline keeps each "Real X." pair together, stacks below
  sm, and the chalk ovals clear their neighbours.
- Section padding is never doubled: the footer drops mt-24 and adjacent
  sections on one ground share a padding.
- FIRST® stands upright in Orbitron headings, its ® drawn by Inter
  through the display stack.
- Only standalone dates take the mono voice; the donate form and its
  card title rules align.
- Meta-refresh stub pages (openhouse, kickoff) also emit a 301 in
  _redirects.
- DESIGN.md §1, §3, §4 record the rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
…wipes

- FRC hero h1 is two lines; the rest of the sentence leads the subhead.
- Donate's hero carries the PayPal button; Sponsors' hero carries
  "Become a sponsor".
- SponsorTier picks its column count from the sponsor count, and a lone
  sponsor takes SponsorCard's full-width feature layout.
- Highlight swipes run 35% at display sizes and 25% at body size; the
  styleguide build check measures each against its floor.
- DESIGN.md §2.13 and §5 record the rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
Depth drawn rather than rendered: cut into metal, laid on the table.

- band (was tint): #121212 drafting table with a primary top edge, the
  brand edge vignette and a feathered two-weight grid; pockets on it
  become raised plates. A build step fails any page where two bands
  touch, footer included.
- Buttons are keycaps: a hard 3px offset that lifts on hover and
  presses flat; the outline keycap's edge meets 3:1. Reduced motion
  keeps the face still.
- Pockets cut deeper with a visible hover; framed media takes a 6px
  drafted edge; photo heroes carry the grid on their copy side.
- Header (md+) and footer use the brand's Light lockup; mobile keeps
  the colour mark.
- The styleguide shows the surfaces and states, and its contrast check
  covers band, plate, grid crossings and control edges.
- DESIGN.md §2, §2.3, §2.4, §4–§8 and §10 record the rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
The panel is a popover in the top layer, where `absolute top-full`
resolves against the viewport, so it opened just below the bottom of
the screen. CSS anchor positioning places it under the nav item, with
a toggle-time fallback where anchors are unsupported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
The grain tile's gamma goes 4 → 5 and its alpha 0.4 → 1: the spread
rises from ~4 to ~6 levels while the mean lift moves only ~5 → ~8, so
the sheet reads as textured without lightening. DESIGN.md §2 records
the new figures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
The staging rule matched one host by name, so any other preview
subdomain (astro.scstem.org) was indexable. https://*.scstem.org/*
covers them all; the apex, production, does not match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
Tighter heroes, intros and CTAs across home, programs, FLL, FRC, about,
sponsors, donate, get-involved, contact, calendar, 404, the events and
the FAQ. Each pitch now lives on one page instead of being copied
between several. Facts corrected: two programs, founded 2012, no drone
teams or maker spaces, kickoff from noon. Grammar and typo fixes along
the way ("premier", "partner with", "teamwork", "begins", en dashes).
The robots page is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RFeYttZCfuyKpR2hJqLfK4
@CS-5
CS-5 removed this pull request from stack #20 September 26, 2026 22:07
@CS-5
CS-5 added this pull request to stack #29 September 26, 2026 22:08
@CS-5
CS-5 merged commit 8f72231 into astro Sep 26, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants