Repository navigation
Rebuild the site: complexity-science reframe, linear pages, Join and Projects - #1
Merged
Merged
Conversation
Information-architecture and content diet, plus the two recruiting surfaces
the site did not have. Style (fonts, cream/burgundy, logo) unchanged.
Recruiting surfaces (new):
- roles.json drives a three-rung ladder — Contributor, Research Collaborator,
Research Affiliate — stating what each rung actually gives. Research roles
only; no unpaid ops, comms or board seats.
- 14 hour-sized entry tasks, each traced to a real gap in projects.json and
listed at the size the project notes themselves use ("a weekend", "an
afternoon", "one inference run", "fifteen minutes"). People say yes to a
weekend and no to an open-ended collaboration.
- A "what the lab does not offer" section, stated plainly. There is no money
and the page says so first.
- advisors.json plus generateAdvisorySection(), which returns '' while the
array is empty — nothing about advisors publishes until a real name with
written consent is added. Outreach templates and the affiliate confirmation
letter live in templates/, unpublished.
Diet:
- collaborate.html (4,022 words) split into join.html and projects.html; the
dossiers keep their length because the unflattering detail is the argument.
- manifesto, charter, reading, press, subscribe deleted, not merely
redirected — keeping the files alongside the 301s left it ambiguous which
the host served, and the sitemap advertised them for three weeks. Charter
content is now About > Commitments. Root pages 17 -> 10.
- Dead css/dissensus.css (52 KB, referenced by nothing) removed; CSS 108K -> 64K.
- About 8 sections -> 5; #services and #partners anchors kept live.
- Homepage: metrics band removed (it recounted the hero's 20 papers three
screens later), and the proposal form removed — it posted to the same
Formspree endpoint as the Join form with a different field set, so one inbox
received two incompatible intake schemas.
- #net hero canvas removed: ~1,770 pairwise distance calculations per frame,
forever, on or off screen. Its `content: none` override went with it so the
shared hero glow returns, and the hero is two columns with the stats panel
filling the space the canvas vacated. #optima stays, retuned from the
dark-mode pink to true burgundy, and now pauses when scrolled out of view.
Single theme:
- Dark path deleted from all three stylesheets and from theme.js; no
[data-theme] selector remains. theme.js is kept because it sets html.js,
which gates the reveal-on-scroll hiding rule (b21d046), and hosts toggleNav().
- One nav brand mark instead of a wine/white pair — one fewer image request
on every page.
Updates surface:
- news.html gains a dated "Where things stand" block: publications, latest
accept, venues under review, what is running, what is open. Nav and the
homepage band read Updates; the published /news/* URLs are unchanged.
Fixes found on the way:
- .section > .container > h2 never matched the generated pages, which write
<section class="section container"> as one element, so every h2 on join,
projects, tools and research sat flush against its next paragraph.
- .hero--editorial: --fs-hero tops out at 4.25rem, which read as a product
splash on a three-line headline.
- Sitemap no longer lists redirecting URLs. 404 stopped offering the manifesto
and reading list.
Verified in headless Chromium across seven pages: no JS errors, every
[data-reveal] element resolves visible after scroll, and no horizontal scroll
at 390px.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
dissensus-ai | 62647be | Commit Preview URL Branch Preview URL |
Aug 11 2026, 10:21 PM |
The Affiliate tier promises a dissensus.ai alias; MF confirms it is available, so the line stays and the alias gets created when the first Affiliate is appointed rather than up front. Also records plainly that this branch is built to a Cloudflare preview only — production deploys from master, so dissensus.ai serves the pre-diet site until PR #1 merges. Worth writing down: the preview URL renders the full new site, which makes it easy to believe it has shipped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
Two review notes from MF on the shipped homepage. The credibility strip and the publications ribbon were the same content twice. The ribbon's ten chips restated the strip's four arXiv IDs, its Digital Finance accept and its four under-review venues, as an auto-scrolling marquee running a requestAnimationFrame loop for the life of the page. The ribbon is gone — markup, CSS and JS — and the strip drops from three rows to two by folding Accepted and Under review into one peer-review line. "02 · The problem" is off the homepage. A lab front page that opens by arguing game theory is insufficient is presenting a thesis rather than introducing an organisation. The friction equation moves to research.html > Notation, directly above the cards that define its symbols, and the three alpha/sigma/epsilon cards are simply dropped: that section already defined F, alpha, sigma, epsilon, Lambda and Psi in more detail, so the homepage copies were the redundant ones. Nothing is lost. The homepage keeps a single plain sentence of the thesis and links to Research for the formalism. The equation's CSS moved from index.css, where it was scoped .home, to site.css unscoped — research.html loads only system.css and site.css, so left in place it would have rendered as unstyled mono text. In the space that freed: - "02 · The lab" — Murad, Andrew and Felipe as a compact three-up linking to About. A lab front page that shows nobody reads as a solo blog. New .crew component rather than site.css's .person, which carries an 88px avatar and biography prose that belong on About. - Three featured open tasks inside Contribute, generated by syncHomeTasks() from roles.json entryTasks where featured:true, between OPEN-TASKS markers. The effort figure leads each card, same argument as the join.html task rows. Generating it means the front page cannot drift from Join — the previous homepage advertised three research directions that appeared nowhere else. Homepage sections are now 01 Who we are, 02 The lab, 03 Contribute, 04 Elsewhere. Verified in headless Chromium: no JS errors, no [data-reveal] element left invisible after scroll, no horizontal scroll at 390px, and the relocated equation picks up burgundy vars, its 1.5px rule and IBM Plex Mono on research.html. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
…ing the lab Second review pass. Everything here is a cut except the two new channels. Social: - x.com/dissensusAI and discord.gg/5VtRcb45N7 in the footer and the homepage Elsewhere row. One SOCIALS list drives both, and the homepage row is written between SOCIAL markers — the X anchor had been sitting commented out in index.html waiting for a handle to exist. X added to the Organization JSON-LD sameAs. Discord is the second CTA on Join. Research page: - Notation section removed. The equation does no work on a publication archive, and the six symbol cards existed to gloss it; the papers carry the formalism. Its "Cite framework" button called a copyBibTeX() that was only ever defined on paper pages, so it had been dead on click. - Lineage and Timeline removed. - Tools folded in as section 03 and out of the nav: generateToolsPage() became generateToolsSection(), injected between TOOLS markers by updateResearchPage(). tools.html, toolsNavHtml() and toolsFooterHtml() are gone, /tools 301s to /research#tools, and the two prose links to it — About's services paragraph and the news status block — now point at the anchor. - Sections are now 01 The agenda, 02 Archive, 03 Tools. Homepage: - The at-a-glance panel (focus / publications / latest accept / status) is gone. The accept sits in the updates band immediately below it and the paper count is on Research, so it was a third restatement. The hero is a single column again and the two-column grid CSS went with it. Join: - Reframed. It led on "No money." — true, but a deficit-first pitch for a lab whose actual selling point is that nothing is settled yet. It now opens on that: two researchers, twenty papers, six open problems, a company incorporated this July, and genuine influence over what the lab works on and how it decides a result is finished. H1 is "A new lab, still deciding what it is." The money facts are unchanged but sit under "The limits", framed as a funding constraint carrying first refusal rather than as policy. The homepage Contribute paragraph was rewritten to match. Also deleted the friction-equation CSS added to site.css earlier today: with the equation gone from every page it was dead within the hour. Verified in headless Chromium at 1280 / 768 / 390px across home, research, join, projects, about and news: no JS errors, no horizontal scroll at any width, and every [data-reveal] element resolves visible under reader-paced scrolling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
Third review pass. Naming and framing: - Adversarial Systems & Complex Adaptive Dynamics Research. The homepage now opens on complex adaptive systems — many interacting agents, no central controller, aggregate behaviour no part intends — with the friction thesis as the specific question rather than the whole pitch. - The dissensus definition moved into the hero as the first thing under the title, since it explains the name the reader just read. Its standalone section three screens down is gone. - Credibility strip removed: it restated the archive a third time, directly under the updates band that already carried the accept. Channels: - X, Discord and Patreon. Patreon appears as "back it directly" on the funding route and "Support the research" in the footer base — deliberately not as an icon among identity channels, where a payment link reads as a CTA. systems.ac parked: - No outbound links anywhere, dropped from the Organization sameAs, and About's programme card rewritten to describe one programme without the acronym or the link. The surviving mentions are a code comment and the dated incorporation post, where ASCRI is historical record. Research page: - papers.json gained a `stage` field — current focus, accepted, in peer review, preprints, preliminary drafts, discontinued lines — and the page is one linear list grouped by it. The five-category card grid is gone: on an archive the useful axis is how finished a thing is, and twenty equal-weight cards read as twenty products. - Tools render beside the paper they came out of, via the `relatedPapers` field that already existed in tools.json (a `papers` field added earlier in this pass was pure duplication and was removed). A tool linked to two papers now renders once rather than once per paper. - Status changes as instructed: ASRI preprint -> in peer review, Extremity Premium under review -> preprint. Both had their `journal` cleared so a preprint cannot advertise a venue; the accepted paper keeps naming Digital Finance. - Research is the record of what is finished, stalled or abandoned; Projects is what is open. Where a paper is both, Research carries a one-line "Open to collaborators" pointer instead of repeating the dossier. - The publications block is now marker-delimited. It had been anchored to the literal <h2>Publications</h2> and silently skipped the entire list the moment the page was retitled — which is exactly what happened. Linear layouts: - Projects and Join replaced their two-column card grids with .projrow and .rung rows. A dossier is a document and a ladder is a sequence. - About's five commitments each lead with the promise and end with "Breaking it looks like:" — a concrete, observable failure mode. Density: - The container was pinned at 1080px, so a full-screen desktop squeezed everything into the middle third with the footer worst hit. It opens to 1160px at 1280 and 1280px at 1600, section rhythm and body size stepping up with it. Prose stays readable because --measure caps it independently. - Footer rebuilt as three columns plus a base row, replacing two flex blocks with inline styles that collided into a cramped strip at full width. - The homepage Elsewhere section went: with a proper footer social row the page was printing the same five icons twice within one screen. Dead CSS swept: .grid--wide (unused once tools.html retired and both pages went linear), the credibility strip, and the standalone .home .etym. Verified in headless Chromium at 1920 / 1280 / 768 / 390px across all six pages: no JS errors, no horizontal scroll at any width, and every [data-reveal] element resolves visible under reader-paced scrolling. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
… space
The three remaining boxed grids were one shared bug. `.stats` was
`repeat(auto-fit, minmax(180px, 1fr))` drawn as a 1px-gap-over-background trick,
which has two failure modes past four items: 180px tracks break sentences into
two-word columns, and any leftover track paints the container's line colour as a
grey block beside the last cell. That is what the five-item commitments list and
the six-item news status block were doing.
All three now use a .deflist of rows: a key column, a body column capped at the
measure, hairline separators, no boxes and no empty tracks to leak. A --tight
variant gives numeric keys a 3.25rem gutter instead of the 13rem text-key column,
because a two-digit number followed by 11rem of whitespace reads as a mistake.
Stacks to one column below 52rem. .stats and .stat are deleted.
Converted: About's four fronts, About's five commitments, and the news
"Where things stand" block.
Also:
- About's applied-work section was three long paragraphs at full measure — a
wall. The two doors plus contributing time are the actual structure, so they
are three labelled rows, with Patreon named on the funding row.
- About's hero and Mission still carried the pre-reframe language ("adversarial
systems … friction dynamics is the through-line") while the homepage had moved
to complexity science. Both now match, and the Mission wall is split into
three paragraphs. Meta descriptions updated with it.
- Fixed two stray </div> tags left by the grid-to-list conversion; div and dl
nesting now balances on all six pages.
- A .section directly after the hero stacked its own 6-8rem top padding onto the
hero's bottom padding, leaving ~14rem of dead space that read as a rendering
fault at large widths. `.hero + .section` takes a reduced top padding.
Verified in headless Chromium at 1920 / 1280 / 768 / 390px: no JS errors, no
horizontal scroll, and every [data-reveal] element resolves visible under
reader-paced scrolling. (A fast synthetic scroll outruns the IntersectionObserver
and reports false positives — including one entirely blank phone screenshot that
turned out to be five rows sitting at opacity 1.)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
studiofarzulla
marked this pull request as ready for review
August 11, 2026 22:35
studiofarzulla
pushed a commit
that referenced
this pull request
Aug 11, 2026
The Affiliate tier promises a dissensus.ai alias; MF confirms it is available, so the line stays and the alias gets created when the first Affiliate is appointed rather than up front. Also records plainly that this branch is built to a Cloudflare preview only — production deploys from master, so dissensus.ai serves the pre-diet site until PR #1 merges. Worth writing down: the preview URL renders the full new site, which makes it easy to believe it has shipped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NFaeEPDNSG1bnfkfPxAUHJ
There was a problem hiding this comment.
Pull request overview
This PR rebuilds the static Dissensus site’s information architecture and generated research surfaces: reframing the homepage/research narrative, splitting collaboration into Join and Projects, moving tools into the Research record, and simplifying the front-end (single light theme, lighter JS/CSS, redirect cleanup).
Changes:
- Introduces advisor + affiliate workflow assets (
advisors.json, outreach and letter templates) and updates metadata to support “tools beside papers” + stage-grouped Research. - Updates site chrome (nav/footer) across public pages, removes legacy meta-refresh stub pages, and standardizes redirects.
- Simplifies client-side behavior (removes theme toggle) and reduces homepage JS work.
Reviewed changes
Copilot reviewed 59 out of 59 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tools.json | Expands catalogue note to document relatedPapers behavior and Research-side rendering. |
| templates/affiliate-letter.md | Adds non-deployed affiliate confirmation letter template and issuance log table. |
| templates/advisor-outreach.md | Adds non-deployed advisor outreach templates/rules. |
| advisors.json | Adds advisor surface config with empty advisors array and publish-guard (showWhileEmpty). |
| papers.json | Adds stage fields, stage labels/blurbs/order to support linear stage-grouped Research rendering. |
| public/_redirects | Updates redirect rules for retired pages and new Join/Projects/Research structure. |
| public/css/system.css | Removes dark-theme path; adjusts container/spacing at larger widths; rebuilds footer styles. |
| public/js/theme.js | Removes theme toggle; keeps JS-class marker and mobile nav behavior. |
| public/js/index.js | Removes old hero canvases/ribbon; retunes optima canvas colors; adds visibility-aware animation logic. |
| public/privacy.html | Updates stylesheet cache busters and replaces nav/footer links to new IA. |
| public/terms.html | Updates stylesheet cache busters and replaces nav/footer links to new IA. |
| public/services.html | Deletes legacy meta-refresh stub page (now handled via redirects). |
| public/partners.html | Deletes legacy meta-refresh stub page (now handled via redirects). |
| public/work-with-us.html | Deletes legacy meta-refresh stub page (now handled via redirects). |
| public/papers/axiom-of-consent.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/alpha-asymmetry-fx.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/autonomous-red-team.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/cbdc-privacy.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/consciousness-monograph.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/consent-to-consideration.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/genre-mimicry.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/hedging-paradox.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/identity-thesis.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/semantic-first-vision.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/stakes-without-voice.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/substrate-independent-friendship.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/temporal-bitmap-interpretation.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/trauma-training-data.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/papers/whitepaper-factor-analysis.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/news/digital-finance-accept.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/news/temporal-bitmap.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
| public/news/trident.html | Updates stylesheet cache busters and replaces nav/footer to new IA. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
187
to
191
| .grid > *, .grid--wide > * { min-width: 0; } | ||
| /* Wide variant for content-rich records (tools, open projects). These carry a long | ||
| description plus a feature list, so they need real width — an auto-fill track floor | ||
| strands a lone card in a narrow column (a tall thin tower on a wide screen). Two | ||
| explicit columns above 46rem, one below: deterministic, unlike minmax(min(100%,…)) | ||
| which resolves differently depending on how the container is sized. Cards flex so | ||
| their action rows bottom-align across a row regardless of description length. */ | ||
| .grid--wide { grid-template-columns: 1fr; align-items: stretch; } | ||
| @media (min-width: 52rem) { .grid--wide { grid-template-columns: repeat(2, 1fr); } } | ||
| .grid--wide > .card { display: flex; flex-direction: column; } | ||
| /* The .grid--wide two-column variant is gone: tools.html was retired, and the projects | ||
| and join pages went linear in Aug 2026, so nothing used it. */ | ||
| .card { display: flex; flex-direction: column; } | ||
| .grid--wide > .card > .btn-row { margin-top: auto; padding-top: var(--sp-4); } |
Comment on lines
+74
to
+78
| if (typeof IntersectionObserver === 'function') { | ||
| new IntersectionObserver(function (entries) { | ||
| visible = entries[0].isIntersecting; | ||
| if (visible) start(); | ||
| }).observe(oc); |
Comment on lines
+42
to
+43
| /tools /research#tools 301 | ||
| /tools.html /research#tools 301 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six commits over four review rounds. Information architecture, content and framing; the visual identity — fonts, cream/burgundy, the logo — is unchanged. Net +4,024 / −6,796 across 59 files.
What the site says now
Dissensus is presented as an independent complexity-science research group in London: complex adaptive systems, no central controller, aggregate behaviour no part intends. The friction thesis is the specific question inside that, not the whole pitch. The homepage is retitled Adversarial Systems & Complex Adaptive Dynamics Research, and the
dis·sen·susdefinition sits in the hero as the first thing under the title, because it explains the name the reader has just read.systems.ac/ ASCRI is parked — no outbound links, dropped from the OrganizationsameAs, and the programme described without the acronym — pending a decision about what that surface becomes.New surfaces
join.html— a three-rung ladder fromroles.json:Research roles only — no unpaid operations, communications or board seats. Plus 14 hour-sized entry tasks, each traced to a real gap in
projects.jsonand listed at the size those notes themselves use: a weekend ×2 coders, an afternoon, one inference pass, fifteen minutes for an arXiv endorsement.The page leads on the actual situation — a group that started this year, where what it works on and how it decides a result is finished are still open — with the money facts under The limits, framed as a funding constraint carrying first refusal rather than as policy.
projects.html— the per-project dossiers, split out of the old 4,022-wordcollaborate.html.advisors.json+generateAdvisorySection()— returns''while the array is empty, so nothing about advisors publishes until a name with written consent is added and no placeholder can leak.templates/advisor-outreach.md(bounded ask, approach order, confirm-before-listing rule) andtemplates/affiliate-letter.mdare in-repo and not deployed.Research page
papers.jsongained astagefield, and the page is one linear list grouped by how finished each thing is:Current focus (2) · Accepted (1) · In peer review (4) · Preprints (4) · Preliminary drafts (5) · Discontinued lines (4)Tools render beside the paper they came out of, via the
relatedPapersfield that already existed intools.json. The five-category card grid, the Open research agendas section, the Notation reference, Lineage and Timeline are all gone. Research is the record of what is finished, stalled or abandoned; where a paper is also open to collaborators it carries a one-line pointer to its Projects entry rather than repeating the dossier.Status changes: ASRI preprint → in peer review; Extremity Premium under review → preprint. Both had
journalcleared so a preprint cannot advertise a venue; the accepted paper keeps naming Digital Finance.Diet
manifesto·charter·reading·press·subscribedeleted rather than left beside their 301s, which had made it ambiguous which the host served.tools.htmlfolded into Research. Theservices/partners/work-with-usmeta-refresh stubs became real 301s. Every retired URL redirects, verified against the deployment.dissensus.css(52 KB, referenced by nothing), the whole dark-mode path,.grid--wide,.stats, the credibility strip and the friction-equation block all removed.[data-theme]selector anywhere.theme.jsis kept — it setshtml.js, which gates the reveal-on-scroll rule, and hoststoggleNav(); deleting it would hide every[data-reveal]element permanently (the b21d046 failure mode).#netcanvas — each a restatement of something the page or the footer already said, or in the canvas's case ~1,770 pairwise distance calculations per frame, forever, on screen or not. It gained a team row and three generated open tasks.#servicesand#partnersanchors kept live.Design
.pubrow(Research),.projrow(Projects),.rung(Join),.deflist(About, News).--measurecaps it independently.Bugs found and fixed on the way
.section > .container > h2never matched the generated pages — they write<section class="section container">, one element with both classes — so everyh2on Join, Projects, Tools and Research sat flush against its next paragraph.<h2>Publications</h2>and silently skipped the entire list the moment the page was retitled. Now marker-delimited..statswasrepeat(auto-fit, minmax(180px, 1fr))over a 1px-gap-on-background trick: past four items it broke sentences into two-word columns and painted leftover grid tracks as a grey block..sectiondirectly after a hero stacked its own 6–8rem top padding onto the hero's, leaving ~14rem of dead space.copyBibTeX()only ever defined on paper pages — dead on click.</div>tags from a grid-to-list conversion;div/dlnesting now balances on all six pages.Verification
Headless Chromium at 1920 / 1280 / 768 / 390 px across home, research, projects, join, about and news: no JS errors, no horizontal scroll at any width, and every
[data-reveal]element resolves visible under reader-paced scrolling. Redirects and page content checked against the live branch preview with cache-busting.Two measurement traps worth recording: Cloudflare edge-caches individual assets, so a stale page looks exactly like a failed deploy; and a fast synthetic scroll outruns the IntersectionObserver and falsely reports reveal elements as hidden — including one entirely blank screenshot of five rows that were all at opacity 1.
Still needs a human
advisors.jsonis empty on purpose. Names go in only after written consent; the outreach templates are ready.CLAUDE.mdis gitignored and still describes the old IA.