Repository navigation
How Grading Works
This page explains exactly how a daily-practice grade is calculated when you push grades to PowerSchool (or export a CSV). Read it before your first real grade push. Work-Based Learning grades work differently and are covered separately — see below and the Work-Based Learning Guide.
Grades are computed on demand for a class and a date range ("the window"), one day at a time and then averaged — nothing is stored, and the number is recomputed every time you push or export.
Set once, in Classes → Gradebook Settings (they apply to all your classes):
| Setting | Symbol below | Meaning |
|---|---|---|
| Assignment Max Score | MAX |
Point value of a full-credit assignment. |
| Completion Score (%) | COMPLETION% |
The floor, as a percent of MAX, for a day where the student did some but not all of that day's requirement. |
| No Submission Score (%) | NOSUB% |
The exact grade for a day the student submitted nothing, and for a student who isn't linked to an app account at all. |
The requirement (e.g. "SAT English, 2 / day") is a per-day target, so the server grades
each day in the window separately, then averages the days together — it does not sum
the whole window into one actual vs. one required ratio.
For each linked, enrolled student:
-
Build the set of graded days: every day the class met (from pulled PS attendance; see section meeting exceptions) that falls inside the student's own enrolled slice of the window, minus any day excused by that student's PS attendance code (see Absences). If a class has no attendance pulled at all, every calendar day in the student's enrolled slice is used instead.
If this set ends up empty — every day in the student's enrolled slice was excused, or the enrollment doesn't overlap the window at all — the student is exempt. No score row is written for them; they simply don't appear in the push.
-
For each graded day, compute that day's
actual(qualifying submissions on that date, see what counts) against that day'srequired(the class's per-day count(s) — see multiple classes for howrequired/actualcombine when a class requires more than one activity), and turn it into a day grade:if actual == 0: dayGrade = round(MAX * NOSUB% / 100) # did nothing that day elif actual < required: dayGrade = max( round(actual / required * MAX), round(MAX * COMPLETION% / 100) ) # partial day: floored at Completion Score else: dayGrade = MAX # met/exceeded that day: full credit -
The pushed
gradeis the average of every day grade in the set, rounded, capped atMAX.
So: a day the student fully met earns MAX. A day with nothing submitted earns exactly
the No Submission Score. A day with some work lands on that day's actual / required
fraction of MAX, but never below the Completion Score. The final grade is the mean of
all those day grades over the days that counted.
| Required activity | A submission counts when… |
|---|---|
| KenKen | its score is ≥ the student's all-time average KenKen score. (The bar is the student's own global average; the count is limited to this class.) |
| SAT Math | the answer was correct (default mode; see SAT accuracy mode below). |
| SAT English | the answer was correct (default mode; see SAT accuracy mode below). |
| Ruler Game | the answer was correct. |
| Projections | the answer was correct. |
If the class requires more than one activity, each day's required/actual are the
sums across those activities for that day. In "either" mode (no activity
checked), each day's required/actual are the larger of that day's KenKen and SAT
English figures — doing one well is enough for that day.
When the class's SAT Requirement is set to Number correct + accuracy (see
Daily Practice & Assignments), the SAT
Math and SAT English required is still the Correct / Day count (call it C), but
actual works differently:
- A day where the student reached
Ccorrect with at least the Minimum Accuracy over their last N answers counts asactual = C, which is full credit for that activity. - Otherwise
actualis partial:C × (share of C reached) × (recent accuracy ÷ required accuracy), taken at the student's best moment of the day, with each share capped at 1. For example, with 3 correct at 50% over the last 3:- 2 answers, both right:
3 × (2/3) × 1= 2 of 3. - Rapid guessing until 3 are right, with the third right answer after two wrong ones:
3 × 1 × (33% ÷ 50%)= 2 of 3. - 1 answer, right:
3 × (1/3) × 1= 1 of 3.
- 2 answers, both right:
- A day with answers but none right counts as
actual = 0, the same as in the default mode.
These figures then go through the same day-grade formula above. The Completion Score floor still applies to partial days.
Answers submitted less than 10 seconds after the question appeared are never saved (see Answering too fast), so they don't count in either mode.
You choose From and End dates when you push or export. The window is inclusive of both ends.
- Submission timestamps are bucketed by the calendar day they fall on (
From 00:00toEnd 23:59bounds the query; see the timezone note for the fine print). - Every graded day inside the window (see the next two sections for exactly which days those are) gets its own day grade; the pushed grade is their average. A longer window isn't a looser standard — each day is still judged on its own.
If you have pulled PowerSchool attendance for the class (via the extension's Sync Attendance from PS — see The DobbsCore Extension), the platform knows which dates the section actually met, and grades only those days:
- A window of Mon–Fri that includes a holiday the section didn't meet is graded over 4 days, not 5 — the holiday just isn't in the average at all.
- Weekends inside a window never count.
- A student's enrolled slice of the window is likewise limited to real meeting days.
If you have not pulled attendance for the class, every calendar day in the window (or the student's enrolled slice of it) is graded instead — the same behavior as before attendance is ever pulled. Pulling attendance only ever makes the day set more accurate; it never changes a grade for a student who was enrolled the whole window with no missed section days. It also unlocks per-student absence exemption below, which has no PS attendance codes to work from otherwise.
This is the "section meeting exceptions" mechanism. It uses the section's own attendance record as its calendar, so a section that meets every other day, or on a rotating block schedule, is graded correctly once its attendance is pulled.
Each roster row has an Enrolled date and (if withdrawn) an exit date. These clamp the student's graded slice of the window:
- effective start = the later of {window start, enrolled date}
- effective end = the earlier of {window end, exit date}
Then:
- If the effective slice is empty (the student's enrollment doesn't overlap the window at all) → the student is exempt. No score row is written for them at all — they simply don't appear in the push.
- Otherwise, the student is graded on their own days only — the meeting days (or calendar days) that fall inside their enrolled slice, exactly as described above. A late arrival or early leaver is never judged on days before they enrolled or after they left; there's no separate "required" number to prorate anymore, since each day already carries its own requirement.
A blank Enrolled date means "enrolled since before we tracked dates" and is treated as the whole window.
Re-sync Roster stamps these dates from PowerSchool automatically. You can also edit them by hand on the roster.
An individual student's excused absence is dropped from their graded days entirely — not zero-filled, not averaged in either direction. This uses the same per-student PS attendance codes section meeting exceptions pulls in, so it needs attendance pulled for the class first.
| PS attendance code that day | Effect on that day's grade |
|---|---|
Starts with EX, but isn't EXT (e.g. EX-ILL, EX-MA) |
Excused — dropped from the average |
EXT (a tardy code, despite the EX prefix) |
Not excused — graded normally |
UNV (unverified absence), with a matching Called Out entry on the WBL Roster and the class linked to a WBL program |
Excused — dropped from the average |
UNV, without a Called Out entry, or on a class not linked to a WBL program |
Not excused — counts against the student like any other day with nothing submitted |
Present, or any other code (e.g. UXT) |
Not excused |
If a student's entire graded slice of the window ends up excused, they're exempt — same as an enrollment gap — and don't appear in the push at all.
Called Out is entered on the WBL Roster tab and only exists for classes linked to a Work-Based
Learning program; a non-WBL class can still pull attendance and get the EX-* exemption, it just
never gets the UNV exception.
Per-student attendance also feeds grading in one other place: Work-Based Learning Work Event scores blend in the student's attendance ratio for that job's window (see below) — a related but separate calculation from the day-exemption rule above.
A roster student who has not been linked to a signed-in app account receives exactly the No Submission Score, marked "unlinked" in the push. Their work — if any — has nowhere to attach. Fix by having them sign in once and running Link Accounts (see Managing Classes & Rosters).
A submission is attributed to the one class the student chose in the practice app's class menu when they did it. A grade push for Class A counts only submissions attributed to Class A.
- Existing submissions from before this feature were automatically assigned to a student's class if they are in exactly one class. Nothing changes for single-class students.
- For students who were already in two or more classes before the change, their older submissions aren't attributed to any class and won't count. Their first grade push after the change may need a one-time manual adjustment.
See Daily Practice & Assignments.
Assume MAX = 100, COMPLETION% = 70, NOSUB% = 20 unless noted. Class requires SAT
English, 2 / day. Window is Mon Sep 1 – Fri Sep 5 (one school week), attendance pulled
so all five weekdays are confirmed meeting days, unless an example says otherwise.
Enrolled the whole window, ≥2 correct every day.
- Every day:
actual ≥ 2 = required→dayGrade = 100 -
grade = mean(100,100,100,100,100) =100
1 correct every day. 1 / 2 × 100 = 50, which is below the 70 Completion floor.
- Every day:
dayGrade = max(50, 70) =70 -
grade =70
Mon 1 correct, Tue 2 correct, Wed 0, Thu 3 correct, Fri 1 correct.
| Day | actual | dayGrade |
|---|---|---|
| Mon | 1 | max(round(1/2×100), 70) = 70 |
| Tue | 2 |
100 (met) |
| Wed | 0 |
20 (No Submission Score) |
| Thu | 3 |
100 (exceeded) |
| Fri | 1 | 70 |
grade = mean(70,100,20,100,70) = 360/5 = 72
- Every day:
actual = 0→dayGrade = 20 -
grade =20
Joined Thu Sep 4 (enrolled date set by Re-sync Roster). Only Thursday and Friday are inside their enrolled slice of the window — Mon–Wed are never graded for them at all, not prorated down. Got 2 correct Thursday, 0 Friday.
- Thu:
dayGrade = 100. Fri:dayGrade = 20. -
grade = mean(100, 20) =60
A student who withdrew Aug 29, before the window started. Effective slice is empty → exempt, no score pushed.
Out sick Monday, PS attendance code EX-ILL for that date. 2+ correct answers Tue–Fri.
- Monday is dropped — never a
dayGradeof20, never counted at all. -
grade = mean(100, 100, 100, 100)(Tue–Fri only) =` 100
Same as #7, but the code is UNV and there's no matching Called Out entry on the WBL
Roster (or the class isn't WBL-linked at all).
- Monday is not dropped —
actual = 0that day →dayGrade = 20. -
grade = mean(20, 100, 100, 100, 100) = 420/5 =84
Window is Mon–Fri, but the section didn't meet Wednesday (a holiday) and attendance was pulled. Only Mon, Tue, Thu, Fri are graded days — Wednesday isn't in the average at all, whether or not anyone submitted anything that day. A student with 2+ correct on all four meeting days:
-
grade = mean(100, 100, 100, 100) =100
- Don't want zeros for a missed day? Raise No Submission Score (e.g. to 20).
- Want partial effort to count for more than the raw fraction? Raise Completion Score — it's the floor for any day with some, but not all, of that day's requirement done.
- Pull attendance for every class you grade, even non-WBL ones — it's what turns a window into real meeting days instead of calendar days, and it's the only source of per-student excused-absence exemption (see Absences).
-
Called Out individual
UNVdays on the WBL Roster before pushing a WBL-linked class's grade, if you want those days excused too. - Link accounts right before a push so nobody is scored "unlinked" by mistake.
WBL pushes are separate assignments with their own rules — always completion- or tier-based, never a partial fraction:
| Item | Score |
|---|---|
| Skill (formative) |
100 if the student has satisfied it; otherwise 0 if the skill's sync state is Due, or blank if In Progress, or the skill isn't synced at all if Not Started. |
| Credential (summative) |
100 if earned; same Due/In Progress/Not Started rules. A credential earned in another class or a prior year is left blank here. |
| Work Event | The Holistic Call tier's configured percentage of the Work Event max points — blended 80/20 with the student's attendance ratio for that job's date span, when attendance has been pulled for the section. Only participants with a Holistic Call are scored; others aren't on the assignment. |
| Habits of Work (5 soft skills) | Not counted toward the traditional final grade. Dispositional skills score from a cumulative rating average over the marking period; transfer skills from verified transfer-claim scores, and only sync once a student reaches Phase 2. |
Details and formulas: Work-Based Learning Guide and Grading Algorithms.
Classes not in a WBL program get a separate Habits of Work Do Now / Exit Slip flow. Its grades are their own PowerSchool assignments, pushed from the extension's Sync Habits of Work button, and never count toward the traditional final grade.
| Item | Score |
|---|---|
HoW <Category> — Weekly (Gravitas / Dignitas / Pietas) |
The mean of your 1–4 ratings for that category's exit slips in the chosen ISO week, put on a 0–100 scale (rating × 25) and scaled to the assignment's max points. |
HoW <Category> — Standing |
The mean of that student's last up to three weekly category scores, up to and including the chosen week. |
Voided and unrated exit slips are ignored. There is no zero-fill for absences — non-WBL classes pull no attendance. A student with nothing rated in range is left blank. Six assignments total (3 categories × weekly + standing); re-running for the same week updates them in place.
Formula: Grading Algorithms.