Release: staging batch without OffSec - #246
Conversation
The AI shelf and the magic books now open to an owner who holds the library-ai flag or whose library holds more than 15 books (type book, every shelf). One check, opensLibraryAi, decides for the page and both routes; the count is read from the library on each check, nothing is stored. The AI shelf keeps its own 30-book lock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The idle pill drops to 34px, smaller label, 0.7 opacity, and loses the orange pulse glow, so it stops burying the host page's bottom-corner buttons and text. Full opacity returns on hover, while the panel is open, and in the relevance-nudge state, whose pulse is also toned down. Opacity stops at 0.7 because the 12px label must keep the 4.5:1 contrast floor over light pages. Mobile pill shrinks in step. Bundle rebuilt, so the change is live on every locale. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> (cherry picked from commit d957e9b)
…ts modal pass Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit 7fcd5ec)
…rey banding The /auth, magic-link and email-change pages hold almost no markup while the provider handshake runs. Two defects came out of that: - The body gradient is propagated to the canvas but sized against the root box, so on those near-empty documents it tiled down the viewport as grey bands. The root now holds viewport height and the gradient no longer repeats. - /auth rendered the shared Spinner without its visible prop, so it drew nothing at all and left the bare document on screen. All three pages now render AuthLoader: a full-viewport paper surface with the house brain loader, dark-theme aware, honouring prefers-reduced-motion. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> (cherry picked from commit 55af48d)
The merge took prod's side on every conflicted file, which dropped three fixes this branch had made against the August structure. Rebuilt on the new one: - The info panel again sits in a host that is transparent to layout on desktop and a fixed clipping layer at the drawer breakpoints, so the panel parked off the right edge stops counting towards the page's scrollable width. Without it Safari measures a library page about two screens wide on a phone. The CSS for it had survived the merge with no element to apply to. - The Add controls pulse again while the library holds no objects. Prod rewrote the empty-shelf area out of Shelf, so only the header control carries it now, and the round-control animation goes with the control it belonged to. - The avatar boxes declare their own widths again (48px panel, 152px edit dialog) instead of paying for the home card's headroom. The fourth, the single-request library load, is not rebuilt: prod paints the library on the server, so the two round trips it removed no longer happen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit 45a2db7)
…-22) (cherry picked from commit 9db1dc7)
Thinking is disabled explicitly on every Claude call, since Sonnet 5 runs adaptive thinking when the field is omitted, and the reply caps grow from 600 to 800 and 360 to 480 tokens for its larger tokenizer. Authorized by Wolf on 2026-09-22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit cd740e3)
The concierge and landing routes no longer hold a paid Anthropic key. They ask claude-sonnet-5 at low effort through the relay, which moves a call from track t1 to t2 to t3 on a rate limit, and read the reply JSON out of the text since the relay runs one turn without tools. A streaming caller now gets the whole reply at once. Authorized by Wolf on 2026-09-22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit d6c6b74)
Claude through the subscription relay is the only model the concierge and landing routes call. When every track is spent the reply is empty and the widget stays quiet instead of switching to a paid key. Authorized by Wolf on 2026-09-22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit bac80e9)
The cover's buildings were bound to usernames. Two owners renamed themselves on production (Mary13 is now Mary, alinamarg is now Alina), so their buildings matched no library and the hover card showed only a name with no About or object counts. Hotspots now carry the owner's account id, which survives a rename and is the same on staging, whose database is a copy of production's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit c1aaa5f)
Titles, texts and the detail and children lists on steps, entries and system nodes are now checked as text before the guide is stored. Before, an object in a title passed adaptGuide and broke the page only when a visitor opened that dossier. Raised by the review on #245. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 20428ab)
|
Claude finished @manager's task in 6m 45s —— View job Review complete
SummaryWent through the full diff against
Everything else checked out:
No test suite exists to run (Playwright E2E only per AGENTS.md, not wired into this review), and I did not execute |
| - No AI-isms: no "let me know if…", no "happy to help", no preamble before the answer. | ||
| - Reference piece: **"The Rise of the Choice Architect"** (article on keepsimple.io). Match its register. | ||
|
|
||
| Worked examples: [docs/voice-guide.md](docs/voice-guide.md). |
There was a problem hiding this comment.
This adds a link to docs/voice-guide.md, but that file doesn't exist anywhere in the tree (not tracked, not added by this PR) — docs/ is gitignored for new files per the Commit Hygiene section further down this same file. Right now this is a dead link in the project instructions every agent reads. Either add and commit the file in this PR, or drop the line until it exists.
There was a problem hiding this comment.
Fixed in d60cbcb: the line is dropped from CLAUDE.md.
| /> | ||
| )} | ||
| {isArc && ( | ||
| <span className={styles.ArcTooltip} aria-hidden> |
There was a problem hiding this comment.
Accessibility: below 1160px, .ArcLabel (the only visible text for this link) is set to display: none in ToolHeader.module.scss (@media (max-width: 1160px) { .ArcLabel { display: none; } }, line ~512), and ArcOfSelfIcon is a bare <svg> with no <title>/aria-label. At that breakpoint the <a> has no accessible name at all for screen reader / accessibility-tree purposes — display: none removes the text node from the tree too.
The tooltip that would explain the icon (arcOfSelfTooltip) is marked aria-hidden here and only shown via @media (hover: hover) { .ArcMenuItem:hover .ArcTooltip { ... } } — CSS :hover only, no :focus/:focus-visible variant — so keyboard users get neither a label nor the tooltip.
Suggest adding aria-label={itemLabel} (or similar) to the anchor for the Arc of Self item so it always has an accessible name regardless of breakpoint, and adding a :focus-visible trigger alongside :hover for the tooltip.
There was a problem hiding this comment.
Fixed in d60cbcb: the Arc of Self anchor carries aria-label with its label, so it keeps an accessible name below 1160px, and the tooltip also shows on :focus-visible.
…c link The Arc of Self link carries aria-label, so it keeps an accessible name when its label is hidden on narrow screens, and its tooltip also shows on keyboard focus. CLAUDE.md no longer links a voice guide that is not in the tree. Raised by the review on #246. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @manager's task in 1m 11s —— View job Re-review complete
SummaryThe only change since the last pass is
No new issues introduced by this commit, and the rest of the diff (Library AI-by-books, avatar/shelf/sidebar fixes, auth loader, Copilot relay refactor, AI Atlas guide validation) is unchanged from the prior review — see that pass for the full breakdown. Diff stat still matches the PR description (51 files, +1125/-774), and no OffSec strings/files are present. Nothing further to flag. Both inline comments from the previous review can be considered resolved. |
Production release: everything that is on staging except the OffSec layer, which stays on DEV and staging. Not merged; waits for Wolf's go.
Built from main plus the non-OffSec commits of the staging branch; no OffSec file or string in the diff. Checks run:
node scripts/release/library-batch-check.cjsPASS,tsc --noEmitclean.🤖 Generated with Claude Code