Published copy, redacted. The test account's username has been removed, and the uid field in QA_Account_Backup.json replaced. Nothing else in the findings was changed. All 19 defects were fixed in v1.1.5; see the QA audits page for the per-issue status.
2 Critical / 6 High / 8 Medium / 3 Low. Verified findings are separated from untested areas and developer-disclosed security risks.
DP Dashboard — hands-on QA audit
Site: https://dpdash.andreisisu.com/ Test date: 12 October 2026, approximately 21:35–22:09 Europe/Bucharest. Environment: remote Chrome desktop browser; screenshots approximately 1363 × 936 px. Preserved account: [redacted QA account] · Profile: QA Student — DP1 Audit · Session: May 2028. The PIN was entered privately by the owner and is not included in this report or evidence package.
1. Executive summary
Readiness: useful for a supervised beta, but not ready to be a student's sole source for deadlines, grade predictions, or stored work. All ten main navigation sections were exercised. Normal creation, editing, filtering, recurrence, valid grade calculations, and main-record persistence largely worked. The audit reproduced 19 defects: 2 Critical, 6 High, 8 Medium, and 3 Low. Critical here means confirmed, localised loss of an existing record through an ordinary Add workflow; it does not imply a service-wide outage or loss of every account.
The most consequential failures are silent replacement of existing timetable/study records, records becoming inaccessible after subject or period-time changes, weekly calendar dates moving one day later, and an incorrect dashboard score that omits the core bonus. The JSON backup also omits saved revision checklists and the weekly study goal. Gradebook validation accepts impossible marks; several date/time and sorting checks fail.
The main records survived a page refresh, a same-account JSON export/import followed by reload, and explicit logout/re-login. This is encouraging, but it does not prove concurrent or cross-device synchronisation is reliable. No other user's data was modified, no production code/configuration was changed, and the QA account was preserved.
Security is not certified. The site's Privacy Policy states that PINs are stored in plaintext and that knowledge of a username can allow technical access to synced data. These are developer-disclosed risks, not vulnerabilities reproduced by this audit. They are excluded from the verified bug count and require separate backend verification.
Preserved student simulation
| Data | Final state |
|---|---|
| Subjects | Mathematics AA, Economics, Physics at HL; English A, Spanish B, History at SL |
| Timetable | Fixed weekly; 15 classes, three per day Monday–Friday |
| Assignments | 10; eight pending/in progress, two done; deadlines from 9 October 2026 to 5 January 2027 |
| Assessments | Eight across all six subjects, including three maths assessments |
| Predictions | Subject total 36; EE A + TOK B gives +3; correct gradebook total 39/45 |
| Study | Three study records plus one break; one study record recurs weekly; 3.5 study hours this week |
| Revision | Maths chain-rule item checked; economics externalities item unchecked |
| Milestones | Nine: one completed EE milestone, one in-progress TOK milestone, seven maths IA template milestones |
| EE word count | 1,200 / 4,000 = 30% |
| Calendar | Mechanics exam 23 October; workshop 20 October; holiday 28 December–4 January |
| Weekly goal | 10 hours; final study planner shows 35% |
2. Verified bug report
Every issue below was observed through live interaction or inspection of a file generated by the app. Causes marked Hypothesis are not source-code findings. All feature names refer to sidebar sections at the root URL.
Critical
QA-001 — Add period silently overwrites an occupied timetable slot
Feature: Timetable → + Add period. Severity: Critical, localised data loss.
Reproduce: 1. Save Mathematics AA on Monday, Period 1, with room/teacher details. 2. Open + Add period again. 3. Choose Monday, Period 1 and History with different details. 4. Save. 5. Reopen the Monday slot.
Expected: Reject the conflict, offer an explicit replacement confirmation, or preserve both records with a conflict indicator.
Actual: “Period saved.” appears; History replaces Mathematics AA immediately. The previous room/teacher details are no longer in the editor. No replacement warning or Undo appeared. Reproduced on both Monday and Friday. Original classes were restored manually after testing.
Evidence: The reopened editor contained History and “QA overwrite test”; the invalid-time screenshot also captures this replaced slot. The final export contains one record per slot, not both versions.
Fix: Use stable record IDs and an explicit occupied-slot check. Make replacement intentional and provide Undo/version history. Hypothesis: day/start-time keyed storage assigns over the existing entry.
QA-002 — Add study block silently replaces an existing session
Feature: Study Planner → + Add block. Severity: Critical, localised data loss.
Reproduce: 1. Save a maths block on 12 October, 17:00–18:30, description “QA calculus revision.” 2. Add a History block on the same date at 17:00–18:00, description “QA collision replacement.” 3. Save.
Expected: Conflict handling or a confirmed replacement that preserves recoverability.
Actual: The maths record vanishes and the History record takes its place without warning. The weekly total falls from 3.5h to 3h. The description and subject are replaced. Restored manually after capture.
Evidence: qa-study-collision.jpg; exported study keys use date/start-time combinations.
Fix: Add collision detection to create and duplicate paths; use unique IDs; support Undo. Hypothesis: an existing date/start key is overwritten.
High
QA-003 — Changing a period start time hides every class in that row
Feature: Settings → Period times; Timetable. Severity: High.
Reproduce: 1. Populate Period 1 at 09:00 across five weekdays. 2. In Settings, change Period 1 start to 08:55. 3. Save periods. 4. Open Timetable. 5. Change it back to 09:00 and reopen Timetable.
Expected: Existing classes remain assigned to Period 1, with their schedule updated or an explicit migration choice.
Actual: All five Period 1 cells become empty at 08:55. Returning to 09:00 makes all five classes reappear. The records are orphaned from the visible row rather than permanently erased.
Evidence: qa-period-time-orphan.jpg; the exported period keys include the literal 09:00 start time.
Fix: Reference a stable period-slot ID and migrate linked entries atomically when times change. Hypothesis: timetable lookup depends on the mutable start-time string.
QA-004 — Subject rename orphans grades and breaks assignment filtering
Feature: Settings → Subjects; Gradebook; Assignments. Severity: High.
Reproduce: 1. Record a History assessment of 16/25 and a History assignment. 2. Rename History to “History QA” and Save subjects. 3. Open Gradebook → History QA. 4. Open Assignments → History QA filter. 5. Revert the name.
Expected: Renaming a subject preserves its assessments, boundaries, tasks and links.
Actual: History QA has “No assessments yet,” its predicted grade is blank, and the total drops from 38 to 33 in the configuration used at that moment. The assignment still displays HISTORY but is absent under the HISTORY QA filter. Reverting to History restores the assessment and filter match.
Evidence: qa-subject-rename.jpg; recorded UI: “ASSESSMENTS — HISTORY QA,” “No assessments yet.”
Fix: Give subjects immutable IDs and use names only as display labels. Migrate existing name-keyed references. Hypothesis: related data is indexed by subject name, without rename migration.
QA-005 — Weekly calendar displays deadlines and events one day late
Feature: Calendar → Week. Severity: High.
Reproduce: 1. Add an assignment due 13 October 2026. 2. Enable Show assignments. 3. View the week 12–18 October. 4. Add/view an exam dated 23 October in the following week. 5. Compare Month view and the .ics export.
Expected: Assignment under Tuesday 13; exam under Friday 23; Sunday deadlines stay in their correct week.
Actual: The Tuesday assignment appears under Wednesday 14. The Friday exam appears under Saturday 24. A Sunday 11 October task appears under Monday 12, and the Sunday 18 October CAS task appears under Monday 19 in the following week. Month view and ICS dates remain correct.
Evidence: qa-week-calendar-shift.jpg, qa-week-event-shift.jpg; ICS contains DTSTART 20261013 and 20261023 respectively.
Fix: Use a single date-only representation for column matching and range filtering; avoid mixing UTC ISO dates with local midnight. Hypothesis: local/UTC conversion creates an off-by-one day error. This was not tested in other timezones.
QA-006 — Dashboard Predicted / 45 omits EE/TOK bonus
Feature: Dashboard score card; Gradebook; generated report. Severity: High.
Reproduce: 1. Enter all six subject predictions totalling 36. 2. Set EE to A and TOK to B. 3. Compare Gradebook, Full PDF report and Dashboard. 4. Navigate away/back; repeat after re-login.
Expected: All displays labelled out of 45 show 39.
Actual: Gradebook and generated report show 39/45 and +3 core points. Dashboard shows 36 under “Predicted / 45.” The mismatch persists after navigation, import/reload and re-login.
Evidence: qa-dashboard-score.jpg, qa-gradebook-score.jpg.
Fix: Share one calculation function among dashboard, gradebook and reports, including core bonus and failure status. Hypothesis: the dashboard sums subject grades alone.
QA-007 — JSON backup omits revision checklists and weekly goal
Feature: Settings → Export JSON. Severity: High, incomplete backup.
Reproduce: 1. Save revision items in Maths and Economics, checking the Maths item. 2. Save a 10h weekly study goal. 3. Export JSON. 4. Inspect the complete generated file.
Expected: The advertised dashboard backup includes these saved features, or clearly states exclusions.
Actual: Both exported files contain main profile/subject/timetable/task/grade/milestone data, but no revision checklist content, completion states, or weekly study-goal value. The entire object was inspected, including nested data/study sections. Existing local revision and goal values survive same-browser import; that does not make the backup complete.
Evidence: Final JSON in the package; top-level fields are exportedAt, uid, data, periods, events, assignments, study, gradebook, milestones, weights, iaSubjects, periodSlots, weekMap, wordCounts. Neither revision text nor goal 10 appears in a corresponding saved field.
Fix: Define/version a full persisted-data export schema and test round-trips in an empty profile. Confirmed scope: missing export content. Not verified: loss on clean-device import, since a clean authenticated second environment was unavailable.
QA-008 — Gradebook accepts impossible assessment marks
Feature: Gradebook → Add/Edit assessment. Severity: High.
Reproduce: 1. Save earned 10, Out of 0. 2. Reopen it. 3. Change to earned 25, Out of 20 and save.
Expected: Total must be greater than zero; earned marks must be between zero and total, unless an explicitly supported extra-credit mode exists.
Actual: 10/0 is stored and shown with a dash for percentage and “No marks yet.” 25/20 is stored as 125%, gives grade 7, and influences the overall prediction. No validation error appears. Replaced with a valid 16/20 record afterwards.
Evidence: qa-invalid-grade.jpg; recorded editor retained Out of 0 after reopening.
Fix: Validate finite numbers, positive denominator and mark bounds before save/import; flag legacy invalid records. Hypothesis: the save path lacks these domain constraints. Valid averaging itself passed.
Medium
QA-009 — Timetable and study editors save reversed time ranges
Feature: Timetable period editor; Study Planner block editor. Severity: Medium.
Reproduce: Save a timetable period starting 11:00 and ending 10:00; reopen. Separately save a study block 19:00–18:00.
Expected: Reject end ≤ start, or explicitly model an overnight interval.
Actual: Both save successfully. Reopened period retains 11:00/10:00. Study block displays 19:00–18:00 and adds no time to weekly study totals. No overnight explanation exists in these forms. Both were corrected afterwards.
Evidence: qa-invalid-period.jpg; recorded study row “QA invalid duration 19:00–18:00.”
Fix: Validate duration before saving and make overnight support explicit if desired. Hypothesis: time strings are stored without interval validation.
QA-010 — Event editor stores an end date before its start date
Feature: Calendar → Add/Edit event. Severity: Medium.
Reproduce: Create an event starting 20 October and ending 19 October; save and reopen.
Expected: Block the invalid range or offer an explicit correction.
Actual: “Event saved.” appears. The editor retains both reversed dates; Month view renders it on the start day, effectively hiding the invalid span. Corrected to a single-day workshop afterwards.
Evidence: qa-reversed-event.jpg.
Fix: Validate end date ≥ start date and use the same rule in import. Hypothesis: rendering falls back to the start date while the invalid end remains stored.
QA-011 — Grade boundary editor accepts a higher grade with a lower threshold
Feature: Gradebook → Edit grade boundaries. Severity: Medium.
Reproduce: Leave grade 6 at 70%; set grade 7 to 65%; save.
Expected: Require monotonically increasing thresholds as grades rise, or clearly flag an invalid configuration.
Actual: The boundaries save. A 70% average is now grade 7; both 7 at 65% and 6 at 70% display as satisfied. Overall rises from 39 to 40. Restored grade 7 to 80% afterwards.
Evidence: Recorded UI: “7 65% ✓”, “6 70% ✓”, predicted 7 at 70% weighted average.
Fix: Validate ordering and 0–100 limits atomically. Hypothesis: each threshold is accepted independently.
QA-012 — Priority sort does not put High before Medium
Feature: Assignments → Sort: Priority. Severity: Medium.
Reproduce: Keep QA 01 Calculus exercises at Medium; set QA 02 Market failure essay to High. Ensure both are unpinned and unfinished. Choose Sort: Priority. Reopen QA 02 to confirm High; save High again and repeat.
Expected: High-priority unfinished task precedes the Medium one, subject to an explicitly documented tie-breaker.
Actual: Medium QA 01 remains first; High QA 02 remains second. All-task ordering resembles insertion order. The generated report confirms QA 02's priority is high. Changing its difficulty to hard changes its visible badge but not the broken priority ordering. Subject and due-date sorting do work.
Evidence: qa-priority-sort.jpg; reopened editor selected Priority High; export stores high.
Fix: Sort using normalised priority values and test high/medium/low records, with pin/done rules separate. Hypothesis: comparator/value mapping is inconsistent with stored priority values.
QA-013 — Sunday milestones are omitted from This Week denominator
Feature: Dashboard → This Week → milestones done. Severity: Medium.
Reproduce: With one completed EE milestone due Friday 16 October and an incomplete TOK milestone due Sunday 18 October, view Dashboard. Change only TOK due date to Saturday 17, view Dashboard, then return it to Sunday.
Expected: Both dates belong to Monday 12–Sunday 18; show 1/2 in either case.
Actual: Sunday produces 1/1; Saturday produces 1/2; returning to Sunday produces 1/1 again. The milestone remains saved and visible in its own section. Assignment weekly counts include the Sunday CAS task.
Evidence: Final dashboard screenshot shows 1/1; recorded Saturday comparison showed 1/2.
Fix: Use an exclusive next-Monday boundary for all weekly counts and date-only comparisons. Hypothesis: Sunday is treated as the endpoint at midnight, with inconsistent timezone handling.
QA-014 — Duplicate claims success but creates no copy when source is already tomorrow
Feature: Study Planner → block → Duplicate. Severity: Medium.
Reproduce: On 12 October, save a Physics block dated 13 October, 19:00–20:00. Open it and click Duplicate.
Expected: Create a separate copy or explain that tomorrow's target already has this block; offer a target date/conflict choice.
Actual: Toast says “Block duplicated to tomorrow,” but there is still one Physics block and the weekly total stays 3.5h. Tomorrow is the source's own date, so the action produces no observable duplicate.
Evidence: Before/after snapshots both contain one Physics practice block; final JSON contains four study/break records, not five.
Fix: Ask for a destination, default to source date + one day, and detect collisions. Hypothesis: duplicate targets today + one day and overwrites the same key.
QA-015 — Assignment controls lack programmatically associated labels
Feature: Assignments → Add/Edit modal. Severity: Medium, accessibility.
Reproduce: Open Add assignment; inspect accessible names for Title, Subject, Type, Due date and Notes. Inspect Title's labels/ARIA attributes.
Expected: Visible labels are connected with label/for or aria-labelledby; modal controls have meaningful accessible names.
Actual: Title has labels=[], aria-label=null and aria-labelledby=null. Its accessible name is the example placeholder. Several comboboxes and the date field are unnamed in the accessibility snapshot. Visual text labels exist but are not associated with the controls. Shift+Tab from the first field does wrap to Save, so a focus-trap failure is not claimed.
Evidence: DOM metadata and snapshot recorded during testing: textbox “e.g. History IA draft”; unnamed comboboxes; unnamed date textbox.
Fix: Associate every label, set a dialog role/name, and validate with keyboard and screen readers. Confirmed cause: missing label associations on inspected controls; no full screen-reader audit performed.
QA-016 — Negative estimated assignment time is accepted
Feature: Assignments → Est. time (hrs). Severity: Medium.
Reproduce: Set the CAS reflection's estimate to -2 and save.
Expected: Reject negative estimates; blank/zero should have a clear meaning.
Actual: Assignment saves and list displays “~-2h.” Restored to 0.5h afterwards. Effects on downstream scheduling were not verified.
Evidence: Recorded list text: “QA 10 CAS reflection … ~-2h 6d.”
Fix: Validate nonnegative finite hours in form and import paths. Hypothesis: numeric parsing lacks a range check.
Low
QA-017 — Homework renders as Other task for ordinary subjects
Feature: Assignments list. Severity: Low.
Reproduce: Save Homework for Mathematics AA or History; inspect list; reopen editor.
Expected: Ordinary subject Homework is labelled Homework.
Actual: List says OTHER TASK; reopened editor still selects Homework. Reproduced for both subjects. Core subjects legitimately have an Other task option, making the mismatch particularly confusing.
Evidence: QA 01 and QA 06 list rows; homework option retained in editor.
Fix: Resolve display names per subject/category instead of globally mapping the shared homework value. Hypothesis: a core label mapping overrides the ordinary-subject label.
QA-018 — Onboarding progress total changes from five steps to four
Feature: Onboarding. Severity: Low.
Reproduce: Advance from identity to subjects to timetable type to completion.
Expected: Consistent step count and progress indicator.
Actual: Steps 1–3 say “of 5”; completion says “STEP 4 OF 4.” No fifth step is presented. The final button successfully opens Dashboard.
Evidence: Recorded onboarding accessibility text for all four steps.
Fix: Derive labels and progress indicators from the same step list. Hypothesis: copy remained after a step was removed.
QA-019 — Notification recovery instructions point Chrome users to Safari
Feature: Settings → Notifications. Severity: Low.
Reproduce: In this desktop Chrome environment, view the blocked notification state.
Expected: Browser-appropriate settings instructions, or platform-neutral guidance.
Actual: “Blocked — go to Settings → Safari → Notifications to re-enable.” Send test notification correctly says “Enable notifications first”; actual push delivery was unavailable.
Evidence: Recorded settings text and screenshots of Settings during testing.
Fix: Detect supported browser/platform or use neutral wording. Hypothesis: blocked-state help text is hardcoded for Safari.
3. Feature test matrix
Pass means the specified exercised scenario passed, not that every possible case is certified. Fail means a reproduced defect. Partial means some scenarios passed with material gaps. Not Tested means no defensible result is available.
| Feature/scenario | Status | Result / coverage |
|---|---|---|
| Site load, navigation shell | Pass | All ten sidebar sections reachable; no site-load blocker |
| Account creation and PIN validation | Partial | Owner completed PIN/terms manually; automated registration/PIN validation not performed |
| Onboarding identity required field | Pass | Empty name triggers “Please enter your name” and stays on step |
| Onboarding username lookup | Pass | QA username accepted and retained; uniqueness/collision cases not tested |
| Onboarding subject/level setup | Pass | Six subjects, three HL/three SL saved and survived refresh |
| Onboarding step indicators | Fail | QA-018 |
| Back navigation and interrupted onboarding resume | Not Tested | No refresh performed halfway through incomplete setup |
| Refresh and session lock | Pass | Refresh requires PIN; onboarding data restored after secure unlock |
| Explicit logout/re-login | Pass | Username/PIN flow succeeds; main populated records retained |
| Dashboard counts and exam countdown | Partial | 8 pending, 1 exam, 11-day exam countdown correct; QA-006/013 affect score and milestones |
| Dashboard quick-add | Partial | Shared editors exercised through section Add controls; each shortcut not separately exhaustively tested |
| Subject rename integration | Fail | QA-004; reverting name restores records |
| Subject colours | Not Tested | Palette visible; cross-section colour changes not exercised |
| Unusual subject counts/HL combinations | Not Tested | Only realistic 3HL/3SL configuration tested |
| Fixed weekly timetable create/edit | Pass | 15 classes; room/teacher fields and slot editing work |
| Timetable conflict and schedule migration | Fail | QA-001/003/009 |
| A/B rotation and week mapping | Not Tested | Fixed weekly selected; A/B was visible in onboarding but not configured |
| Assignment create/edit and statuses | Pass | 10 realistic records; optional fields; 2,115-character note saved/reopened |
| Assignment validation and labels | Fail | QA-016/017; blank save also creates a generic Assignment (usability note) |
| Assignment status/subject filters | Pass | Done returns two records; subjects work with unchanged names |
| Assignment sorting/pinning | Partial | Due/subject sort and pin/unpin work; priority sort fails QA-012 |
| Assignment delete | Pass | Disposable test assignment deleted after confirmation; main ten records preserved |
| Restore/Undo/trash | Not Tested | No recovery UI observed after assignment delete; backup recovery path tested separately |
| Study create/edit/recurrence | Pass | One-off and recurring records; weekly navigation retains recurrence |
| Study duration totals and goal | Pass | 2.5h then 3.5h; breaks excluded; 25% then 35% of 10h |
| Study collision, validation, duplicate | Fail | QA-002/009/014 |
| Revision checklists | Pass | Add/check/uncheck and subject separation; local persistence after reload/re-login |
| Revision export | Fail | QA-007; clean-device restore not tested |
| Gradebook valid calculations | Pass | Raw mean 70%; default weighted 65.7%; configured 50/50 gives 70% |
| Gradebook invalid marks/boundaries | Fail | QA-008/011 |
| Custom assessment category | Pass | New category appears in entry form; zero-weight 100% record changes raw mean to 80% while weighted stays 70% |
| Grade targets | Not Tested | Target selector visible; target changes/persistence not exercised |
| Core bonus/failure handling in gradebook | Pass | A/B gives +3; EE E shows diploma-core failure; restored A/B |
| Milestone create/edit/templates | Pass | EE/TOK saved; maths IA template added seven records with confirmation |
| Milestone totals on dashboard | Fail | Sunday boundary failure QA-013 |
| Milestone drag reordering | Not Tested | Drag handle present; ordering/persistence not verified |
| Word count | Pass | Typed 1,200 gives 30%; persisted through import/re-login |
| Dedicated CAS portfolio | Not Tested | No separate CAS page found; CAS assignments/reflection supported and exercised |
| Calendar Month and multiday/year boundary | Pass | 28 December–4 January renders through year boundary; assignments correctly dated |
| Calendar Week and event ranges | Fail | QA-005/010 |
| Calendar type filters | Partial | Controls discovered; no full combinatorial filter test |
| Friends blank/self/nonexistent checks | Partial | Own username rejected with generic valid-username message; nonexistent username yields no-account result |
| Friend accept/reject, comparisons | Not Tested | No second test account; no contact with real users |
| Profile and dark mode | Pass | Name change persisted; enable/disable dark mode visually confirmed |
| PIN change/account rename | Not Tested | Authentication changes deliberately left untouched |
| Push/reminders | Partial | Blocked state; test notification rejects correctly; actual delivery unavailable; QA-019 help text |
| Full PDF report generation | Partial | Report tab contains correct 39/45, 10 assignments, milestones/events; physical/PDF print output not verified |
| Print timetable/study schedule | Partial | Clicked; no inspectable print output in available browser surface; not reported as a confirmed app defect |
| ICS export | Pass | 11 events: 3 calendar events + 8 unfinished tasks; correct date-only start/end and inclusive holiday range |
| JSON main-record export/import | Partial | Valid same-account import/reload succeeds; QA-007 omissions |
| Malformed JSON rejection | Pass | “Import failed — invalid JSON file”; existing state remains intact |
| Offline cache setup | Partial | Cache action succeeds; summary 4 slots/4 upcoming assignments; real network-off launch unavailable |
| Automatic/manual cloud sync | Partial | Saved changes show synced; manual sync succeeds; remote username fetch/re-login works; conflict/retry resilience unverified |
| Reset/delete account | Not Tested | No account/section reset or account deletion performed |
| Privacy/terms links | Pass | Both pages load; no mail or external privacy-authority action taken |
| Desktop layout/keyboard | Partial | Usable desktop layout; modal focus wraps; long notes retained; QA-015 labels |
| Mobile/tablet/resizing/touch | Not Tested | Available browser API offered no supported viewport/device resizing capability |
| Rapid navigation | Pass | Consecutive traversal of ten sidebar sections without crash or lost main records |
| Console/network | Partial | No app-origin warning/error in inspected captured log slice; extension errors excluded; no request inspector/HAR available |
Numerical checks
| Check | Expected | Observed |
|---|---|---|
| Maths quiz 16/20 | 80% | 80% |
| Maths test 30/50 | 60% | 60% |
| Raw percentage mean, first two marks | (80 + 60)/2 = 70% | 70% |
| Default weights 10:25 over available categories | (80×10 + 60×25)/35 = 65.714% | 65.7%, grade 5 |
| Configured 50/50 quiz:test | 70% | 70%, grade 6 |
| Additional 100% category weighted 0 | Weighted remains 70%; raw becomes 80% | Correct |
| Six subject grades 6+6+6+6+7+5 | 36 points | 36 |
| Core EE A, TOK B | +3 | Gradebook +3 |
| Overall out of 45 | 39 | Gradebook/report 39; dashboard 36 (QA-006) |
| Study 90min + 60min + 60min; 30min break excluded | 3.5h | 3.5h |
| Study goal | 3.5/10 = 35% | 35% |
| EE word count | 1200/4000 = 30% | 30% |
4. Usability and design improvements (not additional verified bugs)
- Provide Undo and a recoverable history for edits, replacements and deletions. The lack of recovery makes small scheduling mistakes costly.
- Add an import preview listing included/missing sections and record counts. Explicitly distinguish a full backup from a partial data export.
- Ask for a destination date when duplicating study sessions, and show a collision preview before any overwrite.
- Use inline validation instead of browser alerts; focus the invalid field and explain how to fix it.
- Empty assignment Save currently creates a generic, undated “Assignment.” Consider requiring a meaningful title or clearly labelling this as a quick-task workflow. This is a design recommendation because no required-title contract is visible.
- Display priority and difficulty as separate labelled badges. Currently changing difficulty changes the main medium/hard badge; priority is visible in the editor/report but hard to identify in the list.
- Add Today navigation to calendar/study views. Switching Month to Week starts at the displayed month's first week, requiring extra navigation to the current week.
- Label partial predictions: with incomplete subjects, show “x of 6 subjects entered” instead of an apparently complete out-of-45 result. Keep diploma-core failure prominent everywhere.
- Make word-count targets and milestones subject-specific and editable with guidance for written versus oral components. Generic targets should be presented as planning targets, not authoritative IB limits.
- Separate planned study time from completed/logged study time; dashboard “Study hrs this week” currently represents planned blocks.
- Clarify the Friends self-request error (“You cannot add yourself”) rather than the generic “Enter a valid username.” No successful second-account friend workflow was verified.
- Add Escape-to-close for forms with sensible unsaved-change handling. Escape did not close the assignment modal; focus wrapping did work.
- Improve the full-report scope/label. The generated printable report covers predictions, assignments, milestones and events, but not the entire timetable, study schedule or revision checklists. Separate print buttons exist.
- After sign-in, distinguish “Not yet synced this session” from “Local only.” In this test, Settings showed a connected account while the header showed Local only until manual sync.
- Make pending/overdue/completed task styling explicit: completed records can still carry an overdue date badge, which can read as an outstanding problem even when status is Done.
5. Top 10 fixes, ranked by urgency and impact
| Rank | Fix | Linked defects | Why first |
|---|---|---|---|
| 1 | Prevent/confirm occupied timetable-slot replacement; add Undo | QA-001 | Ordinary Add can remove entered class details |
| 2 | Prevent study-create/duplicate collisions; stable IDs/history | QA-002, QA-014 | Ordinary scheduling can replace a student's plan |
| 3 | Correct weekly calendar date matching | QA-005 | Students can read deadlines/exams on the wrong day/week |
| 4 | Migrate classes when period times change | QA-003 | One five-minute edit hides five classes |
| 5 | Use stable subject IDs and rename migration | QA-004 | Routine name edit hides grades and disconnects tasks |
| 6 | Include all saved work in versioned backups | QA-007 | Revision work/goal absent from exported recovery data |
| 7 | Unify predicted-score calculation across pages | QA-006 | Prominent 36/45 contradicts correct 39/45 |
| 8 | Enforce assessment mark and boundary constraints | QA-008, QA-011 | Impossible data produces misleading predictions |
| 9 | Centralise date/time validation and week boundaries | QA-009, QA-010, QA-013, QA-016 | Reject invalid durations and count Sunday consistently |
| 10 | Fix priority sorting and show priority clearly | QA-012 | High-priority work is not promoted as selected |
Accessibility QA-015 should also be addressed before a broad student launch. Separately, verify and remediate the security architecture disclosed in the Privacy Policy; it is outside this ranked list of reproduced application bugs.
6. Testing limitations and unverified risks
- Registration: Owner handled PIN creation and legal acceptance. The tester completed the noncredential onboarding. PIN length/mismatch, duplicate account registration and full onboarding Back/interruption cases were not verified.
- Security: No brute force, credential extraction, destructive payloads or access to other accounts. The Privacy Policy's plaintext-PIN/username-access statements are disclosed risks only. No claim of a verified backend vulnerability or secure authorisation is made.
- One account/environment: Same-browser refresh, import and re-login were tested. Independent-device sync, simultaneous edits, conflict resolution, slow/failed network retries and offline reconciliation were not tested.
- Mobile: No real iOS/Android, touch, mobile viewport, portrait/landscape or tablet testing. Desktop screenshots cannot certify responsive layouts. Browser APIs did not expose a supported resize/device emulation operation.
- Notifications: Browser permission was blocked. No grant, installation, background reminder timing, timezone scheduling or delivery was verified.
- Friends: Only own/nonexistent identifiers were used; no requests were sent to real classmates. Acceptance, sharing scope, rejection/removal and comparisons need two disposable accounts.
- Printing: Generated report content was inspected, but saving the browser print preview to an actual PDF and checking pagination was unavailable. Timetable/study print controls were clicked without an inspectable print result; this is a testing limitation, not a reported bug.
- Offline: Cache creation succeeded, but the browser could not be put into a supported network-off state. Launching/reloading with no connection remains unverified.
- Backup: A full main-record round-trip was performed on the same account. Checklists and goal were absent from exports, but clean-profile restore of these sections was not reproduced. The packaged JSON should therefore be treated as a partial app backup.
- Coverage: Every main navigation page was visited, but not every possible interactive component/case was exercised. Colour palettes, A/B configuration, grade targets, drag reorder, section reset, account/PIN change and account deletion remain untested. There was no deliberate heavy-load or multiuser stress test.
- Diagnostics: Captured browser logs were checked; extension-origin errors were excluded. No complete network trace, server logs, database inspection or source-code access was used. Root-cause hypotheses require developer verification.
- Time/date: Date cases cover past/today/future, different months and a December/January boundary. Leap-day, DST transitions and multiple timezone environments were not exercised.
Suggested release gates
Retest the top ten fixes using these same preserved records, then perform a clean-profile full backup restore, a two-device concurrent sync test, a two-test-account Friends test, real mobile checks and a focused backend authorisation review. Do not describe this audit as exhaustive certification.
7. Evidence and handover
The companion package contains the complete report in Markdown, the standalone HTML report, 13 screenshots, a final QA-account JSON export, and the final ICS export. The exports contain only synthetic QA data. Invalid values and overwritten baseline records were corrected; one disposable assignment was created and deleted to test deletion. The account remains available for debugging.
The file QA_Account_Backup.json preserves the app's export exactly and intentionally remains partial: it does not contain the two revision items or the 10h goal. Those values are recorded above and remain in the preserved account after logout/re-login.
Key screenshots
Weekly view: Tuesday deadline drawn under Wednesday; previous Sunday's deadline drawn under Monday.
Friday exam drawn under Saturday; Sunday CAS task drawn under the following Monday.
Dashboard 36/45 versus Gradebook 39/45 on the same account.
Period-time edit leaves the entire first row empty.
Renamed History subject shows no assessments.
Invalid marks are accepted as 125%.
Stored period ends earlier than it begins.
Stored event end precedes its start.
Preserved account at the end of testing.