# Changelog

## Unreleased

## 0.1.11-rc.1 - 2026-06-11

### Ready List

- Scheduled study now limits new-card introductions through a configurable
  `New cards per day` option. New cards are introduced in deck order, generated
  reverse directions share the parent card's introduction, and minimum-session
  fill no longer bypasses the daily new-card limit.
- The ready-screen status bar and `Due cards` filter now follow the same
  scheduled-study new-card limit as the `Start` preview. The `New cards` filter
  continues to show the full unstudied backlog.
- Problem card filtering now uses recent underperformance against the scheduler's
  replayed recall expectation instead of cumulative difficulty or lapse history,
  so cards can leave the filter as recent study results improve.
- Ready-list keyboard navigation on large decks is much faster. Selection
  changes now update only selection-local controls instead of recomputing the
  whole Cards menu on every arrow-key movement.
- Cards-menu opening on large decks is faster. Menu state now reuses one
  ready-list snapshot and preloaded card-state sets rather than repeatedly
  recomputing selected-card, flag, suspension, deferral, reversal, active-card,
  and shown-card bulk-action state.
- Flag, suspend, and defer actions from the ready list now use a narrower
  ready-screen refresh instead of a full screen/menu render, improving response
  time on larger decks while keeping filters, counts, status text, and
  selection accurate.
- `F5` is now handled directly by the ready-list key handler, avoiding a
  separate overlapping key binding on the same control.
- Ending a study session before answering any question no longer records an
  empty study pass. Opening an older review database removes existing empty
  pass rows while leaving review events and ordinary linked pass rows
  unchanged.

### Startup And Profile Safety

- The GUI now refuses to start a second Cosimo instance using the same profile
  lock beside `cosimo.ini`, avoiding conflicting writes to the config file,
  deck file, review database, and sync revision state. Sync server binaries are
  unaffected.
- The GUI profile lock is now held for the whole process lifetime instead of
  only during startup initialisation, so Windows builds continue to block a
  second instance after the main window opens.
- The GUI now releases that profile lock explicitly during the normal close
  path, avoiding a lingering process after exit on Windows.

### Audio

- Audio-generation helper output now goes under `logs` instead of `reports`,
  keeping the reports directory focused on saved study, exam, quiz, and
  learning-dashboard reports.

### Learning Dashboard

- Learning-dashboard workload forecasts now apply the same new-card daily
  intake limit as scheduled study, while still reporting the full unstudied
  deck-card backlog separately.
- Clarified dashboard counts for decks with generated reverse questions. The
  dashboard now labels combined scheduler state as total cards, splits the
  current state by standard and reversed cards, and reports review-state
  progress as standard, reversed, and total counts.

### Backup, Restore, And Sync

- Opening a deck now repairs stale `next_card_id` metadata when existing card
  IDs are already higher than the recorded high-water mark, preventing future
  automatic card IDs from being chosen from an unsafe range.
- Full-deck bundle export and backup now show progress while creating the
  bundle, and sync upload/download progress now includes local bundle creation
  and restore progress rather than jumping across those phases.
- Sync restore progress now continues through the local restore phase instead
  of leaving a long unreported interval after download.
- Sync upload/download progress bars now advance monotonically. Bundle,
  transfer, restore, and saving phases no longer report progress values that
  can appear to start in the middle or move backward.
- Sync OAuth now uses the browser registration/device-authorisation callback
  flow only. The earlier out-of-band code-copy endpoints were removed before
  the release-candidate API surface was established.
- Public sync server registration is now gated by explicit privacy
  configuration. Public-service mode refuses new account registration until
  controller, contact, privacy-notice, data-category, purpose, lawful-basis,
  recipient, transfer, retention, and rights/complaint information is
  configured; domestic mode is available for non-public personal deployments
  and can restrict registration to an account allowlist.
- Sync registration now happens on the sync server's browser page. The page
  presents the configured privacy notice, requires explicit acceptance, records
  the accepted notice version/hash and lawful basis after OAuth verifies the
  account, and rejects a callback for a different Fediverse account when the
  user entered a full account.
- `Deck -> Sync -> Register New Account` is now separate from `Deck -> Sync ->
  Log In`. Registration creates a sync account and authorises the current
  installation; Log In only authorises another installation for an existing
  account and does not repeat the account-registration consent flow.
- `Deck -> Sync -> Delete Sync Account Data` now opens a server-side
  OAuth-backed account-deletion flow. After the returned Fediverse account
  matches the requested account, the server deletes owned deck metadata,
  bundles, review-history bundles, Cosimo sync tokens, completed login
  handoffs, and privacy-notice acceptance records without requiring an existing
  Cosimo bearer token.
- The CGI sync server now has a `config` subcommand that asks deployment
  questions and writes a supported CGI config script containing storage,
  quota, service-mode, privacy-notice, controller/contact, retention, and
  domestic-allowlist settings.
- SQLite-backed sync storage now enables SQLite `secure_delete` for sync
  metadata connections, reducing retention of deleted bearer-token, OAuth,
  privacy-acceptance, and deck-metadata rows in database free pages.
- Sync server databases now migrate to schema version 4, dropping the obsolete
  OAuth application credential cache and removing the legacy out-of-band
  redirect default from pending-login storage.
- Sync server deck deletion now moves bundle files aside before committing the
  metadata deletion, then removes them after commit. Leftover delete
  tombstones are reconciled on later SQLite-backed requests, so CGI crashes
  during deletion are less likely to leave metadata pointing at missing files.
- Sync servers now reserve deck UUID ownership separately from active deck
  metadata. Deleting a deck leaves its UUID reserved for the same owner, while
  deleting the owner account retires those UUIDs without keeping the owner
  identity, preventing deleted public/shared deck identities from being
  claimed by another account.
- Sync upload errors now distinguish active owner mismatches, deleted deck
  UUIDs reserved for another account, and retired deck UUIDs, with GUI
  guidance to make an independent copy when the local deck should get a fresh
  sync identity.
- Sync status now treats invalid saved sync tokens as a stale login and tells
  the user to log in again instead of showing raw HTTP 401 protocol errors.
- Sync Status and Remote Decks now clear the local saved sync login when the
  server reports that the bearer token is invalid. Remote Decks falls back to
  the unauthenticated public deck list instead of failing the whole action.
- Federated OAuth registration errors now identify which OAuth phase returned
  non-JSON and include a short sanitized response summary, instead of only
  reporting a raw JSON parser offset.
- The standalone sync server now locks its durable storage root and refuses to
  start a second standalone process using the same storage. CGI deployments
  remain concurrently runnable.
- GUI and standalone sync-server lock files now use no-follow,
  directory-descriptor-relative opens on Unix and verify lock descriptors
  before writing diagnostic lock contents.
- SQLite-backed sync storage now waits up to 15 seconds for a concurrent writer
  instead of 5 seconds, reducing transient busy failures during large CGI
  uploads.
- SQLite busy/locked sync storage contention is now reported as `503 Service
  Unavailable` with `Retry-After`, and the client explains that the server is
  temporarily busy and the user can try again later.
- Sync upload intake now rejects configured-over-limit request bodies earlier,
  applies a read timeout in the standalone sync server, and has stronger tests
  for staged upload cleanup after quota failures and same-owner revision
  contention.
- The standalone sync web server now bounds concurrent request handling,
  reports saturation as `503 Service Unavailable` with `Retry-After`, and
  applies a response write timeout as well as a request read timeout.
- SQLite sync storage startup now reconciles known stale upload leftovers by
  removing `.upload-*` staged files and unreferenced server-generated revision
  bundle files while preserving unknown files and rejecting symlinked bundle
  paths.
- CGI sync upload intake no longer rejects configured sync quota/body limits
  before consuming stdin, avoiding client-side transport send failures when the
  route can instead return a structured HTTP error after reading the request.
- CGI sync requests now write privacy-safe lifecycle diagnostics to server
  error logs, including request path, content length, body-read result,
  response status, and elapsed timings without logging tokens, cookies, client
  IPs, query strings, or request bodies.
- HTTPS sync upload and download transfers now allow up to ninety seconds
  total while keeping a thirty-second connection timeout, so larger audio decks
  on slow links are not aborted by the metadata-request timeout. Plain HTTP
  development transfers continue to use thirty-second socket read/write
  inactivity timeouts.
- `Tools -> Delete Old Backups` has moved out of Options and into the Tools
  menu. Its confirmation now reports how many files would be deleted before
  deletion begins.
- Shared deck downloads remain available when owner-only sync status requests
  fail because the saved login is invalid or unavailable.
- Owner-only sync actions are disabled after remote authentication errors, so
  the UI no longer presents upload/download-history actions as available when
  the server has rejected the saved credentials.
- Sync status now treats a remote deck owned by a different account as an
  upload-blocking owner mismatch instead of presenting upload as available
  until the later preflight check fails.
- Sync-server 404 responses that are not Cosimo deck-not-found responses are
  now reported as connection/server errors instead of being confused with a
  missing remote deck.
- Sync upload conflict warnings now default to Cancel rather than the
  destructive force-upload action.
- Sync status no longer appears to move the last-seen remote revision
  backwards after logging out when the same deck also has an older anonymous
  shared-download state.

### Exams And Quizzes

- Blank answers in manually graded, non-exact exams are now shown in review
  with the expected answer and counted incorrect. They no longer ask the user
  to decide whether an unanswered question should be accepted.
- Enter now dismisses exam and quiz summary dialogues.

### Accessibility And UI Polish

- Restored the native ready-list label used for screen-reader naming after the
  rationalisation work.
- The transient study-summary focus experiment was backed out after manual
  testing showed no reliable accessibility benefit. The known timing issue
  after summary dismissal is now tracked as a ready-list rendering limitation
  rather than as a focus-restoration fix.
- The final item in exact-exam answer review no longer offers a redundant
  Next button; Summary is the only forward action.

### Documentation, Maintenance, And Internals

- The review-flow and ready-screen code has been rationalised without intended
  behaviour changes. Ordinary study actions, ready-card mutation actions, deck
  properties actions, sync menu/runtime helpers, and several render-state
  decisions now live behind clearer module boundaries.
- The architecture and contributor documentation now describe the current
  module ownership, Fossil backout workflow, UI performance boundary for
  ready-list selection handlers, and policy guidance for preserving native
  accessibility semantics.
- Added design notes for future sync API work: content-addressed storage,
  manifest-based incremental transfer, deck/review-history reconciliation
  constraints, privacy-preserving server statistics, owner deck-only sync,
  operator moderation tooling, and consent/privacy handling before stable sync
  deployment.
- Added basic Anki `.apkg` import: simple prompt/response material is imported
  into a new Cosimo deck with fresh card IDs, supported MP3 prompt/response
  audio is copied into sidecar files, and unsupported notes, skipped audio
  references, cloze cards, Anki scheduling, and review-history limitations are
  reported explicitly.
- Added `cosimo-anki-assess`, a command-line helper that assesses `.apkg`
  import coverage for individual packages or directories without writing Cosimo
  decks.
- Refreshed sync, privacy, and audio documentation, including translated user
  guide sync sections, sync deployment examples, public-server RC compatibility
  guidance, and manual QA steps for the browser-based registration/login flow.
- Documented the RC-forward sync API compatibility policy: current `/api/v1`
  endpoints should remain usable by RC-and-later clients on future sync
  servers unless security or comparable safety requirements force a change;
  storage layout and human-facing sync pages are not a stable machine API.
- Removed unused/test-only helper code that produced Windows dead-code
  warnings.

## 0.1.10 beta 11 - 2026-05-26

This release adds deck sync, Opus audio, deployable sync-server packages, and
several hardening and polish fixes. The major changes are grouped by area
rather than by implementation order.

### Deck Sync

- Added deck sync for portable Cosimo installations. Deck -> Sync can now show
  sync status, upload the current deck with study history, download an owned
  deck with study history, browse remote decks, and download public or unlisted
  shared decks as content-only snapshots.
- Added Mastodon-compatible login for sync. Cosimo can start the login flow,
  store the returned sync owner and Cosimo bearer token, log out locally,
  invalidate the current server token, invalidate all server tokens for the
  authenticated account, and use token-derived ownership for status, listing,
  upload, download, and deletion.
- New installations default to the public project sync server at
  `https://cosimo.isonomia.net/sync.cgi`, so users can try sync without first
  entering a URL. Users can opt out by clearing the sync server URL in Options,
  which writes `sync_server_url=none`.
- Deck metadata can now set sync visibility: private, unlisted, or public.
  The metadata editor also has a Make Independent Copy action for downloaded or
  shared decks, assigning a new UUID, resetting visibility to private, keeping
  cards/audio/local study history, and clearing only the old UUID's local sync
  revision state.
- Remote Decks now uses a selectable list with details for the selected entry.
  It can show public decks with only a configured server URL, copy a selected
  deck UUID, find an unlisted shared deck from a UUID or shared URL, download
  public/unlisted decks, and delete decks owned by the logged-in account.
- Remote deck listings show cached summary data when available: title, deck
  file name, card count, audio file count, generated versus manual/untracked
  audio counts, audio formats, ownership, visibility, and last upload device.
  Opaque UUIDs, revisions, and bundle hashes are moved later in status/details
  text.
- Sync upload and download now show progress and run outside the GUI thread.
  Downloads use exact bundle byte lengths where available, including through
  CGI/proxy deployments that do not expose a normal `Content-Length`.
- Owner uploads store the study-history bundle, while public and unlisted
  downloads derive content-only bundles on demand. This avoids duplicating
  large audio files for every stored revision.
- Sync download now chooses the local restore target by deck UUID. Downloading
  a different remote deck cannot overwrite the currently open deck just because
  the remote bundle has the same file name, and unknown deck UUIDs are restored
  only to a non-overwriting local path.
- Sync Status now handles public and unlisted deck downloads correctly. A
  configured sync URL is enough to inspect shared remote deck state, and decks
  downloaded without owner study history show their remembered remote revision
  and downloaded bundle hash.
- Sync Status and download confirmations now use clearer wording for shared
  decks. Owner-only study-history and last-device fields are shown as
  unavailable when the current login cannot know them, shared downloads say
  that the local review database is kept, and sync owners are displayed in the
  usual Fediverse form such as `@user@example`.
- Upload now checks remote ownership before creating a bundle, handles decks
  without a sync UUID by reaching the UUID creation step, reports missing login
  and missing deck UUID separately, and gives clearer conflict/ownership
  messages. The upload success message now puts the actionable revision and
  target first, with the deck UUID at the end as a technical detail.
- Upload revision conflicts now offer explicit choices: force upload, download
  the remote copy with a full local backup first, or cancel.
- Sync servers now expose quota information. Deck -> Sync -> Sync Status shows
  configured server limits and, when authenticated, the current owner's deck
  count and stored bundle size. Quota parsing now reads real JSON object fields
  and rejects malformed numeric values.
- Sync device diagnostics now use only the optional user-provided local device
  name, avoiding a separate application ID that behaved badly for portable
  copied installations.

### Sync Server And Deployment

- Added `cosimo-sync-server`, a standalone HTTP sync server, and
  `cosimo-sync-cgi`, a CGI sync entry point. Both share the same request
  routing and durable storage code.
- Added durable sync-server storage. `--storage-root` stores deck metadata in
  SQLite and bundle bytes below the storage root, preserving uploads across
  process restarts. The CGI entry point supports `--storage-root`, Fossil-style
  config scripts, `COSIMO_SYNC_STORAGE_ROOT`, or a default storage directory
  beside the executable.
- Opening the sync server root URL in a browser now shows a small
  human-readable status page with a project wiki link instead of a misleading
  API not-found response.
- The standalone server is ready for simple reverse-proxy testing. It uses the
  same sync limit environment variables as the CGI entry point, has
  production-oriented help text, and can honour a configured client-IP header
  from loopback reverse proxies for OAuth rate limiting.
- The standalone server help and deployment guide now warn that omitting
  `--storage-root` uses volatile in-memory storage intended only for temporary
  development tests.
- Hardened sync storage and HTTP handling for public deployment. Uploads
  enforce configured bundle-size, deck-file-size, per-owner deck-count,
  per-owner storage, and total-storage limits; uploaded bundle hashes are
  verified; supported bundle paths are checked; storage rejects traversal and
  unsafe symlink targets; old bundle revision files are pruned after successful
  replacement uploads; non-local clients require HTTPS; and the temporary
  development owner/auth endpoint has been removed.
- The first sync-server release is documented as a beta API. Upload revision
  conflicts now return structured JSON as well as HTTP 409 status, reducing the
  chance that wording changes break clients during the beta cycle.
- Hardened Mastodon-compatible OAuth. Login starts are rate-limited by client
  and instance; unsafe OAuth instance targets and unsafe resolved addresses are
  rejected; redirects are disabled; OAuth application credentials are reused
  per instance; the client validates that the authorisation URL requests only
  the required `read:accounts` scope; temporary Fediverse access tokens are
  revoked after account verification; and stored Cosimo bearer sessions are
  persisted as SHA-256 verifier hashes rather than plaintext bearer tokens.
- Public/shared deck metadata is now separated from owner metadata, so public
  listings exclude unlisted/private decks and owner-only fields are not exposed
  through shared inspection/listing.
- Added property-based tests for the sync server surface, including HTTP
  request parsing, response serialisation, CGI environment/header mapping, and
  malformed upload length handling.
- The user guide now has a gentler client-first deck-sync section, including
  everyday use, the public sync server URL and quota, deck visibility, and
  security properties. Sync deployment documentation is now a separate operator
  guide, with the preferred CGI layout keeping the real binary and sync storage
  outside the web-readable document root.

### Audio

- Review audio now prefers `.opus` sidecar files and falls back to legacy
  `.wav` files. Audio generation now defaults to Ogg Opus, while Options and
  `voice --format wav` still allow WAV output.
- Audio generation uses `audio-manifest.tsv` as the safety boundary:
  manifest-tracked generated audio may be regenerated or converted, while
  existing untracked `.opus` and `.wav` files are preserved so user recordings
  are not replaced.
- Added `Tools -> Remove Inoperative Audio from Deck`, which deletes
  Cosimo-recognised sidecar audio files for removed card IDs and
  lower-priority formats hidden by a preferred playable file, then prunes
  matching `audio-manifest.tsv` entries.
- Clarified audio-generation summary wording for existing untracked audio
  files that are preserved without being overwritten.
- Clarified documentation around backup coverage for sidecar audio: automatic
  deck-content and review-database backups exclude audio, while full-deck
  bundle exports/backups include the sidecar directory.
- Added guiding tones during quiz answer review: a rising cue for correct
  answers and a falling cue for incorrect answers when guiding tones are
  enabled.

### Backups And File Safety

- Full-deck restore safety backups now count as recent automatic full-deck
  backups for the same deck path, avoiding an unnecessary second large backup
  immediately after a restore.
- `Tools -> Delete Old Backups` now prunes obsolete automatic
  full-deck backups as well as numbered deck-content backups, keeping the
  newest retained automatic bundle per original deck path, and its confirmation
  reports how many files would be deleted.
- Documentation now gives a balanced recommended backup policy, warns about
  backup churn on USB sticks and other write-limited flash media, and explains
  which backup systems include sidecar audio and review databases.

### Learning, Scheduling, And Analytics

- Added a review-database schema migration that recomputes derived
  `card_schedules` rows from stored review history with the current FSRS-6
  scheduler. This eliminates mixed legacy/current schedule semantics after
  opening an older review database. The old scheduler calculation code has also
  been removed; the legacy scheduler marker remains only for reading historical
  stored rows.
- Clarified learning-dashboard confidence mismatch diagnostics by showing total
  and recent answer-event counts, affected-card counts, and significant recent
  overconfidence/underconfidence counts. Ready-list high-confidence failure and
  low-confidence success filters now use the configured calibration recall
  rule.
- Normalised elapsed study-time formatting so dashboard and session summaries
  use the same duration formatter, including hours, days, weeks, and years
  rather than reporting long totals only in minutes.
- Fixed very small calibration drift wording so dashboard calibration no longer
  reports "under-confident by 0.0 percentage points" when rounding hides the
  actual difference.
- Clarified the learning-dashboard recall trend label so it explicitly says
  overall recall counts Hard, Good, and Easy answers.

### User Interface And Polish

- Improved file-dialog defaults for portable use. Deck opening now starts from
  the `decks` directory beside the executable, and backup/export/restore
  dialogues start from the `backups` directory, creating those directories when
  needed.
- Changed the ready-list View menu mnemonic for Estimated Recall to `E`, making
  the sort criterion easier to discover from the keyboard.
- Avoided creating empty bulk-reversal batches when no cards are eligible for
  bulk reversal.
- Reordered the Card menu so state-changing card actions are grouped more
  predictably: flagging, suspension, and deferral now sit together before bulk
  shown-card actions and reversal commands.
- Selecting Edit on a generated reverse card now opens the parent card for
  editing, making the existing one-card-data model discoverable from either
  study direction.
- The final item in exact-exam answer review no longer offers a redundant
  Next button; Summary is the only forward action.
- Documented the accepted Windows/NVDA issue where an empty ready-list control
  can be announced as "unknown"; the ready summary and filter counts remain
  the reliable accessible empty-state indicators.

### Release Packaging

- The Windows portable package now includes `cosimo-sync-server.exe` and
  `cosimo-sync-cgi.exe` under `server`.
- The release tool can now build a Linux amd64 sync-server tarball for CGI or
  reverse-proxy deployment. The Linux package strips staged
  `cosimo-sync-cgi` and `cosimo-sync-server` binaries before creating the
  archive.
- The release tool now writes SHA-256 checksum sidecars, uploads numbered
  release archives to static hosting by SFTP, supports private-key and verbose
  SFTP diagnostics, can update static "latest" aliases, and updates only the
  stable latest aliases when adding Fossil unversioned files. Historical binary
  archives are no longer stored as Fossil unversioned files.

## 0.1.9 beta 10 - 2026-05-18

- Improved backup and restore support. Cosimo can now write optional automatic
  full-deck backups at most once per day per deck path, including the deck file,
  same-stem sidecar directory, and a SQLite snapshot of the review database.
  Compressed deck bundles can now be restored after Cosimo previews their card,
  audio, and review-database contents. `Tools -> Wipe Backup Directory` was
  added as a destructive maintenance command with a strong warning before it
  deletes every file and folder in the backup directory.
- Added study-direction choices to quiz and exam setup for decks with generated
  reverse cards, allowing standard cards only, reverse cards only, or both
  directions.
- Added optional quiz audio playback. Quiz settings can automatically play
  prompt audio, response-choice audio as choices are selected, both, or neither;
  quiz answer review also supports `Ctrl+P` for prompt-plus-response playback.
- Added explicit `Alt-N` handling for the `Next` action while reviewing exam
  and quiz answers.
- Fixed study-session Flag/Unflag buttons so Space activates the button instead
  of also revealing the response, keeping focus after toggling and immediately
  presenting the updated opposite action.
- Fixed study-session Defer handling so deferring a prompt keeps the session
  moving forward and the normal study render focuses the next prompt after
  layout.
- Fixed quiz distractor selection for reversible cards, so answer choices stay
  on the answer side for the current study direction instead of mixing prompts
  and responses. Reverse-direction quiz choices now also exclude prompts from
  cards marked non-reversible.
- Added discoverable Card menu and prompt-list context-menu entries for the
  existing selected-card details dialogue and `Alt+Enter` shortcut.
- Added Card menu commands to flag, unflag, suspend, or unsuspend every card
  currently shown in the ready list. The commands respect both the text filter
  and the card-type filter, ask for confirmation, and leave cards already in
  the requested state unchanged.
- Added ready-list filters for recent high-confidence failures and
  low-confidence successes, making it easier to find cards where confidence and
  recall have recently disagreed.
- Added cautious qualitative learning-dashboard summary lines for workload
  shape, workload pressure, and recent recorded study-time consistency.
- Added review-database first-seen tracking for physical deck cards. The
  learning dashboard can now report deck-card intake against standard cards
  reaching review state, while making clear that this is first seen by the
  review database rather than a guaranteed card creation date.
- Deck files now persist a monotonic `next_card_id` high-water mark. New cards
  get fresh IDs instead of reusing gaps left by removed cards, scrub preserves
  the high-water mark, and the documentation now recommends `===` for manually
  added cards so Cosimo assigns IDs safely.
- Improved ready-list filtering performance, especially when typing in the text
  filter or switching to broad filter sets such as all cards or reverse cards.
- Improved startup recovery when Cosimo cannot open or create the startup deck
  or review database. Instead of leaving the user in a non-functional no-deck
  state, Cosimo now offers to open another deck or quit.
- Improved file-operation error messages for maintenance paths such as backup
  index updates, backup pruning, backup-directory wiping, temporary files, and
  durable report/deck writes, so failures include the relevant operation and
  path. Full-deck bundle backup/restore and audio-generation report setup now
  use the same path-specific reporting instead of silently ignoring unreadable
  backup indexes or surfacing bare OS errors.
- Reduced full-deck bundle backup and restore disk churn for decks with many
  sidecar audio files. Bundles now use faster deflate settings, GUI restore
  reuses the already-built bundle preview, and restore avoids per-file forced
  flushes for temporary staging and sidecar audio installation while keeping
  durable replacement for the deck file and review database.
- Clarified audio option labels: ordinary review playback is now labelled
  `Audio during study`, guiding tones are labelled `Guiding tones for automatic
  audio`, and the edit-deck-metadata dialogue no longer exposes a redundant
  `Audio generation` static label that could be announced on open.
- Simplified ordinary study-session summaries when every studied item is unique:
  they now show cards studied and time per card, while preserving the fuller
  question/unique-card breakdown for older repeated-item session data. The
  learning dashboard likewise hides the unique-card aggregate when it matches
  the answer count.
- Clarified learning-dashboard availability counts. The dashboard now reports
  available cards and, as a subset, cards already scheduled and due now using
  the same due-time boundary.
- Improved the main status bar during active sessions so it identifies
  scheduled study sessions, unscheduled study sessions, exams, or quizzes and
  reports current progress.
- Added an `Exam Finished` transition notice with two long tones before exam
  grading, answer review, or summary when a non-timed-out exam ends with
  submitted answers.
- Improved exam-question tab order so the prompt and answer fields are
  adjacent; the Play/Stop Audio button now follows the answer field because it
  also has the `Ctrl+P` shortcut.
- Fixed a timed-exam timeout timer path that could try to close the question
  dialogue after it had already left modal state, causing a wxWidgets debug
  warning during exact-exam review on Windows.
- Improved warning presentation for screen reader users. Duplicate-prompt,
  automatic full-backup, and scheduled-card preview warnings are now included in
  the ready summary, study-session backup warnings open a focused warning
  dialogue, and study-session summary persistence warnings are included in the
  summary text.
- Made duplicate-prompt resolution flow clearer. The per-prompt dialogue now
  has explicit `Skip Prompt` and `Cancel Resolution` buttons, so the user can
  leave one duplicate prompt unchanged and continue, or stop the whole
  resolution process.
- Fixed Card menu mnemonic clashes in Spanish and Galician, and strengthened
  menu tests so every localised item is checked in its actual menu.
- Reworked scheduling around a more faithful FSRS-6 implementation. New
  in-memory schedules and new review-database writes now use deterministic
  FSRS-6 with current default parameters, 1-minute and 10-minute learning
  steps, a 10-minute relearning step, short-term same-day stability updates,
  and deterministic interval fuzzing for review-state cards. Existing schedules
  from older betas keep their due dates until the card is reviewed; at that
  point Cosimo replays that card's stored review history under FSRS-6 before
  applying the new answer. `Again` no longer repeats a card at the end of the
  same session, and only `Again` on a review-state card counts as a scheduled
  lapse. Estimated recall in the ready-list sort, card details, and learning
  dashboard now uses the stored scheduler algorithm, and stored FSRS memory
  state is clamped to reference bounds before updates.
- Expanded scheduler and release-hardening tests, including deterministic
  fuzzing bounds, a longer mixed review history, an optional reference-crate
  scheduler check, timed exact exams, quiz direction/audio, metadata editing,
  dynamic menu state, backup/restore, Options controls, and the canonical
  languages.
- Added Windows executable metadata so packaged binaries expose application
  name, version, and manifest information more consistently.
- Updated the project wiki and contributor release workflow so public
  documentation links follow the current beta release tag rather than the trunk
  development snapshot.
- Expanded scheduler documentation to explain how recall ratings behave in new,
  learning, review, and relearning states.
- Quiz summaries now have a Save Report button, matching study sessions and
  exams. Saved quiz report filenames add `-quiz`.

## 0.1.8 beta 9 - 2026-05-13

- Fixed checkbox accessible names across the Options, Exam setup, Add card, and
  Edit deck metadata dialogues, so screen readers do not fall back to internal
  XRC control identifiers.
- Reorganised the main menu into File, Deck, Card, Study, Tools, View, and Help
  so file operations, deck-wide actions, individual-card actions, study-session
  starts, and maintenance/options are easier to find.
- Began the terminology cleanup for the next beta. The user guide, README, and
  visible UI/report strings now distinguish study sessions, questions, and
  stored attempts more consistently, while keeping established phrases such as
  review database, review history, scheduled review, review audio, and the FSRS
  review memory state where they remain precise.
- Added optional timed exams. The exam setup can enable a whole-minute time
  limit, the remaining time is shown in the status bar, short progress tones
  play at 10% boundaries, and timeout submits any typed answer before showing a
  guarded time-out notice. Exam summaries and saved exam reports now include
  the time limit and whether time expired.
- Redesigned the learning dashboard into shorter sections with a qualitative
  summary, recall distribution bands, median and weakest-card recall,
  conservative recent-trend statements, diagnostics, standard/reversed
  comparison when relevant, and recent recorded study activity. It still
  includes cumulative workload forecasts for the next 24 hours, 3 days, 7 days,
  and 30 days, plus scheduled lapse counts for active cards.
- Expanded the card details dialogue with availability, estimated recall now,
  recent recall, and lapse-summary diagnostics for the selected card.
- Added ready-list filters for problem cards and direction-asymmetry issues.
  Problem cards are detected from recent failures, high `Again` or lapse rate
  relative to the deck, and unusually high scheduling difficulty, rather than
  from raw lifetime lapse counts.
- Added a separate option for automatic audio during exam grading and review,
  with choices for question audio, answer audio, both, or no automatic audio.
  `Ctrl+P` in those dialogues plays prompt audio followed by response audio
  when available.
- Added a deck metadata safeguard for manually maintained audio. Decks marked
  with `audio_generation=disabled` disable `Tools -> Generate Audio`, make
  `voice.exe` refuse generation, and still allow existing audio playback.
- Added report-only quiz mode for multiple-choice recognition practice. Quiz
  sessions sample active cards at random, exclude suspended and deferred cards,
  avoid both directions of the same reversible card when possible, withhold
  correctness feedback until the end, and show a review and summary without
  writing review history or changing schedules.
- Added full compressed deck bundle export and backup commands. A bundle
  contains the `.cosimo-deck` file and its same-stem sidecar directory,
  including audio and manifests, but deliberately excludes the review database.
  Manual export uses a save dialogue; full deck backup writes a timestamped zip
  into `backups/` and records it in `deck-bundle-index.txt`.
- Added a separate full-deck export with study history for personal migration
  and complete manual backups. It adds a SQLite snapshot of the review database
  to the archive instead of copying the open database file directly.
- Documented compressed deck bundle support as preliminary. Cosimo can write
  the bundles, but restoring them is currently a manual operation that can
  overwrite newer deck, sidecar, manifest, or review-database files.

## 0.1.7 beta 8 - 2026-05-10

### Audio Tools

- Added a Windows `voice` helper binary that uses installed OneCore or SAPI
  voices to generate WAV prompt and response audio for a deck.
  Bare deck names resolve to `decks/<name>.cosimo-deck` beside `voice.exe`,
  matching Cosimo's portable path rules, while explicit deck paths are still
  accepted. The tool supports shared or separate prompt/response voice and
  engine selection, side selection, dry-run mode, overwrite control, and voice
  listing. The release package builder now includes `voice.exe` beside
  `cosimo.exe`.
- Deck metadata now includes optional prompt and response voice fields, plus
  per-direction prompt and response voice engine fields. The `voice` helper
  uses `prompt_voice`, `response_voice`, `prompt_voice_engine`, and
  `response_voice_engine` as defaults when command-line options are not
  supplied. `File -> Edit Deck Metadata` now shows editable voice and engine
  combo boxes populated from `voice.exe` when the helper is available, while
  still allowing manual text entry. The editor can show OneCore and SAPI voices
  together, saves the concrete engine for a listed voice, no longer exposes
  OneCore registry IDs in voice labels, and requires a concrete engine when a
  voice filter is typed manually.
- `voice` now maintains an `audio-manifest.tsv` file in the deck's audio
  sidecar directory so it can regenerate prompt or response WAV files whose
  card text, selected voice, or selected voice engine changed while skipping
  unchanged generated audio. If no manifest exists yet, existing selected WAV
  files are now regenerated once to seed a truthful manifest; individual
  untracked files are added to an existing manifest without being overwritten,
  so later card text, voice, or engine changes can be detected.
- Added `File -> Generate Audio` to start `voice.exe` for the current deck from
  the GUI. Cosimo shows a progress dialogue and writes helper output to a
  timestamped report file under `reports/`. The completion message now reports
  generated-card, new-file, regenerated-file, overwritten-file,
  manifest-tracking, and skipped-file counts. GUI audio generation is
  unavailable until the deck has prompt voice, response voice, prompt voice
  engine, and response voice engine metadata, so a deck is not accidentally
  generated with an unsuitable system default voice.
- The audio generation progress dialogue now exposes an ordinary progress bar
  for assistive technology without repeatedly changing status text during
  generation.
- Documentation now explicitly warns that sidecar audio is not included in
  automatic deck-content or review-database backups, and that audio generation
  can overwrite matching user recordings once a file is tracked by the manifest.
- The ready card list now has a `Play/Stop Audio` button and `Ctrl+P` support
  for the selected card. On Windows this uses cancellable MCI playback with
  status polling, so prompt audio can continue into response audio based on
  actual playback completion and `Ctrl+P` can stop the current file.
- Automatic review audio has an optional guiding-tones setting. It adds an
  orientation tone before prompt audio, two short tones before response audio,
  and a three-tone arpeggio when the review summary is shown.
- Saving complete voice metadata in `File -> Edit Deck Metadata` now refreshes
  the `File -> Generate Audio` menu item immediately.
- Audio-generation failures now surface the helper's useful error detail in the
  GUI, such as a missing OneCore or SAPI voice, while still writing the full
  helper output to the report file.

### Deck Integrity

- Normal add, batch add, and edit actions now reject duplicate prompts, because
  prompts should identify one card only.
- The normal Add Card dialogue now has an off-by-default non-reversible
  checkbox, allowing cards that should never be reversed to be marked at
  creation time. Batch add remains unchanged.
- Decks edited by hand can still open with duplicate prompts, but Cosimo warns
  about the problem and `Cards -> Resolve Duplicate Prompts` lets the user keep
  one response for each duplicated prompt while removing the other duplicate
  cards from the deck.
- Duplicate responses are now documented and checked as valid unless more than
  one card in the same duplicated-response set has an active generated reverse
  card, which would make the generated reverse prompts ambiguous.

## 0.1.6 beta 7 - 2026-05-07

### Review Flow

- Added a report-only `Start Exam` mode. Exam mode samples a configurable
  number or percentage of active cards, randomises the selected questions,
  collects typed answers without revealing feedback during the pass, counts
  exact answers as correct automatically, and asks the user to grade non-exact
  answers at the end. The setup dialogue now also has an `Exact` option that
  counts non-exact answers incorrect without manual grading and shows them for
  answer review before the summary. Exam summaries include correct-answer
  percentage and time per question, and can now be saved to the `reports`
  directory like normal pass summaries. Exam results do not yet write review
  history or scheduling changes.

### Learning Dashboard

- The learning dashboard now treats confidence ratings as recall target
  intervals rather than point forecasts. The target ranges are 0-5% for
  `Don't know`, 5-32% for `Probably don't know`, 68-95% for `Probably know`,
  and 95-100% for `Certainly know`; the dashboard now reports whether observed
  recall is within target, under-confident, or over-confident.
- `File -> Options` now lets the user choose and persist either the lenient
  calibration recall rule, where Hard, Good, and Easy count as recalled, or the
  strict rule, where only Good and Easy count as recalled.

### Deck Files and Metadata

- Deck files now migrate to format version 2 when opened. The v2 format stores
  deck metadata in a header and stores per-card non-reversible markers in the
  deck file, so that knowledge about whether a card should be reversible can
  travel with the deck. Active generated reverse cards remain study data in the
  review database.
- `File -> Deck Properties` now shows deck version, title, author,
  description, and URL. `File -> Edit Deck Metadata` lets those metadata
  fields be edited while preserving the deck's cards.
- Legacy decks with stable card ids and v2 decks with missing card ids are
  accepted and normalised instead of being rejected, making manual deck edits
  less fragile.

### Review Audio

- Review passes can now play optional WAV prompt and response audio from the
  deck's same-stem sidecar directory, such as `Indonesian/1.prompt.wav` and
  `Indonesian/1.response.wav`.
- `File -> Options -> Audio during reviews` can set review audio to off, manual,
  or automatic. Manual mode exposes the `Play/Stop Audio` button and `Ctrl+P`
  when the current prompt or response has audio; automatic mode plays matching
  prompt and response audio as cards are shown.
- Exam mode now uses the same audio setting for question prompt audio while the
  learner is answering.
- Generated reverse cards reuse the parent card's prompt and response audio with
  the sides swapped. Audio is stopped when leaving the current card, finishing a
  pass, or closing the window.

### Reliability and Accessibility

- Confirmation prompts now use the platform-native Yes/No dialogue again. The
  destructive menu actions still run through Cosimo's deferred command path,
  which was the actual guard against repeated prompts, while native dialogues
  give screen readers better access to the prompt text.
- `File -> Scrub Database` and `File -> Reclaim Database Space` no longer move
  focus to the ready-card list after a successful confirmation. They now update
  the ready screen while restoring the ready-screen control that had focus
  before the confirmation.
- Creating a new deck now refuses to overwrite an existing file.

## 0.1.5 beta 6 - 2026-05-05

### Review Flow

- `Review Flagged` on the ready screen and `Cards -> Review Flagged Cards` now
  start an unscheduled, randomised pass through flagged cards. The pass includes
  flagged cards whether or not they are scheduled, excludes suspended and
  deferred cards, and leaves flags in place for manual follow-up.
- Cards can now be deferred until tomorrow during the prompt phase of a review
  pass, before the answer is revealed. The action removes the current card from
  the current pass and leaves its stored schedule otherwise unchanged. `Ctrl+D`
  now toggles deferral from the ready list and defers the current card during
  the prompt phase of review. If all cards in a pass are deferred before any
  answer is recorded, Cosimo now shows a notice instead of silently returning to
  the ready screen.
- Generated reverse-card actions now keep the ready-list selection on the
  parent card when a reverse card is removed. Reversal menu and context-menu
  choices also hide impossible actions: non-reversible cards offer allowing
  reversal again instead of Make Reversible, and generated reverse cards no
  longer expose the parent-card non-reversible action.
- `Cards -> Make Possible Cards Reversible` is now disabled when no cards are
  eligible, and the command no longer opens a zero-card confirmation if reached
  from stale menu state.
- Confirmation prompts now use Cosimo's own modal dialog instead of native
  `wxMessageDialog` Yes/No buttons, avoiding repeated prompts when No is
  pressed on affected Windows builds.

### Learning Dashboard and Reports

- `File -> Learning Dashboard` now includes review activity: stored answers,
  days with answers, average answers per active day, recorded passes, answers
  in recorded passes, unique cards reviewed in recorded passes, total review
  time, average answers per recorded pass, average time per recorded pass, and
  average time per answer in recorded passes.
- Learning dashboard review activity now uses clearer labels such as stored
  answers, days with answers, and answers in recorded passes. When old review
  events exist without pass timing, the dashboard now shows an older-answers
  line; that line is hidden for decks where the value is zero.
- The learning dashboard now has a `Save Report` button that writes the current
  dashboard text to `reports/`, named from the deck file stem and generation
  time. Reports include the full deck path and avoid overwriting existing
  reports.

### Interface

- The Windows tray context menu now uses wxdragon's automatic taskbar menu path
  instead of opening a manual popup from the right-click callback, reducing the
  amount of tray-object lifetime work happening inside tray mouse events. Tray
  restore and quit handling should now avoid the wxWidgets debug alerts and
  orphaned process cases seen with the previous manual tray popup handling.
- The review screen now uses larger fonts for core review controls, larger
  button hit targets, and compact rating grids while keeping native colours so
  operating-system light, dark, and high-contrast themes stay in control. The
  report-style statistics, card details, and learning dashboard dialogues also
  use larger text and buttons.
- The Help menu now includes project wiki and bug-report items that open the
  Cosimo wiki and Fossil new-ticket page in the default browser.
- The ready-screen top status line now stays short instead of showing full deck
  and database paths, avoiding truncation in narrower windows while the summary
  still shows the review database path.
- The ready-screen summary now preserves its text position during automatic
  refreshes, avoiding cursor jumps while reading the summary text.

### Database Maintenance

- `File -> Reclaim Database Space` now runs SQLite `VACUUM` on the review
  database without deleting dormant data or overwriting the retained
  review-database backup.
- Expired deferrals and inactive card-state rows are now cleaned when opening a
  deck, before starting a review pass, and during scrub or reclaim maintenance,
  so stale state rows do not keep affecting the ready list.

### Error Handling

- Deck, review database, and config write errors now include the affected path
  and brief recovery guidance. Startup failures now state explicitly when no
  deck is open and show both the deck and review database paths involved.
- Report-save, review-recording, review-pass-summary, and review-database
  backup errors now include the affected paths and state whether the requested
  operation was saved, skipped, or left partially recorded.

### Documentation and Packaging

- The user guide and project wiki now document portable installation and
  upgrade: expand the release zip into the folder where Cosimo should run, and
  expand a newer release over the existing folder to upgrade.
- The project wiki now includes Spanish and Galician entry pages, Fossil clone
  guidance, and instructions for anonymous users to file tickets.
- The project wiki now includes a deck page for example and community decks,
  with CC0 attachments for the default example deck and a basic Indonesian
  vocabulary deck.
- Release packages now include `CHANGELOG.md` at the application root and no
  longer include `decks/` or a default deck, so upgrading by extraction does
  not overwrite user deck data.

## 0.1.4 beta 5 - 2026-05-04

### Ready Screen and Deck Navigation

- Cards can now be marked non-reversible. This removes any active generated
  reverse card for the selected parent and prevents future bulk reversal from
  adding it again until reversal is allowed again. Non-reversible cards are now
  marked in the ready list, shown in card details, and available through the
  ready-list filter combo box.
- Card details now show card characteristics such as suspended, flagged,
  reverse, has reverse, and non-reversible on one state line. Generated reverse
  cards now show the parent card ID. Future and overdue scheduled review times
  are shown as a complete relative duration followed by the exact UTC timestamp.
- `File -> Scrub Review Database` can now delete dormant review database rows
  for removed cards and inactive generated reverse cards, with confirmation
  warnings that reflect the review-database backup policy. It also vacuums the
  SQLite database afterward so freed pages can be reclaimed.
- Ready-list selection now tracks the selected card by stable card identity
  across sorting, filtering, editing, and reverse-card changes. Adding a card
  selects the newly added card, and deleting a card selects the next visible
  card in the current list order.
- The View menu now uses checkable menu items for the active ready-list sort
  criterion and direction. The ready list can also sort by prompt text,
  response text, or estimated recall, with lower estimated recall first in
  ascending order.
- Cards can now be flagged with Ctrl+F on the ready list or during review, from
  the Cards menu, from the ready-list context menu, or with review-screen
  buttons after the rating choices. Flagged cards are marked in the ready list
  and can be shown with the flagged card filter without changing scheduling.
- Cards can now be deferred from the Cards menu or ready-list context menu
  until tomorrow, then made available again manually or automatically when the
  deferral expires. Deferred cards are marked in the ready list, can be shown
  with the deferred-card filter, and are excluded from scheduled and forced
  passes while deferred without changing their stored schedule.

### Review Flow

- `File -> Options` now offers a four-value sound notification policy:
  always, when Cosimo is visible, when Cosimo is in the system tray, or never.
  Timed ready-screen refreshes can play distinct sounds when reviews become
  available or when more reviews become available; manual refreshes,
  user-triggered changes, and active review passes remain silent.
- `File -> Options` can enable minimise-to-system-tray behaviour. When enabled,
  the normal window minimise action hides Cosimo in the system tray; activating
  the tray icon restores the window, and the tray context menu offers Restore
  and Quit. The Windows tray restore and quit paths were hardened after manual
  testing with wxWidgets debug checks enabled.
- End-of-pass statistics can now be saved directly from the statistics dialogue
  to a text report under `reports/`, named from the deck file stem and pass
  finish time. Reports include the full deck path and avoid overwriting
  existing reports.
- The statistics dialogue no longer contains an invalid XRC sizer flag that
  could show an `unknown sizer flag "0"` error after a review pass.
- Review databases now store non-reversible card markers and migrate schema
  version 6 databases to schema version 7.
- Review databases now store sparse card state markers for flags and
  suspensions in one table. Schema version 7 databases migrate to schema
  version 8 by moving existing suspension rows into that table.
- Review databases now allow deferred card state rows and migrate schema
  version 8 databases to schema version 9.

## 0.1.3 beta 4 - 2026-05-02

### Ready Screen and Deck Navigation

- The ready-screen summary now shows the due-card count in parentheses when
  the scheduled count includes extra minimum-fill cards.
- `File -> Learning Dashboard` now opens a deck-wide learning summary with
  card-state counts, estimated recall, confidence calibration, and learning
  pace figures. When generated reverse cards exist, it shows standard cards,
  reversed cards, and total cards separately.
- Learning dashboard due counts are now labelled as available now and scheduled
  and overdue to clarify the difference between cards that can be reviewed
  immediately and scheduled cards that are already late.
- Learning dashboard recall estimates now use sub-day elapsed time and the
  actual short learning/relearning interval, preventing recently failed cards
  from appearing as perfectly remembered until a whole day has passed.
- Cards can now be marked reversible from the Cards menu or with Ctrl+R on the
  ready list. Generated reverse cards have separate scheduling and review
  history, are blocked when duplicate responses would make them ambiguous, and
  can be shown with the reverse-card filter.
- `Cards -> Make Possible Cards Reversible` can mark every eligible card
  reversible after confirmation, excluding cards already reversible and cards
  whose responses are duplicated.
- Bulk reversible-card creation now backs up the review database first when
  review database backups are enabled, then writes the generated reverse-card
  flags in one database transaction, avoiding a long apparent freeze on larger
  decks. Its confirmation warns that the retained review-database backup will
  be overwritten.
- `Cards -> Undo Last Bulk Reversal` can remove only the reverse cards created
  by the latest bulk reversal batch, leaving manual reversals and older batches
  active.
- The ready-list filter combo box can now show cards with duplicated prompts or
  duplicated responses.
- Delete confirmations now explain the data consequences for generated reverse
  cards and for parent cards that have generated reverse cards.
- `View -> Last Reviewed` can sort the ready list by most recently reviewed
  first, leaving new cards at the bottom.

### Review Flow

- Scheduled due cards within about one hour of each other are now randomised
  within that near-tie group to reduce thematic clumping while preserving
  broader overdue priority.
- Due learning and relearning cards are now reviewed before ordinary due review
  cards.
- Cards marked `Again` now use a 10-minute learning or relearning interval,
  while still repeating once at the end of the current pass.
- Cards repeated at the end of a pass after an `Again` rating are now
  randomised instead of following the order in which they failed.
- End-of-pass statistics now separate unique cards from total answered
  questions and include total time, time per question, and time per unique
  card.
- Review databases now store pass-level records and link them to the existing
  per-card review events, including initial and final question counts, providing
  a normalised base for later analytics.
- Review database schedules now store the actual interval in seconds alongside
  the existing whole-day interval, preparing learning and relearning cards for
  sub-day scheduling steps.
- Review databases now store reversible-card parent keys in `card_reversals`
  and migrate schema version 4 databases to schema version 5.
- Review databases now store bulk reverse-card batch metadata and migrate
  schema version 5 databases to schema version 6, allowing the latest bulk
  reversal to be undone without removing manual reversals.

### Data Integrity

- Opening a deck now performs higher-level review-database consistency checks
  after SQLite integrity and schema checks, including stored rating/schedule
  values, review-pass links, and active reversible-card ambiguity.

### Code Quality

- `RecallFeedback` variants now use the standard `Again`, `Hard`, `Good`, and
  `Easy` names while keeping the same stored numeric values.
- Localisation labels, plural nouns, and formatted message templates now use
  gettext `.po` catalogues compiled into Rust at build time, preparing the
  project for additional languages without adding a runtime gettext dependency.

### Documentation and Packaging

- A Galician user guide was added, with a generated HTML version.

## 0.1.2 beta 3 - 2026-04-29

### Ready Screen and Deck Navigation

- `Cards -> Add Card Batch` adds a fast repeated-entry dialogue. Ctrl+Enter adds
  from either field, and Tab from the response field adds when both fields
  contain text.
- The main window now has a status bar summarising total cards, cards due now,
  and the next review using speech-friendly rounded durations.
- The ready-list filter and sort mode are now persisted in `cosimo.ini`.
- The ready screen has a single-line text filter, reachable with Alt+L, that
  narrows the prompt list by matching prompt or response text.
- Cards can be suspended from review. Suspended cards are marked in the ready
  list, excluded from scheduled and forced passes, ignored by the status bar
  review timing, and can be toggled from the Cards menu, the ready-list context
  menu, or Ctrl+S while the ready list has focus.
- The ready-list context menu now includes Edit, Remove, and
  Suspend/Unsuspend for the selected card.
- File-menu Quit no longer claims redundant Ctrl-key accelerators, leaving
  Ctrl+S available for ready-list suspension.
- Recent decks now omit the currently open deck, and a single remaining recent
  deck is shown directly in the File menu instead of in a one-item submenu.

## 0.1.1 beta 2 - 2026-04-27

This release summarises changes since the first beta, whose last `0.1.0`
checkout was `f6df45f10b`.

### Review Flow

- Cards rated `Again` are repeated once at the end of the current pass.
- Scheduled overdue cards are reviewed before new cards, ordered by how overdue
  they are. Equal due-time ties and new cards are randomised to avoid deck-order
  cueing.
- The prompt can be revealed directly with Space or the `Reveal Response`
  button. This records the pre-response confidence as `Not answered`.
- The current card can be edited after its response is revealed, using `e` or
  the `Edit Card` button, and review returns to the post-response rating step.
- Focus after editing a revealed card is restored to the previous post-response
  control.
- The statistics dialogue accepts Enter on its summary text and returns focus to
  the prompt list after Continue.

### Ready Screen and Deck Navigation

- `File -> Recent Decks` lists up to eight recently opened decks.
- Unavailable recent-deck slots are hidden instead of shown as disabled
  placeholder menu items.
- The ready screen can filter cards by all, due, new, and not-due views, with
  item counts in the filter choices.
- `View -> Deck Order` and `View -> Next Scheduled Review` control ready-list
  sorting.
- Pressing Alt+Enter on a selected ready-list card opens a details dialogue showing
  prompt, response, ID, review count, last review, scheduling state, next
  scheduled review, and review history.
- The ready card list has a user-facing accessibility name, and the Cards menu
  edit item changes to Edit Current Card after a review card is revealed.
- Reopening or continuing to the ready screen preserves useful ready-list
  selection and focus behaviour.

### Backups, Settings, and Data Integrity

- Portable settings now live in `cosimo.ini`. Older
  `cosimo-settings.txt` and `cosimo-last-open-deck.txt` files are migrated and
  removed automatically.
- Automatic deck backups are stored in one app-level `backups` directory with
  an `index.txt` that records the original deck path for each backup.
- Deck backup policy is configurable as full history, last-only, or none.
- `File -> Options -> Delete Old Backups` can prune obsolete deck backups after
  confirmation while refusing to overwrite unindexed files.
- Review database backups can be enabled or disabled. When enabled, Cosimo
  refreshes one retained review-database backup when a review pass starts.
- Review databases are checked with SQLite `quick_check` when opened.
- Review database schema versions are validated, and the existing
  `prompt_guess` constraint is migrated to support direct reveal.
- Backup, migration, and database-integrity failures now block risky deck
  writes or are surfaced in status text instead of silently proceeding.
- Durable file replacement now syncs temporary files and best-effort syncs
  containing directories; Windows replacements use write-through semantics.

### Accessibility and Localisation

- Spanish localisation was revised for accents, project terminology, menus,
  and keyboard mnemonics.
- Runtime language selection defaults to English for unknown locales and uses
  Spanish when the system locale is Spanish.
- Menu items and top-level menu names are localised at runtime.
- Shortcut clashes in Spanish were corrected.
- The delete-card button no longer exposes a misleading shortcut
  announcement.
- The Windows build uses the GUI subsystem, so the packaged executable should
  not open a console window.
- `Help -> About` shows authorship, support contact, version, and beta status.
- `Help -> User Guide` opens the generated HTML user guide.

### Documentation and Packaging

- The project uses GPLv3.
- Cargo package metadata and include rules were added for crate publishing.
- The default package excludes old probe examples and helper scripts.
- User guides now exist in English and Spanish, with generated HTML versions.
- Troubleshooting guides now exist in English and Spanish.
- Backup, restore, accessibility acceptance, rating storage, deck format, and
  release packaging guidance were expanded.
- Documentation links were converted to relative links.

### Tests and Internal Quality

- Regression coverage was expanded around localisation, keyboard behaviour,
  ready-list focus, statistics Continue, backups, migration failure, corrupt
  databases, filtering, sorting, card details, direct reveal, and revealed-card
  editing.
- Application configuration, file/backup operations, ready-list logic, review
  session state, options dialogue, review dialogues, and generic dialogue helpers
  were split out of `src/main.rs`.
- Review-session state now uses typed ready/running states and queue invariants.
- `cargo clippy --all-targets` is clean as of the beta-2 preparation pass.

### Known Issue

- Some screen reader and wxWidgets combinations announce the selected ready-list
  item twice when tabbing into the prompt list. Arrow-key navigation, selection,
  editing, removal, details, and review startup remain functional.

## 0.1.0 beta 1

- First beta release.
