diff --git a/TODO.md b/TODO.md
index 551ea9a..9c09de5 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,131 +1,31 @@
# TODO
-## HTMX v2 Migration
+> Last updated: 2026-06-11
+> Context: Form Accessibility & Resilience improvements for XAMXAM thesis submission platform
-Reference: `docs/autosave-system.md` → "HTMX v2 Migration Plan" section.
+## In Progress
-- [x] `contenus-edit.php` (pages): Add `hx-*` attrs, add `overtype:change` dispatch in OverType `onChange`
-- [x] `contenus-edit.php` (form_help): Add `hx-*` attrs, add `overtype:change` dispatch in OverType `onChange`
-- [x] `apropos-groups-form.php` (contacts): Add `hx-*` attrs only
-- [x] `contenus-edit.php` (sidebar_links): Add `hx-*` attrs only
-- [x] Add `handleAutosaveResponse()` shared handler + `htmx:beforeRequest` loading state
-- [x] Delete `autosave.js`
-- [x] Fix backend `$isAjax` detection: also recognize `HX-Request` header (page.php, apropos.php, form-help.php)
-- [x] Form-help inline editors: add OverType toolbar + HTMX auto-save + remove save buttons
-- [x] Markdown cheatsheet modal: reusable dialog on all OverType editors
+## Pending
-## FilePond crash on TFE upload forms
+- [ ] #aria-test-manual Test WCAG changes with VoiceOver and NVDA on full add/edit/partage form flows
+- [ ] #nojs-upload-test Test end-to-end: submit partage form with JS disabled, verify files arrive via `$_FILES`
+- [ ] #filepond-preserve Preserve FilePond temp file IDs on partage validation redirect `(partage/index.php)` `(FilepondHandler.php)`
+- [ ] #two-phase-commit Add two-phase commit: INSERT thesis `status='draft'`, COMMIT, move files, UPDATE to `active` `(ThesisCreateController.php)`
+- [ ] #cleanup-drafts Add periodic cleanup job for orphaned drafts (`just cleanup-drafts`)
-- [x] Analyze root cause → `docs/filepond-crash-analysis.md`
-- [x] Partial fixes (Content-Type headers, onerror cleanup, load object) — insufficient, crash still reproduces
-- [x] HTMX/destroy race hypothesis investigation → `docs/filepond-race-investigation.md` (verdict: REFUTED)
-- [x] Diagnostic probes + deep analysis: confirmed load-file-error dispatch path, traced via error.stack to fileValidateSizeFilter line 389
-- [x] **ROOT CAUSE FIXED**: fileValidateSizeFilter accessed `item.filename` but FileValidateSize's LOAD_FILE filter passes the raw File/Blob (which has `.name`, not `.filename`). Changed to `item.filename || item.name`. Also added null guard to getExt().
-- [x] Defensive: Wt and Fr crash guards in filepond.min.js prevent action.status.main crash
-- [x] process.onload: replaced throw with error-marker return (prevents FilePond crash when server returns HTML)
-- [x] Routing: partage index.php now routes /partage/actions/* directly to PHP files (was treating 'actions' as a slug and returning full HTML page)
-- [x] **All crashes resolved** — verified working on partage form
+- [ ] #form-setup-helper Add `ThesisFormSetup` helper class to reduce bootstrap duplication across add/edit/partage `(partage/index.php)` `(admin/add.php)` `(admin/edit.php)`
-## Form Accessibility & Resilience — Assessment Follow-up
+## Completed
-Reference: Assessment against progressive-enhancement / WCAG-AA / "never lose data" / low-common-denominator guidelines.
+- [x] #refactor-partage Extract partage form page chrome to `templates/partage/form-page.php` `(partage/index.php)` ✓
+- [x] #htmx-migration HTMX v2 migration: OverType editors, autosave handler, backend `HX-Request` detection ✓
+- [x] #filepond-crash FilePond crash on TFE upload forms: root cause fixed (`.filename` → `.name`), all crashes resolved ✓
+- [x] #aria-errormessage WCAG AA: field-level `aria-errormessage`, `aria-invalid`, `aria-describedby` on all form fields ✓
+- [x] #nojs-upload-fix No-JS file uploads: `filepond_mode` default to `0 disabled`, server-side `$_FILES` fallback ✓
+- [x] #autosave-partage Autosave text fields on partage form: session draft endpoint (`fragments/draft.php`), HTMX autosave on change/input, page-load hydration, "Brouillon enregistré" indicator, draft cleared on submit ✓
+- [x] #mobile-responsive Mobile-responsive form layout: `@media (max-width: 600px)` breakpoint, 44×44px touch targets ✓
+- [x] #aria-fieldset-fix Remove invalid `required` attribute from `