ExamAdvantage — Changelog

Certification Tool and Die, Ltd. · (ISC)² and ISACA certification courses

Release 26239_01 — August 27, 2026

Course DBs · Course content update · CISM + CRISC initial delivery · All 9 (ISC)² exams rebuilt · No program changes

CISM and CRISC — Initial Course Delivery

The first two ISACA course databases are now available for download:

Both databases include the full-text search index, ISACA-specific glossary definitions via certBodyDefs, and all editorial standards described below. A deep audit was run against both corpora before release; the items below document what was found and corrected.

CISM Content Fixes

A deep audit surfaced residual editorial issues not caught by the pre-delivery audit pass:

CRISC Content Fixes

Glossary Integrity Pass

All nine (ISC)² course databases rebuilt following a multi-round glossary cleanup. Changes in this pass:

ISACA Glossary Expansion

The shared glossary was expanded and restructured to serve both (ISC)² and ISACA exam databases from a single source.

Final glossary: 3,058 entries, zero exact-term duplicates (asserted), 8 cert-body overrides, 21 legitimate acronym shares (all genuine different-concept pairs). Validated by both validate_gloss_overrides.py and validate_gloss_metadata.py check at exit 0.

Full-Text Search Index

The course database schema now includes a content_search FTS5 virtual table populated from every topic's title and block content (HTML tags stripped, SVG included). This index powers Jump Palette keyword search and future in-course search features. The index is populated once at build time and is read-only at runtime.

⚠ Course database file sizes approximately doubled in this release due to the FTS5 index. Download sizes will be larger than prior releases.

Glossary Metadata Schema

glossary_master.json now carries a metadata block with a SHA-256 content checksum, entry count, content version, and timestamp. On load, migrate.py verifies the checksum and reports a warning on mismatch (non-fatal — the build continues). A new validate_gloss_metadata.py tool provides check and bump subcommands for maintaining the metadata block between editing sessions.

Bug Fix — migrate.py Glossary Filter

A defect in migrate.py v3 caused all glossary entries to be silently excluded when the glossary uses the new dict format ({metadata, entries}) and entries carry no per-exam filter field. The filter predicate incorrectly required an exams field on each entry; entries without that field (i.e., universal entries applicable to all exams) evaluated to zero matches. Patched: entries with no exams field are now treated as universal and included in all exam databases.


Glossary Remediation — Additional Content Fixes

A concurrent session's audit and remediation pass targeted specific data-quality patterns beyond the general ALL-CAPS consolidation described above. These fixes were folded into the same 3,079 → 3,058 net reduction:

All fixes validated by both validate_gloss_overrides.py and validate_gloss_metadata.py check at exit 0. Final entry count and 8 cert-body overrides match the counts documented above.

Bug Fix — validate_gloss_overrides.py Dict-Format Compatibility

Companion bug to the migrate.py glossary filter fix documented above. The validate_gloss_overrides.py script iterated the loaded JSON directly with for entry in entries, which worked when the glossary was a bare list of entry dicts but crashed with AttributeError once the glossary was wrapped in the {metadata, entries, certBodyDefs} dict — the iterator yielded the top-level keys "metadata", "entries", "certBodyDefs" as strings, and the next line's entry.get("term", ...) failed because strings have no get method.

Patched to handle both formats: if the loaded JSON is a dict with an entries key, use data["entries"]; if it's a bare list, use it directly; otherwise fail with a clear error message. The two format branches are exhaustive and mutually exclusive.


Release 26238_01 — August 26, 2026

Feature release · Program · Requires DB rebuild for full-text search

Application-side feature work across three targets (Blazor Web, MAUI Android, Legacy Node). Three feature sprints delivered together, plus the FTS5 application integration to consume the DB-side index shipped in 26239_01.

Sprint C — Retention System

Review queue. Every completed topic resurfaces on a schedule based on how the learner performed. Intervals: 100 percent with high confidence = 14 days, 100 percent otherwise = 7 days, 67 percent accuracy = 7 days, 33 percent = 3 days, 0 percent = 1 day. A new Review pill in the header nav (Blazor) and a Reviews footer link (Legacy) show the due count.

Review mode. Clicking a due topic opens it with a review banner and a confidence-only slider at the bottom instead of the normal quiz. Re-quizzing was deliberately not offered: memorization contaminates repeat scores after one or two passes. The original quiz record remains intact as the retention baseline; the fresh self-rating is appended to a reviews list on the answer record.

Shaky topics detection. A second section flags topics where self-rating is out of step with observed performance, only when the pattern is completely consistent across all three questions on the topic (all correct at low confidence, or all wrong at high confidence). Underconfident and overconfident are shown separately and grouped by domain.

Launch-time reminder banner. When Start loads with items due, a card at the top shows the count and offers a one-tap Start with reviews button. Chosen deliberately in place of Android push notifications, which would have required requesting permissions and undermined the no-permissions, no-ads, no-accounts, no-telemetry story in the Play Store.

Sprint D — Report Screen Overhaul

Report screen segmentation. Organised into five sub-sections with clear headers: Summary, Performance, Insights, Objectives, Next steps. Both Blazor and Legacy share the layout.

Weakness heatmap. A domain-by-difficulty grid, each cell coloured on an HSL green-to-red ramp based on accuracy. Clicking a cell filters the objectives tree below to just those topics.

Per-domain calibration. Alongside the overall calibration verdict, every domain gets its own row: rated vs scored side by side with a verdict (well-calibrated / overconfident by N pts / underconfident by N pts), colour-coded on the left edge.

Calibration trend over time. Weekly-bucketed dual-line chart using the answeredAt timestamps from Sprint A. Measured proficiency (teal solid) vs self-rating (red dashed) averaged per ISO week. Requires at least two weeks of dated activity before it renders; a hint appears in the meantime.

One-click remediation. Focused remediation card with a drop-down criterion (20 weakest / all below 67 percent / all below 50 percent / overconfident) and a button that jumps the study cursor to the first matching topic. Button label shows the count that will be queued; disabled when nothing matches.

Sprint E — Exam Date and Pace Tracker

Per-exam target date. Collapsible section on the Start screen lets a learner pick a target date for each exam independently. Stored locally per exam (Blazor via ProgressStore preferences, key ea_exam_date_{examCode}; Legacy via localStorage) — no calendar sync, no external service.

Pace card. Once a date is set, a card shows days remaining, objectives left, required topics-per-day to finish, and actual pace over the last seven days. When actual pace falls below 80 percent of required the card turns red and adds a recovery line ("Behind pace. To finish on time you'd need X.X topics/day from here on."). No moralizing text — the number does the talking.

Combined launch banner. The Sprint C reminder banner now covers both feature sets: when both an exam date and reviews are present, the banner reads "9 days to your exam · 25 topics due for review". Either half also shows on its own.

Full-Text Content Search (Application Side)

The Jump palette gains a Search inside topic content too checkbox. When enabled, an async debounced query against the DB-side FTS5 index (shipped in 26239_01) returns topics whose prose contains the search terms, unioned with the existing title/number matches. Uses BM25 relevance ordering, prefix matching (so "zero tru" finds zero trust), and falls back gracefully to title-only search on older course databases lacking the index. Legacy exposes the search via GET /api/{examCode}/search?q= with the same sanitisation logic as the Blazor SearchContentAsync.

Report Screen Segmentation — Legacy Parity

Legacy renderResults now emits the same five section wrappers as Blazor (Summary / Performance / Insights / Objectives / Next steps), matching the visual structure across all three targets.

Not Shipping in This Release

Upgrade Actions


Release 26237_03 — August 25, 2026

Feature release · Program only · No course content changed

Sprint B — Notes, Notes Report, Examulator Nudge

Per-topic notes UI. A note button appears on the Topic screen next to the topic title. Clicking it opens an inline editor. Notes are stored on the answer record (nullable string, backward-compat) and are visible when reviewing a completed topic.

Notes report screen. A dedicated screen lists every topic with a note, sorted by most recently updated. Reachable from a badge in the header nav that shows the total note count.

Examulator URL nudge. On the Results screen, once a learner has completed a substantial portion of the course, a small card suggests companion product Examulator at certificationtoolanddie.com/examulator for timed practice with a larger question bank. URL link only — no cross-installation.


Release 26237_02 — August 25, 2026

Feature release · Program · Introduces cross-device progress transfer

Sprint A — Timestamps and Backup/Restore

Answer timestamps. TopicAnswer gains two nullable UTC-millisecond fields: AnsweredAt (when the quiz was submitted) and ContentViewedAt (when the reading portion was first viewed). Backward compatible — existing progress records without these fields are treated as timestamp-unknown and everything continues to work.

ProgressBackup service. Blazor gains a Manage progress screen with two-card UI: create a backup (downloads a zip containing progress.json + manifest.json) and restore from backup (upload a zip, choose overwrite or merge mode). Legacy provides equivalent functionality via three endpoints backed by the adm-zip package.

Cross-device username remap. On restore, if the backup's stored username differs from the current device's username, an option offers to remap the imported records to the current username — useful when moving between devices with different logins.

Merge vs overwrite. Overwrite discards existing progress and installs the backup as-is. Merge preserves both, resolving conflicts by taking the more-recent updatedAt per topic.

Dependency Notes


Release 26237_01 — August 25, 2026

Program only · No course content changed

ISACA Support & Cert-Body Filter

All — Groundwork for ISACA course support. All eleven ISACA certification tracks are now in the bundled catalog and appear in the exam selector: AAIA, AAIR, AAISM, CCA, CCOA, CCP, CDPSE, CGEIT, CISA, CISM, CRISC. The catalog now holds twenty courses total (9 ISC² + 11 ISACA).

Because twenty cards on one screen would be visually overwhelming, the exam selector gains a small cert-body pill toggle in the top-right of the header: (ISC)² and ISACA. The active segment fills with the accent colour and the list re-renders to show only that certifying body's courses. No intermediary screen was added — the toggle sits above the same card grid learners already use.

Implementation Notes


Release 26232_03 — August 20, 2026

Bug fixes · Program only · No course content changed

Progress Counts Against Exam Objectives, Not Raw Page Count

All — Delivery 26232_01 expanded the study sequence to include domain, chapter, and topic overview pages so learners get context before diving into leaves. That change had knock-on effects in several places that had assumed the sequence length equalled the number of testable objectives — since it no longer does, several counters were mis-comparing leaves against a sequence that included overviews:

None of these bugs affected the actual study flow, scoring, or the persisted state — only the on-screen counters.


Release 26232_02 — August 20, 2026

Enhancements · Program only · No course content changed

MAUI App Icon

MAUI — The Android app icon was rendering as an unreadable blur. Root cause: MauiIcon pointed at Resources/AppIcon/logo.png, which contained the full brand logo including all text. When Android scaled that to launcher-icon sizes (48–96 px), every letter became a smear of pixels. Fixed: replaced with a properly-formed adaptive-icon foreground — just the cap, shield, lock, key, and tassel, centred at ~68% of the 432×432 canvas to fit within Android's inner safe-zone circle. Legible and recognisable at every launcher density.

Version + Build Date on Splash Screens

All — The splash screen now displays the running version and build date in a small monospace footer beneath the copyright line:

Version 26232_02 · Built 2026-08-20 22:00 UTC


Release 26232_01 — August 20, 2026

Feature · Program only · No course content changed

Study Sequence Now Includes Overview Content

All — Learners previously jumped straight into terminal leaves (e.g., 1.1.1.a) when starting a new session. The sequence-building code filtered to leaves only, excluding every domain, chapter, and topic overview. Removed the filter so the sequence includes every topic in document order. The existing infrastructure for content-only completion tracking was already fully in place — the fix was one line per target. Existing users' saved progress reconciles transparently.

Back Navigation

All — Added a Previous button on Topic and Quiz screens so learners can walk back through material they've already covered.

Text-to-Speech Fixes

All — Several TTS bugs collectively made the read-aloud button feel unreliable:

UI Fixes

Branding

Version Format


Release 26228_01 — August 16, 2026

Bug fixes · Program only · No course content changed

Accessibility Audit Remediation

Auto-Updater Infinite Loop

Legacy — updater.js determined the locally installed version by regex-scanning ExamAdvantage.html for the EA_VERSION constant. Because the constant in the file on disk is the build-time placeholder APP_VERSION (replaced by server.js only at serve time), the regex never matched, the local version was returned as 0_00, and every launch triggered a download-restart cycle that never resolved. Fixed by reading the version from appsettings.json instead. The filename regex (progRE) was also updated to accept both the legacy underscore format (26226_06.zip) and the current dot-plus-delivery format (26226.06-1.zip).

Start-Over Modal — Dropdown Does Not Activate Choice Button

Legacy — No change listener was attached to the select elements in the "Start over" modal, so choosing a domain or subdomain from a dropdown left the choice button selection unchanged — causing the fresh run to always restart from the beginning. Fixed by adding change listeners that update the active button and mode to match the selection.


Release 26227_01 — August 14, 2026

Feature · Course DBs · Full-corpus quality remediation and content versioning

Question Quality

Glossary

Application — Content Versioning

Each study topic now carries a content version stamp in the course database. When a topic's content or questions are updated in a future release, the application will show an Updated — review badge next to that topic in the section overview. The badge will appear for topics studied from this release onward.

Application — Version Check

On loading a course, the application compares the course database version against the installed application version. If the database is older, a warning banner is shown prompting the user to reinstall the course. Users can still study while the mismatch persists.


Release 26226_06 — August 14, 2026

Enhancements · Program only · No course content changed

Component labels: All = all three targets. Legacy = Node.js / HTML single-file app. Razor = ExamAdvantage.Web (Blazor Server). MAUI = ExamAdvantage.Maui (Android Hybrid).

Course Compatibility Enforcement

All — Replaced the previous version check with a per-exam compatibility floor. Program bug-fix releases no longer force course reinstalls. When an installed course database is below the floor, the learner is redirected to the course installer before anything loads.

All nine (ISC)² exams (CC, SSCP, CISSP, CCSP, CGRC, ISSEP, CSSLP, ISSAP, ISSMP) require a minimum course version of 26227_01 due to full-corpus structural realignment.

Print and Share Report

Application Subtitle

All — Navigation bar subtitle updated from "Exam Preparation Engine" to "Cybersecurity Certification Preparation."

Content Revision Display

Legacy / Razor — The contentRevision field shown in version-mismatch messages is now derived from the installed course database's user_version stamp at runtime, rather than read from a static value in exams.json.

Visual Studio Solution Restructure

Razor / MAUI — Solution files moved to the repository root alongside ea2/ and legacy/. The legacy application source is now represented as a Solution Folder with Solution Items, making all legacy files editable directly from Solution Explorer.

MAUI / Android Improvements

Build Script

Razor — build-desktop.sh now passes PublishTrimmed=true and TrimMode=partial for all self-contained platform builds.