You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CENTRAL.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,6 +33,7 @@ Stack: Next.js, NextAuth (Google + dev bypass), Prisma, KaTeX for math, Lucide i
33
33
34
34
### Recently landed
35
35
36
+
-**Custom problem tags** — create and edit forms accept arbitrary comma-separated set and question tags in addition to the suggested chips. Custom set tags become named, filterable categories in the problem-set catalog instead of collapsing into `Others`; question tags remain independent and become Practice topics after more than 10 published, unsolved questions use them. Tag aliases and casing still normalize through `lib/problem-tags.ts`; no schema or deploy change is required.
36
37
-**Evidence-aware performance analytics** — the old points-weighted best average and duplicated leaderboard score are replaced by one derived `PerformanceProfile` in `lib/analytics.ts`. Mastery Index combines a three-set-prior proficiency score (65%), square-root visible-set breadth (20%), and a smoothed lower-quartile consistency floor (15%); best-set average, mastery rate, counts, and evidence remain visible. Dashboard, profiles, settings, student admin/detail, global analytics leaders, leaderboard, and student CSV use the same helper. `npm run simulate:performance` validates a deterministic 100-student × 100-set cohort: `0.980` ability/index rank correlation, 89 distinct values, monotonic ability deciles, and broad 80% performance outranking one perfect result. No schema/deploy change is required (sources: `lib/analytics.ts`, `scripts/simulate-performance-model.ts`, `tests/analytics.test.ts`, `docs/performance-model.md`).
37
38
- **Attempt review** — `/attempts/[id]` presents a DBSOJ-inspired submission summary and dense expandable question rows with correct/incorrect/skipped state, submitted and normalized answers, accepted answers, awarded marks, topic, statement/assets, grader notes, and explanations. The route is owner-only for ordinary students and permits staff with `admin:analytics`; unauthorized attempt IDs return 404. Review links appear immediately after submit, on solved-set locks and set attempt history, on student dashboard history, and in student/per-set admin analytics. Pure summary/status helpers live in `lib/attempt-review.ts`, and `proxy.ts` now includes `/attempts/:path*`. Local Chrome QA covered student submission, expansion, light/dark rendering, history discovery, horizontal overflow, and cross-student denial. The local-only bypass controls are again surfaced when `AUTH_DEV_BYPASS=true` (sources: `app/attempts/[id]/page.tsx`, `app/problem-sets/[slug]/answer-grid.tsx`, `app/problem-sets/[slug]/page.tsx`, `app/dashboard/page.tsx`, `app/admin/students/[id]/page.tsx`, `app/admin/sets/[id]/analytics/page.tsx`, `app/page.tsx`, `proxy.ts`).
38
39
- **Application-wide safety and maintainability pass** — all API JSON/multipart bodies now use bounded streamed readers and route-specific schemas; auth uses exact school-domain matching and an explicit non-production bypass opt-in; staff routing and private-profile/leaderboard authorization use the documented permissions. Submission, friendship, role mutation, problem-set asset, and FTW room transitions are race-safe; FTW room codes use cryptographic randomness. Grading preserves exact large integer/fraction/decimal identity instead of collapsing through IEEE-754. Imports stage storage before atomic metadata attachment, server and browser ZIP paths enforce actual expanded-byte limits, replacement/deletion paths compensate for failures, and file reads verify size/checksum under hard limits. Exports/restores are paginated and capped, CSV formula cells are neutralized, expensive GETs reject cross-site browser requests, and formerly unbounded assignment/practice-tag scans are computed in bounded SQL. Formerly floating `latest` dependencies are pinned, full and production dependency audits report zero vulnerabilities, and response security headers are enabled. The UI, feature set, and database schema are unchanged. Regression coverage spans 29 test files/195 tests, including policy, body, grading, concurrency, storage, and import cases.
Copy file name to clipboardExpand all lines: docs/admin-guide.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,9 +11,11 @@
11
11
1. Click **Create Set** in the sidebar.
12
12
2. Fill out the set title, slug, topic tags, and settings.
13
13
-**Order ID:** The identifier shown in the set grid (e.g. `1`, `2`, `20212`, `A1`). Accepts any text and uses natural sorting, so `2` appears before `10`. If left blank, the system assigns the next available number.
14
+
-**Set tags:** Enter comma-separated names or use the suggested chips. New names are created when the set is saved and become filterable categories in the problem-set catalog.
14
15
-**Tests tag:** Use the set tag `Tests` for school test papers that have 20 problems with levels `(1)`, `(2)`, and `(3)`. Store these as 60 answerable questions so the student page renders a grouped 20×3 answer sheet.
15
16
3. Add problems one-by-one, including statement, answer type, and answer key.
16
17
-**Problem Number:** A positive integer (e.g. 1, 2, 3). If you leave it as-is, new problems default to sequential numbers.
18
+
-**Question tags:** Enter any comma-separated names to create or reuse Practice topics. A topic appears in Practice after more than 10 published, unsolved questions use that tag.
17
19
4. For each problem, use the **LaTeX / HTML** toggle next to the statement field.
18
20
- Use **LaTeX** for `$...$`/`$$...$$` style input.
19
21
- Table environments (`tabular`, `tabular*`, `tabularx`, and `longtable`) and chemistry with `\ce{...}` are supported through the compatibility renderer; see [LaTeX rendering support](./latex-support.md).
0 commit comments