Skip to content

docs(site): add GitHub Pages landing site - #126

Merged
brenpike merged 11 commits into
mainfrom
docs/landing-site-7c2e
Oct 3, 2026
Merged

brenpike merged 11 commits into
mainfrom
docs/landing-site-7c2e

Conversation

@brenpike

@brenpike brenpike commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Summary

Adds the Chatter.Rest.Hal landing page as a GitHub Pages site at https://brenpike.github.io/Chatter.Rest.Hal/.

The page is the approved "hybrid" motion prototype with five review-driven changes:

  • an accessibility fix that does not alter rendering
  • a single presentation path, so runtime width and reduced-motion changes take effect live
  • builder-demo JSON corrections that make the JSON pane token-identical to real Chatter.Rest.Hal serializer output
  • a mobile code-text variable name (var hal) that now matches the desktop demo
  • demand-driven rendering: frames are scheduled only while something is animating, so the page does no work once it settles

The hero opens on the problem: API clients hardcode URLs, one URL changes, and requests 404. As _links connect the resources, the scene turns from red-on-black into a navy blueprint, and the graph is traversed by rel name. Scrolling zooms into the /orders resource, which becomes the JSON pane of a live fluent-builder demo ("Build it fluently."). A feature strip and footer follow. Prototype previews are on the throwaway branch proto/landing-motion.

Changes

  • site/index.html: the approved page. It is self-contained, with fonts inlined and no network requests. It differs from the approved prototype only by the review fixes listed under Review findings (sha256 dc2fb557b2298e1ad60b5077d9ae2b3450273bd211553c8bce6960ba87c78b64).
  • site/index.src.html, site/build.js, site/package.json, site/package-lock.json: source and a reproducible build. Running npm ci && node build.js regenerates index.html byte-for-byte.
  • site/licenses/: SIL OFL 1.1 texts for Chakra Petch and IBM Plex Mono.
  • site/README.md: rebuild steps, deploy behaviour, font attribution, and a Review checklist covering accessibility, motion, HAL fidelity and render parity.
  • .github/workflows/pages.yml: pages-build runs on PRs and on pushes to main. It stages the committed index.html plus the licence files, then rebuilds from source and fails if the rebuilt page differs byte-for-byte from the committed one. pages-deploy runs only on main. Actions are pinned by SHA and permissions are least-privilege. Runs are serialized per ref.
  • .gitattributes: forces LF for site/** and marks it as documentation/generated for linguist.
  • README.md: adds a "Project Site" link under Additional Resources.

Validation

  • dotnet build -c Release: 0 errors.
  • dotnet test -c Release: 456/456 (Chatter.Rest.Hal.Tests) and 51/51 (CodeGenerators.Tests) passed.
  • Site checks:
    • The prototype bytes changed only for the review fixes: 47d2b01 (screen reader), c9af3f9 (embedded object), 3d5ae69 (presentation driver), db80f5d (serializer fidelity) and 2776b6d (demand-driven rendering). Rendering parity is shown below.
    • Clean rebuild from source reproduces the same hash on Node 20 and Node 24. After c9af3f9, two consecutive rebuilds produce the same sha256. CI pages-build passes its byte-exact rebuild check at 2776b6d.
    • Headless Chromium render shows 0 differing pixels against the approved desktop (1280, reduced motion) and mobile (390) screenshots before c9af3f9, with no console errors.
    • Animated desktop frames at t=2, 7, 11, 18 and 22 (via window.seek) show 0 differing pixels against the pre-fix page from fb61977.
    • c9af3f9 vs e98aeff: the differing pixels are confined to the JSON pane around the ea:order lines. Results: desktop 1280 has 110 px (x818–932, y1243–1323), mobile 390 has 23 px (x249–284, y856–880), the animated t=22 frame has 110 px (x818–932, y523–603), and the t=18 frame has 0 px. There are no console errors.
    • 3d5ae69: the load render shows 0 differing pixels for desktop, mobile and reduced motion, and for the seek frames. Runtime toggle checks T1–T6 pass. Their residual diffs equal the renderer noise between two runs of the base page.
    • db80f5d: a token comparison against real Chatter.Rest.Hal serializer output for the Act-2 builder code gives 83/83 equal tokens (whitespace aside).
    • 2776b6d idle proof: once the page settles, a 3 s idle window shows 0 requestAnimationFrame calls, 0 callbacks and 0 DOM mutations. Before the fix the same window showed 181 rAF calls and up to ~58k DOM mutations. Pixel parity is unchanged for the seek frames, the load render, reduced motion and the live settled state (mobile within renderer noise), and toggle checks T1–T6 still pass.
    • The accessibility tree now exposes the h1, intro, install command and builder code on desktop.
  • actionlint 1.7.12 reports no findings.

Versioning

None. No src/Chatter.Rest.Hal/** or src/Chatter.Rest.Hal.CodeGenerators/** paths changed, and READMEs are not packed into either nupkg.

Merge notes

  • GitHub Pages is already enabled with build_type: workflow. The first deploy runs on merge.
  • This PR changes no package paths, so the package CI never produces the required build check. Merging needs the admin bypass, the same as chore(claude): replace agent-framework with hivemind plugin config #124. The Pages job is deliberately not named build, so it can never satisfy or mask the package check.
  • The footer shows a hardcoded "REV 2.1.1". It will need a source edit and rebuild after the next release.

Review findings

Local pre-PR review ran 2 iterations, followed by Codex review on this PR:

  • 7d646e58: the deploy-trigger docs were inaccurate. Fixed in 57f6f3b.
  • 8c4fd398: CI deployed index.html without checking it against its source. Fixed in 1dcad11: CI rebuilds and runs a byte-exact cmp before upload, and still deploys the committed bytes.
  • a2e3263d: out-of-order deploys were possible. Per-ref concurrency (1dcad11) serializes runs. Ordering is not guaranteed, and site/README.md (Deployment) documents that.
  • c59801fb and r4172768221 (deploy order): covered by the same documented contract (e98aeff), which promises no ordering or freshness by design. Freshness of the published site is a deliberate design choice. Re-running an old main run republishes an old commit. This is fixed by correcting the deploy contract in site/README.md (fb61977, e98aeff), not by gating the workflow:
    • Each run publishes the commit it was started for, and the last deploy to finish wins. GitHub does not guarantee the order queued runs start, so an older commit can occasionally deploy after a newer one.
    • Re-running an older run is the intended rollback path. To return to the latest version, re-run the newest run or push to main.
    • A tip-of-main guard was considered and rejected. It removes rollback, adds an API or network dependency to the privileged deploy job, and cannot keep the site fresh when a re-run displaces a pending run.
    • Impact is bounded: it takes a deliberate maintainer action, it is visible and reversible, and it only affects a static page with no secrets or data.
  • r4172768218 (accessibility): on desktop the HTML copy was display:none while both animated stages are aria-hidden, so screen readers missed the h1, intro, install command and code. Fixed in 47d2b01: a visually-hidden rule replaces display:none, and the h1 block now precedes the h2 in the DOM. Pixel parity with the approved screenshots and the pre-fix animated frames is proven at 0 differing pixels.
  • r4172859594 (builder-demo JSON): the demo builds .AddEmbedded("ea:order").AddResource(...). That adds a single resource with ForceWriteAsCollection false, so the serializer writes "ea:order" as an object. The JSON pane showed an array. Fixed in c9af3f9: the pane now shows the embedded single resource as an object ([{ → {, }] → }), matching AddResource semantics, and the C# example is unchanged.
  • r4172898406 (reduced-motion driver): a runtime prefers-reduced-motion change only switched the layout mode, while the animation loop kept running. A page loaded with reduced motion also stayed in manual mode after the preference was turned off. Fixed structurally in 3d5ae69:
    • A single applyPresentation() is now the only listener for width and motion media-query changes and for resize.
    • It drives an idempotent requestAnimationFrame start/stop driver. (The driver part is superseded by 2776b6d, below.)
    • Reduced motion renders the end-state frame and stops the driver. Turning reduced motion off resumes the scroll-driven story without replaying the intro.
    • After seek(), environment changes re-layout and re-render but never restart the driver.
    • The site/README.md Review checklist (Motion) records this invariant.
  • Serializer fidelity (db80f5d): closes the demo-JSON class against ground truth rather than case by case. The Act-2 JSON pane is now token-identical to real Chatter.Rest.Hal serializer output: "total": 30, and curies members in serializer order (href, templated, name). The mobile code text uses var hal, and the animated code lines are now read from that same text. The Review checklist (HAL fidelity) requires re-verifying against real serializer output whenever the code or the pane changes.
  • r4173189205 (always-on driver): after the builder animation finished, its elapsed time kept growing, so the polling loop re-rendered the Act-2 DOM/SVG at about 60 fps for as long as the page was open. Fixed in 2776b6d with demand-driven rendering, which replaces the polling loop and supersedes the start/stop driver from 3d5ae69:
    • requestRender() is the only scheduler. A frame schedules another only while animating() is true, meaning the hero (th < HE) or Act 2 (a2 < A2_SETTLE) is still in motion. Both values are clamped at their end states.
    • sample() is the only code that writes live state. Scroll, IntersectionObserver, resize and media-query handlers only set anchors and request a frame.
    • Settled, reduced-motion and seek() states therefore schedule no further frames.
    • The index.html sha256 is now dc2fb557…8b64.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fb619778cf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/index.src.html Outdated
Comment thread site/README.md Outdated
brenpike and others added 2 commits October 3, 2026 04:49
Replace the desktop `.mcopy{display:none}` with a visually-hidden rule so the
h1, intro, install command and builder code stay in the accessibility tree
while both animated stages remain aria-hidden. The mobile rule resets every
hiding property, so the mobile layout is unchanged. Move #mc1 ahead of #mc2 so
screen readers reach the h1 before the h2. Static mode positions the copy with
flex `order`, so the move does not change layout.

Rendering is pixel-identical to the approved screenshots and to fb61977.

Addresses: #126 (comment)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MkQVaQjH2G3QpJpFtj3LdM
Per-ref concurrency serializes runs but does not guarantee the order in which
queued runs start, so the Deployment section no longer promises any ordering
or freshness. Each run publishes its own commit, the last deploy to finish
wins, and re-running a run is the documented way to roll back or refresh.

Addresses: #126 (comment)

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e98aeff8fc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/index.src.html Outdated
The Act-2 builder demo calls .AddEmbedded("ea:order").AddResource(...), which
adds one resource without ForceWriteAsCollection, so the serializer writes
"ea:order" as an object. Render the JSON pane the same way: `[{` -> `{` and
`}]` -> `}`. The C# code is unchanged.

Render diff vs e98aeff is confined to the JSON pane around the ea:order lines
(fullpage 1280, mobile 390, animated t=22). index.html rebuild is deterministic.

Addresses: #126 (comment)

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c9af3f953b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/index.src.html Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: db80f5d344

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread site/index.src.html Outdated
@brenpike
brenpike merged commit 2940b7f into main Oct 3, 2026
4 checks passed
@brenpike
brenpike deleted the docs/landing-site-7c2e branch October 3, 2026 13:44
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.

1 participant