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.

Hands-on quality assurance · 12 October 2026
19 reproduced defects · QA account preserved
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

DataFinal state
SubjectsMathematics AA, Economics, Physics at HL; English A, Spanish B, History at SL
TimetableFixed weekly; 15 classes, three per day Monday–Friday
Assignments10; eight pending/in progress, two done; deadlines from 9 October 2026 to 5 January 2027
AssessmentsEight across all six subjects, including three maths assessments
PredictionsSubject total 36; EE A + TOK B gives +3; correct gradebook total 39/45
StudyThree study records plus one break; one study record recurs weekly; 3.5 study hours this week
RevisionMaths chain-rule item checked; economics externalities item unchecked
MilestonesNine: one completed EE milestone, one in-progress TOK milestone, seven maths IA template milestones
EE word count1,200 / 4,000 = 30%
CalendarMechanics exam 23 October; workshop 20 October; holiday 28 December–4 January
Weekly goal10 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/scenarioStatusResult / coverage
Site load, navigation shellPassAll ten sidebar sections reachable; no site-load blocker
Account creation and PIN validationPartialOwner completed PIN/terms manually; automated registration/PIN validation not performed
Onboarding identity required fieldPassEmpty name triggers “Please enter your name” and stays on step
Onboarding username lookupPassQA username accepted and retained; uniqueness/collision cases not tested
Onboarding subject/level setupPassSix subjects, three HL/three SL saved and survived refresh
Onboarding step indicatorsFailQA-018
Back navigation and interrupted onboarding resumeNot TestedNo refresh performed halfway through incomplete setup
Refresh and session lockPassRefresh requires PIN; onboarding data restored after secure unlock
Explicit logout/re-loginPassUsername/PIN flow succeeds; main populated records retained
Dashboard counts and exam countdownPartial8 pending, 1 exam, 11-day exam countdown correct; QA-006/013 affect score and milestones
Dashboard quick-addPartialShared editors exercised through section Add controls; each shortcut not separately exhaustively tested
Subject rename integrationFailQA-004; reverting name restores records
Subject coloursNot TestedPalette visible; cross-section colour changes not exercised
Unusual subject counts/HL combinationsNot TestedOnly realistic 3HL/3SL configuration tested
Fixed weekly timetable create/editPass15 classes; room/teacher fields and slot editing work
Timetable conflict and schedule migrationFailQA-001/003/009
A/B rotation and week mappingNot TestedFixed weekly selected; A/B was visible in onboarding but not configured
Assignment create/edit and statusesPass10 realistic records; optional fields; 2,115-character note saved/reopened
Assignment validation and labelsFailQA-016/017; blank save also creates a generic Assignment (usability note)
Assignment status/subject filtersPassDone returns two records; subjects work with unchanged names
Assignment sorting/pinningPartialDue/subject sort and pin/unpin work; priority sort fails QA-012
Assignment deletePassDisposable test assignment deleted after confirmation; main ten records preserved
Restore/Undo/trashNot TestedNo recovery UI observed after assignment delete; backup recovery path tested separately
Study create/edit/recurrencePassOne-off and recurring records; weekly navigation retains recurrence
Study duration totals and goalPass2.5h then 3.5h; breaks excluded; 25% then 35% of 10h
Study collision, validation, duplicateFailQA-002/009/014
Revision checklistsPassAdd/check/uncheck and subject separation; local persistence after reload/re-login
Revision exportFailQA-007; clean-device restore not tested
Gradebook valid calculationsPassRaw mean 70%; default weighted 65.7%; configured 50/50 gives 70%
Gradebook invalid marks/boundariesFailQA-008/011
Custom assessment categoryPassNew category appears in entry form; zero-weight 100% record changes raw mean to 80% while weighted stays 70%
Grade targetsNot TestedTarget selector visible; target changes/persistence not exercised
Core bonus/failure handling in gradebookPassA/B gives +3; EE E shows diploma-core failure; restored A/B
Milestone create/edit/templatesPassEE/TOK saved; maths IA template added seven records with confirmation
Milestone totals on dashboardFailSunday boundary failure QA-013
Milestone drag reorderingNot TestedDrag handle present; ordering/persistence not verified
Word countPassTyped 1,200 gives 30%; persisted through import/re-login
Dedicated CAS portfolioNot TestedNo separate CAS page found; CAS assignments/reflection supported and exercised
Calendar Month and multiday/year boundaryPass28 December–4 January renders through year boundary; assignments correctly dated
Calendar Week and event rangesFailQA-005/010
Calendar type filtersPartialControls discovered; no full combinatorial filter test
Friends blank/self/nonexistent checksPartialOwn username rejected with generic valid-username message; nonexistent username yields no-account result
Friend accept/reject, comparisonsNot TestedNo second test account; no contact with real users
Profile and dark modePassName change persisted; enable/disable dark mode visually confirmed
PIN change/account renameNot TestedAuthentication changes deliberately left untouched
Push/remindersPartialBlocked state; test notification rejects correctly; actual delivery unavailable; QA-019 help text
Full PDF report generationPartialReport tab contains correct 39/45, 10 assignments, milestones/events; physical/PDF print output not verified
Print timetable/study schedulePartialClicked; no inspectable print output in available browser surface; not reported as a confirmed app defect
ICS exportPass11 events: 3 calendar events + 8 unfinished tasks; correct date-only start/end and inclusive holiday range
JSON main-record export/importPartialValid same-account import/reload succeeds; QA-007 omissions
Malformed JSON rejectionPass“Import failed — invalid JSON file”; existing state remains intact
Offline cache setupPartialCache action succeeds; summary 4 slots/4 upcoming assignments; real network-off launch unavailable
Automatic/manual cloud syncPartialSaved changes show synced; manual sync succeeds; remote username fetch/re-login works; conflict/retry resilience unverified
Reset/delete accountNot TestedNo account/section reset or account deletion performed
Privacy/terms linksPassBoth pages load; no mail or external privacy-authority action taken
Desktop layout/keyboardPartialUsable desktop layout; modal focus wraps; long notes retained; QA-015 labels
Mobile/tablet/resizing/touchNot TestedAvailable browser API offered no supported viewport/device resizing capability
Rapid navigationPassConsecutive traversal of ten sidebar sections without crash or lost main records
Console/networkPartialNo app-origin warning/error in inspected captured log slice; extension errors excluded; no request inspector/HAR available

Numerical checks

CheckExpectedObserved
Maths quiz 16/2080%80%
Maths test 30/5060%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:test70%70%, grade 6
Additional 100% category weighted 0Weighted remains 70%; raw becomes 80%Correct
Six subject grades 6+6+6+6+7+536 points36
Core EE A, TOK B+3Gradebook +3
Overall out of 4539Gradebook/report 39; dashboard 36 (QA-006)
Study 90min + 60min + 60min; 30min break excluded3.5h3.5h
Study goal3.5/10 = 35%35%
EE word count1200/4000 = 30%30%

4. Usability and design improvements (not additional verified bugs)

  1. Provide Undo and a recoverable history for edits, replacements and deletions. The lack of recovery makes small scheduling mistakes costly.
  2. Add an import preview listing included/missing sections and record counts. Explicitly distinguish a full backup from a partial data export.
  3. Ask for a destination date when duplicating study sessions, and show a collision preview before any overwrite.
  4. Use inline validation instead of browser alerts; focus the invalid field and explain how to fix it.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. Separate planned study time from completed/logged study time; dashboard “Study hrs this week” currently represents planned blocks.
  11. 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.
  12. Add Escape-to-close for forms with sensible unsaved-change handling. Escape did not close the assignment modal; focus wrapping did work.
  13. 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.
  14. 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.
  15. 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

RankFixLinked defectsWhy first
1Prevent/confirm occupied timetable-slot replacement; add UndoQA-001Ordinary Add can remove entered class details
2Prevent study-create/duplicate collisions; stable IDs/historyQA-002, QA-014Ordinary scheduling can replace a student's plan
3Correct weekly calendar date matchingQA-005Students can read deadlines/exams on the wrong day/week
4Migrate classes when period times changeQA-003One five-minute edit hides five classes
5Use stable subject IDs and rename migrationQA-004Routine name edit hides grades and disconnects tasks
6Include all saved work in versioned backupsQA-007Revision work/goal absent from exported recovery data
7Unify predicted-score calculation across pagesQA-006Prominent 36/45 contradicts correct 39/45
8Enforce assessment mark and boundary constraintsQA-008, QA-011Impossible data produces misleading predictions
9Centralise date/time validation and week boundariesQA-009, QA-010, QA-013, QA-016Reject invalid durations and count Sunday consistently
10Fix priority sorting and show priority clearlyQA-012High-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

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.

Weekly calendar date shift
Weekly calendar date shift

Friday exam drawn under Saturday; Sunday CAS task drawn under the following Monday.

Weekly event date shift
Weekly event date shift

Dashboard 36/45 versus Gradebook 39/45 on the same account.

Dashboard score
Dashboard score
Gradebook score
Gradebook score

Period-time edit leaves the entire first row empty.

Period row orphaned
Period row orphaned

Renamed History subject shows no assessments.

Renamed subject missing grades
Renamed subject missing grades

Invalid marks are accepted as 125%.

Invalid gradebook marks
Invalid gradebook marks

Stored period ends earlier than it begins.

Invalid timetable interval
Invalid timetable interval

Stored event end precedes its start.

Reversed event dates
Reversed event dates

Preserved account at the end of testing.

Final QA account
Final QA account