feat(scratchnode): ship sidecar handoff contract#455
Merged
Conversation
…nt stream Phase 8: a layout-only "Memory Wall" overlay that points at PUBLIC event content (liveEventMessages / liveEventAnswers) or holds short public stickies, positioned by a single commit-on-pointerup mutation. The Wall is a second render lane over the same canonical event stream the chat feed shows (the "Twitch" model: one stream, two synchronized views). Schema (liveEventWallItems): - refType message|answer|note, x/y/w/color/groupId/z, createdBySessionId - 4 indexes: by_event, by_event_updated, + pin-dedup by_event_message/answer - Content/layout separation: message/answer text is NEVER duplicated; only a "note" stores inline text, public by construction. Backend (convex/wall.ts): - listWallItems realtime query, BOUND at 500 (mirrors getMembers) - pinToWall idempotent; cross-event integrity-checked ref - createWallNote public sticky; editWallNote (note-only); recolorWallItem - moveWallItems the ONE write per drag; group-move = one delta; z-to-front - groupWallItems deterministic groupId = "g:" + smallest member id - ungroupWallItems / removeWallItems (unpin != delete the source content) Reliability (.claude/rules/agentic_reliability.md): - BOUND list cap 500; every id[] mutation caps at 200 - HONEST_STATUS typed ConvexError on every validation failure - requireMember + DB-backed enforceRateLimit on every mutation (separate wall: and wallmove: buckets so drags can't starve creates) - coordinate clamping: NaN/Infinity -> last-good, finite-out-of-range -> +/-1e5 - color allowlist (no arbitrary inline style); DETERMINISTIC group ids Privacy invariant: the public Wall NEVER references userNotes (private, owner-keyed). A "note" item is public inline text, identical in visibility to a chat message. Enforced by a static-source boundary test. Tests: - 17 scenario-based (convex/__tests__/scratchnode.wall.test.ts): pin idempotency/dedup, cross-event id smuggling, clamp branches, deterministic grouping, BOUND batch+list, membership/lifecycle gates, color/text injection, collaborative-open move by a different member, unpin-keeps-source, rate-limit bucket independence. - 6 runtime-boundary static assertions (privacy + BOUND + gates + allowlist). Prototype (public/proto/wall.html): the smooth-drag engine reference (translate3d + rAF + setPointerCapture + group-move + alignment snap); commit stubs now name the real api.wall.* contracts. Next PR mounts the Wall lane into home-v5 behind a Chat|Wall toggle. Verification: convex codegen clean, tsc --noEmit clean, 33 targeted tests pass, scratchnode.events regression suite 50 pass / 1 skip, npm run build clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align ScratchNode as a disposable sidecar event room that keeps public chat and public /ask answers separate from private notes. Update the NodeBench continuation URL to the event private route and make public answer traces explicitly state that private notes are excluded. Also fix a host-console focus regression where delayed composer autofocus could steal input focus from modal fields during live-event setup. Verification: npm run build; npx vitest run convex/__tests__/scratchnode.events.test.ts; npx playwright test tests/e2e/scratchnode-live-route-honesty.spec.ts --project=chromium --workers=1 --reporter=list; npm run dogfood:proto-live-backend; npx tsc -p convex -noEmit --pretty false; npx tsc -p . -noEmit --pretty false. Co-Authored-By: Augment Agent <77596827+HomenShum@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
✅ Dogfood Visual QA Gate: PASSED
ArtifactsDownload the Generated by Dogfood QA Gate |
|
Demo: walkthrough of the surfaces this PR changed is available as a workflow artifact ( |
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.
Aligns ScratchNode as a disposable sidecar event room with the correct NodeBench private continuation URL (
/events/:slug/private) and enforces that public answer traces explicitly state private notes are excluded.Pull Request opened by Augment Code with guidance from the PR author