Skip to content

[#534] Add judging room communications and announcements - #535

Open
DVidal1205 wants to merge 9 commits into
mainfrom
blade/judging-discord-comms
Open

[#534] Add judging room communications and announcements#535
DVidal1205 wants to merge 9 commits into
mainfrom
blade/judging-discord-comms

Conversation

@DVidal1205

@DVidal1205 DVidal1205 commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Why

Judges need a quiet way to coordinate while hackers are presenting. Walkie-talkies interrupt pitches, while authenticated organizers already have Discord on their phones. Guest QR activity and operational announcements also need to reach the right room without exposing unrelated judging data.

What

Closes: #534

  • Adds an optional, hackathon-scoped root Discord channel to Command Center → Rooms.
  • Provisions one Discord thread per active judging room, keeps its name and parent channel valid, and exposes an Open thread action.
  • Mentions an authenticated judge when they newly enter a room. Reloads and heartbeats remain quiet.
  • Announces a guest after the required Full Name step and mentions the authenticated judges assigned to that room.
  • Posts the QR image and signed link on first generation, rotation, and the explicit Send QR action. Every send resolves the room's authenticated judges at delivery time.
  • Announces individual guest revocation and room-link revocation with the acting officer and affected guest names.
  • Adds global and room announcements. Standard notices stay visible until dismissed. Urgent notices block judging until acknowledged.
  • Defaults Blade announcements to authenticated judges. Officers can include guest judges, including eligible global notices for every guest and room notices only for guests in that room.
  • Mirrors every announcement to Discord. Global notices go to the root channel and room notices go to the room thread. Guests are never Discord-mentioned.
  • Server-renders visible announcements, then polls every 30 seconds while the judging page remains open, including in a hidden tab.
  • Uses the current Member profile full name anywhere the judging UI presents an authenticated judge. The stored Discord label is used only when no Member profile exists.
  • Keeps Discord outside security and publication transactions. Room entry, guest sign-in, QR changes, revocation, and Blade announcements remain committed when Discord is unavailable.
  • Validates the configured channel against the environment-aware Knight Hacks guild, filters recipients by current judge or officer permissions, batches large mention sets, and splits escaped long announcements without dropping accepted text.
  • Serializes room-thread creation and announcement replacement delivery so concurrent requests cannot create competing current state or deliver an older replacement after a newer one.
  • States the Discord trust boundary in Command Center: officers must choose an organizer-only root channel because room threads inherit that channel's readers.
  • Adds migrations 0048_little_tarot and 0049_real_redwing, audit coverage, principal-scoped reads, and the approved Forge feature bundle.

Flow

  1. An officer opens Command Center → Rooms, searches the configured Knight Hacks guild, and saves an optional root channel.
  2. Blade provisions one thread for each active room. Rooms created later receive one automatically, and partial failures remain retryable.
  3. An authenticated judge selects a room on the Projects page. Blade applies the room's challenge, records presence, and posts a self-mention in the room thread.
  4. A guest scans the room QR and completes the unskippable Full Name gate. Blade records their identity and posts a guest-arrival notice to the room thread.
  5. Officers can send the current QR, rotate it, revoke a guest, or revoke the room link. Each Discord notice mentions the authenticated judges assigned at that moment.
  6. Officers can publish a standard or urgent announcement to all rooms or one room. They can keep the default authenticated audience or include guests.
  7. Blade serves the current eligible announcements on the first response and refreshes them every 30 seconds. Standard notices require an X dismissal; urgent notices require acknowledgment.

Interface and live delivery evidence

Screenshots are hosted in the PR evidence gist. None are committed to Forge.

Communications setup and room controls

Command Center Rooms tab with optional Discord communications

Room actions for QR and Discord delivery

The channel uses the existing searchable combobox and environment-aware guild. Send QR keeps the current link, while rotation revokes it and generates a replacement.

Authenticated judge room entry and human names

Authenticated judge selecting a room

Authenticated judge assigned to a room

Judging header showing Dylan Vidal from the Member profile

Room roster showing Dylan Vidal and the room announcement audience

The judging shell, room roster, score feedback, evaluation history, and organizer messages resolve the current Member full name. The Discord account remains the mention target, not the visible identity label.

Guest identity gate

Unskippable guest Full Name dialog

Guest identity dialog at 390px

Scanning the QR alone is quiet. The arrival message is sent only after the guest submits their full name.

Global announcement controls and standard notice

Global announcement editor

Global announcement shown live in Command Center

Authenticated judge persistent announcement banner

Announcement rendered above an open feedback form

Standard notices do not expire. Dismissal is scoped to the announcement ID, so a replacement in the same scope appears again.

Urgent announcement

Urgent announcement editor with guest audience enabled

Urgent announcement blocking the authenticated judging workspace

Escape and outside clicks do not close an urgent notice. The judge must select I understand.

Room-scoped and guest announcement views

Room announcement shown in Command Center

Authenticated judge seeing global and room announcements

Guest judge receiving eligible urgent and room announcements

Guest judge room announcement banner

A guest can receive an included global notice and the included notice for their signed QR room. Room announcements never cross room boundaries.

Live T.K delivery in Dev@KnightHacks

Room threads provisioned in bot-testing

Current QR and assigned judge mention

Guest arrival in the room thread

Member arrival using the Member profile name

Global announcement in the root channel

Room announcement in Sponsor Suite A

Urgent global announcement in the root channel

These messages were sent by the local Blade dev server through T.K to the dynamic development guild and #bot-testing.

Test Plan

  • pnpm verify:precommit passed: React analysis, formatting, lint, and 33 type-check tasks.
  • pnpm --filter=@forge/validators test -- judging audit passed: 17 tests.
  • pnpm --filter=@forge/api test -- judging passed: 25 tests.
  • pnpm --filter=@forge/db test -- migration passed: 65 tests.
  • pnpm --filter=@forge/db test -- judging-schema passed: 11 tests.
  • pnpm --filter=@forge/api test passed: 112 files and 797 tests.
  • pnpm --filter=@forge/db test passed: 148 tests, including the development-backup policy gate.
  • pnpm --filter=@forge/blade test -- authenticated-shell project-judge-privacy guest-name-gate judging-announcements passed: 29 tests.
  • pnpm --filter=@forge/blade build passed: 58 routes generated, including server-rendered judging routes.
  • git diff --check passed.
  • Deep Forge review covered API authorization, schema and migration safety, UI and SSR behavior, test quality, and product acceptance. Confirmed findings were fixed and retested.
  • Manual KH VIII checks covered authenticated judge, officer, and QR guest flows at desktop and mobile sizes.
  • Live Discord checks covered thread provisioning, member and guest arrival, QR send and rotation, revocation, global announcements, room announcements, urgent announcements, and current Member names.
  • The branch is current with origin/main at bd97fccb, which includes PR [#1] Fix forms callback delivery and action feedback #533.

Checklist

  • Database: Ran pnpm db:generate and committed 0048_little_tarot.sql, 0049_real_redwing.sql, their snapshots, and the journal entries.
  • Environment Variables: No environment variables changed.

@DVidal1205 DVidal1205 added Feature New Feature or Request Blade Change modifies code in Blade app Database Change modifies code in the DB package API Change modifies code in the global API/tRPC package labels Sep 6, 2026
@DVidal1205 DVidal1205 self-assigned this Sep 6, 2026
@DVidal1205 DVidal1205 added Feature New Feature or Request Blade Change modifies code in Blade app Database Change modifies code in the DB package API Change modifies code in the global API/tRPC package labels Sep 6, 2026
@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 36 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Team

Run ID: 12cbe5a6-ec72-4847-9f03-dbe480525f63

📥 Commits

Reviewing files that changed from the base of the PR and between af7dd86 and 2208053.

📒 Files selected for processing (1)
  • .forge/features/judging-discord-comms/status.md

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Team

Run ID: 42f20e00-facc-45ac-b75e-c9c5fe74e8f8

📥 Commits

Reviewing files that changed from the base of the PR and between 2e218a4 and af7dd86.

📒 Files selected for processing (22)
  • .forge/features/judging-discord-comms/srd.md
  • .forge/features/judging-discord-comms/status.md
  • .forge/features/judging-discord-comms/test-cases.md
  • apps/blade/src/app/_components/judging/guest-name-gate.tsx
  • apps/blade/src/app/_components/judging/judging-announcements.tsx
  • apps/blade/src/app/_components/judging/judging-control-panel.tsx
  • apps/blade/src/tests/projects/guest-name-gate.test.tsx
  • apps/blade/src/tests/projects/judging-announcements.test.tsx
  • packages/api/src/judging-access.server.ts
  • packages/api/src/routers/judging.ts
  • packages/api/src/tests/integration/judging-access.test.ts
  • packages/api/src/tests/judging/discord-comms.test.ts
  • packages/api/src/utils/audit/coverage.ts
  • packages/api/src/utils/judging/discord-comms.ts
  • packages/api/src/utils/member/display-name.ts
  • packages/db/drizzle/0049_real_redwing.sql
  • packages/db/drizzle/meta/0049_snapshot.json
  • packages/db/scripts/dev-db-backup-sanitizer.ts
  • packages/db/src/schemas/knight-hacks.ts
  • packages/db/src/tests/dev-db-backup-sanitizer.test.ts
  • packages/db/src/tests/judging-schema.test.ts
  • packages/validators/src/tests/judging.test.ts
💤 Files with no reviewable changes (1)
  • packages/api/src/utils/audit/coverage.ts

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

Adds optional Discord communications for judging rooms, including persistent room threads, judge and guest notices, QR delivery, revocation notices, and announcements. Stores Discord configuration, room threads, and announcement history. Adds API procedures, delivery status reporting, validation, audit policies, and migration changes. Adds Command Center controls and Blade announcement banners or urgent dialogs with polling and dismissal persistence. Updates judge display-name resolution and adds tests for delivery, permissions, safety, persistence, and UI behavior.

Merge Risk: ⚪ Minimal · up to af7dd

Current announcement validation and Send QR feedback handle the previously identified cases, with no actionable merge-blocking risk remaining.

🚥 Pre-merge checks | ✅ 7 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.63% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 71 functions across 28 files. (4 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (7 passed)
Check name Status Explanation
Title check ✅ Passed The title starts with issue #534, describes the judging communications and announcements change, and is 56 characters long.
Description check ✅ Passed The description directly explains the Discord communications, Blade announcements, security-failure isolation, implementation scope, and validation performed.
Linked Issues check ✅ Passed The changes implement the objectives in [#534], including optional Discord configuration, room threads, judge and guest notices, QR and revocation delivery, announcements, guest boundaries, current me…
Out of Scope Changes check ✅ Passed The changes remain within [#534]. Supporting UI, validation, migrations, audit coverage, documentation, tests, and display-name updates directly support the requested judging communications feature.
No Hardcoded Secrets ✅ Passed No hardcoded secret was introduced. Scans of the 39 changed files found no API-key, provider-token, private-key, bearer-token, credential-URL, password, or secret-literal matches. Discord delivery use…
Validated Env Access ✅ Passed PASS: The PR diff adds no direct process.env usage. The new judging Discord module reads configuration through getKnightHacksGuildId; its raw process.env.NODE_ENV access is in the unchanged `pac…
No Typescript Escape Hatches ✅ Passed No new TypeScript escape hatch was introduced. The PR diff adds no any type, @ts-ignore, @ts-expect-error, or postfix non-null assertion. The only any matches are ordinary prose in documentati…
Full details: Docstring Coverage

Explanation

Docstring coverage is 5.63% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 71 functions across 28 files. (4 skipped: 4 unsupported.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch blade/judging-discord-comms

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Dylan Vidal and others added 3 commits September 5, 2026 23:09
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
@DVidal1205
DVidal1205 force-pushed the blade/judging-discord-comms branch from 8cac730 to 0b562cc Compare September 6, 2026 03:13
@DVidal1205

Copy link
Copy Markdown
Contributor Author

Live Discord acceptance is complete with T.K in Dev@KnightHacks #bot-testing.

The run covered room-thread provisioning, Send QR, QR rotation, authenticated judge arrival, guest arrival, current-room mentions, and guest revocation. It also caught one real Discord contract issue before review: Discord caps message nonces at 25 characters. The implementation now emits a 22-character base64url nonce and has a regression test for the limit.

I also changed member-facing Discord copy to use the linked Blade member profile name. The mention still targets the right Discord account, but alerts now say Dylan Vidal instead of dvidal1205. The Discord label remains the fallback when a member profile does not exist.

Current QR delivery

T.K sends the current room QR and mentions assigned organizers

Guest arrival and revocation

T.K announces the guest and names Dylan Vidal as the organizer who revoked access

Member profile name on room entry

T.K announces Dylan Vidal entering Sponsor Suite A

The branch is rebased onto origin/main at bd97fccb, including PR #533. Post-rebase lint, typecheck, judging tests, validator tests, migration tests, and the Blade production build all pass.

Dylan Vidal and others added 2 commits September 5, 2026 23:23
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
@DVidal1205

Copy link
Copy Markdown
Contributor Author

Announcement and identity acceptance pass

The latest pass adds Blade and Discord announcements, preserves the full accepted message during Discord escaping and batching, and applies the Member full-name rule throughout judging.

Officer view

Command Center room with urgency and guest-audience badges, plus Dylan Vidal in the roster

The room card now exposes both urgency and audience without opening the editor. The live roster resolves the current Member profile name.

Authenticated judge view

Authenticated judging header showing Dylan Vidal

The judging shell uses Dylan Vidal, while Discord still uses the linked account for mentions.

Guest view

Guest identity gate labeled Full name

The unskippable identity field now says Full name and keeps the same validation and signed-session flow.

Live Discord delivery

Global announcement delivered to bot-testing

Room announcement delivered to the Sponsor Suite A thread

Both messages came from the local Blade server through T.K in Dev@KnightHacks. The complete screenshot set and flow notes are in the updated PR body.

@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Co-authored-by: Codex <codex@openai.com>
@DVidal1205

Copy link
Copy Markdown
Contributor Author

CI identified that the new announcement table was missing from the explicit development-backup policy. Commit 697df940 classifies it with the rest of the project and judging data that is removed from shared development backups. The complete database suite now passes: 29 files and 147 tests.

@DVidal1205 DVidal1205 changed the title [#534] Add Discord communications for judging rooms [#534] Add judging room communications and announcements Sep 6, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 6

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (4)
packages/db/drizzle/0049_real_redwing.sql-12-12 (1)

12-12: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Reject all-whitespace announcements.

btrim() removes spaces by default, so tab-only and newline-only messages pass this check. Use message ~ '[^[:space:]]' in the migration and packages/db/src/schemas/knight-hacks.ts. Add regression cases for tab-only and newline-only messages.

Source: MCP tools

packages/api/src/routers/judging.ts-681-690 (1)

681-690: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

A Discord outage produces a wrong validation message.

validateJudgingDiscordChannel returns false for any thrown error, including a 429, a 5xx, or a network failure. The officer then reads "Choose a text channel from the configured Knight Hacks server." while the selected channel is valid. Return a distinct outcome for lookup failure and map it to a retry message.

apps/blade/src/app/_components/judging/judging-control-panel.tsx-1039-1049 (1)

1039-1049: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add a fallback branch for other discordDelivery values.

The handler toasts only for "delivered" and "failed". Any other status, for example "not_configured" after the configuration changes between render and click, produces no feedback. The officer sees no result.

🛠️ Proposed fix
                                   if (result.discordDelivery === "delivered") {
                                     toast.success(
                                       "QR sent to current room judges.",
                                     );
                                   } else if (
                                     result.discordDelivery === "failed"
                                   ) {
                                     toast.error(
                                       "The QR is still active, but Discord delivery failed.",
                                     );
+                                  } else {
+                                    toast.error(
+                                      "Connect a Discord channel to send this QR.",
+                                    );
                                   }
apps/blade/src/app/_components/judging/judging-control-panel.tsx-777-778 (1)

777-778: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Show the configured channel when the channel list fails to load.

items={channels.data ?? []} leaves the combobox empty on a query error. ResponsiveComboBox resolves its label by finding value inside items, so the trigger falls back to "Choose a text channel" while the badge still reports "Connected". The officer then cannot see which channel is configured. Add the saved channel id as a fallback item.

🛠️ Proposed fix
-              items={channels.data ?? []}
+              items={
+                channels.data ??
+                (commsChannelId
+                  ? [{ id: commsChannelId, name: commsChannelId }]
+                  : [])
+              }
🧹 Nitpick comments (5)
packages/api/src/utils/judging/discord-comms.ts (1)

676-676: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Accept a gateway parameter for consistency and testability.

Every other exported delivery function takes gateway: JudgingDiscordGateway = liveJudgingDiscordGateway. provisionJudgingRoomThreads does not, so setCommsChannel and provisionRoomThreads in packages/api/src/routers/judging.ts cannot be tested without live Discord calls.

♻️ Proposed signature change
-export async function provisionJudgingRoomThreads(hackathonId: string) {
+export async function provisionJudgingRoomThreads(
+  hackathonId: string,
+  gateway: JudgingDiscordGateway = liveJudgingDiscordGateway,
+) {
@@
-      const threadId = await ensureJudgingRoomThread(room.id);
+      const threadId = await ensureJudgingRoomThread(room.id, gateway);
packages/api/src/tests/integration/judging-access.test.ts (1)

385-390: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make the "not_configured" assertion independent of test order.

This expectation holds only while no earlier test has set judgingCommsChannelId for HACKATHON. The tests at lines 602 and 651 configure that channel and never clear it. Reordering or running this it alone after those tests changes the result. Delete the row for HACKATHON in HackathonJudgingConfiguration, or set judgingCommsChannelId to null, immediately before line 385.

As per path instructions for **/*.test.*: "Check for meaningful descriptions, proper assertions, and no skipped tests without explanation."

Source: Path instructions

packages/api/src/routers/judging.ts (1)

1634-1640: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Pass tx instead of opening a second connection inside the transaction.

resolveCurrentJudgeDisplayNames uses the module-level db, so this call takes a second pool connection while the surrounding transaction holds JudgingRoomPresence FOR UPDATE. Add an executor parameter to resolveCurrentJudgeDisplayNames in packages/api/src/utils/member/display-name.ts and pass tx here.

apps/blade/src/tests/projects/judging-announcements.test.tsx (1)

57-57: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a test for dismissal persistence across mounts.

beforeEach clears sessionStorage, but no test proves that readDismissed suppresses an announcement after a remount. That persistence is the purpose of DISMISSED_KEY. Add a case that dismisses an announcement, unmounts, renders again with the same initialAnnouncements, and asserts the message stays hidden.

As per path instructions: "Test files. Check for meaningful descriptions, proper assertions, and no skipped tests without explanation."

Source: Path instructions

packages/api/src/tests/judging/discord-comms.test.ts (1)

58-62: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert nonce uniqueness.

The test checks only the charset and the length. A constant return value would pass, yet Discord uses the nonce for deduplication, so a repeated nonce drops messages. Add an assertion that separate calls differ.

🛠️ Proposed fix
   it("uses a Discord-safe nonce", () => {
     const nonce = judgingDiscordNonce();
     expect(nonce).toMatch(/^[A-Za-z0-9_-]+$/);
     expect(nonce.length).toBeLessThanOrEqual(25);
+    expect(new Set(Array.from({ length: 50 }, judgingDiscordNonce)).size).toBe(
+      50,
+    );
   });

As per path instructions: "Test files. Check for meaningful descriptions, proper assertions, and no skipped tests without explanation."

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Team

Run ID: 4abc4a72-10b0-444c-ab85-061b377f16dc

📥 Commits

Reviewing files that changed from the base of the PR and between bd97fcc and 2e218a4.

⛔ Files ignored due to path filters (1)
  • packages/api/src/tests/root/__snapshots__/api-surface.test.ts.snap is excluded by !**/*.snap
📒 Files selected for processing (35)
  • .forge/features/judging-discord-comms/spec.md
  • .forge/features/judging-discord-comms/srd.md
  • .forge/features/judging-discord-comms/status.md
  • .forge/features/judging-discord-comms/test-cases.md
  • apps/blade/src/app/_components/judging/guest-name-gate.tsx
  • apps/blade/src/app/_components/judging/judging-announcements.tsx
  • apps/blade/src/app/_components/judging/judging-control-panel.tsx
  • apps/blade/src/app/_components/projects/judge-project-workspace.tsx
  • apps/blade/src/app/_components/shared/authenticated-shell.tsx
  • apps/blade/src/app/judge/layout.tsx
  • apps/blade/src/tests/admin/authenticated-shell.test.tsx
  • apps/blade/src/tests/projects/guest-name-gate.test.tsx
  • apps/blade/src/tests/projects/judging-announcements.test.tsx
  • apps/blade/src/tests/projects/project-judge-privacy.test.tsx
  • docs/DATABASE-USAGE.md
  • packages/api/src/judging-access.server.ts
  • packages/api/src/routers/judging-scores.ts
  • packages/api/src/routers/judging.ts
  • packages/api/src/tests/integration/judging-access.test.ts
  • packages/api/src/tests/judging/discord-comms.test.ts
  • packages/api/src/utils/audit/coverage.ts
  • packages/api/src/utils/judging/discord-comms.ts
  • packages/api/src/utils/judging/principal.ts
  • packages/api/src/utils/member/display-name.ts
  • packages/db/drizzle/0048_little_tarot.sql
  • packages/db/drizzle/0049_real_redwing.sql
  • packages/db/drizzle/meta/0048_snapshot.json
  • packages/db/drizzle/meta/0049_snapshot.json
  • packages/db/drizzle/meta/_journal.json
  • packages/db/src/schemas/knight-hacks.ts
  • packages/db/src/tests/migration-lineage.test.ts
  • packages/ui/src/dialog.tsx
  • packages/validators/src/audit.ts
  • packages/validators/src/judging.ts
  • packages/validators/src/tests/judging.test.ts

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

Comment thread .forge/features/judging-discord-comms/srd.md
Comment thread apps/blade/src/app/_components/judging/judging-announcements.tsx
Comment thread packages/api/src/routers/judging.ts Outdated
Comment thread packages/api/src/utils/judging/discord-comms.ts Outdated
Comment thread packages/api/src/utils/judging/discord-comms.ts Outdated
Comment thread packages/api/src/utils/judging/discord-comms.ts Outdated
Co-authored-by: Codex <codex@openai.com>
@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Co-authored-by: Codex <codex@openai.com>
@DVidal1205

Copy link
Copy Markdown
Contributor Author

Review fixes are pushed in af7dd86. This pass separates Discord delivery from database transactions, preserves room threads during transient Discord failures, serializes room and announcement operations, distinguishes skipped deliveries, hardens announcement dismissal storage, expands migration and boundary tests, and labels guest identity as Full Name. The PR body now includes the new guest dialog capture and updated verification counts. All six inline review threads are resolved.

@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

API Change modifies code in the global API/tRPC package Blade Change modifies code in Blade app Database Change modifies code in the DB package Feature New Feature or Request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add judging room communications and announcements

1 participant