Release history
Substantive changes to the Veriprose essay tools and Gloss, newest first.
Dates. The date beside a version is when it was released. Where a last deployed date also appears, later work under that version went live on that day, and that is what is running now.
Compatibility. .essay files verify across all v1.4.x releases in both directions: files from an older editor verify in a newer verifier, and vice versa.
v1.5.6
2026-09-02
last deployed 2026-10-17
Current
PDF export works for long essays. The exported PDF no longer ends with pages of raw session data, which turned one 700-word essay into 434 pages and stalled Chrome's print preview. That essay now exports as four pages. The essay verifier also gains a submission bar with Previous / Next, and several Gloss verifier bugs are fixed.
Fixes
- Long essays could fail to export to PDF. The export printed the full session data as its last pages — 395 of 434 pages for one essay. On lower-memory Macs, Chrome's print preview stalled and the tab closed with no PDF and no message. That section is removed.
- The print dialog could open too early. Export waited a flat half-second, too short for a long document. It now waits until the page has finished laying out, and never less than half a second.
- The verifier offered a check that could never pass. Copying the session data out of a PDF adds line breaks and alters characters, so pasting it always failed the signature. The paste option is removed; verify from the
.essay file.
- Gloss verifier: your copy of one reading was applied to every reading. After moving to the next student, highlights went missing and notes from other readings showed as not found in your copy. Your copy now attaches only to the reading it matches; other readings show Load your copy….
- Gloss verifier: some submissions showed no notes. A reading or note ID matching a built-in browser name, such as constructor, emptied the notes panel. These IDs now work like any other.
- Gloss verifier: Typed vs pasted read 100% typed for every student. The signal looked for pastes under the wrong field name, in the report and the batch table. It now agrees with the activity dashboard. Malformed activity counts are skipped instead of producing nonsense totals.
- Gloss verifier: a damaged file could fail to open silently, leaving the previous student's report on screen. It now says the file cannot be reviewed and why.
- Gloss: PDFs over 20 MB were refused as too large. PDF import borrowed the size limit meant for
.gloss session files, so larger assigned readings could not be added. PDFs now have their own 100 MB limit, and the message gives the file's size and the limit. The PDF itself is still never saved or exported.
- Gloss: a reading with an ID such as constructor could appear blank or reject notes, including after a reload. Fixed.
- Gloss: the re-attach and re-open links did nothing for a reading whose ID contained an apostrophe or quotation mark. Fixed.
- Gloss: the remove-source button was hard to read on hover in dark mode, with white text on red at 3.8:1. It now uses dark text there, at 4.9:1.
New — for instructors
- Clear roles for the two files. The PDF is the readable copy; the
.essay file is the one that verifies. The verifier now states that the signature printed on the PDF identifies its .essay file.
- Less scrolling in the report. Verdict cards are shorter, the ten summary tiles fill their grid evenly, and card headings share a line with the "generated by" text.
- A submission bar names every report. It shows the assignment field exactly as the student typed it, for single files and batches. Names are not split out, because students don't follow one format.
- Previous / Next through a batch. The bar shows your place (7 of 30) and follows the table's current sort. Alt + arrow keys do the same. Batch table returns to the list without losing your place. Unreadable files are skipped.
- Gloss verifier: reloading asks first. Once you have opened a submission from the table or marked a rubric level, closing or reloading the tab asks for confirmation. Your pass is never saved, so this is its only protection. Opening a single file or loading a copy does not trigger it.
- Gloss verifier: the note count stays in view. It sits beside the student's name while you scroll and reads 12 of 65 notes when filtered. Submissions covering several readings show a count per reading. The student found this label is removed.
- Gloss verifier: signals cover the reading you are grading. Once you load your copy of this assignment's reading, the signals, activity figures and worklist count only notes on that reading, and say how many they left out. Notes on other readings stay listed, marked not matched to a copy you loaded.
- Gloss verifier: the Manifest button and Coverage card are removed. Coverage could not handle PDFs and read 0 of 3 for a whole class; your loaded copy now does that job. Rubrics and saved column lists that name Coverage still load.
- Gloss verifier: the Rubric button and rubric notes are removed. Signals now show as one list, the way they always did without a rubric loaded. Level marks and "Copy my rubric notes" went with it; nothing about a student's
.gloss file changes.
- Gloss verifier: the worklist works from the keyboard. Tab to a row and press Enter or Space to open it; focus moves to the report, and Worklist returns it to the row you were reading. Rows could not be reached without a mouse before.
- Gloss verifier: a new batch asks before replacing your pass. Once you have opened a submission, choosing another batch β or dropping several files on the Submission box β asks first and says how far through the class you are. Cancel keeps the worklist, your ticks and the open submission.
Changes — for students
- Gloss: adding a pasted article asks only for a title and the text. The Assigned-materials ID box and the own find tag are removed. Existing sessions, including any ID already entered, open and export unchanged.
Internal
- New PDF export check. The essay, appendix and signature always print; the session data never does; the largest session the editor allows stays printable. Fixtures are built from the editor's own limits.
- Overtaken reviews are discarded in the essay verifier, as they already were in the Gloss verifier, so a slow review cannot show its result under another student's name. The stepper re-finds the open submission after sorting or opening.
- New Gloss verifier checks cover copy matching (including cost on a file declaring hundreds of readings), signal scope, the reload warning, built-in-name IDs, typed vs pasted against what Gloss actually records, damaged-file refusal, and complete removal of the manifest.
- Imported Gloss sessions keep every signed field on re-export, including the retired reading ID, and a check confirms the re-exported file verifies.
- Release check widened to the Gloss verifier footer, which read v1.5.4 for two releases, and to the project notes' count of checks.
- New Gloss check fails if the PDF size limit falls back to the
.gloss file limit, or below what the PDF cache can hold.
- Each new check was confirmed to fail when the fault it guards against is put back.
- A deploy could hang forever in the checks. About 2–3% of the time,
check-gloss.js deadlocked inside Node while exiting, after printing a clean pass. It now ends without that exit call (0 hangs in 800 runs), and check-all.js stops and names any check that runs past two minutes.
Rubric marks stay with their student. Marks made on one submission could carry over to the next and be copied out under the wrong name; that is fixed. The worklist also gains choosable columns, a class-wide check against your copy of a reading, ticks for what you have opened, and sorting. All changes are to the Gloss verifier.
Fixes
- Rubric marks carried over to the next student. Pressing Next showed the previous submission's levels already ticked, and copying the feedback put them under the new student's name. Marks now belong to their submission: stepping away clears them, and coming back restores them.
- Coverage collapsed three cases into βnot computedβ. A different assignment, a submission naming no reading list, and a list you have not loaded now read differently in the column.
- A file that failed part-way could look healthy, with its signals quietly blank. It now shows as unreadable.
- Re-ordering the list while a submission was opening tracked the wrong student, so Next stepped from the wrong place. Fixed.
New β for instructors
- Choose the worklist columns. Under Columns, add any signal from the report: words per note, active reading time, quoted vs note words, notes containing a question, typed vs pasted, sources. The defaults favour signals that vary; in a real class of 29, Coverage and Sources were identical in every row. Your choice is remembered on your computer.
- Passages not in your copy, for the whole class. Load your copy of a reading and every row is checked against it. A number above zero means some highlighted passages were not found in your file: worth asking about, never a verdict. A row annotated against a different file says so. Until a copy is loaded the column reads βnot computedβ, not zero.
- Ticks for opened submissions, with a count above the list (β12 of 29 openedβ). It tracks your own pass, is not a score, and resets on reload.
- Previous and Next beside the Notes heading, so reading notes first no longer means scrolling up to step. Both steppers stay in sync.
- Less scrolling to reach the notes. Submission details now take two rows instead of nine, the Verification card is shorter, and the student's name leads both cards and the notes panel. Card headings are larger and darker.
- Sort into gradebook order by Student, Signature, Exported or Reviewed. Signal columns cannot be sorted, so a class cannot be ranked by apparent quality. The list still opens in the order the files were chosen.
Internal
- Eight new checks, each confirmed to fail when its fault is put back. Several test how two additions interact, which is where the defects above slipped through.
- Batch table columns are declared once, so headings and cells cannot drift apart, and a check refuses a sortable signal column.
- Saved column choices are repaired on load, so a list saved by an older version cannot hide student names with no way to get them back.
Batch review works. The Batch⦠button read no files, and dropping several submissions reviewed only one; both are fixed. You can also step between submissions, see the student's name above their notes, and keep your copy of a reading open across the class. All changes are to the Gloss verifier.
Fixes
- The Batch⦠button did nothing. Choosing files produced no worklist and no error, because the page cleared the file picker before reading the files from it. Fixed, and a check now models that browser behaviour.
- Dropping a class reviewed one submission. The Submission box kept only the first file, and on a Mac its picker would not allow multiple selection. Several files now open the worklist; a single file still opens on its own.
- Dropping a folder failed silently. It now tells you to open the folder and drop the
.gloss files inside.
- Two submissions opened quickly could be mixed together, showing one student's signature result above another's notes. An overtaken review now stops instead of drawing over the one on screen.
- A message about your copy could never be seen. When a reading could not be re-opened, the status line overwrote the explanation. It now stays on screen.
New β for instructors
- Step through the class. Once a submission is open, Previous and Next appear with your position (β7 of 30β) and a way back to the worklist. Unreadable files are skipped, and the current row stays marked. Alt + left or right arrow does the same.
- The student's name above their notes, staying in view as you scroll.
- Load your copy of a reading once. It stays open across the class instead of being requested for every student. Each submission is still matched against it fresh, and a reading shown from an earlier copy says so. Your copy lives only in the open tab: never uploaded, never saved.
Internal
- Nine new checks cover every fix and addition above, each confirmed to fail when its fault is put back. One models the browser's live file list, the gap that let the batch defect ship.
- Two code descriptions corrected to match the code: how a kept copy is matched, and a note claiming a reading had to be re-opened for every student.
v1.5.3
2026-08-08
last deployed 2026-08-25
Prior
Gloss is reachable, and capitals are gone. The editor and essay verifier now link to their Gloss counterparts, Gloss shows what it has recorded, and all-caps text is removed from every page.
New β for students
- A Gloss button in the editor, beside Help. Gloss could previously be reached only by typing its address. It opens in a new tab, so your draft stays where it is.
- A Gloss footer showing what is recorded: sources, notes, keystrokes, pastes, and when your work was last saved on this computer. These are the same figures the file carries; nothing new is recorded.
New β for instructors
- A Gloss verifier link in the essay verifier's header. Student pages still have no path to either instructor tool.
- A getting-started guide for teachers (teacher-guide.html): which link to give students, the Chromebook workflow, what the file records, getting
.essay files out of Google Classroom, and reading the review tool. It says plainly that the signature check can be skipped, since it guards only against a file hand-edited after saving. It is not linked from the app, because it names the instructor tool. Added 2026-08-14, under this version.
Improvements
- No more text in capitals. 31 all-caps rules across six pages are removed, including in the exported-PDF stylesheet; capitals are harder to read, especially at small label sizes. Initialisms such as PDF and HMAC are unchanged.
- The Gloss buttons are indigo, matching where they lead rather than the page they sit on.
Fixes
- Two note counts disagreed. The count beside a reading covers the open source; the footer covers the whole session. The footer now says βThis sessionβ.
- A successful save could report failure, and the same fault could stop saving silently. Introduced while building the footer and caught before release; both are fixed, with a test.
Internal
- Three new release checks: capitals are rejected across all seven pages, the Gloss indigo is compared across the four files that carry it, and the footer counters are tested against a corrupt file. Each was confirmed to fail when its fault is put back.
- Gloss's layout no longer hardcodes the header height, which left no room for the footer.
v1.5.2
2026-07-26
last deployed 2026-08-08
Prior
Richer annotation, and a view of how it was done. Gloss adds coloured highlights, tags, search and margin pins. The Gloss verifier adds an activity summary and rubric notes. Several counting and display bugs are fixed, including a revision diff that could show no change.
New β for students
- Six highlight colours, saved with each note so your instructor sees the same distinction you made.
- Tags on notes, from a category list or your own, shown as badges and usable as filters.
- Search and filter notes by text, quoted passage, colour or tag.
- Margin pins beside each note's passage: hover to preview the note, click to jump to it.
- Prompt starters for when a passage matters but you are not yet sure why. Whether you use one is not recorded.
New β for instructors
- Activity summary: time spent, separate sittings, typed vs pasted, and typing-pace distribution. Built from totals the file already carried; no new data is collected, and what was typed is still not recorded.
- Rubric notes. With your rubric loaded, mark a level for each criterion and copy the marks out for your LMS. Veriprose does not score: no totals, no percentages, no number beside a criterion.
- Notes beside the pages. With your copy of a source open, the student's notes sit in a column beside the page images and stay put as you scroll; clicking a note jumps to its passage.
Fixes
- Essay verifier: a revision could look unchanged. On long essays the diff showed only edits near the end, so an earlier edit displayed nothing highlighted. It now shows the change wherever it falls.
- Essay verifier: word and character counts were low. Paragraphs were joined without a space, merging the words either side. Counts, and the pace figure built on them, now match the editor.
- Essay verifier: the entropy panel named the wrong sample (βthe last ~200 keystrokesβ while using 500). The label now reads from the same setting as the measurement.
- A large or damaged
.gloss file could fail to open. Signals are now computed in a way that handles any number of notes or sources.
- Tag badges failed contrast, as low as 2.8:1 against a 4.5:1 minimum. Each colour now has light and dark values, and all twelve combinations were measured.
- Highlight colours did not show on PDFs; only the margin marker carried the colour. Highlights now show it on the page, in both tools.
- A previous submission's reading could linger, including βfound in your copyβ marks worked out against another student's source. The same happened to students opening a saved session. Each file now starts clean.
- βLoad your copyβ did nothing. Fixed.
- Students' own tags could not be filtered on; the filter offered a fixed list of five. It is now built from the tags in the file.
- Page images rendered smaller than needed. They now fill their column.
- A PDF that could not be mapped gave no reason. The explanation was written into a hidden panel; it is now visible.
The Gloss verifier. Instructors can now open a .gloss file, check its signature, and read every note beside its passage, drawn on their own copy of the source if they load one. Students get PDF page images, and each of the four tools now has a distinct colour and role badge.
New
- The Gloss verifier (
gloss-verifier.html) shows the signature outcome, submission details, descriptive signals, and every note with its quoted passage. Like the essay verifier, it surfaces things to notice and leaves judgement to you: it never selects a rubric level, totals anything, or prints a score.
- PDF page images in Gloss. A Pages button shows the real pages, with selectable text and highlights in place. A source whose text cannot be positioned reliably stays in the text reader rather than risk highlights on the wrong words.
- Student highlights on your own copy. Load the assigned PDF in the verifier to see notes drawn on its pages. Three outcomes stay distinct: source not loaded, the highlight shown in place, and not found in your copy. A copy different from the student's is flagged as a file difference, not a finding about the student.
- Assigned-materials lists. Load a small file listing an assignment's readings to see how many a submission has notes on, and which sources the student found. Without a list, coverage reads not computed, never zero.
- Your rubric as the frame. Load your course rubric to group signals under your own criteria, wording and point values. The tool does no arithmetic with the points.
- Batch review. Choose many
.gloss files to get one row each (signature outcome, coverage, counts), and click a row to open it. The materials list is loaded once for the batch, and a file that will not open gets a row saying why. The table does not sort: it is a worklist, not a ranking.
Improvements
- Each tool has its own colour. The essay tools stay terracotta; the Gloss tools are indigo, on a band across the top and through highlights, buttons and selections.
- An Instructor badge on both verifiers, which now differ in colour as well.
- A consistent title block: all four pages show the Veriprose mark with the tool's name and version.
- The Gloss reader looks like a page: a sheet on a desk rather than the full-width panel the essay editor uses, so reading and writing look different.
- One file to hand in. The βcopy a summary for the submission boxβ button is removed; the
.gloss file is the submission. The short signature handle shown on export remains.
Fixes
- Gloss slowed down with use. Every opened PDF stayed in memory because the release code called a function that does not exist and failed silently. Only the current source is kept now, and a failed release shows in the status line.
- PDF and pasted-text highlights differed in dark mode, because the PDF colour was hardcoded. It now follows the theme.
- Gloss status messages are colour-coded again, with green, blue and red backgrounds matching the verifier.
- Text on coloured buttons and badges failed contrast in dark mode, as low as 2.8:1: Export PDF, Clear on hover, the instructor badges, tab counters and the changelog's Current pill. All now pass AA in both themes.
Internal
- The theme-colour drift check reads every colour block. It read only the first, so a later block could override a shared colour unnoticed. A per-tool layer may add colours but not redefine shared ones.
- The release check follows the Gloss version stamps into the new title block.
- Both Gloss pages must carry the same PDF engine build, since a highlight captured under one has to resolve under the other. The release check enforces it.
- The shared-code standalone check runs on every page carrying shared blocks, not just the student Gloss page.
- Materials-list and rubric formats are validated and refuse, with an explanation, fields that would turn them into automatic grading, such as a minimum note count or a rule for reaching a level.
Gloss, for annotating readings. Veriprose adds a third tool for highlighting and annotating the sources a course assigns, exported as one signed file. The essay editor and verifier are unchanged; the version moves to 1.5 because the app is now more than one tool.
New
- Gloss (
gloss.html). Paste an article or open a PDF, select a passage, and attach a note. Notes are listed in document order beside the reader, and a session can hold as many sources as an assignment needs.
- Offline PDF reading. The PDF engine is built into the page, so a PDF opens with no upload and no network request.
- Highlights survive changes to the source. A note finds its passage by the words and their surroundings, not a position in the file, so re-pasting, re-downloading or repaginating keeps highlights in place. If a passage is truly gone, the note shows as unanchored with its quote still there and editable. A note is never lost because a highlight drifted.
- Signed sessions. Export produces one
.gloss file, signed the same way as .essay files, to attach to the dropbox. The signature shows the file is unchanged since export; it does not prove authorship, and the page says so.
Notes for teachers
- Sources are never uploaded or stored. Pasted article text stays in the browser so highlights show on the next visit. PDFs do not: the student re-opens the file, and Gloss checks it is the same one. Nothing is sent anywhere until the student clicks Export.
- Activity is recorded as totals, not a transcript: how much was typed in each note, the pace distribution, and paste lengths, never the typed text or pasted content. Deleting a note deletes its activity record. See the privacy statement.
- Two-column papers can read out of order. Text follows the order stored in the PDF rather than a guess at the layout, so a quote may jump between columns. Guessing could attach a note to the wrong passage, which is worse.
Replay the writing session. The editor now records the essay's full edit history with timing, so an instructor can watch the essay being written and see where each part came from. The .essay format gains one optional field and stays compatible with every v1.4.x build.
New
- Session replay. The verifier's Replay tab plays the essay back at ×5 to ×100 speed, with scrubbing and a playhead on the session timeline. Long idle pauses are shortened for viewing, while the clock shows real session time.
- Origin view. Shades the final essay by where each character came from: typed, pasted or dragged, carried over from a loaded file, or produced by undo. Retype a pasted sentence in your own words and only the retyped words lose the paste shading.
- Edit history check. A new consistency check replays the recorded history and confirms it reproduces the submitted essay. A mismatch means the history has a gap or the text was changed outside it. Files from older builds read “n/a”.
- Session timeline. The first activity chart becomes one timeline: word count over time, paste events sized by amount, shaded bands where the editor lost focus, and a strip coloured by typing pace.
Improvements
- Sharper pace strip. For files with edit history, typing pace is computed in roughly 30-second bins instead of 60-second snapshots, so short bursts are easier to see. Older files keep the snapshot view.
Privacy
- The file now records text that was later deleted. Replay needs the full sequence of edits, including text you later deleted or changed. Only activity inside the essay editor is recorded, never other windows, tabs or apps. The privacy statement was rewritten to say so, and the student guide now tells writers their session can be replayed.
Internal
- Inline-script syntax check.
check-syntax.js parses every inline script in the shipped pages, so a typo in interface code can no longer pass the tests, which covered only the analysis engine. It runs as part of check-all.js.
Save format: a new optional opLog edit-history field. Older verifiers ignore it and files saved before v1.4.7 show “n/a”, so .essay files still verify across every v1.4.x build in both directions.
v1.4.6.2
2026-06-06
Prior
Accessibility to WCAG 2.2 AA. Stronger contrast, labelled controls, larger touch targets and a keyboard-operable batch table across the editor and verifier. No workflow change, and the .essay format is unchanged.
Accessibility
- Muted text failed contrast in both themes (below 4.5:1): timestamps, field labels, hints, footers. Darkened across the editor, verifier, changelog and privacy pages.
- A field with no label, and missing focus styles. The editor's name/assignment field now has a real label instead of placeholder text alone, plus a matching focus outline; the verifier's review tabs have a focus style.
- Small touch targets now meet 24×24px: the editor's Clear, Help and theme buttons, the history and revision steppers, and the verifier's “?” buttons.
- The batch table needed a mouse. Sortable headers are now buttons that announce their sort direction, and each row is focusable and opens with Enter or Space.
- The active side-panel tab is announced to assistive technology in the editor, matching the verifier.
- Reduced motion is honoured in both tools: the looping status indicator stops, and transitions and smooth scrolling are removed.
- Follow-ups: stronger batch status-pill contrast, a more visible assignment-field border and page heading, focus moved into the recovery dialog, a larger resize handle with double-click to reset, and a longer, pausable Clear-undo window.
Security
- Editor library integrity check. Quill, loaded from a CDN, now carries a Subresource Integrity hash, so a tampered copy is refused instead of recording and signing the session. The verifier was already protected: its sanitizer is inlined.
Schema unchanged from v1.4.6. .essay files from any v1.4.x build verify in either direction.
v1.4.6.1
2026-05-21
Prior
DraftSmith is now Veriprose. Also sturdier handling of malformed .essay files, and code shared between the editor and verifier kept in sync. No workflow change, and the save format is unchanged.
Fixes
- Malformed
revisions or pasteLog fields could break loading. A non-array value slipped past the fallbacks and threw, half-rendering the verifier or aborting a file open in the editor. Both fields are now checked as arrays on every load path.
Internal
- Shared-code drift check. Utilities copied into both
editor.html and verifier.html (the HMAC routine, escHtml, the theme toggle, the entropy constants and more) are fenced with SHARED: markers, and check-shared.js fails if the copies diverge. Several that had already drifted were reconciled.
- Two different functions shared the name
formatElapsed (h:mm:ss and 1h 23m). They are now formatDurationClock and formatDurationHuman.
Schema unchanged from v1.4.6. .essay files from any v1.4.x build verify in either direction.
A window focus signal, and batch review. The editor records when its window loses focus, the verifier gains a check that uses it and a batch mode for a whole class, and the pace check gains a sustained-burst lens. The schema change is additive; older files show “n/a” for the new check.
New
- Window focus timeline and check. The editor logs window blur and focus events (switching apps, windows or displays) as
stats.focusEvents[], capped at 500. The verifier's Window focus check warns when a long absence (≥20s) is immediately followed by fast typing (≥50 WPM), the pattern of reading from another window or a printout and typing it back. Stepping away on its own is Info, not Warn, and the note points to the revision diffs worth reading. Files from earlier builds show “n/a”.
- Batch review in the verifier. Drop many
.essay files to get a sortable table: file, warnings, paste %, edit passes, pace, words, assignment, signature. It sorts most warnings first, and unreadable files sink to the bottom. Every row runs exactly the same checks as a single review, so the table cannot disagree with the detail view. Click a row to open it; Load Another File returns to the table. Signals are framed as relative to the batch: a prompt to look closer, not a verdict.
Improvements
- Plain-language explainers. A
? button on every consistency check reveals a non-technical explanation of what it looks for and how to read it, framed as a prompt for a conversation, not proof. Collapsed by default; the Help panel keeps the technical detail.
- Sustained bursts in Writing pace. Alongside the single-interval peak, the pace check now finds the highest typed WPM held across any window of 60 seconds or more, and escalates on either. It stays one check rather than two near-duplicate warnings.
Schema is additive over v1.4.5: stats.focusEvents[] is new and optional. Files verify in both directions across all v1.4.x builds.
Crash recovery, a three-way theme, and compare any two revisions. Also fixes an XSS path in the verifier's stats card and several smaller hardening and consistency bugs.
New
- Auto-recovery in the editor. Every revision, paste, drop and text change saves an unsigned snapshot in the browser. After a crash, or a tab closed without saving, the next visit offers to restore it before the starter text appears. A restored session counts as unsaved. Clear removes the snapshot (undo brings it back), and opening a file replaces it.
- System, Dark and Light themes in both tools. System follows the OS setting as it changes; Dark and Light stick. The button shows the current mode, and its tooltip says what the next click does.
- Compare any two revisions in the verifier. A Compare to: list in the revision panel diffs against any earlier revision, not just the previous one, and resets to the previous one when you move to another revision.
Improvements
- Editor header regrouped into file actions (Save, Export PDF, Open) and smaller secondary controls (Clear, Help, Theme), with the separator between the two.
- Shorter starter text in the editor, pointing directly to the Help tab.
- “Pre-v1.0 build” was misleading for files with no version, since the project starts at v1.4. It now reads “an early Veriprose build”.
- “1 revisions” is now singular.
Fixes
- XSS in the verifier's stats card. A hostile
.essay could put HTML in the typed or pasted character counts and inject script into the instructor's page. Both are now validated as numbers before display.
- Saved files claimed a release date one day early, because
APP_RELEASE_DATE still carried v1.4.3's date. The verifier's “Generated by” line and the PDF footer both showed it.
- Typing during a save could be marked as saved. The unsaved flag was cleared after signing finished, overwriting keystrokes made meanwhile, so the leave-page warning could miss them. It is now cleared before signing starts.
- The editor trusted numbers in a loaded file. Stats fields could let non-numbers, NaN or negatives through. They now use the same validation as the verifier, and keystroke timings must be an array.
- The pastes panel crashed on a hostile entry with no text. Missing text and counts now default safely.
- The editor and verifier showed different diffs for long texts (the last 500 words vs the last 300). The verifier now matches the editor.
- A redundant slider update was removed from the editor.
Schema unchanged from v1.4.4. .essay files from any v1.4.x build verify in either direction.
A verifier laid out for reviewing the writing process. Revision diffs open under the clicked row, the charts sit beside the controls that drive them, and a consistency-checks summary joins the signature verdict. Also bundles editor accessibility and keyboard improvements.
New
- Inline revision diffs. Clicking a revision expands its diff directly beneath the row, replacing the separate viewer further down the page. Stepping with the slider or buttons scrolls the active row into view.
- Consistency checks summary card beside the signature verdict: a one-line result, pass/warn/info counts, and an expandable list of the warnings. Stacks into one column under 760px.
Improvements
- Verifier reordered. The Revisions/Pastes card now sits directly under the activity charts, so the slider is next to the diff it drives; the final essay moves to the bottom.
- Final essay collapsed by default, saving space until you need it.
- Smaller overview tiles, fitting the same six figures in less height.
- Keyboard-resizable side panel in the editor: arrow keys nudge it 20px, Shift+arrow 60px, and Home/End snap to the limits.
- Editor shortcuts.
Ctrl+Shift+/ opens the History tab; Esc leaves revision view or closes the Clear-all dialog.
- Toolbar buttons are labelled for screen readers.
- The Clear-all dialog keeps focus inside it and returns focus when it closes.
- An auto-save countdown (“next save in Ns”) in the editor footer.
- A “Back to editing” banner while viewing an old revision, so leaving it doesn't depend on knowing Esc.
- The editor confirms before opening a tampered file, as the verifier does. The file stays marked if you go ahead.
Fixes
- The checks summary undercounted warnings, reading “2 consistency warnings” above a list showing three, because it skipped the summary row at the top. It now counts every row shown.
Schema unchanged from v1.4.3. Saved files load identically.
Activity charts and a revision slider. The verifier gains three charts of a session's growth, edits and typing rhythm, and a slider that marks the matching point on them. The consistency checks were restructured internally with no change in behaviour.
New
- Activity Pattern Panel. Three charts: word count over the session, words gained or lost per revision (both with the final quarter shaded), and a histogram of keystroke intervals in 50ms buckets. Inline SVG that follows the theme, with no chart library.
- Revision slider and step buttons above the revisions list. The heavy update waits 100ms after you stop dragging, so scrubbing stays smooth.
- Chart sync. Viewing a revision marks its moment on the growth chart and outlines its bar, updating live while you drag.
Improvements
- Hardware macros noted in Help. Programmable keyboards (Logitech G Hub, Razer Synapse, Corsair iCUE) can automate input that still registers as trusted.
- Small pastes no longer dodge the transcription marker. “Zero pastes” now fires under 50 pasted characters, so pasting a title or citation doesn't clear it; the label reads “minimal pastes (N chars)”.
- The editor's history slider stutters less. Its label updates immediately and the heavy redraw waits 100ms.
- The verifier fits narrow screens. The header and tabs wrap, help tables scroll, the slider thumb grows on phones, and the Help button no longer resizes the header.
Internal
- Thresholds in one place. All 24 numeric thresholds are grouped in
CONSISTENCY_THRESHOLDS, each commented, so tuning one is a one-line edit.
- One function per check. The 444-line
renderConsistencyChecks was split into a function per check plus shared helpers, called from a 25-line orchestrator.
- Note text reads from the thresholds, so changing a threshold updates the wording too.
- Timestamp helpers replace eight repeated conversions in the editor.
Fixes
- “High typing pace” fired on very low pace, mislabelling paste-only students. It now requires pace above the high threshold.
- Single-field edit counts now show their breakdown, such as “(200 bs/del)”.
- Very short sessions said “no markers”, which reads as reassurance. They now say “insufficient data”.
- Edit-pass positions were off by one (“rev 33/33”). They now match the editor's numbering (“rev 34/34”).
Schema unchanged from v1.4.2. Saved files load identically.
Backspace and cut tracking, and a transcription summary. Two new consistency checks use the new counts, a summary row combines related signals, and the verifier gains a help panel documenting every check.
New
- Backspace and cut counts. The editor records trusted Backspace/Delete presses and non-empty cuts as
stats.backspaceCount and stats.cutCount. Older verifiers ignore them; newer ones show “n/a” for older files.
- Edit-action ratio check. Deletions and cuts as a share of typing: composing writers typically self-correct 5–15% of the time, transcription under 2%. A ratio of 2–5% becomes a Warn when pace is also above 40 WPM.
- Edit-passes check. Counts revisions where the word count went down. Pure forward growth is a transcription pattern, and a few decreases clustered only in the final quarter warn, naming the revisions.
- Transcription-pattern summary row at the top of the list, combining four markers: high pace, low edit ratio, late-only edit passes, and no pastes alongside substantial typing. No markers is ok, one is info, two or more is warn.
- Help panel explaining each check's formula, thresholds and known false positives. Esc closes it.
Improvements
- Writing-pace warning lowered from 80 to 50 WPM, with a stronger note above 80.
- Per-revision typed peak. The highest typed WPM between any two revisions, excluding pastes, catches a sudden burst that the session average hides.
Fixes
- “NaN%” in the output. Numeric stats are now validated, so NaN, infinite, negative or text values count as missing.
- “1 edits / 1 intervals” is now singular.
- XSS through the signature and counts. Hostile
hmac_sha256 values and untyped word and character counts are now escaped or validated before display.
A safer sanitizer. Verifier-only: the custom HTML sanitizer is replaced with inlined DOMPurify, closing a bypass in the old link check.
Security
- DOMPurify 3.2.4 inlined in
verifier.html (Cure53, Apache-2.0 / MPL-2.0), replacing the custom allowlist. Inlined rather than loaded from a CDN, so the verifier stays one file that works offline.
- Links limited to
https?:, mailto: and relative URLs. DOMPurify's defaults also allow tel:, sms:, ftp: and xmpp:, which an essay never needs.
- Link-check bypass closed. The old check could be fooled by a tab or line break inside
javascript:. DOMPurify normalizes that whitespace before checking the scheme.
Initial v1.4 baseline. Two tools: an editor that records typing rhythm, pastes and revisions and signs every save, and a verifier that checks the signature, sanitizes the student's HTML, and runs consistency checks.
Highlights
- Editor: Quill 2.0.3; paste and drop tracking with source details; keystroke-interval entropy; auto-saved revision history (up to 200); HMAC-SHA256 signing on every save; active session time; three outcomes on opening a file (verified, legacy, or broken with a lasting taint); printable PDF export with the signed JSON appended.
- Verifier: drag-and-drop or paste-JSON loading, signature verification, content sanitization, statistics, revision review with word-level diffs, paste log review, and consistency checks (writing pace, keystroke record, revision growth, typing rhythm, event trust, integrity chain).