You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Track small, well-scoped changes with disproportionate benefit to users or interview authors. Prioritize correctness, accessibility/internationalization, and common UX friction; avoid research-heavy or architectural work in this list.
Why: Incorrect page numbers in a legal-document table of contents are a correctness problem, and the likely change is tightly scoped.
Implementation notes:ALExhibitList._update_page_numbers() already calculates each exhibit.start_page, including the estimated TOC pages and whether a cover page is inserted, so the remaining bug is likely the DOCX TOC template applying an additional offset. Update the TOC expression to derive the displayed content page from exhibit.start_page plus the cover-page offset only when cover pages are enabled, and add regression coverage for multiple one-page exhibits both with and without cover pages.
Why: The current controls hard-code English in both visible labels and ARIA labels, affecting every translated interview that enables the audio UI.
Implementation notes:data/static/al_audio.js currently builds audio_contents_html with literal Listen, Restart, Pause, and stop strings, so the JS needs translated values supplied at runtime rather than more hard-coded branches. Expose translated labels from YAML/HTML (for example through data attributes or a small JS configuration object) and use the same translated source for both the visible <span> and aria-label values.
Why: This can direct a user to the wrong underlying court form, and the current code makes the failure mode clear.
Implementation notes:about_this_interview_version_info in al_visual.yml chooses MAIN_METADATA from the legacy interview_metadata dictionary before reading original_form, even though the active interview metadata is already available through all_variables(special='metadata'). Prefer the current interview's metadata.original_form and use the legacy interview_metadata structure only as a backwards-compatibility fallback; Look for original form URL in metadata, not just interview_metadata in custom error action #692 is related and may be closable once this is fixed.
Why: Small logic defect with visible impact in any interview using dynamic navigation.
Implementation notes:get_visible_al_nav_items() in al_general.py filters hidden child dictionaries into new_sublist but unconditionally appends the parent dictionary even when that list becomes empty. Skip a parent whose list-valued navigation children are all empty after filtering, and add an all children hidden case to test_al_general.py alongside the existing helper coverage.
Why: Prevents the page from appearing unresponsive and discourages repeated clicks that can restart the wait.
Implementation notes:session_list_html() renders each form title as an .al-session-form-title anchor directly to interview_url(...), while interview_list.yml currently has click handling only for delete confirmations. Add a handler for those title links that immediately marks the clicked link/row busy and shows a spinner, then ignores subsequent clicks on that same link while allowing the original navigation to proceed.
Why: The current custom audio buttons are real focusable <button> elements and remain exposed to assistive technology, matching the accessibility concern in the issue.
Implementation notes:audio_contents_html in al_audio.js creates the visible Listen/Restart/Pause/Stop controls without removing the active control from the tab order or accessibility tree. If the earlier product decision still stands, mark the custom control group hidden from assistive technology and remove its buttons from keyboard tab order while preserving pointer activation for the low-literacy use case; this could be implemented/tested together with JS audio button labels don't support translation #1053.
Why: Reduces per-package setup and makes branded/custom feedback behavior work automatically for interview authors.
Implementation notes:al_visual.yml currently hard-codes feedback_form = "docassemble.AssemblyLine:feedback.yml" even though package_name is already computed just above it. Check safely for {package_name}:feedback.yml (the repo already uses Docassemble file-path helpers such as path_and_mimetype elsewhere), prefer it when present, and retain the AssemblyLine feedback interview as the fallback.
Why: Small API-parity improvement that avoids regenerating documents after background assembly and makes background processing easier to use consistently.
Implementation notes:download_list_html(use_previously_cached_files=True) already reuses self._downloadable_files and its cached bundled_pdf, but ALDocumentBundle.as_pdf() only checks its separate self.cache[safe_key] path. Add an equivalent opt-in parameter to as_pdf() that returns the cached bundled PDF when available, with fallback to normal generation, and extend test_aldocument_background_assembly.yml to exercise the new path after the background task completes.
Verify against current main / likely close rather than implement
AssemblyLine renders the terms with display_template(al_terms_of_use, scrollable=True). Current ALToolbox display_template() already adds tabindex="0", role="region", and aria-labelledby/aria-label to scrollable panels, while AssemblyLine depends on docassemble.ALToolbox>=0.18.0; verify the packaged dependency/version in a browser and close if the audit now passes.
The current al_saved_sessions.yml answer-set UI no longer exposes a “Delete All Answer Sets” action matching the 2024 reproduction. Verify that there is no remaining reachable bulk-delete path for answer sets; if the old UI was intentionally removed, close as no longer applicable rather than adding new handling.
Current al_visual.yml still implements al_start_over with command("new_session"), and issue discussion correctly notes that replacing it with destructive restart is not the desired behavior. Need a deterministic statement of the expected non-destructive flow, affected Docassemble versions, and whether this shares the same mid-process/action-resolution cause as "Start over" on hamburger menu not working while on a screen triggered by "recompute" review screen logic #1071 before choosing the implementation.
The current copy path is session_list_html() → url_ask(...) → interview_list_copy_action; unlike the rename block, the copy action block does not declare only sets, which is one concrete lead worth testing. Because the production failure is intermittent, capture a reliable trigger/server state and regression test before making that speculative change.
The current function has no new-tab parameter and its title links are ordinary same-tab anchors, but the issue body is empty. Define whether the option applies only to form-title links or also action links, its default value, and expected target/rel output before implementation.
The list is produced by get_saved_interview_list() and then rendered by session_list_html(), so filtering can likely happen before HTML generation. The unresolved requirement is which secondary-user sessions must remain visible for true multi-user interviews; define that rule before adding a query/filter condition.
The default menu currently points to url_ask(['al_start_over_confirmation', 'al_start_over']), so the suggested client-side confirmation would specifically avoid entering another Docassemble question/action while the interview is mid-process. Confirm that this preserves the desired logged-in/anonymous warning text and test a recompute-triggered screen before treating it as a quick JS-only fix.
Selection rule
A good item for this tracker should normally be finishable in one focused PR, have a clear expected behavior, and improve a shared AssemblyLine component rather than one downstream interview. If investigation reveals broad API design, migration work, or significant backwards-compatibility risk, move it out of this tracker rather than expanding the scope here.
Goal
Track small, well-scoped changes with disproportionate benefit to users or interview authors. Prioritize correctness, accessibility/internationalization, and common UX friction; avoid research-heavy or architectural work in this list.
Priority fixes — ready to implement
P0
Exhibit upload tool - TOC page numbering error #884 — Exhibit upload tool: TOC page numbering error
ALExhibitList._update_page_numbers()already calculates eachexhibit.start_page, including the estimated TOC pages and whether a cover page is inserted, so the remaining bug is likely the DOCX TOC template applying an additional offset. Update the TOC expression to derive the displayed content page fromexhibit.start_pageplus the cover-page offset only when cover pages are enabled, and add regression coverage for multiple one-page exhibits both with and without cover pages.JS audio button labels don't support translation #1053 — JS audio button labels don't support translation
data/static/al_audio.jscurrently buildsaudio_contents_htmlwith literalListen,Restart,Pause, andstopstrings, so the JS needs translated values supplied at runtime rather than more hard-coded branches. Expose translated labels from YAML/HTML (for example through data attributes or a small JS configuration object) and use the same translated source for both the visible<span>andaria-labelvalues."About this form" is pulling from "interview_metadata" object but it's only sometimes right #994 — “About this form” can show the wrong original-form link
about_this_interview_version_infoinal_visual.ymlchoosesMAIN_METADATAfrom the legacyinterview_metadatadictionary before readingoriginal_form, even though the active interview metadata is already available throughall_variables(special='metadata'). Prefer the current interview'smetadata.original_formand use the legacyinterview_metadatastructure only as a backwards-compatibility fallback; Look for original form URL in metadata, not just interview_metadata in custom error action #692 is related and may be closable once this is fixed.P1
When using al_nav_sections, don't display a top level section if there are no visible sections underneath #867 — Hide top-level navigation section when all children are hidden
get_visible_al_nav_items()inal_general.pyfilters hidden child dictionaries intonew_sublistbut unconditionally appends the parent dictionary even when that list becomes empty. Skip a parent whose list-valued navigation children are all empty after filtering, and add anall children hiddencase totest_al_general.pyalongside the existing helper coverage.My interviews page should display a waiting animation when the link is clicked #775 — Show a waiting state after clicking a My Interviews form link
session_list_html()renders each form title as an.al-session-form-titleanchor directly tointerview_url(...), whileinterview_list.ymlcurrently has click handling only for delete confirmations. Add a handler for those title links that immediately marks the clicked link/row busy and shows a spinner, then ignores subsequent clicks on that same link while allowing the original navigation to proceed.Remove "Listen to page" screen reader from tab order #621 — Remove the “Listen to page” widget from screen-reader/tab navigation
<button>elements and remain exposed to assistive technology, matching the accessibility concern in the issue.audio_contents_htmlinal_audio.jscreates the visible Listen/Restart/Pause/Stop controls without removing the active control from the tab order or accessibility tree. If the earlier product decision still stands, mark the custom control group hidden from assistive technology and remove its buttons from keyboard tab order while preserving pointer activation for the low-literacy use case; this could be implemented/tested together with JS audio button labels don't support translation #1053.P2 / small API and configuration wins
Maybe automatically check for presence of feedback.yml in the current package and use it in preference to the global one? #724 — Prefer a package-local
feedback.ymlwhen it existsal_visual.ymlcurrently hard-codesfeedback_form = "docassemble.AssemblyLine:feedback.yml"even thoughpackage_nameis already computed just above it. Check safely for{package_name}:feedback.yml(the repo already uses Docassemble file-path helpers such aspath_and_mimetypeelsewhere), prefer it when present, and retain the AssemblyLine feedback interview as the fallback.ALDocumentBundle.as_pdf() should accept keyword param to provide a cached file #978 — Allow
ALDocumentBundle.as_pdf()to use background-cached filesdownload_list_html(use_previously_cached_files=True)already reusesself._downloadable_filesand its cachedbundled_pdf, butALDocumentBundle.as_pdf()only checks its separateself.cache[safe_key]path. Add an equivalent opt-in parameter toas_pdf()that returns the cached bundled PDF when available, with fallback to normal generation, and extendtest_aldocument_background_assembly.ymlto exercise the new path after the background task completes.Verify against current main / likely close rather than implement
Terms of use text box not keyboard accessible #1061 — Terms of use text box not keyboard accessible
display_template(al_terms_of_use, scrollable=True). Current ALToolboxdisplay_template()already addstabindex="0",role="region", andaria-labelledby/aria-labelto scrollable panels, while AssemblyLine depends ondocassemble.ALToolbox>=0.18.0; verify the packaged dependency/version in a browser and close if the audit now passes.Delete all answer sets bug #829 — Delete all answer sets bug
al_saved_sessions.ymlanswer-set UI no longer exposes a “Delete All Answer Sets” action matching the 2024 reproduction. Verify that there is no remaining reachable bulk-delete path for answer sets; if the old UI was intentionally removed, close as no longer applicable rather than adding new handling.Look for original form URL in metadata, not just interview_metadata in custom error action #692 — Look for original form URL in metadata, not just
interview_metadataabout_this_interview_version_info, and "About this form" is pulling from "interview_metadata" object but it's only sometimes right #994 captures the concrete wrong-link symptom. Treat Look for original form URL in metadata, not just interview_metadata in custom error action #692 as related/legacy scope and consider closing it when "About this form" is pulling from "interview_metadata" object but it's only sometimes right #994 switches the original-form lookup to currentmetadatawith a legacy fallback.Needs more detail before it is fully actionable
al_custom_error Restart button isn't working #1082 —
al_custom_errorrestart/new-session buttonal_visual.ymlstill implementsal_start_overwithcommand("new_session"), and issue discussion correctly notes that replacing it with destructiverestartis not the desired behavior. Need a deterministic statement of the expected non-destructive flow, affected Docassemble versions, and whether this shares the same mid-process/action-resolution cause as "Start over" on hamburger menu not working while on a screen triggered by "recompute" review screen logic #1071 before choosing the implementation.Error screen when copying answer set #1001 — Error screen when copying answer set
session_list_html()→url_ask(...)→interview_list_copy_action; unlike the rename block, the copy action block does not declareonly sets, which is one concrete lead worth testing. Because the production failure is intermittent, capture a reliable trigger/server state and regression test before making that speculative change.Add option to open links in new tab from session_list_html #928 — Add option to open links in new tab from
session_list_htmltarget/reloutput before implementation.Filter/hide sessions the admin has joined #1052 — Filter/hide sessions an admin has joined
get_saved_interview_list()and then rendered bysession_list_html(), so filtering can likely happen before HTML generation. The unresolved requirement is which secondary-user sessions must remain visible for true multi-user interviews; define that rule before adding a query/filter condition."Start over" on hamburger menu not working while on a screen triggered by "recompute" review screen logic #1071 — “Start over” fails during recompute flow
url_ask(['al_start_over_confirmation', 'al_start_over']), so the suggested client-side confirmation would specifically avoid entering another Docassemble question/action while the interview is mid-process. Confirm that this preserves the desired logged-in/anonymous warning text and test a recompute-triggered screen before treating it as a quick JS-only fix.Selection rule
A good item for this tracker should normally be finishable in one focused PR, have a clear expected behavior, and improve a shared AssemblyLine component rather than one downstream interview. If investigation reveals broad API design, migration work, or significant backwards-compatibility risk, move it out of this tracker rather than expanding the scope here.