Skip to content

[#570] Improve pre-hack judging operations - #571

Merged
DVidal1205 merged 4 commits into
mainfrom
codex/judging-reset-checklist
Sep 13, 2026
Merged

DVidal1205 merged 4 commits into
mainfrom
codex/judging-reset-checklist

Conversation

@DVidal1205

Copy link
Copy Markdown
Contributor

Why

KH IX judging needed a setup and recovery workflow that officers could use before judges entered rooms. The existing command center mixed configuration order, occupied space with persistent warning cards, and lacked complete cleanup controls for rehearsal data. Hacker management also lacked a Checked-In view and safe bulk deletion.

What

Closes: #570

Command center flow

  • Reorders the workspace into Projects, Rubric, Rooms, Schedule, Launch, Evaluations, and Reset.
  • Adds an eight-step launch checklist with live completion state and links to the matching tab or section.
  • Compacts project inventory count, visibility, import, deletion, search, filters, sorting, and pagination into one control panel.
  • Keeps the checklist and hackathon selector aligned without recentering the tab strip.

Cleanup and recovery

  • Adds direct reset actions for projects, challenge and rubric setup, rooms and access, schedules, evaluations, and launch settings.
  • Adds a typed full reset that removes every judging-owned row for one hackathon and restores launch toggles to defaults.
  • Makes project reset clear claims, project deliberation entries, inventory locks, imported challenges, and project records after dependent slices are removed.
  • Makes schedule reset remove both a saved schedule and generated preview jobs while preserving the permanent first-result lock.
  • Adds permanent individual room deletion with reservation checks and typed confirmation.

Hacker operations

  • Adds Checked-In as a roster filter and status count.
  • Adds a Checked-In bulk action that records attribution and sends no email.
  • Adds permanent hacker application deletion to the detail dialog and multi-select action bar.
  • Keeps deletion separate from status transitions, previews exact targets, skips blacklisted applicants for delegated editors, and allows officers to remove them.
  • Preserves reusable profiles, revisions, and accounts while removing orphaned legacy hacker snapshots.

Operator feedback

  • Moves scheduler failures into a dialog so they do not shift the schedule workspace.
  • Replaces translucent room announcement cards with compact neutral alerts; urgent judge announcements remain blocking dialogs.
  • Keeps destructive actions disabled when the owned slice is empty or permanently locked.

No database schema, dependency, environment variable, or production deployment changes are included.

Test Plan

  • pnpm verify:precommit passed: React analysis, formatting, lint, and all 33 workspace typecheck tasks.
  • pnpm build passed: all 21 workspace build tasks.
  • Targeted API suite passed: 178 tests covering reset transactions, permission denial, FK order, inventory locks, schedule previews, hacker deletion, blacklist rules, no-email check-in, audit coverage, and API shape.
  • Targeted Blade suite passed: 41 tests covering mutation routing, destructive confirmations, action grouping, filters, reset availability, room announcements, and challenge setup.
  • Manual Playwright passes covered desktop and mobile command-center layouts, checklist and reset dialogs, scheduler errors, room deletion, announcements, Checked-In filtering, bulk deletion, individual deletion, and authenticated judge hackathon selection with no page errors.
  • Production diagnosis confirmed the authenticated judge project page, historical hackathon dropdown, and guest activation redirect use the public Blade origin.
  • Standard Forge review completed with API, React, and test-quality reviewers. The follow-up review found no remaining production issues.

Visual evidence

Screenshots are attached in the PR discussion so they remain outside the repository.

Checklist

  • Database: No schema changes, OR I ran pnpm db:generate and committed the generated files in packages/db/drizzle/
  • Environment Variables: No environment variables changed, OR I have contacted the Development Lead to modify them on Coolify BEFORE merging.

Co-authored-by: Codex <codex@openai.com>
@DVidal1205 DVidal1205 added Feature New Feature or Request Major Big change - 2+ reviewers required Blade Change modifies code in Blade app API Change modifies code in the global API/tRPC package labels Sep 13, 2026
@DVidal1205 DVidal1205 self-assigned this Sep 13, 2026
Co-authored-by: Codex <codex@openai.com>
@DVidal1205

Copy link
Copy Markdown
Contributor Author

Visual review

1. Compact Projects workspace

Project totals, inventory visibility, import, deletion, search, filters, sorting, and pagination now share one control panel. This removes the redundant active-inventory card and keeps the checklist aligned with the hackathon selector while the setup tabs stay left-aligned.

judging-command-center-desktop

2. Desktop launch checklist

The checklist turns setup into an ordered path. Each step links to its exact workspace and becomes green only when its prerequisite is ready.

judging-checklist-desktop

3. Granular reset workspace

Every judging-owned resource uses the same direct Reset action. Full reset remains visually separate because it spans every slice and restores launch settings.

judging-reset-desktop

4. Full judging reset confirmation

The dialog names everything that will be removed and requires the hackathon name before the destructive action is enabled.

judging-full-reset-dialog

5. Mobile reset workspace

Reset controls collapse into a single readable column without hiding scope or confirmation language.

judging-reset-mobile

6. Mobile launch checklist

The ordered checklist stays usable on a narrow viewport and preserves the same completion state and deep links.

judging-checklist-mobile

7. Authenticated judge hackathon selector

Authenticated judges retain a hackathon dropdown, so current and historical project inventories remain available from the same page.

judge-projects-dropdown

8. Routine room announcement

Non-urgent room updates use a compact neutral alert instead of a translucent orange card, avoiding a large visual interruption.

judging-routine-announcement

9. Scheduler failure dialog

Inventory-fit failures move into a dialog, preserving the schedule layout and giving the operator a focused explanation to dismiss.

judging-scheduler-alert-dialog

10. Room deletion confirmation

Each room has a permanent delete action with typed confirmation and reservation safeguards.

judging-room-delete-dialog

11. Checked-In status filter

Checked-In is available as a first-class roster status filter alongside the existing application states.

hackers-checked-in-filter

12. Checked-In roster view

The status view exposes the checked-in count and the people currently expected to participate in judging.

hackers-checked-in-view

13. Bulk destructive action

Delete selected hackers is a separate action rather than a fake status transition; the Actions label makes that grouping explicit.

hackers-bulk-delete-action

14. Bulk hacker deletion preview

The confirmation previews exact targets and skipped applicants before any permanent deletion runs.

hackers-bulk-delete-dialog

15. Individual hacker deletion

The same permanent delete operation is available from each hacker dialog, with destructive styling and explicit scope.

hackers-individual-delete-action

@coderabbitai

coderabbitai Bot commented Sep 13, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Warning

Review limit reached

Next included review available in 25 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: Advanced

Run ID: 25e4cefc-30d5-4895-a95b-d41266c0e981

📥 Commits

Reviewing files that changed from the base of the PR and between 541016b and 2034640.

📒 Files selected for processing (3)
  • .forge/features/hacker-management/srd.md
  • apps/blade/src/app/_components/admin/hackathon/hackers/bulk-confirm-dialog.tsx
  • apps/blade/src/tests/admin/bulk-confirm-dialog.test.ts
📝 Walkthrough

Walkthrough

The pull request adds officer-only judging reset and room-deletion workflows with typed confirmations, audit events, readiness data, and a reorganized command center. It also adds Checked-In filtering and bulk transitions, permanent individual and bulk hacker application deletion, blacklist safeguards, and no-email handling. UI components, validators, API procedures, audit coverage, and integration tests are updated for both feature areas.

Priority: ➖ Normal

Severity of issue fixed: Medium

Merge Risk: 🔵 Low · up to 54101

The remaining issues are limited to bulk-operation documentation accuracy and singular deletion wording. They do not affect reset, deletion, authorization, or scheduler behavior.

🚥 Pre-merge checks | ✅ 7 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 34 files. (6 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 the required issue number, stays under 72 characters, and accurately describes the judging operations changes.
Description check ✅ Passed The description directly covers the judging command center, reset workflows, hacker management changes, permissions, testing, and deployment scope.
Linked Issues check ✅ Passed [#570] The PR implements the command-center setup flow and readiness checklist, granular and typed full resets, reservation-safe room deletion, compact announcement and scheduler warnings, Checked-In …
Out of Scope Changes check ✅ Passed The changed application code, tests, validators, audit policies, and feature documentation directly support [#570]. The PR makes no reported schema, dependency, environment, deployment, or unrelated p…
No Hardcoded Secrets ✅ Passed No changed file contains a credential-shaped API key, password, token, or secret literal. The only added token fields are deterministic test placeholders using "a".repeat(64), "c".repeat(64), and …
Validated Env Access ✅ Passed No new direct process.env usage was introduced. The only occurrence in a changed source path is pre-existing in packages/api/src/tests/integration/hacker-guards.test.ts; the added diff contains no…
No Typescript Escape Hatches ✅ Passed No TypeScript escape hatches were introduced. Added-line scans across the reviewed diff found no standalone any type, @ts-ignore, @ts-expect-error, or non-null assertion. Structural scans of all…
Full details: Docstring Coverage

Explanation

Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 34 files. (6 skipped: 6 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 codex/judging-reset-checklist

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.

@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: 2

Note

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

🟡 Other comments (6)
apps/blade/src/tests/admin/bulk-confirm-dialog.test.ts-96-96 (1)

96-96: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Handle the singular application label.

This assertion preserves the user-facing text Delete 1 applications. Pluralize the noun in bulkActionCopy and expect Delete 1 application here.

apps/blade/src/app/_components/judging/judging-reset-panel.tsx-255-255 (1)

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

Invalidate judging queries after a reset.

JudgingResetPanel.confirm calls router.refresh(), which refreshes server components but does not invalidate the tRPC cache. JudgingControlPanel and JudgingSchedulePanel therefore keep stale judging.listAdmin and judging.listScheduleAdmin data until their polling intervals run.

+  const utils = api.useUtils();
...
       setAction(null);
+      await Promise.all([
+        utils.judging.listAdmin.invalidate({ hackathonId: data.hackathon.id }),
+        utils.judging.listScheduleAdmin.invalidate({
+          hackathonId: data.hackathon.id,
+        }),
+      ]);
       router.refresh();
apps/blade/src/app/_components/judging/judging-schedule-panel.tsx-552-552 (1)

552-552: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reset dismissal after refresh recovery.

dismissedAlert retains refresh:${message} after query.error clears. A later failure with the same message does not reopen the dialog. Clear dismissedAlert when alertKey becomes null.

Proposed fix
   const diagnostics = (failedJob?.diagnostics ?? []).map((message) =>
     data.source.tasks.reduce(
       // ...
     ),
   );
+
+  useEffect(() => {
+    if (alertKey === null) setDismissedAlert(null);
+  }, [alertKey]);
apps/blade/src/app/_components/admin/hackathon/hackers/bulk-confirm-dialog.tsx-121-127 (1)

121-127: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the submitted status in the success callback.

Cancel and the dialog close button remain enabled while statusConfirm is pending. Closing clears action, but BulkConfirmDialog remains mounted. The success callback can then see action === null and report that email is queued for a submitted checkedin request. Use the mutation variables.

-    onSuccess: (result) => {
+    onSuccess: (result, variables) => {
...
-      if (action === "checkedin") {
+      if (variables.status === "checkedin") {
.forge/features/hacker-management/srd.md-204-205 (1)

204-205: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the documented procedure shapes.

hackerRosterListSchema defines filter, cursor, and limit at the top level. hackerRosterCountsSchema defines filter at the top level. Document search and status inside filter, and include the list cursor:

listForHackathon: query({hackathonId, filter?, cursor?, limit?}) → page
statusCounts: query({hackathonId, filter?}) → count per status

.forge/features/judging-command-center-reset/status.md-24-24 (1)

24-24: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Complete the owner screenshot approval.

The feature checklist requires desktop/mobile screenshots to be shown before opening the PR. status.md also requires current task and phase tracking. Show the captures to the owner, record the approval, and then update the checklist and phase.

🧹 Nitpick comments (1)
.forge/features/judging-command-center-reset/srd.md (1)

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

Add judging.resetProjects to the tRPC behavior list.

The router adds resetProjects in packages/api/src/routers/judging.ts. It deletes deliberation entries, claims, projects, and non-group challenges, and it blocks while schedule, job, room, or evaluation data exists. The SRD list omits it.

📝 Proposed addition
 - `judging.dropRooms`: deletes all rooms and room-scoped access data after the schedule is gone.
+- `judging.resetProjects`: deletes deliberation entries, claims, projects, and non-group challenges, and clears inventory-lock metadata after schedules, jobs, rooms, and evaluations are gone.
 - `judging.resetSetup`: restores starter groups and clears the rubric after downstream rooms, schedules, and feedback are gone.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Advanced

Run ID: ea42e46f-6c95-43ba-9414-2e53b293da33

📥 Commits

Reviewing files that changed from the base of the PR and between c23ab5e and 5a048f5.

⛔ 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 (42)
  • .forge/features/hacker-management/spec.md
  • .forge/features/hacker-management/srd.md
  • .forge/features/hacker-management/status.md
  • .forge/features/hacker-management/test-cases.md
  • .forge/features/judging-command-center-reset/spec.md
  • .forge/features/judging-command-center-reset/srd.md
  • .forge/features/judging-command-center-reset/status.md
  • .forge/features/judging-command-center-reset/test-cases.md
  • apps/blade/src/app/_components/admin/hackathon/hackers/bulk-confirm-dialog.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-detail-dialog.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-filters.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-roster.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-table.tsx
  • apps/blade/src/app/_components/judging/judging-announcements.tsx
  • apps/blade/src/app/_components/judging/judging-configuration-panel.tsx
  • apps/blade/src/app/_components/judging/judging-control-panel.tsx
  • apps/blade/src/app/_components/judging/judging-launch-checklist.tsx
  • apps/blade/src/app/_components/judging/judging-reset-panel.tsx
  • apps/blade/src/app/_components/judging/judging-schedule-panel.tsx
  • apps/blade/src/app/_components/judging/project-command-center.tsx
  • apps/blade/src/app/_components/projects/admin-project-workspace.tsx
  • apps/blade/src/app/_components/projects/project-directory.tsx
  • apps/blade/src/app/admin/judging/page.tsx
  • apps/blade/src/tests/admin/bulk-confirm-dialog.test.ts
  • apps/blade/src/tests/admin/hacker-detail-dialog.test.tsx
  • apps/blade/src/tests/admin/hacker-filter-facets.test.ts
  • apps/blade/src/tests/admin/hacker-roster-actions.test.tsx
  • apps/blade/src/tests/projects/challenge-configuration-panel.test.tsx
  • apps/blade/src/tests/projects/judging-announcement-editor.test.tsx
  • apps/blade/src/tests/projects/judging-reset-panel.test.tsx
  • packages/api/src/routers/hacker.ts
  • packages/api/src/routers/judging-schedule.ts
  • packages/api/src/routers/judging.ts
  • packages/api/src/tests/hacker/access.test.ts
  • packages/api/src/tests/integration/hacker-guards.test.ts
  • packages/api/src/tests/integration/judging-reset.test.ts
  • packages/api/src/utils/audit/coverage.ts
  • packages/api/src/utils/hacker/access.ts
  • packages/validators/src/audit.ts
  • packages/validators/src/hackers.ts
  • packages/validators/src/judging.ts
  • packages/validators/src/tests/hackers.test.ts

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

Comment thread packages/api/src/routers/hacker.ts
Co-authored-by: Codex <codex@openai.com>
@DVidal1205

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Review follow-up in 541016b:

  • Checked-In rows, counts, details, and selection results are now officer-only at the API boundary; Blade also hides that tab for non-officers.
  • Bulk deletion is bound to the exact IDs shown in preview and rejects eligibility drift before deleting anything.
  • The grouped follow-ups are covered: singular copy, tRPC invalidation after reset, repeat scheduler errors after recovery, mutation-variable success messaging, corrected procedure docs, recorded owner approval, and resetProjects documentation.
  • Authenticated judge hackathon selection is pre-existing behavior from [#567] Fix pre-event judging setup and access #568. It is covered by apps/blade/src/tests/judging/prod-flow-regressions.test.tsx in “lets an authenticated judge select a past hackathon” and shown in screenshot 7 of the visual review.

Validation: 170 focused API tests, 29 focused Blade tests, 22 validator tests, the full pre-commit gate, and all 21 builds passed.

@coderabbitai

coderabbitai Bot commented Sep 13, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

git show --stat --oneline 541016bf
git diff 541016bf^ 541016bf -- \
  packages/api/src/routers/hacker.ts \
  packages/api/src/routers/judging.ts \
  apps/blade/src/app/_components/admin/hackathon/hackers \
  apps/blade/src/app/_components/judging \
  apps/blade/src/tests/judging/prod-flow-regressions.test.tsx \
  packages/api/src/tests/integration/hacker-guards.test.ts \
  packages/api/src/tests/integration/judging-reset.test.ts

for f in \
  packages/api/src/routers/hacker.ts \
  apps/blade/src/app/_components/admin/hackathon/hackers/hacker-roster.tsx \
  apps/blade/src/app/_components/admin/hackathon/hackers/hacker-filters.tsx \
  apps/blade/src/app/_components/judging/judging-reset-panel.tsx \
  apps/blade/src/app/_components/judging/judging-schedule-panel.tsx \
  apps/blade/src/tests/judging/prod-flow-regressions.test.tsx
do
  if [ -f "$f" ]; then
    echo "=== OUTLINE: $f ==="
    ast-grep outline "$f" --items all || true
  fi
done

echo "=== CHECKED-IN / BULK DELETE REFS ==="
rg -n -C 4 -P 'checkedin|previewBulkDelete|confirmBulkDelete|eligibility drift|eligible' \
  packages/api/src/routers/hacker.ts \
  apps/blade/src/app/_components/admin/hackathon/hackers \
  packages/api/src/tests/integration/hacker-guards.test.ts

echo "=== RESET INVALIDATION / SCHEDULER ALERT REFS ==="
rg -n -C 4 -P 'invalidate|dismissedAlert|alertKey|failedJob|dropSchedule|resetProjects' \
  apps/blade/src/app/_components/judging \
  packages/api/src/routers/judging.ts \
  packages/api/src/tests/integration/judging-reset.test.ts

echo "=== JUDGE SELECTOR TEST REFS ==="
rg -n -C 4 -F 'lets an authenticated judge select a past hackathon' apps/blade/src/tests/judging/prod-flow-regressions.test.tsx

Length of output: 80025


@DVidal1205 No additional concrete problem was found in the inspected follow-up.

⚠️ 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 13, 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.

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

Note

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

Caution

Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

⚠️ Outside diff range comments (1)
apps/blade/src/app/_components/admin/hackathon/hackers/bulk-confirm-dialog.tsx (1)

226-226: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the singular noun for one deleted application.

When one application is affected, this renders Delete 1 applicants. Use application when deleting is true and the count is one.

🟡 Other comments (1)
.forge/features/hacker-management/srd.md-207-208 (1)

207-208: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the stale previewVersion claim from the bulk-status prose.

hackerBulkPreviewSchema contains only attendeeIds, hackathonId, and status, and both previewBulk and confirmBulk use it. The router does not use or return previewVersion; confirmBulk re-resolves the selected rows. Update the SRD prose to describe this intentional distinction instead of adding previewVersion to both procedures.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Advanced

Run ID: 82eea738-d044-4f7a-933a-56686944d507

📥 Commits

Reviewing files that changed from the base of the PR and between 5a048f5 and 541016b.

📒 Files selected for processing (19)
  • .forge/features/hacker-management/spec.md
  • .forge/features/hacker-management/srd.md
  • .forge/features/hacker-management/status.md
  • .forge/features/hacker-management/test-cases.md
  • .forge/features/judging-command-center-reset/srd.md
  • .forge/features/judging-command-center-reset/status.md
  • apps/blade/src/app/_components/admin/hackathon/hackers/bulk-confirm-dialog.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-filters.tsx
  • apps/blade/src/app/_components/admin/hackathon/hackers/hacker-roster.tsx
  • apps/blade/src/app/_components/judging/judging-reset-panel.tsx
  • apps/blade/src/app/_components/judging/judging-schedule-panel.tsx
  • apps/blade/src/tests/admin/bulk-confirm-dialog.test.ts
  • apps/blade/src/tests/admin/hacker-filter-facets.test.ts
  • apps/blade/src/tests/projects/judging-reset-panel.test.tsx
  • packages/api/src/routers/hacker.ts
  • packages/api/src/tests/hacker/access.test.ts
  • packages/api/src/tests/integration/hacker-guards.test.ts
  • packages/validators/src/hackers.ts
  • packages/validators/src/tests/hackers.test.ts

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

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

Copy link
Copy Markdown
Contributor Author

Addressed the two final review notes in 2034640: the delete dialog now uses singular/plural application wording and the SRD now documents the actual bulk-status and stricter bulk-deletion confirmation behavior. Added a heading regression assertion; focused Blade tests, pnpm verify:precommit, and pnpm build pass.

@DVidal1205
DVidal1205 added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit 60dd61b Sep 13, 2026
13 checks passed
@DVidal1205
DVidal1205 deleted the codex/judging-reset-checklist branch September 13, 2026 22:36
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 Feature New Feature or Request Major Big change - 2+ reviewers required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve pre-hack judging controls and hacker operations

1 participant