01Single nav surface
Past a shared scroll threshold the header retracts and a vertical rail slides in from the left, both reading one exported constant so the two can never both be on screen. I reserve only a 76px gutter through a --rail-offset variable on the body; the rail is 56px collapsed and expands to 260px over the page rather than reflowing it under the cursor. A 180 ms cancellable close timer keeps the services sub-panel alive while the pointer crosses the 12px gap to reach it.
02Services as config
config/services.ts is my source of truth for 13 services in three categories, each entry carrying its slug, accent colour, primary keyword, supporting keywords and a 60-character meta title. Tier hub pages, the homepage pillar grids, the case-study filter chips, sitemap.ts and every generateMetadata read from it; the header mega-menu and side rail read a parallel nav list in config/site.ts that mirrors the same slugs by hand. Reordering the reverse-engineering cards on the homepage cost me four order values rather than a template edit.
03Documents as changelog
Four rounds of client feedback arrived as one PDF and three Word files with annotated screenshots. Three of them became a single commit carrying the document's item numbers in the message; the first round fanned out across four commits. The history reads back to the source document, which is what made the last round cheap.
04Confidentiality as constraint
When the client decided team presence could not be shown for sensitive engagements, I stripped every portrait band, lead chip, team grid and headcount line across 17 files in one commit and reflowed the sections that had been built around them. No engineer had ever been named — I used initials and role aliases from the start. I rewrote a hard CVE count to "multiple publicly documented CVEs — details available after NDA".
05Rules for the agent
I wrote CLAUDE.md and five guides in .ai/ defining where each kind of change belongs: a decision tree routing copy edits to MDX or config and explicitly forbidding component edits for copy, a forbidden-dependency list (no CSS-in-JS, no Redux, no alternative UI kits), and a performance budget with hard limits. It is why months of copy-driven change rounds never turned into JSX churn.