Repository navigation
docs(site): add GitHub Pages landing site - #126
Conversation
There was a problem hiding this comment.
💡 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".
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
There was a problem hiding this comment.
💡 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".
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
There was a problem hiding this comment.
💡 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".
There was a problem hiding this comment.
💡 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".
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:
var hal) that now matches the desktop demoThe hero opens on the problem: API clients hardcode URLs, one URL changes, and requests 404. As
_linksconnect 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/ordersresource, 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 branchproto/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 (sha256dc2fb557b2298e1ad60b5077d9ae2b3450273bd211553c8bce6960ba87c78b64).site/index.src.html,site/build.js,site/package.json,site/package-lock.json: source and a reproducible build. Runningnpm ci && node build.jsregeneratesindex.htmlbyte-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-buildruns on PRs and on pushes tomain. It stages the committedindex.htmlplus the licence files, then rebuilds from source and fails if the rebuilt page differs byte-for-byte from the committed one.pages-deployruns only onmain. Actions are pinned by SHA and permissions are least-privilege. Runs are serialized per ref..gitattributes: forces LF forsite/**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.47d2b01(screen reader),c9af3f9(embedded object),3d5ae69(presentation driver),db80f5d(serializer fidelity) and2776b6d(demand-driven rendering). Rendering parity is shown below.c9af3f9, two consecutive rebuilds produce the same sha256. CIpages-buildpasses its byte-exact rebuild check at2776b6d.c9af3f9, with no console errors.window.seek) show 0 differing pixels against the pre-fix page fromfb61977.c9af3f9vse98aeff: the differing pixels are confined to the JSON pane around theea:orderlines. 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).2776b6didle 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.actionlint1.7.12 reports no findings.Versioning
None. No
src/Chatter.Rest.Hal/**orsrc/Chatter.Rest.Hal.CodeGenerators/**paths changed, and READMEs are not packed into either nupkg.Merge notes
build_type: workflow. The first deploy runs on merge.buildcheck. Merging needs the admin bypass, the same as chore(claude): replace agent-framework with hivemind plugin config #124. The Pages job is deliberately not namedbuild, so it can never satisfy or mask the package check.Review findings
Local pre-PR review ran 2 iterations, followed by Codex review on this PR:
57f6f3b.index.htmlwithout checking it against its source. Fixed in1dcad11: CI rebuilds and runs a byte-exactcmpbefore upload, and still deploys the committed bytes.1dcad11) serializes runs. Ordering is not guaranteed, andsite/README.md(Deployment) documents that.e98aeff), which promises no ordering or freshness by design. Freshness of the published site is a deliberate design choice. Re-running an oldmainrun republishes an old commit. This is fixed by correcting the deploy contract insite/README.md(fb61977,e98aeff), not by gating the workflow:main.mainguard 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.display:nonewhile both animated stages arearia-hidden, so screen readers missed the h1, intro, install command and code. Fixed in47d2b01: a visually-hidden rule replacesdisplay: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..AddEmbedded("ea:order").AddResource(...). That adds a single resource withForceWriteAsCollectionfalse, so the serializer writes"ea:order"as an object. The JSON pane showed an array. Fixed inc9af3f9: the pane now shows the embedded single resource as an object ([{→{,}]→}), matchingAddResourcesemantics, and the C# example is unchanged.prefers-reduced-motionchange 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 in3d5ae69:applyPresentation()is now the only listener for width and motion media-query changes and for resize.2776b6d, below.)seek(), environment changes re-layout and re-render but never restart the driver.site/README.mdReview checklist (Motion) records this invariant.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 usesvar 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.2776b6dwith demand-driven rendering, which replaces the polling loop and supersedes the start/stop driver from3d5ae69:requestRender()is the only scheduler. A frame schedules another only whileanimating()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.seek()states therefore schedule no further frames.index.htmlsha256 is nowdc2fb557…8b64.