Skip to content

Commit fc7ffad

Browse files
authored
Merge pull request #165 from R3Nexe/dev
Domain Questions & Interview Prep
2 parents 994de1e + bc7570c commit fc7ffad

56 files changed

Lines changed: 10114 additions & 206 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,22 @@ brain/
1111
server/DEPLOYMENT_NOTES.md
1212
CLAUDE.MD
1313
.playwright-mcp/
14-
docs/
1514
.superpowers/sdd/
1615
.claude/
1716
CLAUDE.md
17+
# Added by code-review-graph
18+
.code-review-graph/
19+
.kiro/steering/
20+
.qoder/
21+
.gemini/
22+
.cursor/
23+
.codebuddy/
24+
.cursorrules
25+
.mcp.json
26+
CODEBUDDY.md
27+
GEMINI.md
28+
AGENTS.md
29+
opencode.jsonc
30+
QODER.md
31+
.windsurfrules
32+
docs/superpowers/

CONTEXT.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Algorithm Arena
2+
3+
A platform for running DSA coding-challenge events for a community, built around a
4+
challenge → submission → manual review → scoring lifecycle. This glossary fixes the
5+
vocabulary for **questions, answers, and scoring** — the area most prone to drift now
6+
that questions come in more than one shape.
7+
8+
## Questions
9+
10+
**Question**:
11+
A single prompt a participant answers, stored as a `Challenge` document. Every question
12+
has a `type`. All questions share difficulty, points, and `tags`.
13+
_Avoid_: Problem, task (except "DSA question", see below).
14+
15+
**Type**:
16+
The discriminator on a question: `dsa`, `mcq`, or `written`. Determines how it is
17+
answered, graded, and displayed. Defaults to `dsa`.
18+
19+
**DSA question**:
20+
A `type: dsa` question answered with code, run against test cases via Judge0, then
21+
manually reviewed. The original and only pre-existing question shape.
22+
_Avoid_: Coding challenge, algorithm problem.
23+
24+
**Domain question**:
25+
The umbrella for `mcq` and `written` questions — interview-style questions about a
26+
subject area rather than code. Lives in a standalone pool, not in a Question Set.
27+
_Avoid_: Theory question, quiz question.
28+
29+
**MCQ question**:
30+
A `type: mcq` domain question with a fixed set of `options` and exactly one
31+
`correctOption`. Auto-graded server-side.
32+
_Avoid_: Poll, single-choice.
33+
34+
**Written question**:
35+
A `type: written` domain question answered in prose, carrying a `modelAnswer`. The
36+
learner self-assesses against the model answer; a reviewer separately scores it.
37+
_Avoid_: Essay, long-answer, subjective question.
38+
39+
**Question Set**:
40+
A weekly, deadline-bound collection of DSA questions with a target level. Domain
41+
questions are **not** part of any Question Set.
42+
_Avoid_: Assignment, batch, week.
43+
44+
**Interview Prep**:
45+
The participant-facing area where the standalone domain-question pool is browsed by
46+
`tags` and answered. Distinct from Missions (the DSA/Question-Set area).
47+
48+
## Answering & mastery
49+
50+
**Submission**:
51+
A record of one participant answering one question — code, a selected MCQ option, or
52+
written prose — carrying a review status and the points actually awarded.
53+
54+
**Mastery status**:
55+
A participant's per-question state, held in `DomainProgress`: `Unattempted`,
56+
`NeedsReview`, or `Mastered`. Independent of points.
57+
_Avoid_: Progress, completion, done.
58+
59+
**Needs-review**:
60+
The mastery status of a domain question the participant got wrong (MCQ) or self-marked
61+
as not-yet-understood (written). Resurfaces after a cooldown.
62+
_Avoid_: Failed, incorrect, pending.
63+
64+
**Mastered**:
65+
The mastery status of a domain question answered correctly (MCQ) or self-marked as
66+
understood (written). Still viewable, no longer resurfaced.
67+
68+
**Self-assessment**:
69+
For written questions only: the participant's own *Got it* / *Review later* judgement
70+
after seeing the model answer. Drives mastery status, never points.
71+
72+
**Cooldown**:
73+
The lock period before a Needs-review question may be re-attempted. Escalates by
74+
doubling per wrong/missed attempt (2 → 4 → 8 … days), capped once no points remain
75+
to earn.
76+
_Avoid_: Timeout, delay, wait.
77+
78+
## Scoring
79+
80+
**Full points**:
81+
A question's base award, derived from its difficulty (Easy/Medium/Hard). The starting
82+
value the MCQ decay halves and the amount a written approval grants.
83+
84+
**Decayed award**:
85+
The MCQ points for a correct answer on attempt _n_: `round(fullPoints / 2^(n-1))`,
86+
dropping to 0 once it would fall below 5. Anti-farming device unique to auto-graded
87+
MCQ.
88+
_Avoid_: Penalty, discount.
89+
90+
**Awarded points**:
91+
The points a Submission actually granted (a decayed award, full points, or 0) — as
92+
distinct from the question's full points. Recorded on the Submission.
93+
94+
**Domain-mastered count**:
95+
A participant's tally of mastered domain questions, tracked separately from
96+
`solvedProblems` so domain badges and DSA badges stay independent.
97+
_Avoid_: Solved (that term is reserved for DSA `solvedProblems`).

admin-client/src/index.css

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
/* Default Stack Imports: Inter (Body), Michroma & Orbitron (Headings) */
99
@import url("https://rsms.me/inter/inter.css");
1010
@import url('https://fonts.googleapis.com/css2?family=Michroma&family=Orbitron:wght@400..900&display=swap');
11+
@import url('https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,400;1,200&family=Work+Sans:ital,wght@0,100..900;1,100..900&display=swap');
1112

1213
/* Additional Alternative Premium Fonts (Pre-imported for easy testing): */
1314
/*
@@ -18,9 +19,9 @@
1819
- Syne: Expressive, artistic headline font
1920
- Montserrat: Bold, high-character sans-serif
2021
*/
21-
@import url('https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,400;1,200&family=Work+Sans:ital,wght@0,100..900;1,100..900&display=swap');
2222

23-
/* Tailwind Engine Directives */
23+
/*
24+
*/
2425
@tailwind base;
2526
@tailwind components;
2627
@tailwind utilities;
@@ -620,6 +621,7 @@ samp,
620621
}
621622
}
622623

624+
623625
/* Recent Activity Icon Glow in Dark Mode */
624626
[data-theme="dark"] .recent-activity-icon {
625627
filter: drop-shadow(0 0 6px rgba(var(--accent-rgb), 0.75));
@@ -638,6 +640,7 @@ samp,
638640
color: #25D366 !important;
639641
border-color: #25D366 !important;
640642
background-color: rgba(37, 211, 102, 0.1) !important;
643+
/* Default Stack Imports: Inter (Body), Michroma & Orbitron (Headings) */
641644
}
642645

643646
.social-instagram:hover {
@@ -724,9 +727,6 @@ samp,
724727
/* 1. IMPORT GOOGLE FONTS & CUSTOM FONTS
725728
Uncomment or add imports below to easily test different styling. */
726729

727-
/* Default Stack Imports: Inter (Body), Michroma & Orbitron (Headings) */
728-
@import url("https://rsms.me/inter/inter.css");
729-
@import url('https://fonts.googleapis.com/css2?family=Michroma&family=Orbitron:wght@400..900&display=swap');
730730

731731
/* Additional Alternative Premium Fonts (Pre-imported for easy testing): */
732732
/*
@@ -737,7 +737,6 @@ samp,
737737
- Syne: Expressive, artistic headline font
738738
- Montserrat: Bold, high-character sans-serif
739739
*/
740-
@import url('https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,400;1,200&family=Work+Sans:ital,wght@0,100..900;1,100..900&display=swap');
741740

742741
/* Tailwind Engine Directives */
743742
@tailwind base;
@@ -1434,5 +1433,3 @@ samp,
14341433
animation: slideRightIn 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards;
14351434
}
14361435
}
1437-
1438-

admin-client/src/pages/AdminPanel.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import PageHeader from '../components/PageHeader';
1212
// --- Subcomponents for Tabs ---
1313
import DashboardTab from './admin/DashboardTab';
1414
import QuestionSetsTab from './admin/QuestionSetsTab';
15+
import DomainQuestionsTab from './admin/DomainQuestionsTab';
1516

1617
import ClanManagerTab from './admin/ClanManagerTab';
1718
import ResourcesTab from './admin/ResourcesTab';
@@ -20,7 +21,7 @@ import ReviewTab from './admin/ReviewTab';
2021

2122
const AdminPanel = () => {
2223
const [searchParams] = useSearchParams();
23-
const validTabs = ['dashboard', 'review', 'sets', 'clans', 'resources', 'members'];
24+
const validTabs = ['dashboard', 'review', 'sets', 'domain', 'clans', 'resources', 'members'];
2425
const initialTab = validTabs.includes(searchParams.get('tab')) ? searchParams.get('tab') : 'dashboard';
2526
const [activeTab, setActiveTab] = useState(initialTab);
2627
const [initialClanFilter, setInitialClanFilter] = useState('');
@@ -29,6 +30,7 @@ const AdminPanel = () => {
2930
{ id: 'dashboard', label: 'Overview', icon: FiActivity },
3031
{ id: 'review', label: 'Review Work', icon: FiEye },
3132
{ id: 'sets', label: 'Question Sets', icon: FiCode },
33+
{ id: 'domain', label: 'Domain Questions', icon: FiFileText },
3234

3335
{ id: 'clans', label: 'Clan Manager', icon: FiShield },
3436
{ id: 'resources', label: 'Resources', icon: FiFolder },
@@ -85,6 +87,7 @@ const AdminPanel = () => {
8587
{activeTab === 'dashboard' && <DashboardTab setActiveTab={setActiveTab} setInitialClanFilter={setInitialClanFilter} />}
8688
{activeTab === 'review' && <ReviewTab />}
8789
{activeTab === 'sets' && <QuestionSetsTab />}
90+
{activeTab === 'domain' && <DomainQuestionsTab />}
8891

8992
{activeTab === 'clans' && <ClanManagerTab />}
9093
{activeTab === 'resources' && <ResourcesTab />}

0 commit comments

Comments
 (0)