Skip to content

How Grading Works

benjamindobbs edited this page Oct 1, 2026 · 6 revisions

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.


The three settings

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 formula

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:

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

  2. For each graded day, compute that day's actual (qualifying submissions on that date, see what counts) against that day's required (the class's per-day count(s) — see multiple classes for how required/actual combine 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
    
  3. The pushed grade is the average of every day grade in the set, rounded, capped at MAX.

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.


What counts as a "qualifying submission"

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.

SAT accuracy mode

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 C correct with at least the Minimum Accuracy over their last N answers counts as actual = C, which is full credit for that activity.
  • Otherwise actual is 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.
  • 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.


The window (date range)

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:00 to End 23:59 bounds 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.

Section meeting exceptions (school days vs. calendar days)

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.


Enrollment dates

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.


Absences

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.


Unlinked students

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


Students in more than one class

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.


Worked examples

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.

1. Full-time student, met every day

Enrolled the whole window, ≥2 correct every day.

  • Every day: actual ≥ 2 = required → dayGrade = 100
  • grade = mean(100,100,100,100,100) = 100

2. Full-time student, consistently short

1 correct every day. 1 / 2 × 100 = 50, which is below the 70 Completion floor.

  • Every day: dayGrade = max(50, 70) = 70
  • grade = 70

3. Mixed week

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

4. Did nothing all week

  • Every day: actual = 0 → dayGrade = 20
  • grade = 20

5. Late arrival

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

6. No overlap

A student who withdrew Aug 29, before the window started. Effective slice is empty → exempt, no score pushed.

7. Excused absence (EX-ILL)

Out sick Monday, PS attendance code EX-ILL for that date. 2+ correct answers Tue–Fri.

  • Monday is dropped — never a dayGrade of 20, never counted at all.
  • grade = mean(100, 100, 100, 100) (Tue–Fri only) =` 100

8. UNV, not excused

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 = 0 that day → dayGrade = 20.
  • grade = mean(20, 100, 100, 100, 100) = 420/5 = 84

9. Holiday in the window

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

Practical guidance

  • 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 UNV days 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.

Work-Based Learning grades

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.


Habits of Work (non-WBL classes)

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.

Clone this wiki locally