Compare commits

...
955 Commits
Author SHA1 Message Date
github-actions[bot] 634e32620c Bump versions for v11.78 2026-09-14 11:32:07 +00:00
Lauri Ojansivu f40d29a6e5 Prepare v11.78 release 2026-09-14 14:30:32 +03:00
Lauri Ojansivu cc00713b2c Organize upcoming changes and refresh translation status according to changelog rules 2026-09-14 14:29:59 +03:00
Lauri Ojansivu b232abe1a0 Record dated Basque rule terminology repair and remaining grammar review 2026-09-14 14:27:51 +03:00
Lauri Ojansivu 2a22a42a96 Correct Basque rule archive and restoration terminology 2026-09-14 14:27:31 +03:00
Lauri Ojansivu a6da38e763 Document automatic Git menu merge and translation review progress 2026-09-14 14:26:42 +03:00
Lauri Ojansivu f23a18515a Automate orphan autostash recovery and merge origin in Git menu 2026-09-14 14:26:20 +03:00
Lauri Ojansivu ffde8e84ee Validate Basque rule action and date-field labels 2026-09-14 14:25:29 +03:00
Lauri Ojansivu 39f4f573d8 Document Git menu recovery in upcoming changelog 2026-09-14 14:24:29 +03:00
Lauri Ojansivu f665f7cdaf Guard Git menu operations and report interrupted pull cleanup failures 2026-09-14 14:24:18 +03:00
Lauri Ojansivu ec5a6464fc Merge remote-tracking branch 'origin/main' 2026-09-14 14:23:49 +03:00
Lauri Ojansivu 3ad3491f39 Update dated translation audit and upcoming review progress 2026-09-14 14:23:27 +03:00
Lauri Ojansivu 4c788beef0 Validate Basque date parent-task and standalone rule labels 2026-09-14 14:23:10 +03:00
Lauri Ojansivu 84514bb203 Record dated Basque impersonation translation review 2026-09-14 14:22:21 +03:00
Lauri Ojansivu f29c14def7 Validate Basque impersonation wording against dictionary and handler 2026-09-14 14:21:50 +03:00
Lauri Ojansivu 0443b18e38 Add Frappe responsiveness browser regression and upcoming notes 2026-09-14 14:21:21 +03:00
Lauri Ojansivu 670c203113 Stop Frappe Gantt chrome observer from rewriting identical labels 2026-09-14 14:20:56 +03:00
Lauri Ojansivu fb74726c9e Document full-width board views in upcoming changelog 2026-09-14 14:20:35 +03:00
Lauri Ojansivu fda197bb00 Use full available width for timeline and shared board report views 2026-09-14 14:20:23 +03:00
Lauri Ojansivu 74ecca7814 Record Basque date and webhook translation review progress 2026-09-14 14:19:59 +03:00
Lauri Ojansivu a076987c96 Validate Basque date activities upload outcomes and webhook labels 2026-09-14 14:17:24 +03:00
Lauri Ojansivu e35ba91dfd Update LDAP investigation and language picker changelog 2026-09-14 14:16:25 +03:00
Lauri Ojansivu dad65fb6c5 Verify LDAP issue 6692 through actual bind and user search methods
The latest 11.77 report still shows the undefined-index error fixed locally in 2c5cdd78a. Exercise service-account binding followed by user search with unset and configured filters, and prove failed binding cannot proceed to search. The separately reported oplog observer error is not established as the authentication cause.

Thanks to Nissulya and xet7 !

Fixes #6692,
2026-09-14 14:16:19 +03:00
Lauri Ojansivu c3ce54fa21 Show full-width language picker with separate language and region lines 2026-09-14 14:15:31 +03:00
Lauri Ojansivu 220a6beb69 Record Basque report and storage translation review progress 2026-09-14 14:14:23 +03:00
Lauri Ojansivu ea16ef95e4 Validate Basque team reports and storage migration messages 2026-09-14 14:13:58 +03:00
Lauri Ojansivu 1ee15661a3 Record Basque search terminology repair and review progress 2026-09-14 14:13:28 +03:00
Lauri Ojansivu 9910a2c138 Clarify Basque archived search status and validate operator instructions 2026-09-14 14:12:59 +03:00
Lauri Ojansivu de9da747a7 Record Basque rule and activity translation review progress 2026-09-14 14:12:19 +03:00
Lauri Ojansivu e34b55d698 Validate Basque rule fragments and activity settings 2026-09-14 14:11:54 +03:00
Lauri Ojansivu 251e352245 Record Basque archive translation fixes and review progress 2026-09-14 14:11:22 +03:00
Lauri Ojansivu 629577951a Clarify Basque archive activity terminology and validate instructions 2026-09-14 14:10:57 +03:00
Lauri Ojansivu f7a816eb22 Record Basque activity and Galician label review progress 2026-09-14 14:10:08 +03:00
Lauri Ojansivu 641062f8cd Validate Basque activity messages and Galician session labels 2026-09-14 14:09:46 +03:00
Lauri Ojansivu bceb89d928 Document activity placeholder repair and translation review progress 2026-09-14 14:09:02 +03:00
Lauri Ojansivu 888e0e6bcd Substitute activity message values through current translation API
Pass activity values as sprintf options and discard Spacebars helper metadata so card and sidebar feeds show actual titles and labels instead of literal percent placeholders. Preserve the security-aware viewer and sanitizing. Verify substitution using the real i18next formatter and register browser assertions for both feeds.
2026-09-14 14:08:37 +03:00
Lauri Ojansivu a5e111f910 Validate Galician repository and account translations 2026-09-14 14:07:04 +03:00
Lauri Ojansivu 30abbc9ae2 Record Galician scheduler translation review progress 2026-09-14 14:06:27 +03:00
Lauri Ojansivu d2780f0082 Validate Galician scheduler and migration threshold translations 2026-09-14 14:06:05 +03:00
Lauri Ojansivu 1ca33bf70f Record Galician subtask agreement and migration review progress 2026-09-14 14:05:25 +03:00
Lauri Ojansivu 01fa30d1c3 Fix Galician completed-subtask agreement and review migration steps 2026-09-14 14:04:56 +03:00
Lauri Ojansivu cfeeb65d46 Record Galician storage migration translation review progress 2026-09-14 14:04:10 +03:00
Lauri Ojansivu b71db72ab0 Validate Galician storage migrations and progress labels 2026-09-14 14:03:49 +03:00
Lauri Ojansivu 196b82d78c Record Galician S3 and migration translation review progress 2026-09-14 14:03:14 +03:00
Lauri Ojansivu 9683042c4e Validate Galician S3 settings and migration outcomes 2026-09-14 14:02:45 +03:00
Lauri Ojansivu 86dc493da9 Document historical mirror recovery in upcoming changelog 2026-09-14 14:02:10 +03:00
Lauri Ojansivu 44e3e1fd75 Recover unavailable mirror links from creation-date Wayback history
Bound attachment requests and defer long rate-limit cooldowns while preserving rate-limit state. Recover missing public links from the closest historical capture, retain provenance, and skip optional failures so remaining content synchronization continues.
2026-09-14 14:01:59 +03:00
Lauri Ojansivu f753dedd93 Record Galician migration and backup review progress 2026-09-14 14:00:13 +03:00
Lauri Ojansivu 4e3802901e Validate Galician migration retry and backup translations 2026-09-14 13:59:56 +03:00
Lauri Ojansivu 9e8d8da268 Document staged parallel mirror synchronization in upcoming changelog 2026-09-14 13:59:20 +03:00
Lauri Ojansivu 103e4dface Stage Git and archive sync before parallel destination mirroring
Synchronize Git to all active destinations before collecting source content. Reuse the local archive for concurrent destination processes, show combined per-mirror issue and release counters, and retain separate mirror-named logs. Stop content writes after archive failure and preserve restart checkpoints.
2026-09-14 13:58:58 +03:00
Lauri Ojansivu 587f4ec335 Record Galician received-card and scheduler translation repairs 2026-09-14 13:55:47 +03:00
Lauri Ojansivu cfc2480e54 Fix Galician received-card agreement and validate scheduled job labels 2026-09-14 13:55:27 +03:00
Lauri Ojansivu 927faa7215 Record Galician upload and accessibility review progress 2026-09-14 13:54:27 +03:00
Lauri Ojansivu f51c7439f9 Validate Galician upload and accessibility settings translations 2026-09-14 13:54:09 +03:00
Lauri Ojansivu b5ddb610a8 Update Galician diagnostic review progress 2026-09-14 13:53:41 +03:00
Lauri Ojansivu 8fbc620750 Validate Galician diagnostic and storage labels 2026-09-14 13:53:21 +03:00
Lauri Ojansivu 503ada2fbe Document LDAP optional-filter login repair and verification 2026-09-14 13:52:52 +03:00
Lauri Ojansivu 2c5cdd78a9 Handle unset optional LDAP user search filter
An unset LDAP_USER_SEARCH_FILTER was indexed after service-account binding, causing the reported undefined index TypeError instead of searching users. Preserve configured filters and reject invalid types explicitly.

Thanks to Nissulya and xet7 !

Fixes #6692,
2026-09-14 13:52:37 +03:00
Lauri Ojansivu 5b2ce8f6f3 Record Galician diagnostic and dictionary review progress 2026-09-14 13:51:54 +03:00
Lauri Ojansivu c6c3b90bef Clarify Galician V8 garbage overwrite diagnostic 2026-09-14 13:51:30 +03:00
Lauri Ojansivu 798e86ec68 Record Galician format translation review progress
Update dated evidence and exact counts while preserving unresolved dictionary and browser requirements.

Thanks to xet7 !
2026-09-14 13:48:33 +03:00
Lauri Ojansivu 1adfb3bec3 Validate Galician format instructions and request states
Retain 27 correct values preserving template tokens, space entities, spinner options and closed/resolved distinctions.

Thanks to xet7 !
2026-09-14 13:48:09 +03:00
Lauri Ojansivu 9d307d8518 Record Galician query translation review progress
Update dated evidence and exact counts while preserving remaining grammar and browser requirements.

Thanks to xet7 !
2026-09-14 13:47:29 +03:00
Lauri Ojansivu d2d90abf53 Validate Galician query syntax and troubleshooting instructions
Retain 30 correct values preserving shorthand, descending sort, period predicates and executable diagnostics.

Thanks to xet7 !
2026-09-14 13:47:04 +03:00
Lauri Ojansivu 414e846517 Record Galician entity translation review progress
Update dated evidence and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:46:26 +03:00
Lauri Ojansivu c78c7f3c52 Validate Galician entity and search predicate labels
Retain 30 correct values preserving entity names, date sorting and ended versus overdue predicates.

Thanks to xet7 !
2026-09-14 13:45:57 +03:00
Lauri Ojansivu e410234e78 Record Galician reminder translation review progress
Update dated evidence and exact counts, preserving remaining grammar and browser verification.

Thanks to xet7 !
2026-09-14 13:45:23 +03:00
Lauri Ojansivu 92b911aa94 Validate Galician reminders and notification controls
Retain 30 correct values preserving due conditions, exact tokens, read-state scope and weekday names.

Thanks to xet7 !
2026-09-14 13:44:57 +03:00
Lauri Ojansivu fe022ff608 Record Galician date activity translation review
Update dated evidence and exact counts while preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:44:27 +03:00
Lauri Ojansivu 44ff8c566b Validate Galician date activities and placement labels
Retain 30 correct values preserving authentication settings, date interpolation and opposing placement directions.

Thanks to xet7 !
2026-09-14 13:44:02 +03:00
Lauri Ojansivu cb16fd4d30 Record Galician rule translation review progress
Update dated evidence and exact counts while preserving remaining agreement and browser requirements.

Thanks to xet7 !
2026-09-14 13:43:32 +03:00
Lauri Ojansivu 87b9e45fb1 Validate Galician rule actions and web metadata labels
Retain 30 correct values preserving check/uncheck scope, wildcard meaning, date actions and literal HTML/JSON configuration names.

Thanks to xet7 !
2026-09-14 13:43:09 +03:00
Lauri Ojansivu 9530e99ea9 Record Galician custom-field activity repair progress
Update dated repair evidence and exact counts, retaining remaining grammar and browser verification.

Thanks to xet7 !
2026-09-14 13:42:35 +03:00
Lauri Ojansivu 29f1980b24 Clarify Galician custom-field value clearing activity
Describe removing the card field value rather than deleting its definition. Retain 25 correct rule and activity values, preserve percent placeholders and add positive/negative regression checks.

Thanks to xet7 !
2026-09-14 13:42:06 +03:00
Lauri Ojansivu 7f47bbf7f3 Record Galician permission translation review progress
Update dated evidence and exact counts while preserving unresolved agreement and browser requirements.

Thanks to xet7 !
2026-09-14 13:40:56 +03:00
Lauri Ojansivu dda51a1e5c Validate Galician account permissions and subtask settings
Retain 28 correct values preserving metadata, roles, notification scope and subtask path relationships. Leave received-label agreement open.

Thanks to xet7 !
2026-09-14 13:40:23 +03:00
Lauri Ojansivu 0b154538d3 Document compact release-note sections in Upcoming
Record the requested section whitelist and verification.

Thanks to xet7 !
2026-09-14 13:39:52 +03:00
Lauri Ojansivu f7def463be Restrict release notes to summary security and language updates
Emit only In short, Security, translation language names, thanks and the exact changelog anchor. Keep other details in the changelog and verify security retention, omitted developer entries and version-specific links offline.

Thanks to xet7 !
2026-09-14 13:39:32 +03:00
Lauri Ojansivu 6e9c26d53b Record Galician diagnostic translation review progress
Update dated evidence and exact counts while preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:37:55 +03:00
Lauri Ojansivu 6c534f40f6 Validate Galician SMTP and system diagnostic labels
Retain 30 correct values preserving WIP remedies, webhook scope, invitation tokens and diagnostic distinctions.

Thanks to xet7 !
2026-09-14 13:37:22 +03:00
Lauri Ojansivu 55a8bb26ca Record Galician shortcut translation review progress
Update dated evidence and exact counts, preserving outstanding language and browser requirements.

Thanks to xet7 !
2026-09-14 13:36:56 +03:00
Lauri Ojansivu 64a60f1897 Validate Galician shortcuts and custom branding labels
Retain 30 correct values preserving units, limits, shortcut actions and URL configuration distinctions.

Thanks to xet7 !
2026-09-14 13:36:34 +03:00
Lauri Ojansivu 1709b89e7b Record Galician selection translation review progress
Update dated evidence and exact counts while retaining outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:36:06 +03:00
Lauri Ojansivu 885d65b3b8 Validate Galician selection and board-management labels
Retain 30 correct values preserving selection scope, role restrictions, login-link interpolation and image-only input.

Thanks to xet7 !
2026-09-14 13:35:43 +03:00
Lauri Ojansivu d07cc31d21 Record Galician filter translation review progress
Update dated evidence and exact counts, retaining outstanding grammar and browser requirements.

Thanks to xet7 !
2026-09-14 13:35:14 +03:00
Lauri Ojansivu c45e99b02b Validate Galician filters and import mapping labels
Retain 30 correct values preserving date ranges, list visibility, import formats and existing-user mapping.

Thanks to xet7 !
2026-09-14 13:34:48 +03:00
Lauri Ojansivu 88fa9f5461 Record Galician email translation review progress
Update dated evidence and exact counts, retaining unresolved contextual and browser requirements.

Thanks to xet7 !
2026-09-14 13:33:59 +03:00
Lauri Ojansivu ac0f8696fa Validate Galician account emails and export fields
Retain 29 correct values preserving email purposes, placeholders, export roles and attachment metadata.

Thanks to xet7 !
2026-09-14 13:33:18 +03:00
Lauri Ojansivu d3afacd15f Record Galician custom-field translation review progress
Update dated evidence and exact counts, preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:32:45 +03:00
Lauri Ojansivu 98c90fd8a6 Validate Galician custom fields and access labels
Retain 30 correct values preserving access restrictions, field types, dropdown alternatives and email interpolation.

Thanks to xet7 !
2026-09-14 13:32:20 +03:00
Lauri Ojansivu 3fb32bc4b5 Record Galician estimation translation review progress
Update dated evidence and exact counts while preserving remaining language and browser validation.

Thanks to xet7 !
2026-09-14 13:31:39 +03:00
Lauri Ojansivu 47fb0f2771 Validate Galician estimation controls and color labels
Retain 30 correct values preserving named features, automatic-width inversion and color distinctions.

Thanks to xet7 !
2026-09-14 13:31:11 +03:00
Lauri Ojansivu 51d025e131 Record Galician calendar translation review progress
Update dated evidence and counts, retaining outstanding language and browser requirements.

Thanks to xet7 !
2026-09-14 13:30:42 +03:00
Lauri Ojansivu e5e09f52c8 Validate Galician calendar and voting labels
Retain 30 correct values preserving date directions, voting scope and permanent deletion warnings.

Thanks to xet7 !
2026-09-14 13:30:19 +03:00
Lauri Ojansivu 31786d7574 Record Galician display translation review progress
Update dated evidence and exact counts while preserving outstanding language and browser validation.

Thanks to xet7 !
2026-09-14 13:29:52 +03:00
Lauri Ojansivu 708478423a Validate Galician display settings and archive controls
Retain 30 correct values preserving units, archive scope, avatar tokens and zoom directions.

Thanks to xet7 !
2026-09-14 13:29:29 +03:00
Lauri Ojansivu 00c917ab39 Record Galician activity translation review progress
Update dated evidence and exact counts, retaining outstanding fluency and browser requirements.

Thanks to xet7 !
2026-09-14 13:29:00 +03:00
Lauri Ojansivu 4b926a60fa Validate Galician activities and workspace controls
Retain 35 correct values preserving activity directions, date tokens, workspace settings and shortcut state inversions.

Thanks to xet7 !
2026-09-14 13:28:34 +03:00
Lauri Ojansivu 829fb2ae9d Record Galician migration execution translation review
Update dated evidence and exact counts; preserve outstanding language and browser verification.

Thanks to xet7 !
2026-09-14 13:28:03 +03:00
Lauri Ojansivu e8766c17b9 Validate Galician migration execution and account messages
Retain 30 correct values preserving background behavior, batch limits, attachment states and account validation.

Thanks to xet7 !
2026-09-14 13:27:41 +03:00
Lauri Ojansivu 81ed6d9899 Document language-only translation release notes
Record summary behavior and offline verification under Upcoming.

Thanks to xet7 !
2026-09-14 13:27:11 +03:00
Lauri Ojansivu 8db16132cb Summarize release-note translations as updated languages
Keep detailed translation entries in the changelog and audit, but list only affected languages in release notes. Require explicit language metadata, preserve other topic details, and anchor release heading extraction. Verify nested detail removal and missing-metadata failure offline.

Thanks to xet7 !
2026-09-14 13:26:55 +03:00
Lauri Ojansivu a187b70013 Record Galician migration translation review progress
Update dated evidence and exact counts while preserving open completion terminology and browser requirements.

Thanks to xet7 !
2026-09-14 13:25:13 +03:00
Lauri Ojansivu ff77543b5c Validate Galician migration scopes and confirmations
Retain 34 correct values preserving archive restrictions, duplicate-list conditions, administrator-only execution and migration progress.

Thanks to xet7 !
2026-09-14 13:24:53 +03:00
Lauri Ojansivu 72abc938dd Record Galician account and scheduling review progress
Update dated exact counts and remaining ambiguous terminology requirements.

Thanks to xet7 !
2026-09-14 13:24:23 +03:00
Lauri Ojansivu 3b524f0712 Validate Galician account states and scheduled board actions
Retain 29 correct values preserving activation, unlock scope and scheduling success versus execution. Leave Complete wording open pending context.

Thanks to xet7 !
2026-09-14 13:23:57 +03:00
Lauri Ojansivu fd170dfc32 Record Galician storage translation review progress
Update dated evidence and resolve visibility-label context while preserving remaining validation scope.

Thanks to xet7 !
2026-09-14 13:23:33 +03:00
Lauri Ojansivu 2f141de75b Validate Galician storage and account-lockout labels
Retain 30 correct values preserving attachment scope, storage names, account states and visibility settings. Resolve card-show-lists context against the settings row and toggle.

Thanks to xet7 !
2026-09-14 13:23:08 +03:00
Lauri Ojansivu 4b82dd70fb Document changelog-only release notes in Upcoming
Record the release-note fix, validation and preserved separate provenance artifacts.

Thanks to xet7 !
2026-09-14 13:22:38 +03:00
Lauri Ojansivu ccfceb7b77 Exclude binary provenance tables from release notes
Generate initial and refreshed release notes solely from the changelog. Retain checksum verification and build provenance artifacts separately. Update build entry points, release instructions and regression guards.

Thanks to xet7 !
2026-09-14 13:22:19 +03:00
Lauri Ojansivu 263da8892d Record Galician predicate translation review progress
Update dated evidence and remaining contextual review requirements.

Thanks to xet7 !
2026-09-14 13:20:49 +03:00
Lauri Ojansivu f22aeb7bcd Validate Galician search predicates and checklist instructions
Retain 39 correct values preserving boolean search logic, deletion constraints, checklist order and legal-notice agreement. Leave card-show-lists context open.

Thanks to xet7 !
2026-09-14 13:20:19 +03:00
Lauri Ojansivu 7672a79147 Record Galician search translation review progress
Update dated review evidence and exact counts while retaining remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:19:50 +03:00
Lauri Ojansivu cf1e89bb9e Validate Galician search results and operator instructions
Retain 40 correct values preserving query syntax, role alternatives, date thresholds and result interpolation.

Thanks to xet7 !
2026-09-14 13:19:28 +03:00
Lauri Ojansivu 93ea560109 Record Galician deletion and card-view review progress
Update dated evidence and exact review counts, preserving outstanding grammar and browser validation.

Thanks to xet7 !
2026-09-14 13:18:59 +03:00
Lauri Ojansivu 2cb3f6b13f Validate Galician deletion warnings and personal card views
Retain 34 correct values, preserving irreversible effects, linked-card deletion order, mention placeholders and due-card permission restrictions.

Thanks to xet7 !
2026-09-14 13:18:38 +03:00
Lauri Ojansivu f8bb9f02f7 Record Galician date-trigger repairs and grammar finding
Update dated progress, source commit and remaining contextual agreement requirements.

Thanks to xet7 !
2026-09-14 13:18:14 +03:00
Lauri Ojansivu 54fdfd33ca Repair Galician automation date-trigger meanings
Replace Portuguese date wording and preserve both setting and changing dates. Retain 39 correct automation and HTML-placement values; leave attachment participle agreement open after inspecting assembled controls. Add positive and negative date-trigger regression checks.

Thanks to xet7 !
2026-09-14 13:17:47 +03:00
Lauri Ojansivu 6100709231 Record Galician card settings translation review progress
Update dated review evidence and exact counts while retaining outstanding language and browser validation.

Thanks to xet7 !
2026-09-14 13:16:37 +03:00
Lauri Ojansivu edea4b20e1 Validate Galician card settings and automation labels
Retain 25 correct translations after checking parent relationships, subtask destinations, attachment counts, activity interpolation and automation action scope.

Thanks to xet7 !
2026-09-14 13:16:13 +03:00
Lauri Ojansivu 0a43570fc8 Record Galician visibility translation review progress
Update dated review hash and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 13:14:09 +03:00
Lauri Ojansivu e74cc64642 Validate Galician visibility and deletion warnings
Retain twenty-five correct values, preserving private-only scope, field application distinctions, invitation tokens and irreversible deletion warnings.

Thanks to xet7 !
2026-09-14 13:13:40 +03:00
Lauri Ojansivu 115901a7c8 Record Galician removal and shortcut translation review
Update dated review hash and exact counts while preserving all remaining audit and browser requirements.

Thanks to xet7 !
2026-09-14 13:13:08 +03:00
Lauri Ojansivu 4f0293f5cd Validate Galician removal and card-shortcut labels
Retain twenty-five correct translations, preserving member-removal effects, unsaved-description warnings, thresholds and self-assignment distinctions.

Thanks to xet7 !
2026-09-14 13:12:44 +03:00
Lauri Ojansivu 91c36f1cea Record Galician import-mapping and privacy translation review
Update dated review hash and exact counts while preserving remaining full audit and browser scope.

Thanks to xet7 !
2026-09-14 13:12:13 +03:00
Lauri Ojansivu 7f7db419c7 Validate Galician import mapping and board privacy descriptions
Retain twenty-five correct translations, preserving admin constraints, mapping fallback, notification scope and public versus private access.

Thanks to xet7 !
2026-09-14 13:11:37 +03:00
Lauri Ojansivu b6403e798e Record Galician import-help translation repair
Update dated repair hash and exact counts while preserving remaining full language and browser audit scope.

Thanks to xet7 !
2026-09-14 13:11:10 +03:00
Lauri Ojansivu 316232f694 Preserve Trello navigation labels in Galician import help
Retain Galician prose and twenty-nine correct template, invitation, export and filter labels. Preserve literal JSON properties and interpolation.

Thanks to xet7 !
2026-09-14 13:10:42 +03:00
Lauri Ojansivu 0233b49593 Record Galician role-description translation review
Update dated review hash and exact counts, preserving remaining full language and browser audit scope.

Thanks to xet7 !
2026-09-14 13:10:03 +03:00
Lauri Ojansivu 96367d2134 Validate Galician role descriptions and card controls
Retain twenty-five correct translations, preserving assigned-only visibility, editing restrictions and worker self-assignment scope.

Thanks to xet7 !
2026-09-14 13:09:36 +03:00
Lauri Ojansivu c8adbff586 Record Galician deletion-warning translation review
Update dated review hash and exact counts while preserving remaining audit and browser requirements.

Thanks to xet7 !
2026-09-14 13:08:58 +03:00
Lauri Ojansivu 4c585a2b81 Validate Galician deletion warnings and archive guidance
Retain twenty-five correct values, preserving permanent deletion versus reversible archive behavior and activity-loss warnings.

Thanks to xet7 !
2026-09-14 13:08:36 +03:00
Lauri Ojansivu 646ab17f46 Record Galician board-settings translation review
Update dated review hash and exact counts, preserving full remaining audit and browser scope.

Thanks to xet7 !
2026-09-14 13:08:04 +03:00
Lauri Ojansivu 68277a708d Validate Galician board settings and archive controls
Retain twenty-five correct translations, preserving member and assignee scopes, public/private distinctions and HTML emphasis.

Thanks to xet7 !
2026-09-14 13:07:41 +03:00
Lauri Ojansivu e55898711f Record Galician creation-control translation review
Update dated review hash and exact counts while preserving all unresolved language and browser requirements.

Thanks to xet7 !
2026-09-14 13:07:13 +03:00
Lauri Ojansivu f1add7ab2b Validate Galician creation controls and offline warning
Retain twenty-five correct translations, preserving placement, privilege scope, count agreement and data-loss conditions.

Thanks to xet7 !
2026-09-14 13:06:49 +03:00
Lauri Ojansivu 36b0109fc3 Record Galician membership and movement translation review
Update dated review hash and exact counts while preserving unresolved language and browser verification.

Thanks to xet7 !
2026-09-14 13:06:22 +03:00
Lauri Ojansivu b82f539a41 Validate Galician membership and card-movement activities
Retain twenty-five correct archive, import, movement and checklist values, preserving direction and exact interpolation.

Thanks to xet7 !
2026-09-14 13:05:59 +03:00
Lauri Ojansivu 2998b14bc2 Record Galician activity translation review progress
Update dated review hash and exact counts while preserving uncertain Esperanto findings and full remaining language/browser scope.

Thanks to xet7 !
2026-09-14 13:05:31 +03:00
Lauri Ojansivu 0d2e977d90 Validate Galician card and checklist activity translations
Retain twenty-five correct activity values, preserving action distinctions, object relationships and exact placeholders.

Thanks to xet7 !
2026-09-14 13:05:08 +03:00
Lauri Ojansivu 0b8f090343 Record Esperanto overtime terminology repair and evidence limits
Update dated repair hash and counts, distinguishing work classification from deadline expiry and retaining broader fluency review.

Thanks to xet7 !
2026-09-14 13:04:34 +03:00
Lauri Ojansivu 9b6b1ffe6f Clarify Esperanto overtime work labels
Use consistent overtime-work terminology for manually classified recorded hours, preserving the hours unit and separating this flag from due-date expiry.

Thanks to xet7 !
2026-09-14 13:04:06 +03:00
Lauri Ojansivu 11ac7f8a97 Record Esperanto advanced-filter translation repair
Update dated repair hash, exact counts and parser evidence while preserving wider language and browser review requirements.

Thanks to xet7 !
2026-09-14 13:03:28 +03:00
Lauri Ojansivu 5d94f1b92b Repair Esperanto advanced-filter examples and escaping instructions
Preserve canonical query examples and explain literal special-character escaping. Add positive example and negative malformed-wording coverage.

Thanks to xet7 !
2026-09-14 13:03:02 +03:00
Lauri Ojansivu e520065604 Record confirmed Esperanto scrollbar terminology
Update dated review hash and primary-source evidence, retaining unresolved color and broader audit requirements.

Thanks to xet7 !
2026-09-14 13:02:10 +03:00
Lauri Ojansivu 41fb26dff6 Validate Esperanto scrollbar terminology against computing references
Retain the correct vertical scrollbar translation; primary terminology and LibreOffice documentation confirm rulumskalo.

Thanks to xet7 !
2026-09-14 13:01:46 +03:00
Lauri Ojansivu c91ef98426 Record Esperanto garbage-zapping terminology repair
Update dated repair hash, official API evidence and exact counts while keeping remaining translation review open.

Thanks to xet7 !
2026-09-14 13:01:18 +03:00
Lauri Ojansivu 05217bbb9e Correct Esperanto heap garbage-zapping diagnostic
Describe overwriting heap garbage with a bit pattern rather than zeroing it, matching official Node V8 documentation.

Thanks to xet7 !
2026-09-14 13:00:52 +03:00
Lauri Ojansivu d8fd82d57d Record Esperanto remaining-label review progress
Update dated review hash and exact counts; explicitly preserve nine uncertain Esperanto findings and wider audit scope.

Thanks to xet7 !
2026-09-14 13:00:18 +03:00
Lauri Ojansivu f523001c3e Validate Esperanto account outcomes and remaining basic labels
Retain ten correct labels, preserving account creation success versus failure and login versus logout distinctions.

Thanks to xet7 !
2026-09-14 12:59:51 +03:00
Lauri Ojansivu ccafc4db96 Record Esperanto repository translation review progress
Update dated review hash and counts, preserving all remaining language and browser audit requirements.

Thanks to xet7 !
2026-09-14 12:59:23 +03:00
Lauri Ojansivu 9ba7cfcb80 Validate Esperanto repository and authentication labels
Retain thirty correct values, preserving temporary lockout conditions, required credentials, minimum length and byte units.

Thanks to xet7 !
2026-09-14 12:58:58 +03:00
Lauri Ojansivu 545e1bc9fb Record Esperanto scheduling translation review progress
Update dated review hash and exact counts; group upcoming translation entries and preserve open verification requirements.

Thanks to xet7 !
2026-09-14 12:58:32 +03:00
Lauri Ojansivu 5a398d5acc Validate Esperanto scheduling intervals and diagnostics
Retain thirty correct restoration, resource and scheduling labels, preserving interval quantities, singular/plural agreement and percent units.

Thanks to xet7 !
2026-09-14 12:57:52 +03:00
Lauri Ojansivu 44a6f7e74a Record Esperanto migration-confirmation review progress
Update dated review hash and counts, preserving unresolved meanings and full remaining audit scope.

Thanks to xet7 !
2026-09-14 12:57:26 +03:00
Lauri Ojansivu 07756eecd0 Validate Esperanto migration confirmations and steps
Retain thirty correct warnings and progress labels, preserving operation order, archived versus nonarchived scope and difficult-undo warnings.

Thanks to xet7 !
2026-09-14 12:57:00 +03:00
Lauri Ojansivu ba489652ec Record Esperanto migration-description review progress
Update dated review hash, exact counts and unresolved completion-label evidence without closing remaining audit scope.

Thanks to xet7 !
2026-09-14 12:56:33 +03:00
Lauri Ojansivu 036cbff311 Validate Esperanto migration repair descriptions
Retain nineteen correct restoration and data-integrity labels, preserving field identifiers, board scope and administrator-only permission. Leave Complete state terminology under review.

Thanks to xet7 !
2026-09-14 12:56:08 +03:00
Lauri Ojansivu aa0ae67f83 Record Esperanto storage and migration review progress
Update dated review hash and exact counts while preserving remaining translation and browser requirements.

Thanks to xet7 !
2026-09-14 12:55:32 +03:00
Lauri Ojansivu 460df4ada0 Validate Esperanto storage and migration settings
Retain thirty correct values, preserving conjunctive duplicate-list safety conditions and distinct migration actions and connection outcomes.

Thanks to xet7 !
2026-09-14 12:55:10 +03:00
github-actions[bot] 605c6caf41 Bump versions for v11.77 2026-09-14 09:55:00 +00:00
Lauri Ojansivu 25ed0a5ccb Record Esperanto scheduled-job translation review progress
Update dated review hash and counts, preserving released v11.77 notes and recording new work under Upcoming.

Thanks to xet7 !
2026-09-14 12:54:44 +03:00
Lauri Ojansivu 8b0d7488ad Prepare v11.77 release 2026-09-14 12:53:36 +03:00
Lauri Ojansivu 5946767b1f Validate Esperanto scheduled-job and migration labels
Retain twenty-nine correct administration values, preserving failed versus paused states and success versus failure outcomes. Leave context-dependent Complete under review.

Thanks to xet7 !
2026-09-14 12:53:34 +03:00
Lauri Ojansivu 0f29a984da Record Esperanto account-window translation repair
Update dated local repair hash, exact counts and evidence while preserving remaining language and browser review.

Thanks to xet7 !
2026-09-14 12:53:00 +03:00
Lauri Ojansivu 6eaabcaeaa Clarify Esperanto login-failure time window
Distinguish the time window for failed attempts from an unsuccessful window. Retain twenty-nine correct support, accessibility and account-state labels.

Thanks to xet7 !
2026-09-14 12:52:34 +03:00
Lauri Ojansivu 26013dc670 Record Esperanto attachment translation review progress
Update dated review hash and exact counts, preserving remaining language and browser requirements.

Thanks to xet7 !
2026-09-14 12:51:48 +03:00
Lauri Ojansivu 1439290a60 Validate Esperanto attachment and custom-translation labels
Retain thirty correct storage, upload, authentication and custom-translation strings, preserving byte units and irreversible deletion warnings.

Thanks to xet7 !
2026-09-14 12:51:21 +03:00
Lauri Ojansivu 0a5b46b0fb Record Esperanto RSS repair and technical terminology review
Update dated repair hash, exact counts and dictionary evidence; keep uncertain memory and wider language/browser validation open.

Thanks to xet7 !
2026-09-14 12:50:55 +03:00
Lauri Ojansivu 3e0c49da97 Restore size meaning in Esperanto RSS diagnostic
Clarify resident set size and retain twenty-eight correct memory, legal and checklist labels. Preserve documented native terminology; garbage-zapping wording remains under review.

Thanks to xet7 !
2026-09-14 12:50:28 +03:00
Lauri Ojansivu 4e22307ef9 Document private-only board insertion policy follow-up
Add upcoming changelog entry and dated remediation evidence with the local implementation commit and verification limits.

Thanks to xet7 !
2026-09-14 12:49:47 +03:00
Lauri Ojansivu 749467c802 Enforce private-only policy for trusted board insertions
Apply the instance visibility policy at the shared before-insert hook so copies, imports and lazy helpers cannot create public boards. Keep policy enforcement independent of security logger availability.

Thanks to xet7 !
2026-09-14 12:49:30 +03:00
Lauri Ojansivu 71084bbef2 Record Esperanto request and spinner translation review
Update dated review hash, exact progress counts and evidence without closing remaining language or browser verification.

Thanks to xet7 !
2026-09-14 12:48:16 +03:00
Lauri Ojansivu 59ad2ce12a Validate Esperanto request states and spinner labels
Retain thirty correct separator, swimlane, spinner and request translations, preserving literal space entities and organization deletion constraints.

Thanks to xet7 !
2026-09-14 12:47:57 +03:00
Lauri Ojansivu e62d364229 Record Esperanto search instruction audit progress
Update dated review hash and exact counts, noting shared source formatting separately from translation errors.

Thanks to xet7 !
2026-09-14 12:47:31 +03:00
Lauri Ojansivu bc927c112c Validate Esperanto search instructions and sorting labels
Retain thirty correct translations, preserving query examples, interpolation, integer rules and sorting direction.

Thanks to xet7 !
2026-09-14 12:47:11 +03:00
Lauri Ojansivu 1f08e395f2 Record Esperanto search validation review progress
Update dated commit, exact review counts and evidence while preserving remaining translation scope.

Thanks to xet7 !
2026-09-14 12:46:41 +03:00
Lauri Ojansivu 18cf8b11bb Validate Esperanto search operators and errors
Retain forty correct search display labels, validation errors and pagination translations, preserving positive-integer requirements and exact interpolation.

Thanks to xet7 !
2026-09-14 12:46:23 +03:00
Lauri Ojansivu eb592680b0 Record Esperanto due-card and search audit progress
Update dated review commit and exact counts while preserving the full remaining translation review scope.

Thanks to xet7 !
2026-09-14 12:45:53 +03:00
Lauri Ojansivu 53044af0bb Validate Esperanto due-card and search labels
Retain forty-five correct weekdays, task states, due-card permission descriptions and search labels, preserving negation and interpolation.

Thanks to xet7 !
2026-09-14 12:45:34 +03:00
Lauri Ojansivu 96623d8651 Record Esperanto reminder and notification review progress
Update dated local review hash, exact counts and evidence while keeping all remaining translation verification open.

Thanks to xet7 !
2026-09-14 12:45:11 +03:00
Lauri Ojansivu 35792c787d Validate Esperanto reminders and notification controls
Retain forty correct date activity, placement, deletion warning, assignee and notification translations after direct semantic review.

Thanks to xet7 !
2026-09-14 12:44:52 +03:00
Lauri Ojansivu 11c667884b Record Esperanto completion validation with corrected dictionary provenance
Update dated review counts and preserve remaining language and browser audit requirements.

Thanks to xet7 !
2026-09-14 12:44:26 +03:00
Lauri Ojansivu 5b1ec70e94 Validate Esperanto checklist completion and metadata labels
Use the correct native ReVo komplet entry and retain six checklist state translations plus thirty correct authentication, custom metadata and date labels.

Thanks to xet7 !
2026-09-14 12:44:03 +03:00
Lauri Ojansivu 74114f5856 Update translation audit after Esperanto custom-field review
Record dated repair commit, corrected example coverage and current counts. Preserve open language and browser validation requirements.

Thanks to xet7 !
2026-09-14 12:43:10 +03:00
Lauri Ojansivu 3b44bfb5e9 Clarify Esperanto custom-field value removal
Replace misconfiguration wording with value removal, retain fifty-two valid rule and hierarchy labels, and preserve translated comma-separated example names in review coverage.

Thanks to xet7 !
2026-09-14 12:42:37 +03:00
Lauri Ojansivu adc40ef818 Record Esperanto member and subtask translation repairs
Update dated audit counts, evidence and upcoming changelog with the verified local repair commit. Keep remaining language and browser review open.

Thanks to xet7 !
2026-09-14 12:41:29 +03:00
Lauri Ojansivu fbc39261f7 Repair Esperanto member notification and subtask activity wording
Use a singular member reference and a finite past verb with the established swimlane term. Retain fourteen correct rule and filter translations after semantic review.

Thanks to xet7 !
2026-09-14 12:40:33 +03:00
Lauri Ojansivu 8d3e71f0b3 Record Esperanto webhook and date validation progress
Update dated local review and exact counts in short audit, evidence and upcoming changelog, preserving remaining validation requirements.

Thanks to xet7 !
2026-09-14 12:37:27 +03:00
Lauri Ojansivu e4e614f298 Validate restored Esperanto webhook and date labels
Retain 40 directly reviewed correct values. Preserve webhook direction, field sum meaning, private-only policy, date endpoint distinctions and irreversible notification deletion warning. Existing uncertain terms remain open.

Thanks to xet7 !
2026-09-14 12:37:11 +03:00
Lauri Ojansivu 5a30f3f957 Record Esperanto Unwatch repair and mail review progress
Update dated local hash and exact reconstructed counts in short audit and upcoming changelog; remaining language/browser validation stays open.

Thanks to xet7 !
2026-09-14 12:36:43 +03:00
Lauri Ojansivu 5ef0759877 Repair Esperanto unwatch wording and validate upload and mail labels
Express stopping observation/subscription rather than looking. Retain 37 correct restored shortcut, upload, invitation and SMTP values; keep overtime terminology unresolved. Verify placeholders and both translation ledgers.

Thanks to xet7 !
2026-09-14 12:36:24 +03:00
Lauri Ojansivu 5e2ba642b9 Record Esperanto mapping and selection validation progress
Update dated local review and exact reconstructed counts in short audit, evidence and upcoming changelog. Keep unresolved terminology and browser validation open.

Thanks to xet7 !
2026-09-14 12:35:41 +03:00
Lauri Ojansivu ba7f76e53e Validate restored Esperanto member mapping and selection labels
Retain 40 directly reviewed correct values. Preserve administrator minimum, assigned-only scope, invitation state, image constraints, login links and placeholders. Correct emoji autocomplete wording is distinct from unresolved checklist completion terms.

Thanks to xet7 !
2026-09-14 12:35:23 +03:00
Lauri Ojansivu 65aa56ae29 Record Esperanto sorting and filter validation progress
Record dated local review, exact counts and remaining long-form syntax/language verification in short audit and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:34:55 +03:00
Lauri Ojansivu 5ab78031d9 Validate restored Esperanto sorting and filter labels
Retain 34 directly reviewed correct values, preserving date ranges, absent-field states, manual order, import format meanings and export restrictions. Keep long advanced-filter syntax and earlier uncertain terminology open.

Thanks to xet7 !
2026-09-14 12:34:38 +03:00
Lauri Ojansivu 28a865dcbf Record Esperanto date-format repair and export review progress
Update dated local repair hash, exact reconstructed counts and remaining validation scope in short audit, evidence and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:34:10 +03:00
Lauri Ojansivu 1b2232534d Restore Esperanto date-format notation and validate export guidance
Replace foreign JJJJ/TT abbreviations with canonical YYYY/DD notation in three format labels. Retain 37 correct restored field, email and export values. Verify correction records, placeholders, key order and unchanged acceptances.

Thanks to xet7 !
2026-09-14 12:33:50 +03:00
Lauri Ojansivu 5e779f5303 Record Esperanto role and field validation progress
Keep dated short audit and changelog current with actual local review, reconstructed counts and remaining language/browser validation.

Thanks to xet7 !
2026-09-14 12:33:08 +03:00
Lauri Ojansivu 5ba04c1021 Validate restored Esperanto roles and custom-field labels
Retain 49 directly reviewed correct values. Preserve assigned-card scope, comment/read restrictions, field types and none/unknown states. Keep the lime color term and earlier uncertain findings open.

Thanks to xet7 !
2026-09-14 12:32:50 +03:00
Lauri Ojansivu 232c97fac1 Record Esperanto calendar and voting validation progress
Keep dated local review, exact reconstructed counts and open validation scope current in the short audit and upcoming changelog.

Thanks to xet7 !
2026-09-14 12:32:24 +03:00
Lauri Ojansivu 8be47d3b3d Validate restored Esperanto calendar and voting controls
Retain 50 directly reviewed correct zoom, board-view, archive, voting and avatar labels. Preserve numeric bounds, date directions, visibility meaning, literal product names and question-mark notation.

Thanks to xet7 !
2026-09-14 12:32:07 +03:00
Lauri Ojansivu 6f85909d0d Record Esperanto watch title repair and subtask validation
Update dated short audit, actual local source hash and exact progress. Correct the complex-versus-complete dictionary attribution and keep completion terminology unresolved.

Thanks to xet7 !
2026-09-14 12:31:40 +03:00
Lauri Ojansivu 9ee9d2357d Repair Esperanto watch settings title and validate subtask wording
Use observation terminology for watch settings. Retain 33 correct restored values, including transparent subtask compounds after checking ReVo task vocabulary, and attachment/template/mode controls. Completion wording remains under review.

Thanks to xet7 !
2026-09-14 12:31:18 +03:00
Lauri Ojansivu 34701c8c8a Record Esperanto workspace review and recovered dictionary evidence
Update dated local review progress and exact counts. Record directly fetched ReVo task source without claiming full completion terminology validation.

Thanks to xet7 !
2026-09-14 12:30:27 +03:00
Lauri Ojansivu 6f096bfeb6 Validate restored Esperanto workspace and activity wording
Retain 47 directly reviewed correct values, preserving date distinctions, source/destination order, workspace hierarchy, administrator powers and loading data-loss warnings. Completion terminology remains open.

Thanks to xet7 !
2026-09-14 12:30:01 +03:00
Lauri Ojansivu 195eda9d97 Record Esperanto lockout and storage validation progress
Update dated short audit, evidence and upcoming changelog with actual local review and reconstructed counts. Remaining language and browser validation stays open.

Thanks to xet7 !
2026-09-14 12:29:20 +03:00
Lauri Ojansivu e88feb32ae Validate restored Esperanto lockout and storage translations
Retain 48 directly reviewed correct values. Preserve upload units, ZIP layout instructions, lockout identities, activation polarity, job failure/success distinctions, S3 endpoint examples and placeholders. Uncertain terminology remains open.

Thanks to xet7 !
2026-09-14 12:29:03 +03:00
Lauri Ojansivu 35fd800f54 Record Esperanto template repair and advanced-search review progress
Keep dated short audit and changelog current with actual local commit and verified counts. Record failed completion reference retrieval as unresolved, preserving the broader review scope.

Thanks to xet7 !
2026-09-14 12:28:34 +03:00
Lauri Ojansivu b92bbca3e9 Repair Esperanto template Enter instruction and validate search guidance
Name the Enter key explicitly in string-template item guidance. Retain 52 correct restored search, report, organization and storage values, preserving logical operators, commands and placeholders. Completion and subtask terminology remain under review.

Thanks to xet7 !
2026-09-14 12:28:14 +03:00
Lauri Ojansivu 8b136b4d33 Record Esperanto rule and search validation progress
Keep short audit current with dated local review, reconstructed counts and remaining validation scope.

Thanks to xet7 !
2026-09-14 12:27:21 +03:00
Lauri Ojansivu e2ef875c85 Validate restored Esperanto rule and search instructions
Retain 53 directly reviewed correct rule, card-view and search values. Preserve action polarity, wildcard and comma-separation instructions, operator syntax, HTML tags and placeholders. Uncertain terminology remains in the restored queue.

Thanks to xet7 !
2026-09-14 12:27:04 +03:00
Lauri Ojansivu 1835b5b184 Summarize current translation review and retain detailed evidence
Record the dated Esperanto settings review and exact progress. Shorten Audit.md while preserving accumulated notes in Audit-Evidence.md and keeping all pending, provenance and browser validation requirements open. Verify audit and changelog checks.

Thanks to xet7 !
2026-09-14 12:26:37 +03:00
Lauri Ojansivu b999becb4c Validate restored Esperanto settings and rule actions
Retain 58 directly reviewed correct values. Preserve memory distinctions, custom-field scope, parent relationships, activity placeholders and rule movement directions. Completion, subtask, member-pronoun and overtime terminology remain open.

Thanks to xet7 !
2026-09-14 12:25:30 +03:00
Lauri Ojansivu d35969905d Record Esperanto notification and search translation progress
Update dated audit and upcoming changelog with local source commit, verified counts and remaining validation limits.

Thanks to xet7 !
2026-09-14 12:25:03 +03:00
Lauri Ojansivu ab4da5ab27 Repair Esperanto watch notifications and search-key wording
Preserve observation/subscription semantics and explicitly identify Enter. Retain 61 correct restored role, shortcut, warning and configuration values. Verify placeholders, correction ledger and unchanged values; uncertain member pronoun and overtime labels stay open.

Thanks to xet7 !
2026-09-14 12:24:44 +03:00
Lauri Ojansivu 8c22f98b17 Record Esperanto Enter-key repair and transfer review progress
Record dated local repair commit, exact reconstructed progress and unverified remaining language/browser work.

Thanks to xet7 !
2026-09-14 12:24:04 +03:00
Lauri Ojansivu 620007ebc0 Repair Esperanto Enter-key instruction and validate transfer wording
Name the Enter key explicitly instead of using the direction inwards. Retain 64 correct restored import, export, invitation and deletion values; preserve vendor menu labels, JSON property names and placeholders. Verify correction and unchanged-value ledgers.

Thanks to xet7 !
2026-09-14 12:23:43 +03:00
Lauri Ojansivu 8fa772ae15 Record Esperanto watch repair and board-control validation
Update dated local audit, evidence and upcoming changelog with repair commit and reconstructed progress. Wider translation validation remains open.

Thanks to xet7 !
2026-09-14 12:23:07 +03:00
Lauri Ojansivu 1c4a07cde5 Repair Esperanto automatic-watch wording and validate board controls
Use ongoing observation rather than merely looking at boards. Retain 59 correct restored board/card controls and warnings after direct review. Verify correction ledger, placeholders and unchanged values.

Thanks to xet7 !
2026-09-14 12:22:49 +03:00
Lauri Ojansivu 55dce7200e Document LDAP bind diagnostic repair and remaining investigation
Record local repair and tested limits without claiming the directory authentication failure is resolved.

Thanks to Nissulya and xet7 !
2026-09-14 12:22:06 +03:00
Lauri Ojansivu 5f5822f7d0 Preserve actionable redacted LDAP bind errors
LDAP errors were serialized as empty objects because their name and message are non-enumerable. Preserve diagnostic name, message, code and reason through the existing secret sanitizer. Verify certificate and credential diagnostics plus disabled logging.

Thanks to Nissulya and xet7 !

Refs #6692
2026-09-14 12:21:37 +03:00
Lauri Ojansivu 2f0dbbf370 Record restored Esperanto translation review progress
Record dated local commit and verified counts while issue 6692 is prioritized. Broader translation repairs remain open.

Thanks to xet7 !
2026-09-14 12:19:14 +03:00
Lauri Ojansivu 2092f78608 Validate restored Esperanto activities and card controls
Retain 60 directly reviewed correct values, preserving past-tense activity grammar, accusative objects, movement directions, keyboard toggle polarity and literal placeholders. Completion and subtask terminology remain awaiting closer review.

Thanks to xet7 !
2026-09-14 12:18:55 +03:00
Lauri Ojansivu f82b12f1f8 Record restored Danish storage and monitoring review progress
Update dated local audit evidence and upcoming changelog with reconstructed counts, review commits and four remaining context-dependent Danish labels.

Thanks to xet7 !
2026-09-14 12:18:18 +03:00
Lauri Ojansivu ed9be5431c Validate restored Danish monitoring and account wording
Review remaining restored Danish resource, interval, repository and account labels directly. Preserve correct wording, thresholds, units and identifier constraints; leave four context-dependent labels open.

Thanks to xet7 !
2026-09-14 12:17:54 +03:00
Lauri Ojansivu 9442439179 Validate restored Danish storage and migration translations
Retain 68 correct values after direct review. Preserve technical endpoint examples, region identifiers and migration outcome distinctions. Obsolete migration labels remain in translation scope without claiming the corresponding feature is active.

Thanks to xet7 !
2026-09-14 12:17:35 +03:00
Lauri Ojansivu 761dcbc386 Record Danish control translation validation progress
Update dated audit and upcoming changelog with local review commit, reconstructed counts and remaining uncertainty.

Thanks to xet7 !
2026-09-14 12:17:10 +03:00
Lauri Ojansivu 3eeef49053 Validate restored Danish controls and administrator labels
Retain 63 correct translations after direct review, including shared Danish and English Start, Stop and Support vocabulary. Preserve byte units, ISO week numbering and scheduled-job outcome distinctions. Keep ambiguous free and Complete labels awaiting context validation.

Thanks to xet7 !
2026-09-14 12:16:51 +03:00
Lauri Ojansivu d8212bc9df Record dated Danish translation review progress
Update the short audit, evidence and upcoming changelog with actual local repair commit and reconstructed counts. Translation repairs and broader validation remain open.

Thanks to xet7 !
2026-09-14 12:16:20 +03:00
Lauri Ojansivu cceae079c1 Repair Danish legal notice and malloc diagnostic wording
Review restored Danish values directly, retaining 41 correct translations. Correct singular adjective agreement and preserve the malloc allocation method in the heap diagnostic. Verify correction records and unchanged acceptances.

Thanks to xet7 !
2026-09-14 12:15:35 +03:00
Lauri Ojansivu 8ca8a30ab2 Document consistent organization mirror log paths
Thanks to xet7 !
2026-09-14 12:14:16 +03:00
Lauri Ojansivu a744eb907f Standardize organization mirror log datetime directories
Use the shared log-directory reservation for organization reports and update remaining path examples. Verify report paths with offline organization fixtures.

Thanks to xet7 !
2026-09-14 12:14:08 +03:00
Lauri Ojansivu e0d529d919 Document SubtaskDepositBleed repairs and remaining validation 2026-09-14 12:09:55 +03:00
Lauri Ojansivu c50d7b4ea7 Authorize subtask deposit reads and destination writes
Remove unvalidated deposit and null board IDs from source-card scope. Publish deposit content beneath its own reactive visibility-filtered board cursor, applying destination assignment restrictions and reactive card children. Filter status counts by visible assigned scopes.

Require destination write access before pointer changes and subtask landing structures, and deny client pointer rename bypasses. Summarize blocked writes in Problems. Positive decisions, scope/dispatcher inventory and existing subtask/status suites pass; browser regression syntax-check passes with live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:09:35 +03:00
Lauri Ojansivu cb8fb48514 Document LinkedWriteBleed remediation and verification 2026-09-14 12:05:31 +03:00
Lauri Ojansivu 26e9e70304 Prevent linked cards from promoting non-writing source roles
Require source write access for authoritative and DDP link creation, including pointer changes. Treat explicit non-writing source roles as a ceiling on delegated writes, covering legacy self-created links. Match UI permissions and remove the link action from the non-writer menu. Record denied writes in bounded Problems summaries.

Actual shared permission decisions for every role, creation/deny inventory and existing link and role suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:05:14 +03:00
Lauri Ojansivu 2d2671ead9 Document InvitationBoardBleed remediation and verification limits 2026-09-14 12:03:13 +03:00
Lauri Ojansivu af93621261 Authorize every board grant before sending registration invitations
Domain-approved inviters must hold an allowed inviter role on each requested board. Site admins retain access to real boards; missing boards fail closed. Validate the complete grant before creating or changing any invitation code or sending mail, and summarize rejected grants in Problems.

Role and grant inventory plus invitation email suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 12:02:59 +03:00
Lauri Ojansivu 41c05a8001 Record standardized build and release log directory format 2026-09-14 12:02:59 +03:00
Lauri Ojansivu 0d6be31986 Standardize build and release log directories on readable datetimes
Use operation/YYYY-MM-DD_HH-MM-SS for Unix and Windows build logs, mirror launcher and data reports, translation push reports, conformance and speed diagnostics. Preserve earlier same-second runs with reserved suffixes. Keep record timestamps in their existing data format.

Path and collision fixtures, build progress and parity, mirror launcher and Transifex suites pass. Shell syntax checks pass; Windows execution was not available. Update the internal release preflight inventory used by parity checks.

Thanks to xet7 !
2026-09-14 12:02:36 +03:00
Lauri Ojansivu 388f3be073 Record Transifex status retry repair in upcoming changelog 2026-09-14 11:57:56 +03:00
Lauri Ojansivu 7f24f80355 Retry transient Transifex upload status failures with progress
The saved 2026-09-14 run abandoned its accepted English upload after a status GET returned 502, preventing all 241 target uploads. Add bounded safe-read retries, throttling delays respecting Retry-After, and visible upload/job/retry progress. Do not resubmit uncertain failed writes.

Offline tests reproduce source-job recovery without duplicate submissions, throttle timing, permanent error behavior, retry bounds and Retry-After parsing. Existing upload, locale retry and pull suites pass; no remote uploads were run.

Thanks to xet7 !
2026-09-14 11:57:44 +03:00
Lauri Ojansivu 541a6d1fb3 Document invitation-profile repair and test-only scanning alert 2026-09-14 11:55:42 +03:00
Lauri Ojansivu 11d2fe037c Use the actual HTML sanitizer in activity viewer tests
Resolve code-scanning alert 540 by removing a regex sanitizer stub. Test malformed script end tags with the existing sanitize-html parser. The reported location is test-only, not an application sanitizer.

Thanks to GitHub CodeQL and xet7 !
2026-09-14 11:55:21 +03:00
Lauri Ojansivu 055cf42d49 Protect server-issued invitations from client profile updates
Reject invitation field writes, array mutations, parent replacement and rename destinations. Inspect actual modifier paths so top-level profile field reporting does not block ordinary preference updates. Record denied invitation changes through bounded Problems summaries.

Profile guard and existing invitation suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:55:21 +03:00
Lauri Ojansivu 77d4e97b10 Document RuleButtonBleed remediation and verification 2026-09-14 11:53:20 +03:00
Lauri Ojansivu 64123a603a Bind manual rule execution to a writable board and its card
Check write capability and authoritative card board before button dispatch and again in the shared action dispatcher. Board buttons without a card remain supported. Record denied contexts in bounded Problems summaries.

Role and boundary decisions plus dispatcher inventory and existing rule suites pass. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:53:05 +03:00
Lauri Ojansivu 0ef30cabec Document ManageBoardBleed remediation and verification 2026-09-14 11:51:59 +03:00
Lauri Ojansivu c33e9c3bf9 Require administrator privileges for REST board management
Align board title, card settings and all rule mutations with existing DDP administrator policy. Preserve site-admin access and record refused management attempts in bounded Problems summaries.

Actual guard and endpoint inventory tests pass along with card-settings and rule suites. Browser regression syntax-check passes; live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:51:24 +03:00
Lauri Ojansivu f42ae665a7 Document CommentBoundaryBleed remediation and verification limits 2026-09-14 11:50:06 +03:00
Lauri Ojansivu d7ac619d63 Bind comment inserts to the authorized card board
Reject foreign-card REST and DDP comment inserts and prevent DDP rebinding from bypassing the boundary. Keep card-authoritative legacy comment listing. Add bounded Problems summaries and attack, negative insert inventory and browser regression coverage.

Targeted Node suites pass; browser regression is syntax-checked with live execution pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:49:40 +03:00
Lauri Ojansivu 7c2d39fe4d Document MutationBleed remediation and remaining security review 2026-09-14 11:48:03 +03:00
Lauri Ojansivu 9b1fb5214f Require board write capability for list moves and sibling mutations
Enforce the canonical role policy for both sides of list, swimlane and checklist moves, scoped imports, attachment renames and history writes. Record denied attempts through bounded Problems summaries without allowing logging failures to bypass authorization.

Add role-matrix decisions, the reported moveList attack, sibling guard inventory and a browser regression. Targeted Node suites pass; live browser execution remains pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:47:29 +03:00
Lauri Ojansivu fc34861b04 Document VisibilityBleed remediation and remaining security reports
Add critical upcoming release entry and dated remediation progress. Record passing policy, negative insert inventory and catalog coverage; live browser execution and nine other reports remain pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:43:33 +03:00
Lauri Ojansivu 962debc12d Enforce private-only board visibility across server creation methods
Apply instance visibility policy to direct board creation and card-to-board conversion. Record blocked public overrides with bounded Problems summaries, preserving enforcement if logging fails. Positive policy and negative insert-inventory suites pass; browser regression is syntax-checked but live execution remains pending.

Thanks to Wenhao Wu, Southeast University and xet7 !
2026-09-14 11:43:10 +03:00
Lauri Ojansivu c715235451 Record Danish spinner repair and security-priority checkpoint
Update dated progress with 349 reviewed Danish values and 3,709 restored values still awaiting validation. Keep translation repairs open while prioritizing the requested wekansec21 security findings.

Thanks to xet7 !
2026-09-14 11:40:25 +03:00
Lauri Ojansivu 04df440db8 Restore Danish outward-spinner qualifier and validate controls
Review thirty restored values on 2026-09-14. Restore outward scaling confirmed by spinner CSS and retain twenty-nine correct labels unchanged, preserving sort directions, creator roles, placeholder syntax and ticket states.

Thanks to xet7 !
2026-09-14 11:37:57 +03:00
Lauri Ojansivu a1c51b6997 Record Danish Boolean search translation review progress
Update dated audit and changelog with 319 reviewed Danish values, 496 retained findings and 3,739 restored values awaiting validation. Preserve full remaining repair scope.

Thanks to xet7 !
2026-09-14 11:37:03 +03:00
Lauri Ojansivu c6d3b9e0e4 Validate Danish restored Boolean search instructions
Review thirty complete values on 2026-09-14. Preserve OR versus AND operators, executable examples, title/comment/label matching, pagination and date predicates. Retain correct Danish unchanged; ambiguous export wording remains open.

Thanks to xet7 !
2026-09-14 11:36:43 +03:00
Lauri Ojansivu b649cb7e2a Record Danish search label validation progress
Update dated audit and changelog with 289 reviewed Danish values, 466 retained findings and 3,769 restored values awaiting validation. Preserve pending repairs and ambiguous wording review.

Thanks to xet7 !
2026-09-14 11:36:08 +03:00
Lauri Ojansivu 6531c37d2c Validate Danish restored search labels and result counts
Review thirty complete values on 2026-09-14. Preserve zero/one/multiple result counts, not-found subjects, creator/assignee and created/modified distinctions, time periods and predicates. Ambiguous export wording remains unreviewed.

Thanks to xet7 !
2026-09-14 11:35:46 +03:00
Lauri Ojansivu 10b29f907d Record Danish display validation and ambiguous export wording
Update dated summaries with 259 reviewed Danish values, 436 retained original findings and 3,799 restored values awaiting validation. Keep ambiguous free export label and all remaining review open.

Thanks to xet7 !
2026-09-14 11:35:16 +03:00
Lauri Ojansivu b8b7f8235e Validate Danish restored display and task controls
Review twenty-nine complete values on 2026-09-14. Preserve selected above/below directions, ALL unread actions, technical JSON identifiers and valid shared Danish words. Leave ambiguous export free wording awaiting source-context review.

Thanks to xet7 !
2026-09-14 11:34:56 +03:00
Lauri Ojansivu 7f223493fb Record Danish migration status and account wording review
Update dated audit and current summaries with 230 reviewed Danish values, 407 retained original findings and 3,828 restored values awaiting validation. Keep pending and uncertain review scope intact.

Thanks to xet7 !
2026-09-14 11:34:21 +03:00
Lauri Ojansivu 2250b6716f Validate Danish restored migration status and account warnings
Review thirty full values on 2026-09-14. Preserve background continuation and slower-completion warning, batch range, attachment counters, temporary lockout cause and later retry. Retain valid Danish orange unchanged.

Thanks to xet7 !
2026-09-14 11:33:59 +03:00
Lauri Ojansivu fc58887e3c Record Danish migration translation validation progress
Update dated audit and changelog totals to 200 reviewed Danish values, 377 retained original findings and 3,858 restored values awaiting validation. Preserve all pending repair scope.

Thanks to xet7 !
2026-09-14 11:33:30 +03:00
Lauri Ojansivu 12d02f4dc5 Validate restored Danish migration and S3 instructions
Review thirty full Danish source meanings on 2026-09-14. Preserve duplicate-list AND conditions, conversion order, non-archived recovery, all-archived restoration, difficult-undo warnings and storage scopes. Retain valid wording unchanged without claiming obsolete migrations are active.

Thanks to xet7 !
2026-09-14 11:33:09 +03:00
Lauri Ojansivu a2e12764d2 Record Danish scheduling and storage wording review progress
Synchronize dated audit and changelog with 170 reviewed Danish values, 347 retained original findings and 3,888 restored values awaiting validation. All pending and uncertain language work remains open.

Thanks to xet7 !
2026-09-14 11:32:37 +03:00
Lauri Ojansivu 5fcf0d284c Validate Danish restored scheduling and storage controls
Review thirty complete values on 2026-09-14. Retain correct current-state/inverse-action tooltips, scheduled-job errors, pause/resume distinctions, all-migration stop and storage/authentication descriptions. Remaining review is open.

Thanks to xet7 !
2026-09-14 11:32:17 +03:00
Lauri Ojansivu 0b4d99a3be Record Danish attachment and lockout translation validation
Update dated audit and changelog summaries with 140 reviewed Danish values, 317 retained original findings and 3,918 restored values awaiting validation. Keep pending and uncertain wording review open.

Thanks to xet7 !
2026-09-14 11:31:47 +03:00
Lauri Ojansivu 807ceeee25 Validate Danish restored attachment and lockout controls
Review thirty complete Danish values on 2026-09-14. Retain correct board attachment scopes, upload cancellation, support restrictions, lockout distinctions and unlock actions unchanged. Remaining translations still require review.

Thanks to xet7 !
2026-09-14 11:31:27 +03:00
Lauri Ojansivu f39aade54e Record Danish diagnostic repairs and restored-value review progress
Update dated summaries with two repaired diagnostics and twenty-eight retained values. Record 15,538 corrected findings, 287 retained and 3,948 restored values awaiting validation. Remaining review is open.

Thanks to xet7 !
2026-09-14 11:31:00 +03:00
Lauri Ojansivu e5d7da30e0 Repair Danish heap diagnostic meanings and validate restored controls
Review thirty restored Danish values on 2026-09-14. Correct peak malloc allocation and heap garbage bit-pattern overwriting using Node documentation. Retain twenty-eight correct values unchanged, including deletion constraints and attachment destinations.

Thanks to xet7 !
2026-09-14 11:30:33 +03:00
Lauri Ojansivu 67788fe644 Record Danish search wording validation progress
Update the dated audit and current summaries to eighty reviewed Danish values, 259 retained findings and 3,978 restored values awaiting review. Preserve pending repair scope and distinguish wording review from parser correctness.

Thanks to xet7 !
2026-09-14 11:29:46 +03:00
Lauri Ojansivu eb1f433e25 Validate Danish restored search instructions and errors
Review thirty complete values on 2026-09-14. Preserve correct Danish source correspondence, operator examples, inclusive ages, missing-value and descending-sort syntax, permission-related scopes and exact troubleshooting commands. Independent source/parser behavior remains outside this wording review.

Thanks to xet7 !
2026-09-14 11:29:24 +03:00
Lauri Ojansivu f6114528ce Update audit after second Danish restored-value review
Record dated validation of fifty Danish values in total. Synchronize summaries to 229 retained findings and 4,008 restored values awaiting validation. Remaining repairs remain open.

Thanks to xet7 !
2026-09-14 11:28:57 +03:00
Lauri Ojansivu 9abcbc4245 Validate thirty more restored Danish translations
Review complete Danish instructions and errors on 2026-09-14. Preserve correct no-undo warnings, due-card permission scope, activity locations, search errors and placeholders unchanged. Remaining restored values still need review.

Thanks to xet7 !
2026-09-14 11:28:36 +03:00
Lauri Ojansivu b28f2811d4 Record Danish restored-value validation progress
Update dated summaries after twenty correct Danish translations were retained. Record 199 reviewed original findings and 4,038 restored values awaiting validation; all remaining repairs and uncertain wording remain open.

Thanks to xet7 !
2026-09-14 11:28:09 +03:00
Lauri Ojansivu 1598868213 Validate and retain twenty restored Danish translations
Review complete Danish meanings on 2026-09-14. Preserve correct wording, identifiers, count spacing and left/right directions. Record reviewed values without changing translations or claiming the remaining restored queue complete.

Thanks to xet7 !
2026-09-14 11:27:52 +03:00
Lauri Ojansivu ba6fa5c4d3 Verify placeholder integrity across restored translation findings
Review all 4,058 restored values on 2026-09-14 and add token-inventory regression coverage. No mismatches found. Keep every restored value awaiting language validation; structural validity does not establish fluency.

Thanks to xet7 !
2026-09-14 11:27:03 +03:00
Lauri Ojansivu c63a7fcdff Record Tamazight spent-time and sorting repair progress
Update the dated audit and current changelog summaries with 18,131 correction records. All 308 pending original findings and wider fluent review remain open.

Thanks to xet7 !
2026-09-14 11:25:48 +03:00
Lauri Ojansivu edfed81761 Repair Tamazight spent-time and sorting controls
Replace three additional Arabic/French labels on 2026-09-14, preserving noun-only versus Change actions. Reuse existing spent-time wording and native sorting terminology. Full participle and agreement remain low confidence pending fluent review.

Thanks to xet7 !
2026-09-14 11:25:26 +03:00
Lauri Ojansivu 3e3eb91efb Update translation repair progress after due-date title correction
Record the dated source commit and 18,128 verified correction records. Keep all 308 pending original findings, restored values and uncertain date terminology under review.

Thanks to xet7 !
2026-09-14 11:24:42 +03:00
Lauri Ojansivu db8421e9b4 Repair Tamazight due-date popup title
Replace the additional Arabic Change Due Date title on 2026-09-14. Reuse existing Due Date terminology and the native Change imperative used by neighboring date popups. Wider fluent terminology review remains open.

Thanks to xet7 !
2026-09-14 11:24:19 +03:00
Lauri Ojansivu 74fd190c3d Synchronize current translation repair summaries with verified progress
Correct stale TODO Later and upcoming aggregate totals on 2026-09-14. Record 15,536 corrected original findings, 308 pending, and 18,127 correction records. Preserve historical batch snapshots and all unresolved fluency work.

Thanks to xet7 !
2026-09-14 11:23:29 +03:00
Lauri Ojansivu fb01497bc1 Document Tamazight parent-label repairs and remaining review
Update dated audit progress to 18,127 correction records and 308 pending original findings. Record native terminology sources and the verified display-only semantics; full grammar remains open.

Thanks to xet7 !
2026-09-14 11:22:18 +03:00
Lauri Ojansivu 9b11c99d98 Repair Tamazight parent card and hidden-parent labels
Replace French labels on 2026-09-14. Preserve the display-only meaning of no-parent, using native Hide rather than deleting the relationship. Parent compound and bound-state adaptation remain low confidence pending fluent review.

Thanks to xet7 !
2026-09-14 11:21:57 +03:00
Lauri Ojansivu cfcb759877 Verify and document Tamazight visibility notice repairs
Update the dated audit with 18,125 correction records and 309 pending original findings. Verify source HTML emphasis, removal of Arabic and future-state wording. Keep grammar review explicitly open.

Thanks to xet7 !
2026-09-14 11:21:16 +03:00
Lauri Ojansivu 084d44fab6 Repair Tamazight public and private board notices
Replace Arabic visibility messages on 2026-09-14, preserving future state and HTML emphasis. Feminine agreement and full future construction remain low confidence pending fluent review. All correction records pass structural verification.

Thanks to xet7 !
2026-09-14 11:20:32 +03:00
Lauri Ojansivu 1006a322a6 Update translation audit after Tamazight authorization repair
Record the 2026-09-14 repair commit, 18,123 verified corrections and 310 pending original findings. Keep restored values and low-confidence grammar explicitly open.

Thanks to xet7 !
2026-09-14 11:19:54 +03:00
Lauri Ojansivu 739495cf8b Repair Tamazight page-view authorization error
Replace the Arabic error with native-source-derived permission denial on 2026-09-14. Preserve the restriction to viewing this page. Combined grammar remains low confidence pending fluent review. Verify all 18,123 correction records and placeholder inventories.

Thanks to xet7 !
2026-09-14 11:19:30 +03:00
Lauri Ojansivu bbeb79124d Record additional mixed-language Veps controls for repair
Review local accessibility and parent-card values on 2026-09-14. Record ten additional keys, including a Venda inheritance instruction in the Veps locale, without claiming a fluent replacement or reducing pending counts.

Thanks to xet7 !
2026-09-14 11:18:16 +03:00
Lauri Ojansivu c67a747514 Record complete Veps escape-marker syntax verification in translation audit
Update the audit and upcoming changelog with the standalone escape-marker follow-up. Full Veps prose review remains pending; translation completion counts are unchanged.

Thanks to xet7 !
2026-09-14 11:17:21 +03:00
Lauri Ojansivu cd563cce58 Repair Veps filter standalone escape marker and broaden syntax coverage
On 2026-09-14 compare all escape runs against English, preserving the open full language review. Record dictionary access and authority limits.

Thanks to xet7 !
2026-09-14 11:14:12 +03:00
Lauri Ojansivu f0351b3901 Document changelog link repair in upcoming release notes
Record 14d6a8cd1 and passing shell and changelog checks.

Thanks to xet7 !
2026-09-14 11:12:59 +03:00
Lauri Ojansivu 14d6a8cd14 Repair stale translation changelog links and truthful preflight reporting
Repoint four missing hashes to local commits with matching subjects. Report unresolved links without a contradictory success message, propagate checker failures and treat an unchanged changelog as a successful check.

Thanks to xet7 !
2026-09-14 11:12:47 +03:00
Lauri Ojansivu 368e8ab1b4 Document mirror HTTP attachment crash repair in upcoming changelog
Record 6dd41dd41 and targeted positive and negative regression coverage.

Thanks to xet7 !
2026-09-14 11:11:58 +03:00
Lauri Ojansivu 6dd41dd414 Handle unsupported attachment HTTP statuses without crashing mirror archives
Reject invalid statuses and malformed headers inside the HTTP response callback, close rejected streams and drain bodyless responses. Regression tests cover unsupported statuses, malformed headers and successful downloads.

Thanks to xet7 !
2026-09-14 11:11:45 +03:00
Lauri Ojansivu ad3b67dfa9 Record partial Veps filter syntax repair in audit and upcoming changelog
On 2026-09-14 document d0c247094, passing example checks and the still-open full language review without changing completed-language counts.

Thanks to xet7 !
2026-09-14 11:10:50 +03:00
Lauri Ojansivu d0c2470946 Repair executable examples in Veps filter help without closing language review
On 2026-09-14 restore exact source comparison, escaping and Boolean examples. Positive and negative regression checks preserve the open Veps language queue; Finnish prose remains awaiting repair.

Thanks to xet7 !
2026-09-14 11:10:12 +03:00
Lauri Ojansivu afc5d988be Correct Veps example review against exact decoded JSON
Record single equality sign and doubled escape rather than an absent escape. Directly asserted current JSON on 2026-09-14.

Thanks to xet7 !
2026-09-14 11:09:31 +03:00
Lauri Ojansivu 61cab2cc1f CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 11:09:21 +03:00
Lauri Ojansivu b3fb0e0b7c Identify Veps filter example escape loss and native field terminology
On 2026-09-14 directly inspect locale JSON and native field keys; keep full language review open rather than treating syntax repair as translation completion.

Thanks to xet7 !
2026-09-14 11:09:11 +03:00
Lauri Ojansivu 742f71766b Document Veps translation review requirements and verified control terms
On 2026-09-14 isolate review of Finnish-seeded labels, distinguish native source evidence from full phrase validation and preserve all filter syntax requirements.

Thanks to xet7 !
2026-09-14 11:08:41 +03:00
Lauri Ojansivu b3d4fdbd5d Record native Veps control terminology for remaining translation review
On 2026-09-14 confirm legacy locale identity and native software components while preserving full shortcut and operator-help review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 2d0160eeff Verify rendered allocation and context spellings for translation audit
On 2026-09-14 resolve emphatic-letter extraction substitutions while retaining complete diagnostic modifier review and source authority limits.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 35dded7943 Record inspected heap terminology and diagnostic translation distinctions
On 2026-09-14 verify rendered Heap candidate while preserving all pending diagnostic qualifiers and source authority limits.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu f8d71633a6 Record provisional CLDR calendar evidence in translation audit
On 2026-09-14 verify exact native calendar labels and distinguish provisional Islamic wording from missing native variant display names. Values and progress counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 7328bf00e8 Update dated translation audit for selection scope repairs
Record 6352fbd5e and upcoming changelog progress, preserving unresolved native-language review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu 902ff1859b Repair Tamazight board and list selection scopes
On 2026-09-14 preserve only one board versus all cards in this list, including missing All in the Arabic label. Full commands remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu f12f25ef8c Record additional selection translation repairs in dated audit
Update upcoming changelog for 3f72fb6e8, preserving unchanged original queue counts and unresolved native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu dc8d40ad05 Align Tamazight select all controls with native selection terminology
On 2026-09-14 preserve selecting all versus removing selection from all. Derived command and action noun remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:28 +03:00
Lauri Ojansivu a2c75b3a87 Clarify obsolete migration strings in translation audit scope
On 2026-09-14 inspect removed migration imports and surviving locale inventory. Preserve repair scope without implying an active feature; distinguish Integrity from Integration evidence.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 8dfda6f0eb Update dated translation audit for storage engine repair
Record afca796a0 and upcoming changelog progress while retaining unresolved native language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu f3fda75a54 Translate Tamazight MongoDB storage engine label
On 2026-09-14 use visually inspected engine and storage candidates, preserving MongoDB. Cross-variety compound and bound form remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu b2d5d527ce Update translation audit and upcoming changelog for zoom repairs
Record 35eb7e7ab and verified dated counts, retaining unresolved native language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 72a70be095 Translate Tamazight zoom controls with reviewed dictionary terms
On 2026-09-14 preserve zoom direction, level and exact 50-300% input range. Cross-variety terminology and full phrases remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 0f0fe17c8f Record visually inspected Tamazight zoom control candidates
On 2026-09-14 verify Level and Zoom In/Out letters from rendered dictionary pages, retaining cross-variety adaptation and full input command review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu a249a10b35 Record native notification terminology repairs in translation audit
Update dated progress and upcoming changelog for ca3ba7006; full warning review remains open.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 9bb6154eeb Use native Tamazight muted and notification labels
On 2026-09-14 reuse directly attested native software labels and align notification terminology. Full muted warning remains under review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu cf277e45db Update translation audit for permanent board deletion warning
Record f8a1255dd, dated evidence and verified progress while preserving outstanding language review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 2cb3dad4b4 Translate permanent Tamazight board deletion notice
On 2026-09-14 preserve irreversible deletion and future loss of all lists, cards and actions associated with this board. Full warning and derived agreement remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu db3e1410b2 Record additional import translation repairs and unchanged queue counts
Update dated audit and upcoming changelog for a56e507e9, retaining unresolved language validation.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 883527750f Repair wrong-language Tamazight import labels
On 2026-09-14 replace Kter and Arabic board import labels with native import terminology. Action noun and full command remain low confidence pending native review; these are additional repairs outside the original queue.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 809214006e Correct visually verified dictionary source markers in translation audit
On 2026-09-14 inspected rendered bibliography and authentication/method entries. Correct 105 explanations from extracted MC£ to printed MCΓ, retaining unresolved Moroccan suitability and grammar review. Translation values and progress counts are unchanged.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu f1d99bca43 Update translation audit and upcoming changelog for board analysis repair
Record visual dictionary evidence, unresolved native-language review and verified progress on 2026-09-14.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu c97b1d06b3 Translate Tamazight board structure analysis command
Use visually inspected dictionary letters for Analyze and Structure. Cross-variety terminology, Tifinagh adaptation and complete command remain low confidence pending native review.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 884f97fd47 Record board analysis translation candidates and font limits
2026-09-14: Directly inspect dictionary text for Analysis and Structure. Preserve cross-variety source markers and unresolved legacy-font spellings; leave the complete label pending.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 2b33aaf477 Record dated Tamazight authentication label repairs
2026-09-14: Update audit and Upcoming to 15,529 corrected and 315 pending original findings, with 18,104 correction records. Preserve cross-variety provenance and full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu b91b63c539 Repair Tamazight authentication method labels
2026-09-14: Replace four French labels, preserving method/type, default and display distinctions. Inspected Authentication candidate is cross-variety MC£; script rendering, bound form and full phrases remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 25df941137 Record dated board icon translation repair
2026-09-14: Update audit and Upcoming progress to 15,526 corrected and 318 pending findings, with 18,100 correction records. Preserve full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:27 +03:00
Lauri Ojansivu 3534bed868 Repair Tamazight board icon drag and open instructions
2026-09-14: Replace French help, retaining drag/drop reordering versus click-to-open behavior. Native Click/Change and existing dictionary terms support components; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 6eb79b5948 Record dated clipboard input method translation repair
2026-09-14: Update audit and Upcoming progress to 15,525 corrected and 319 pending findings, with 18,099 records. Preserve source authority limits and full-language review scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 5f73473161 Repair Tamazight clipboard or drag drop label
2026-09-14: Preserve two alternative input methods and the combined drag/drop action. Dictionary Drag and indexed Place support components; full software adaptation and clipboard borrowing remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 1d24a2f163 Record dated Tamazight clipboard action repairs
2026-09-14: Update audit and Upcoming progress to 15,524 corrected and 320 pending findings, with 18,098 records. Preserve Kabyle provenance and open full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 199da35810 Repair Tamazight text and card link clipboard actions
2026-09-14: Replace French and Arabic copy labels, preserving copied object and clipboard destination. Inspected Clipboard candidate is a Kabyle metaphor; borrowing and full command phrases remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 5ec3639818 Record search case translation semantics and evidence limits
2026-09-14: Preserve uppercase/lowercase matching semantics; French typography excerpts and Tifinagh alphabet casing do not establish native software terminology. Leave the full instruction pending.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu a37b573030 Record dated Tamazight Value morphology refinement
2026-09-14: Record indexed Value paradigm correction and unchanged progress counts. Preserve full instruction and wider language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 333250c882 Refine Tamazight value bound form in format help
2026-09-14: Replace derived uzal with indexed IRCAM Value paradigm wazal. Preserve %{value}, substitution meaning and original French provenance. Direct PDF access failed; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 713f3bd0cf Record dated Tamazight separator instruction repair
2026-09-14: Update audit and Upcoming progress to 15,522 corrected and 322 pending findings, with 18,096 records. Preserve cross-variety evidence and open language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 2b9ecc10cc Repair Tamazight separator space instruction
2026-09-14: Replace French help, preserving both literal HTML space entities and OR. Inspected cross-variety Separator and Space Character candidates support components; full instruction remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu e26a896506 Record dated Tamazight format help translation repair
2026-09-14: Update audit and Upcoming progress to 15,521 corrected and 323 pending findings, with 18,095 correction records. Preserve indexed evidence and full-language validation limits.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu f87013a7a8 Repair Tamazight format placeholder instruction
2026-09-14: Replace French help with in-place-of-value paraphrase preserving %{value}. Native component usage and indexed Format support wording; bound forms and full software instruction remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 6147d00468 Record parent card translation semantics and terminology limits
2026-09-14: Establish display-only No Parent scope from board schema. Avoid deriving singular parent terminology from lexical amawlan or substituting visual position for the actual relationship. Keep full wording review open.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 28af148d3d Record dated workspace icon translation repair
2026-09-14: Update audit and Upcoming progress to 15,520 corrected and 324 pending findings, with 18,094 records. Retain exact cross-variety provenance and open validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu b80086e9f4 Repair Tamazight workspace icon label
2026-09-14: Replace French label and preserve markdown format name. Reuse existing icon and workspace terms; inspected CNAM icon candidate is a starred cross-variety proposal, not normative Moroccan usage. Full wording remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 963bf13ff8 Record dated workspace confirmation translation repair
2026-09-14: Update audit and Upcoming progress to 15,519 corrected and 325 pending findings, with 18,093 correction records. Preserve open language validation scope.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 00a9fd000a Repair Tamazight workspace deletion confirmation
2026-09-14: Replace French checkbox text, preserving confirmation action and workspace deletion scope. Native Verify and Deletion support components; full phrase and workspace adaptation remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:26 +03:00
Lauri Ojansivu 68b6885a69 Correct upload repair accounting to unflagged scope
2026-09-14: Authoritative audit progress shows the three upload statuses were outside the original flagged queue. Preserve 15,518 corrected and 326 pending original findings, with 18,092 correction records.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu c38d13cb74 Record dated Tamazight upload translation repairs
2026-09-14: Update audit and Upcoming progress to 15,521 corrected findings and 323 pending. Preserve full-language validation and provenance scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 87836f6b50 Repair Tamazight upload statuses and file plurals
2026-09-14: Replace three French upload statuses and refine two earlier file restriction labels with directly attested Files plural. Preserve progress versus failure and upload versus avatar scope. Full status and permission adaptations remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu fc3a655556 Record dated Tamazight file type translation repairs
2026-09-14: Update audit and Upcoming progress to 15,518 corrected findings and 326 pending. Preserve full-language validation limits and remaining restored/provenance review scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 1100ace91d Repair Tamazight permitted file type labels
2026-09-14: Replace two Arabic labels while distinguishing upload and avatar file restrictions. Preserve colons. Native Type, File, Permission and Upload support components; plural and full permission constructions remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu d772ca7ec8 Record dated Tamazight Hide All command refinement
2026-09-14: Record stronger command evidence and unchanged progress counts while preserving the open full-language validation scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu e79e80afd7 Refine Tamazight hide all checklist items command
2026-09-14: Use directly attested native Hide command, preserving ALL scope and original Arabic provenance. Checklist compound and full noun phrase still require language validation.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 850c60f516 Record dated Tamazight checked-item visibility repair
2026-09-14: Update audit and Upcoming progress to 15,516 corrected findings and 328 pending. Reference the tested local repair; preserve broader validation and low-confidence grammar scope.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 34fa863e55 Repair Tamazight hide checked checklist items label
2026-09-14: Replace Arabic wording, preserving checked-item scope rather than all checklist items. Native Hide and Check roots support components; derived passive plural and full grammar remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu aad5946b49 Record indexed Tamazight format terminology evidence
2026-09-14: Distinguish the indexed Format noun from unverified full placeholder wording. Preserve literal placeholder and HTML space syntax; leave both repairs pending.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu ca784bed85 Record dated field history scope refinement
2026-09-14: Record ee5f6301f with unchanged counts and remaining language validation.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 2192b0428d Clarify Tamazight field history deletion scope
2026-09-14: Repeat future deletion predicate for field history so it cannot attach to the from-all-cards phrase. Preserve original provenance and counts; full grammar remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4025c170b9 Record dated field deletion translation repair
2026-09-14: Record 1b8797450, 329 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 0108c21939 Repair Tamazight custom field deletion warning
2026-09-14: Preserve no undo, removal from all cards and destruction of field history. Record native components and low-confidence full warning coordination.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4e1085d903 Record dated failure window translation repair
2026-09-14: Record 7c0384e5a, 330 pending findings and indexed source access limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu beac93aaef Repair Tamazight failure counting window label
2026-09-14: Preserve failure time window in seconds, distinct from lockout duration/count threshold. Record native components and low-confidence time-window and error adaptations.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu a828bbe66d Record dated lockout threshold translation repair
2026-09-14: Record ee8fc5f24, 331 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 4cc989bd52 Repair Tamazight lockout failure threshold label
2026-09-14: Preserve failures before lockout as count threshold. Record indexed native Before and error-to-failure adaptation with remaining low confidence.

Thanks to xet7 !
2026-09-14 11:08:25 +03:00
Lauri Ojansivu 6622d8ca28 Record dated lockout duration translation repair
2026-09-14: Record 5be2812bd, 332 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu d8cdf1d12f Repair Tamazight lockout duration label
2026-09-14: Preserve lockout duration in seconds, distinct from failure window. Record native duration/block components and low-confidence bound noun and plural.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu f7d61b0320 Record dated field unsetting translation repair
2026-09-14: Record e5cb150bc, 333 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9659de1718 Repair Tamazight custom field unsetting activity
2026-09-14: Preserve removal of card field value rather than board field definition, with exact placeholders. Record native components and low-confidence technical Value adaptation.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu c3c6eca3a9 Record dated custom field activity translation repair
2026-09-14: Record c45999486, 334 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu fbf2ac1114 Repair Tamazight custom field assignment activity
2026-09-14: Preserve active field name to value assignment in card, exact placeholders and quotes. Record native component evidence and low-confidence technical Set adaptation.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu c6b5055ded Condense recent translation research summary
2026-09-14: Combine seven review paragraphs while retaining detailed source evidence, unresolved requirements and unchanged repair counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9335cea7fd Record dated import activity translation repair
2026-09-14: Record e2cdae25d, 335 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 120dff3100 Repair Tamazight import activity direction
2026-09-14: Preserve active import object, destination and source with exact percent placeholders. Record native import noun and low-confidence derived actor and location grammar.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b0525246b6 Record dated unchecked item translation repairs
2026-09-14: Record 28c88263f, 336 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b18cfb5d49 Repair Tamazight unchecked item activities
2026-09-14: Preserve active removal of checkmark and exact percent placeholders, distinct from state or item deletion. Record native components and low-confidence mark nominalization and relations.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e7acf89e9e Record dated checked item translation repairs
2026-09-14: Record dccca19d4, 338 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 32125b9797 Repair Tamazight checked item activities
2026-09-14: Preserve active checkbox checking, checklist/card relations and exact percent placeholders. Record native checkbox evidence and low-confidence actor and full grammar.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu b74b5a4f6d Record dated subtask destination translation repair
2026-09-14: Record 73b5d0eed, 340 pending findings and indexed evidence limits.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9453634410 Repair Tamazight subtask deposit destination label
2026-09-14: Preserve hierarchical subtasks and this-board destination. Record indexed native Place imperative and failed direct access; full software adaptation remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 9487c3d4c0 Record migration waiting terminology source limits
2026-09-14: Distinguish regional Wait/Hope polysemy and failed direct PDF inspection. Preserve full pending migration progress scope and unchanged counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 132d56dfa1 Record WIP comparative source context limits
2026-09-14: Distinguish Vietnamese and aged-man examples from native numeric Higher terminology. Preserve pending WIP guidance and unchanged counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu d0d6c63ada Record WIP translation scope from actual controls
2026-09-14: Verify Tasks counts list cards and preserve alternative move-out or higher-WIP remedies. Keep unresolved terminology pending without changing values or counts.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu 4172d4c2db Record search limit source help discrepancy
2026-09-14: Verify zero means no limit in actual parser despite positive-integer English help. Preserve locale source meaning and reject font choice as regional terminology proof.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e873f3d955 Record integer vocabulary retrieval evidence limits
2026-09-14: A failed PDF fetch cannot prove Integer or Positive entries absent. Preserve pending messages and direct subsequent research toward mathematical vocabulary.

Thanks to xet7 !
2026-09-14 11:08:24 +03:00
Lauri Ojansivu e81b5b416f Record Tamazight search integer terminology review
2026-09-14: Preserve positive integer and per-page scope while recording indexed Number evidence and cross-region source limits. Values and pending counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 4ecccdabcb Record dated imported board agreement refinement
2026-09-14: Record 7525d9271 and preserve unchanged counts and language confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 4f7d7b69cb Refine Tamazight imported board relative agreement
2026-09-14: Remove masculine actor prefix from the passive relative modifying feminine Board. Preserve original correction provenance and counts; derived agreement remains low confidence.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 5c77611d7f Record dated member mapping fallback repair
2026-09-14: Record 77a0023cc, 341 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2dba939233 Repair Tamazight unmapped member fallback note
2026-09-14: Preserve future assignment of unmapped members to current user. Record native components and low-confidence fallback composition.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu fe203ed673 Clarify Tamazight mapping source provenance
2026-09-14: Distinguish association relative from Continue homograph and retain low confidence for derived mapping imperative. Correct Copy evidence key. Values and original counts unchanged; correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 75059aa5d1 Record dated board member mapping translation repair
2026-09-14: Record a9c0a3a55, 342 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu d54c1674a1 Repair Tamazight imported board member mapping
2026-09-14: Preserve your imported board having some members and mapping selected members to your users. Record native components and low-confidence association and import grammar.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu daf67dea28 Record invitation source retrieval limits
2026-09-14: Independent normalized/indexed URL retrieval fails certificate-chain verification. Record that no PDF was inspected and preserve pending status; other repairs remain actionable.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2c0c0d531d Record Tamazight invitation evidence review
2026-09-14: Record indexed parallel IRCAM invitation and failed direct fetch. Preserve pending status because Welcome does not prove Invited and the exact native wording remains uninspected.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 1a6f74c431 Record dated card completion translation repair
2026-09-14: Record e091ab50d, passing checks and remaining confidence limits. Original findings counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 2b685ef724 Repair Tamazight card checklist completion activity
2026-09-14: Replace unflagged Kabyle-seeded wording, preserving active completion and all five location placeholders. Record native completion evidence and remaining low-confidence grammar.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu ebf63955c1 Record dated checklist reversal translation repairs
2026-09-14: Record bc0e7f13a, 343 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 6600574f5f Repair Tamazight checklist uncompletion activities
2026-09-14: Preserve active undoing of checklist completion and exact percent placeholders. Native edit reversal supports Undo, while derived actor, completion noun and full checklist wording remain low confidence.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu f39386456c Record dated imported member translation repair
2026-09-14: Record 4ee286985, 345 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu e5116be843 Repair Tamazight imported member user selection
2026-09-14: Preserve selection of your existing user to use as this member. Record native components and low-confidence existence and use-as composition.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 0ae4a1fcca Record dated list archive translation repair
2026-09-14: Record f827f29de, 346 pending findings and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:23 +03:00
Lauri Ojansivu 8e8782eaa8 Repair Tamazight list card archive instructions
2026-09-14: Preserve all cards of this list removed from the board and return from Archive via matching menu labels. Record native components and low-confidence full coordination; archiving remains distinct from permanent deletion.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu eb340b94ee Record dated board import translation repairs
2026-09-14: Record 6800bb1ec and 347 pending findings with native component evidence and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu df83b65435 Repair Tamazight board export import instructions
2026-09-14: Align Menu and Export Board controls with repaired import instructions. Preserve your board, ordered navigation and copying text from the downloaded file. Record native component sources and low-confidence derived morphology and sequence.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu fd0ea8c51e Correct stale translation progress description
2026-09-14: Match TODO Later text to linked leave-board repair 8a9719417, preserving counts and remaining confidence limits.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 61e5f47e9a Record dated leave-board translation repair
2026-09-14: Record 8a9719417 and 348 pending findings, preserving evidence limits and remaining language validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 2a486083be Repair Tamazight leave-board membership warning
2026-09-14: Replace wrong-language label and confirmation. Preserve board-title placeholder and future removal of the current user from all cards on this board. Record native components and low-confidence membership adaptation and grammar.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu a04a2dc63f Record dated board deletion translation repair
2026-09-14: Record 4a03ba96c and 349 pending findings with source limits and remaining validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu bf88de4003 Repair Tamazight permanent board deletion warning
2026-09-14: Preserve every deleted content category, future inability to recover board contents and unconditional no-undo warning. Record native components and low-confidence grammatical composition.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu bee5f38ef2 Record dated notification translation repair progress
2026-09-14: Record local repair 7caee4baa, 350 pending findings and passing correction checks. Preserve language confidence limits and remaining restored/unflagged validation.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu d256aea927 Repair Tamazight notification deletion confirmation
2026-09-14: Replace French confirmation and align the related notification label. Preserve all notifications and unconditional inability to undo. Native component evidence is recorded; composed confirmation and action agreement remain low confidence. Update the older notification regression to match reviewed terminology.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 1879ec8bf9 Record checklist checkbox translation repair progress
2026-09-14: Record fee3de6db, check/uncheck scopes and remaining language validation. Update audit to 15,493 corrected and 351 pending, including 216 Tamazight. All 18,060 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 31b741b52d Repair Tamazight checklist check and uncheck controls
2026-09-14: Replace three French values preserving Hide checked items, Check ALL items OF A LIST and active Uncheck ALL reversal. Native checkbox/hide/remove components support provisional wording; nominalization, passive and full grammar remain low confidence. All 18,060 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 67e76f8a83 Record migration control translation repair progress
2026-09-14: Record 371ccad6b, operation/scope distinctions and remaining language validation. All 18,057 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 8188521840 Repair Tamazight migration start and pause controls
2026-09-14: Repair six unflagged values preserving Start/Pause, ALL/singular scope and failed/completed statuses. Native components support provisional wording; migration and derived grammar remain low confidence. Stop remains distinct and awaits review. All 18,057 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 4ab1e95dd9 Record migration label translation repair progress
2026-09-14: Record df6e03f46, scheduling/resume distinctions and remaining language validation. All 18,051 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 7f4ce06024 Repair Tamazight migration scheduling and resume wording
2026-09-14: Repair four unflagged labels preserving Scheduled plural versus Automatic singular and Resume versus Complete. Native Red Moon/Dialect components support provisional wording; migration adaptation and derived grammar remain low confidence. All 18,051 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 62ae602ab4 Record worker role translation repair progress
2026-09-14: Record cda2d947b, restricted permission scope and remaining language validation. Update audit to 15,490 corrected and 354 pending, including 219 Tamazight. All 18,047 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 021a8fe977 Repair Tamazight worker role permission description
2026-09-14: Replace French preserving ONLY move cards, SELF-assignment and comment permissions. Native components support provisional wording; self-assignment paraphrase and whole grammar remain low confidence. All 18,047 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu f6e2a52f5a Record watcher explanation translation repair progress
2026-09-14: Record c002054d5, preserved notification scope and remaining language validation. Update audit to 15,489 corrected and 355 pending, including 220 Tamazight. All 18,046 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:22 +03:00
Lauri Ojansivu 8114b5a87b Repair Tamazight board watcher explanation
2026-09-14: Replace French while preserving future YOU notification for ANY change on THIS board. Native notification/each/sent-to-you components support provisional wording; feminine plural passive and full grammar remain low confidence. All 18,046 correction checks pass; fluent/browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 13cd12eb0c Record All predicate repair and reference access limits
2026-09-14: Record 5e5519f2f, exact native evidence and single-token tests. Keep pending date-boundary and uncertain mention wording open; additional IRCAM PDF could not be inspected. All 18,045 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 3ed703f5a0 Repair Tamazight All search predicate
2026-09-14: Replace Arabic with exact native MediaWiki All, preserving single-token query format. Add exact-value and negative whitespace/colon regression coverage. All 18,045 correction checks pass. Date-boundary wording remains pending.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 8ca9371260 Record swimlane search repair and date boundary review
2026-09-14: Record 9daf257e4, preserved syntax and pending date boundary wording. Update audit to 15,488 corrected and 356 pending, including 221 Tamazight. All 18,044 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 5164786769 Repair Tamazight swimlane title search instruction
2026-09-14: Replace French preserving exact query parameter, cards IN swimlanes and specified title matching. Native Matching/Title/Given components support provisional wording; Swimlane-as-Path, specified adaptation and full grammar remain low confidence. Days-ago-or-less findings remain pending.

All 18,044 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 71b8294156 Record search scope translation repair progress
2026-09-14: Record 3f2d9c726, preserved search scopes and remaining language validation. Update audit to 15,487 corrected and 357 pending, including 222 Tamazight. All 18,043 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu d9570ea4d1 Repair Tamazight search scopes and archive defaults
2026-09-14: Replace three French values preserving default archive exclusion, ALL archived AND unarchived cards, predicate token, and title/description/custom-field scope on THIS board. Native components support provisional wording; passive/plural/full grammar remain low confidence. All 18,043 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu b6667021e0 Record group search translation repair progress
2026-09-14: Record e0f16c497, metasyntax preservation and remaining language validation. Update audit to 15,484 corrected and 360 pending, including 225 Tamazight. All 18,040 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 30973c6c89 Repair Tamazight organization and team search prose
2026-09-14: Replace French prose while preserving exact query metasyntax and cards belonging to a board assigned TO organization/team. Native Given and local group terms support provisional wording; relative passive, assignment adaptation and whole grammar remain low confidence. All 18,040 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 4069c747be Record search role translation repair progress
2026-09-14: Record 129fa829e, syntax preservation and remaining language validation. Update audit to 15,482 corrected and 362 pending, including 227 Tamazight. All 18,038 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 48b3fd33d9 Repair Tamazight assignee and user search instructions
2026-09-14: Replace French while preserving operator tokens, colon, repeated username parameter and emphasis. Assignee-only versus member OR assignee scopes remain distinct. Reuse native Username and existing local role paraphrases; full grammar remains low confidence. All 18,038 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 714b807662 Record card mention translation repair progress
2026-09-14: Record 1493cc244, preserved placeholders and indexed evidence limits. Update audit to 15,480 corrected and 364 pending, including 229 Tamazight. All 18,036 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 2842bbc987 Repair Tamazight card mention activity translation
2026-09-14: Replace French while preserving mentioned YOU, card/comment/list/swimlane/board and all five exact placeholders. Indexed IRCAM mention entry supports a provisional verb; PDF redirects to HTML and full wording remains low confidence. Native Mastodon person-directed activity supports object component only.

All 18,036 correction checks pass; fluent and browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu a83431635d Record board role translation repair progress
2026-09-14: Record 381d18eb3, permission scopes and remaining low-confidence validation. Update audit to 15,479 corrected and 365 pending, including 230 Tamazight. All 18,035 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 0524017b8e Repair Tamazight board role permission descriptions
2026-09-14: Replace French administrator and Arabic normal-member descriptions and Activities label. Preserve card view/edit, member removal, board settings and activity view permissions, including normal-member inability to change settings. Native UI components support wording; full grammar and activity-log adaptation remain low confidence.

All 18,035 mechanical correction checks pass. Fluent and live browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu ec6108908b Record Home translation repair and restore instruction review
2026-09-14: Record f903af89d and direct native Home evidence. Preserve unresolved full archive restoration wording and complete audit scope. All 18,032 correction checks and three metadata suites pass; original counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 51f38c9a05 Repair Tamazight Home navigation label
2026-09-14: Replace Arabic with exact native Mastodon Home label, corroborated by MediaWiki Home-page wording. Full archive restoration instruction remains pending; standalone label evidence does not prove header/button wording. All 18,032 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:21 +03:00
Lauri Ojansivu 168ddd4060 Record checkbox instruction translation repair progress
2026-09-14: Record repair 7d1e0ef15, component evidence and low-confidence grammar. Update audit to 15,477 corrected and 367 pending, including 232 Tamazight. All 18,031 correction checks and three metadata suites pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu a7f5c5c871 Repair Tamazight board selection checkbox instruction
2026-09-14: Replace French while preserving checkbox click and board selection. Native MediaWiki supports checkbox and selection components; compound, plural and full instruction remain low confidence. All 18,031 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 8b50e3851a Record failed migration retry translation repair progress
2026-09-14: Document repair 7dcaf17cf, native component evidence and remaining low-confidence language validation. Update original audit counts to 15,476 corrected and 368 pending, including 233 Tamazight.

All 18,030 correction checks and three audit/changelog suites pass. Restored values, unflagged strings and earlier uncertain wording remain in scope. No remote uploads performed.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu db12dfa7a0 Repair Tamazight failed migration retry messages
2026-09-14: Replace three French values while preserving failed migration scope, Retry versus Resume, successful retry notification and no failed migrations to retry.

Native Mastodon and non-fuzzy Dialect support components. Migration adaptation, derived plural/passive grammar and full wording remain low confidence. All 18,030 mechanical correction checks pass; fluent and live browser validation remain open.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f7492a25da Record scheduled job deletion translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for bc7b01940 with verified inventory and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f745b5304f Repair Tamazight scheduled job deletion and pause messages
2026-09-14: Preserve Delete versus Pause, this scheduled job confirmation and success versus failure in five unflagged values. Job adaptation and derived grammar remain low confidence.

Validation: 18,027 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 2b6f88d4e8 Record scheduled job translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 7a49eb16b with verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 496b434235 Repair Tamazight scheduled job labels and status messages
2026-09-14: Preserve Add, active/plural job scope, Resume versus Start and success versus failure. Seven French values repaired; scheduled-job adaptations and derived grammar remain low confidence.

Validation: 18,022 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 8201419bad Record migration resume translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 34a98e0d1 with verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 93ffecca2c Repair Tamazight migration resume and error status text
2026-09-14: Preserve paused-migration scope, no paused items, successful resumption and all-errors-cleared meaning. Four French findings repaired; derived passives and migration terminology remain low confidence.

Validation: 18,015 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 46f5661cec Record settings translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 10b082127 with verified inventory and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu b8d1e0b6e3 Repair Tamazight settings navigation and save status
2026-09-14: Preserve Team settings, return/save actions and S3 success versus failure in five labels. Success uses completed Saved notification. Derived save noun, passive agreement and full phrases remain low confidence.

Validation: 18,011 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 888a57229d Record star selection translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for c82cef74f, verified correction count and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 9942022321 Repair Tamazight star selection and empty state controls
2026-09-14: Preserve selected boards, star/unstar, all starred items and not-yet-anything meaning in six unflagged values. Passive and negative grammar, star adaptation and swimlane term remain low confidence.

Validation: 18,006 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 5fc27a7f7e Record starred item translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for d6a73fae4, verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 7e229b64c4 Repair Tamazight starred board and page controls
2026-09-14: Preserve star/unstar, board/page distinctions, top-of-your-boards-list location and count placeholder in nine labels. Star vocabulary reuse and full grammar remain low confidence.

Validation: 18,000 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu bbb7f9ce1f Record due-time translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 9af74b9d0, verified counts and explicit native validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu f9534f3667 Repair Tamazight due-time activity text
2026-09-14: Preserve new due time, When/Where labels, previous due value, four-line layout and exact placeholders. Actor past, deadline compound and full grammar remain low confidence.

Validation: 17,991 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu fc57c752f0 Record board information translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 2557151f0, verified counts and remaining native validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:20 +03:00
Lauri Ojansivu 423eb10518 Repair Tamazight board duplicate and information labels
2026-09-14: Preserve duplicate-this confirmation, all-board settings scope and Board/List/Swimlane information tuple. Four wrong-language labels repaired; assembled phrases and swimlane adaptation remain low confidence.

Validation: 17,990 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 7859e80f9d Record template container translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for 6c1388962 with verified counts, source semantics and explicit confidence limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu a6e7d0e549 Repair Tamazight template container and copy controls
2026-09-14: Preserve container distinction and Copy Template to Many Cards versus Copy Checklist from Template. Six French/mixed values repaired. Container adaptation, checklist noun and full grammar remain low confidence.

Validation: 17,986 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 43b7226333 Record template translation terminology repairs
2026-09-14: Update upcoming changelog and audit evidence for 747e1d96e, distinguishing unflagged repairs from original counts and preserving validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 8efe266378 Repair Tamazight template labels and save action
2026-09-14: Use directly attested Template component for seven labels, including Save as Template previously using Subject. Preserve Add/Create and card/list/board scopes. Plurals and full phrases remain low confidence.

Validation: 17,980 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 7c4feba4d5 Record translation warning and count repair progress
2026-09-14: Update upcoming changelog and audit evidence for 1f30de7d6 with verified counts and native validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e612c7e7a3 Repair Tamazight translation deletion warning and count
2026-09-14: Preserve deletion confirmation, this/custom scope, no-undo warning and count punctuation. Two Arabic values repaired; derived text plural and full grammar remain low confidence.

Validation: 17,973 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu a5ea88123b Record custom translation control repair progress
2026-09-14: Update upcoming changelog and audit evidence for 67e2d101b, verified counts and remaining language validation. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 17363c5320 Repair Tamazight custom translation controls
2026-09-14: Replace five Arabic labels using non-fuzzy native Translation evidence. Preserve new/edit/delete-this actions, custom scope and question mark. String-to-text adaptation and modifier attachment remain low confidence.

Validation: 17,971 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu fad15cae03 Record archive title translation review progress
2026-09-14: Update upcoming changelog and audit evidence for 148e72446, including original versus unflagged repair counts and language validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 0f5c6a7da6 Repair Tamazight archive states and recovery titles
2026-09-14: Preserve archive states, restoration destinations and search placeholder. Repair seven labels; full clauses, passive recovery and provisional swimlane term remain low confidence.

Validation: 17,966 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 630ba02a1a Record archive guidance translation repair progress
2026-09-14: Update upcoming changelog and audit evidence for a2a88d405 with verified counts and explicit language validation limits. Three metadata tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu d354958820 Repair Tamazight archive visibility and recovery guidance
2026-09-14: Preserve post-archive locations, later restoration through Board Settings and activity retention. Seven wrong-language findings repaired; assembled clauses and swimlane terminology remain low confidence.

Validation: 17,959 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 270440bcec Record archive and restore translation scope repairs
2026-09-14: Update upcoming changelog, audit counts and evidence for a9e68b414. Changelog and audit regression tests pass; native validation remains incomplete.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 64905b0d62 Repair Tamazight archive and restore scope controls
2026-09-14: Preserve swimlane movement, all cards in this list and restore-all scope. Full phrases and swimlane terminology remain low confidence. Keep the existing generic Restore alternative.

Validation: 17,952 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e66ff03e19 Update upcoming changelog and translation audit progress
2026-09-14: Record archive alternative and native control repairs in 14c2b82da, verified counts and remaining language validation. Changelog and audit regression tests pass.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu 185787ca0e Repair Tamazight archive alternative and native controls
2026-09-14: Preserve the list archive alternative and activity retention; replace inherited Kabyle Save and Search controls with attested native labels. The assembled archive hint remains low confidence.

Validation: 17,948 correction checks pass, including placeholders, formatting and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:19 +03:00
Lauri Ojansivu e49c58fbb9 Record archive activity translation repair progress
2026-09-14: Record dce7f41cd, preserved placeholders and low-confidence clauses. Refresh audit and upcoming changelog; original counts unchanged. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 38cd067136 Repair Tamazight archive activity vocabulary
2026-09-14: Replace inherited Kabyle-leaning archive wording in four activities, preserving objects, nested locations, completed movement and exact placeholders. Latin script alone is not treated as an error. Passive forms, swimlane adaptation and whole clauses remain low confidence.

Validation: 17,945 correction checks pass, preserving translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 2c3786fdbc Record archive confirmation translation repair progress
2026-09-14: Record 66c5df4fe, preserved intent/placeholders and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu bac0f55782 Translate Tamazight archive confirmation and activity
2026-09-14: Replace three French/Arabic values. Preserve confirmation intent, this-board scope, question marks and exact %s placeholder. Native software supports the confirmation frame; derived verbs and full clauses remain low confidence.

Validation: 17,941 correction checks pass, including placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu da914e5a50 Record archive rule translation repair progress
2026-09-14: Record cbc2bf400, preserved action/state scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu e6d350b6d2 Translate Tamazight archive rule actions and states
2026-09-14: Replace seven Arabic/French labels. Preserve Move to versus Restore from Archive, card scope and completed states. Native MediaWiki attests action verbs; full clauses and passive states remain low confidence for native review.

Validation: 17,938 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 9b22e53ea9 Record archive state translation repair progress
2026-09-14: Record 38debcc33, preserved scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu a22c15f1c6 Translate Tamazight archive status and empty states
2026-09-14: Replace seven Arabic/French values. Preserve board/list/card negative scopes, singular this-board moved status, and warning that the list containing this card is archived. Derived forms and full clauses remain low confidence for native review.

Validation: 17,931 correction checks pass, preserving placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 264d77a04d Record direct archive noun provenance review
2026-09-14: Record fbe388603 and distinguish inspected native logo evidence from French body text. Counts unchanged; full labels remain low confidence. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu bee9ec4744 Corroborate Tamazight archive noun from institutional logo
2026-09-14: Inspect the native Archives du Maroc logo embedded on page 1 of a University Mohammed V press release. Add direct lexical provenance to nine archive records; French body text is not native evidence. Full kanban labels remain low confidence.

Validation: all 17,924 correction checks pass; no values or counts changed.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 6234d76bf1 Record archive translation repair progress
2026-09-14: Record 5dca9f38d, indexed evidence limits and low-confidence full phrases. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 90e738a83b Translate Tamazight archive controls
2026-09-14: Replace nine Arabic/French labels with Archive and Move-to-Archive wording, preserving all, board, card, list and selection scopes. Ministry indexed institutional archive terminology supports the noun; direct page access timed out. Full labels remain low confidence for native review.

Validation: 17,924 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 6b27f538db Record assignee recipient translation review
2026-09-14: Record 0488199cf, preserved original provenance and explicit recipient wording. Counts unchanged; grammar remains low confidence. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 0914e764be Clarify Tamazight assignee filter recipient wording
2026-09-14: Refine two earlier filter labels with an explicit To whom recipient and feminine card passive, matching the assignee labels. Preserve No assignee and original French provenance. Relative grammar and responsibility paraphrase remain low confidence for native validation.

Validation: all 17,915 correction checks pass; counts unchanged.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 08757e2a6e Record assignee scope translation repair progress
2026-09-14: Record 2e15e9f7b, preserved scopes and low-confidence grammar. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 012a78b69b Translate Tamazight assignee labels and card scopes
2026-09-14: Replace five French labels. Preserve singular/plural, No assignee and all-cards versus current-card board scope. Responsibility paraphrases, relative clauses and derived forms remain low confidence for native review.

Validation: 17,915 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu fe6a1421fc Record assigned role translation repair progress
2026-09-14: Record 13f8fbd14, preserved capability scopes and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu 3843b82af5 Translate Tamazight assigned card permission labels
2026-09-14: Replace six French role labels and descriptions. Preserve assigned-only visibility and distinct normal editing, read cannot edit and comment-only capabilities. Derived forms, assignment paraphrase and complete clauses remain low confidence for native validation.

Validation: 17,910 correction checks pass, including placeholders and translation preference.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu e62b1e0a3b Record filter translation repair progress
2026-09-14: Record 5da9a2084, preserved scopes and low-confidence wording. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:18 +03:00
Lauri Ojansivu a3fbbc9ba1 Translate Tamazight filter controls and status
2026-09-14: Replace seven Arabic/French labels. Preserve member versus assignee, negative scopes, other filters and active-filter edit instruction. Derived forms, responsibility paraphrase and full clauses remain low confidence for native validation.

Validation: 17,904 correction checks pass; placeholders and newer translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu a09730776a Record time tracking translation repair progress
2026-09-14: Record 9f60960f4, preserved scopes, native Hour evidence and low-confidence full phrases. Refresh audit and upcoming changelog. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 3c2b1bbfdf Translate Tamazight time tracking labels
2026-09-14: Replace five Arabic/French labels, preserving spent versus overtime, hours units and card-presence scope. Native CLDR supports Hour; derived forms and full time-tracking paraphrases remain low confidence for native review.

Validation: 17,897 correction checks pass; placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 7435d38694 Record account and starred label repair progress
2026-09-14: Record 47758fc61, three unflagged repairs, direct native action/noun evidence and low-confidence starred compounds. Original counts unchanged. Correction checks and all three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 11c943dcf7 Repair Tamazight account and starred item labels
2026-09-14: Replace two Arabic labels and repair the unflagged starred-list noun. Create Account is directly attested in native MediaWiki; Lists is directly attested in native Mastodon. Starred compounds remain low confidence for native validation.

Validation: 17,892 correction checks pass, preserving placeholders and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu e417ffc136 Record membership shortcut translation repair progress
2026-09-14: Record cffc0bd98, distinct scopes and low-confidence assignment adaptation. Refresh audit and upcoming changelog counts. Correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 845c624f0b Translate Tamazight membership and assignment shortcuts
2026-09-14: Replace four Arabic/French labels while preserving membership versus assignment, current-card scope and distinct filters. Assignment paraphrase, derived forms and full clauses remain low confidence for native review.

Validation: 17,889 correction checks pass; source placeholders and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 4658bdab29 Record sidebar translation repair progress
2026-09-14: Record abaa87ed9, action evidence and low-confidence noun paraphrases. Refresh audit counts and upcoming changelog. All correction checks and three summary checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 2eb31cb56d Translate Tamazight sidebar and dialog controls
2026-09-14: Replace six Arabic/French controls. Preserve open, close, and show/hide actions and distinct filter, search and board sidebar scopes. Native software supports action verbs; panel/dialog paraphrases and full grammar remain low confidence for review.

Validation: 17,885 correction checks pass, including tokens, JSON examples and newer translation preference.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu d193ce839c Record autocomplete translation repair progress
2026-09-14: Record e5625d884, native component evidence, provisional compounds and remaining validation scope. Update short audit and upcoming changelog. All correction checks and three summary tests pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 88af035864 Translate Tamazight autocomplete shortcut labels
2026-09-14: Replace two Arabic labels while preserving automatic completion and emoji/member targets. Derive provisional completion wording from native software components; full compounds and reused member terminology remain low confidence for native review.

Validation: 17,879 correction checks pass; placeholders, JSON examples and translation preference preserved.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 8f1aed0ef3 Record Tamazight shortcut translation repair progress
2026-09-14: Record source commit 786d29cfb, native software evidence, low-confidence grammar and remaining validation scope. Refresh audit counts and upcoming changelog. Correction checks and all three summary checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu aa47320106 Translate Tamazight shortcut list action
2026-09-14: Replace Arabic shortcut-list wording using native Dialect keyboard shortcut terminology. Preserve the show-this-list action. Full assembled wording remains low confidence pending language validation.

Validation: 17,877 correction checks pass, including placeholder and translation-preference checks.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu bd96ae179b Record attested Paste translation refinement
2026-09-14: Update audit and upcoming notes with stronger native lexical evidence for two import hints. Preserve full-phrase review scope and original provenance; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 075e8718de Use attested Tamazight Paste terminology in import hints
2026-09-14: Replace the earlier tentative Paste verb in two hints with a directly attested native Dialect control. Preserve original provenance and format identifiers. Full phrases remain low confidence; all 17,876 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 0078b9c67b Record structured-data import translation progress
2026-09-14: Update audit and upcoming notes with two Tamazight import hint repairs, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 73bbc6bafc Translate Tamazight structured-data import hints
2026-09-14: Replace two French hints while preserving Paste your valid data here and literal CSV/TSV or JSON. Paste terminology and full phrasing remain low confidence. All 17,876 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu facd5077dd Record stop translation repair progress
2026-09-14: Update audit and upcoming notes with two unflagged Tamazight stop repairs and remaining terminology review. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu b274ed118b Translate Tamazight stop command and migration progress
2026-09-14: Replace French Stop and Stopping text using native app evidence. Preserve command versus progress; derived full clause and lexical pause/stop overlap remain for fluent review. All 17,874 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:17 +03:00
Lauri Ojansivu 5503a1f9b1 Record resume migration translation progress
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight Resume control repair and remaining review limits. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 9e1adc713e Repair Tamazight resume migration control
2026-09-14: Use directly attested native Resume terminology for the migration control, preserving resumption rather than completion. Full phrase remains low confidence; all 17,872 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 3a86582d4b Record migration pause translation progress
2026-09-14: Update audit and upcoming notes with pause-state repairs, evidence limits and remaining review scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu f5862acbda Translate Tamazight migration pause states
2026-09-14: Repair Pausing and Paused using native app pause evidence, retaining progress versus paused state. Derived plural clauses remain low confidence. All 17,871 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu c48e416784 Record migration starting translation progress
2026-09-14: Update audit and upcoming notes with the Tamazight migration progress repair, source evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu e5628a3339 Translate Tamazight migration starting progress
2026-09-14: Replace French progress text using native Start evidence. Preserve ongoing starting, plural migrations and ellipsis; derived passive and full clause remain low confidence. All 17,869 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 01b54285ad Record rule actor translation repair progress
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight rule qualifier repair and remaining review scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 638efa8aef Translate Tamazight rule actor qualifier
2026-09-14: Replace French By qualifier before the rule user field. Complete assembled predicate grammar remains low confidence. All 17,868 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu fdd7668b51 Record logo translation provenance review progress
2026-09-14: Update audit and upcoming notes with clarified dictionary authority for prior Tamazight logo repairs. Preserve remaining review scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu af533b8526 Clarify Tamazight logo dictionary provenance
2026-09-14: Apply the inspected cross-variety dictionary preface to two earlier logo correction records. Preserve independent native caption evidence and low confidence; no values/counts changed. All 17,867 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 8fc830aceb Record original-order translation repairs and evidence limits
2026-09-14: Update audit and upcoming notes with repaired ordering guidance and the dictionary cross-variety preface. Preserve low-confidence review scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 63850d0622 Translate Tamazight original-order checklist guidance
2026-09-14: Replace two Arabic values while retaining original ordering and one item per line. Dictionary preface confirms cross-variety proposals; terminology and full wording remain low confidence. All 17,867 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu f814259071 Record translation conversion review progress
2026-09-14: Update audit and upcoming notes with native evidence limits for the uncertain Tamazight conversion verb. Preserve remaining repair scope; three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 06fc5be68b Record Tamazight conversion verb evidence limits
2026-09-14: Distinguish native Return/date-back usage from the proposed checklist conversion verb. Preserve low confidence and the unresolved original-order constraint; no values or counts changed. All 17,865 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu fcb2702b82 Record each-line checklist translation progress
2026-09-14: Update audit and upcoming notes with the Tamazight guidance repair, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu b2f402fb79 Translate Tamazight each-line checklist guidance
2026-09-14: Replace Arabic guidance while preserving each line becoming one checklist item. Derived Become and full wording remain low confidence; the original-order variant needs separate review. All 17,865 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu ecba5091df Record checklist text editor translation repair
2026-09-14: Update audit and upcoming notes with the unflagged Tamazight title correction, evidence limits and remaining scope. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2f7ea0f780 Repair Tamazight checklist text editor title
2026-09-14: Remove the inherited First qualifier absent from English and preserve editing checklist items as text. Native component evidence supports Edit and Items; full phrase remains low confidence. All 17,864 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 05a4b333e7 Record date rule translation repair progress
2026-09-14: Update audit and upcoming notes with two unflagged Tamazight date condition repairs, remaining review limits and verified counts. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2521b7092a Translate Tamazight start and end date rule conditions
2026-09-14: Replace mixed-language conditions and restore When and Set or Changed alternatives. Preserve distinct start and end dates. Set adaptation and full grammar remain low confidence; all 17,863 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu 2631b7b167 Record checklist line hint translation progress
2026-09-14: Update the audit and upcoming notes with the Tamazight line-to-item repair, source evidence limits and remaining counts. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu e548b250d5 Translate Tamazight checklist line-to-item hint
2026-09-14: Replace Arabic bulk-entry guidance using native textual Line and Text evidence. Preserve one line equals one checklist item. Full wording remains low confidence; all 17,861 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:16 +03:00
Lauri Ojansivu ba0a73ce22 Record checklist rule translation repair progress
2026-09-14: Update upcoming notes and audit counts for four repaired Tamazight rule prefixes and their remaining terminology review. Three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 479fbd178d Translate Tamazight checklist rule condition prefixes
2026-09-14: Replace four French prefixes while distinguishing generic and named checklists and items. Native temporal When evidence supports the prefix; checklist terminology and assembled grammar remain low confidence. All 17,860 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b5d7beed00 Record custom login logo text translation progress
2026-09-14: Update the translation audit and upcoming release with the repaired Tamazight label, source commit and remaining review counts. All three documentation checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 878bbd2b50 Translate Tamazight text below custom login logo
2026-09-14: Replace the French label with Tamazight using native Text, Below, Logo and Login evidence. Full noun-chain grammar remains low confidence. All 17,856 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 9799227683 Update upcoming release and translation repair progress
2026-09-14: Record custom login logo URL repairs, native terminology evidence and remaining review scope. Changelog and audit progress checks pass. The upcoming release retains the verified wekan22 build repair and Linux arm64 build log.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 3845b24a5d Translate Tamazight custom login logo URLs
2026-09-14: Replace French labels preserving image/link distinction and URL. Logo has directly labelled zgh community caption evidence; normative authority, bound forms and full phrases remain low confidence. All 17,855 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu bb55423501 Record software completion review progress
2026-09-14: Update Audit, TODO Later and Upcoming with 4139001a3 native software evidence and remaining grammar/terminology review. Values/counts unchanged. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu dd797e68b6 Record native transitive software completion evidence
2026-09-14: MediaWiki resetpass_announce directly supports complete login beyond temporal ending/legal supplementation. Past actor form and full checklist grammar remain low confidence. Record login noun and unresolved logo terminology. Values/counts unchanged; 17,853 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu d9365ae9a1 Record custom HTML tag translation repairs
2026-09-14: Record a536b274a, 15,396 corrected originals, 448 pending findings and 17,853 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 29e4bcc1c0 Translate Tamazight custom HTML tag labels
2026-09-14: Replace French labels preserving plural tags, custom scope, HTML and link/meta element identifiers. Technical semantic extensions and full phrases remain low confidence. All 17,853 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 11e5e004ee Record minicard checklist display translation repair
2026-09-14: Record 02cdb84f3, 15,394 corrected originals, 450 pending findings and 17,851 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b701a697de Translate Tamazight minicard checklist display control
2026-09-14: Replace French Show Checklist at Minicard preserving display action and minicard scope. Proposed checklist/minicard phrases remain low confidence. All 17,851 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu d121156672 Record checklist completion review limits
2026-09-14: Update Audit, TODO Later and Upcoming with 9de9f2c15 source-context evidence and remaining completion-validation requirements. Values/counts unchanged. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu c3c60cd4ca Clarify Tamazight checklist completion evidence
2026-09-14: Record native legal supplementation uses of completion root without treating them as proof of past transitive checklist completion. Preserve existing values, counts and low-confidence status. All 17,850 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu e915076de6 Record finished checklist visibility translation repair
2026-09-14: Record bd511b086, 15,393 corrected originals, 451 pending findings and 17,850 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 292b623e5f Translate Tamazight finished checklist visibility control
2026-09-14: Replace Arabic control preserving Hide and finished-checklist restriction. Derived relative grammar and full phrase remain low confidence for fluent review. All 17,850 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 8a1f9fc1ea Record checklist form translation repairs
2026-09-14: Record a8ac930ee, 15,392 corrected originals, 452 pending findings and 17,849 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b07cbe95aa Translate Tamazight checklist form close controls
2026-09-14: Replace French controls preserving Close Form rather than executing Add/Edit. Derived addition noun and full checklist phrases remain low confidence. All 17,849 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu b701a9f217 Record completed checklist translation repair
2026-09-14: Record 2544843d6, 15,390 corrected originals, 454 pending findings and 17,847 correction records in Audit, TODO Later and Upcoming. Preserve semantic distinctions and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu e396b633d6 Translate Tamazight completed checklist activity
2026-09-14: Replace French activity preserving checklist completion and two ordered %s tokens. Transitive past-completion adaptation and full phrase remain low confidence. Uncompletion requires active reversal wording, not simple negation. All 17,847 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 556b9cf14d Record checklist activity translation repairs
2026-09-14: Record 0ecbc1189, 15,389 corrected originals, 455 pending findings and 17,846 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:15 +03:00
Lauri Ojansivu 85c8bcdf07 Translate Tamazight checklist add and remove activities
2026-09-14: Replace four Arabic activities preserving checklist versus item, addition/removal and To/From/In relationships. Preserve exact %s order/count and quotes. Full phrases and derived forms remain low confidence. All 17,846 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 9c3eee5091 Record minicard count translation repair
2026-09-14: Record ed9620896 and 17,842 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu aa3f4ce66a Align Tamazight minicard checklist count
2026-09-14: Align count terminology preserving literal (0/0) and explicit minicard scope. Small Card paraphrase and derived grammar remain low confidence for fluent review. All 17,842 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f72dd937ac Record checklist count translation repair
2026-09-14: Record edd3ae666 and 17,841 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 8c1b29f291 Align Tamazight checklist count terminology
2026-09-14: Use native count and plural element components, preserving literal (0/0). Proposed checklist noun and complete phrase remain low confidence for fluent review. All 17,841 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu c8c5910514 Record checklist rule translation repairs
2026-09-14: Record 0379f9df8 and 17,840 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 177aff81b5 Translate Tamazight checklist rule actions
2026-09-14: Replace three French rule actions preserving Add versus Remove of whole checklist. Proposed checklist term remains low confidence for fluent review. All 17,840 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6e7eda9828 Record checklist noun translation repairs
2026-09-14: Record 3cd6ae3d6 and 17,837 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu e50b2b72f7 Translate Tamazight checklist noun labels
2026-09-14: Replace six Arabic/French labels preserving singular, plural and Of relation with native list components. Proposed verification noun and full checklist terminology remain low confidence for fluent review. All 17,837 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 35870c7afd Record checklist confirmation translation repairs
2026-09-14: Record b0a3b5308, 15,387 corrected original findings, 457 pending findings and 17,831 correction records in Audit, TODO Later and Upcoming. Preserve full validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 59845f1cac Translate Tamazight checklist deletion confirmations
2026-09-14: Replace French confirmation questions preserving whole-checklist versus one-item deletion. Native Mastodon supplies question frame and bound singular item. Full checklist wording remains low confidence. All 17,831 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6dc5481337 Record checklist menu translation repairs
2026-09-14: Record 0dd39bb6b and 17,829 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu efc33e5c10 Translate Tamazight checklist menu actions
2026-09-14: Replace Arabic Add Checklist and French Checklist Actions preserving whole checklist and plural actions. Proposed checklist noun and full grammar remain low confidence. All 17,829 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu d7f6c0f5d6 Record checklist deletion translation repairs
2026-09-14: Record 79be9d37d, 15,385 corrected originals, 459 pending findings and 17,827 correction records in Audit, TODO Later and Upcoming. Preserve native-source limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu a5aea16510 Translate Tamazight checklist deletion headings
2026-09-14: Replace French headings preserving single-item versus whole-checklist deletion and questions. Verification noun and full checklist paraphrase remain low confidence; targeted source review does not attest that noun. All 17,827 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 7ee844d5bb Record checklist action translation repairs
2026-09-14: Record 6435ad6a6, 15,384 corrected originals, 460 pending findings and 17,825 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu d70a159999 Translate Tamazight checklist item actions
2026-09-14: Replace wrong-language Add Item and Hide All Checklist Items, preserving distinct actions and scope. Proposed checklist paraphrase and derived morphology remain low confidence for fluent review. All 17,825 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu edb8e491e1 Record migration status translation repairs
2026-09-14: Record 1824cd778 and 17,823 correction records in Audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f2603e2e74 Align Tamazight migration status terminology
2026-09-14: Align two migration status labels with reviewed native migration spelling, preserving status rather than progress/completion. Full noun chain remains low confidence for fluent review. All 17,823 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 8c074f2634 Record migration authorization translation repair
2026-09-14: Record 5bb209c06, 15,382 corrected original findings, 462 pending findings and 17,821 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and full validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu f0795037b3 Translate Tamazight migration administrator restriction
2026-09-14: Replace French restriction preserving only board administrators and ability to execute plural migrations. Derived grammar and full authorization sentence remain low confidence for fluent review. All 17,821 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 6de23d08e6 Record migration errors translation repair
2026-09-14: Record 66c8bd979 and 17,820 correction records in Audit, TODO Later and Upcoming. Preserve confidence limits and remaining validation scope. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu febec4e317 Translate Tamazight migration errors heading
2026-09-14: Replace French Migration Errors preserving plural errors distinct from warnings. Full software phrase remains low confidence for fluent review. All 17,820 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu c8ae38d24d Record plural migration translation repairs
2026-09-14: Record 41d712523 and 17,819 verified correction records in Audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. Three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 94a68db592 Align Tamazight plural migration and step labels
2026-09-14: Replace French All Migrations and align Migrations and Migration Steps with reviewed native components. Preserve plural and all semantics. Derived migration plural and full software phrases remain low confidence for fluent review. All 17,819 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 33e7c80a06 Record administrator translation repair progress
2026-09-14: Record 443b180a2 and 17,816 verified correction records in the translation audit, TODO Later and Upcoming. Preserve remaining validation scope and confidence limits. All three metadata checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu ba8efb2460 Use native Tamazight administrator role labels
2026-09-14: Replace Arabic administrator labels and align the singular board administrator role with native MediaWiki administrator terminology. Board-qualified phrase remains low confidence for fluent review. All 17,816 correction checks pass, preserving placeholders and newer translations.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 5baf01a119 Record Tamazight migration warning repair progress
2026-09-14: Update audit, TODO Later and Upcoming with c303eb013, 15,381 corrected originals, 463 pending findings and 17,813 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 839088b604 Translate Tamazight migration warnings heading
2026-09-14: Replace French Migration Warnings preserving plural warnings rather than errors or failure. Derived plural and full software-migration phrase remain low confidence for fluent review. All 17,813 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu 4989bf15a4 Record Tamazight migration validation repair progress
2026-09-14: Update audit, TODO Later and Upcoming with 3416af191 and 17,812 correction records. Original counts are unchanged; retain full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:14 +03:00
Lauri Ojansivu eb0c8fdc06 Translate Tamazight migration validation action
2026-09-14: Replace French Validate Migration with native verification imperative, preserving validation rather than running or completion. Verification-to-migration adaptation and complete action remain low confidence for fluent review. All 17,812 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 744c94df6e Record Tamazight step label repair progress
2026-09-14: Update audit, TODO Later and Upcoming with b84a88696 and 17,811 correction records. Original counts are unchanged; retain full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu d8a33d5fcb Translate Tamazight step and current-step labels
2026-09-14: Replace three French step labels preserving singular/plural and Current qualifier. Primary native references corroborate step noun and plural; extension to software phases and full agreement remain low confidence for fluent review. All 17,811 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu ef082a6f63 Record Tamazight migration control repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 858a00526, 15,380 corrected originals, 464 pending findings and 17,808 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu a2546a352e Translate Tamazight migration run and progress controls
2026-09-14: Replace three French controls/statuses preserving imperative Run, ongoing Running/In Progress, ellipsis and board scope. Passive derivation, software-run terminology and complete phrases remain low confidence for fluent review. All 17,808 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2ee3028cd6 Record Tamazight completion status repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 1f72241e3, 15,379 corrected originals, 465 pending findings and 17,805 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2bdb12f24f Translate Tamazight completion status labels
2026-09-14: Replace four French completion statuses while distinguishing bare completion from successful migration completion. Completed-tense adaptation, standalone grammar and full success phrase remain low confidence for fluent review. Generic Complete action remains under contextual review. All 17,805 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 0e091969f9 Record Tamazight selection and migration necessity repairs
2026-09-14: Update the audit, TODO Later and Upcoming with 94eb1a0c5, 15,378 corrected originals, 466 pending findings and 17,801 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 07e02fe2d6 Translate Tamazight selection and required migration labels
2026-09-14: Replace five French/Arabic labels with native selection and necessity components, preserving entity scope and required/not-required polarity. Full necessity constructions and software-migration wording remain low confidence for fluent review. Select Color follows native MediaWiki wording. All 17,801 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu a3324b43ce Record Tamazight migration label repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 81fba99d7, 15,376 corrected originals, 468 pending findings and 17,796 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 54febc0b57 Translate Tamazight migration scope and failure labels
2026-09-14: Replace four French migration labels while preserving singular/plural, board/database scope and failed status. Native move noun adapted to software migration, derived plurals and full phrases remain low confidence for fluent review. All 17,796 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu cfed19e3f1 Record Tamazight field control repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with eb3965660, 15,375 corrected originals, 469 pending findings and 17,792 correction records. Preserve full validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu e5ae1e646c Translate Tamazight field control labels
2026-09-14: Replace French checkbox, dropdown list and custom-field filter labels with Tamazight components. Preserve selection, dropdown direction and filtering qualifiers. Full control terminology, bound nouns and derived plurals remain low confidence for fluent review. All 17,792 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 7c2366ec84 Record Tamazight field label repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with 97c1c79fe, 15,374 corrected originals, 470 pending findings and 17,789 correction records. Preserve full validation scope and low-confidence wording. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 2e89b4d91a Translate Tamazight field labels and actions
2026-09-14: Replace four Arabic/French field labels, preserving custom, edit, absence and hierarchical subtask qualifiers. Derived plural, specified/custom adaptation and complete phrases remain low confidence for fluent review. All 17,789 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu dc8cf3d3ec Record Tamazight linked entity repair progress
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with af33f6640 and 17,785 correction records. Original counts are unchanged; preserve full language-validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu d82e7ae07d Translate Tamazight linked entity labels
2026-09-14: Repair Linked Subtask, Linked Card and Linked Board labels using native linked/associated wording. Preserve hierarchy and entity distinctions. Full kanban phrases and participle agreement remain low confidence for fluent review. All 17,785 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu eb2520e46a Record Tamazight added activity repair progress
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with b26d1ddc1, 15,373 corrected originals, 471 pending findings and 17,782 correction records. Preserve full language-validation scope and confidence limits. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:13 +03:00
Lauri Ojansivu 62bdf5ab93 Translate Tamazight added activity messages
2026-09-14: Replace two Arabic added-activity messages with local Tamazight past-action and destination wording. Preserve all percent placeholders and subtask hierarchy. Full activity grammar, past conjugation and kanban paraphrase remain low confidence for fluent review. All 17,782 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu d23ff15c53 Record Tamazight subtask action repairs
2026-09-14: Update audit evidence, short progress, TODO Later and Upcoming with repair 23c82a5c1, 15,372 corrected originals, 472 pending findings and 17,780 correction records. Preserve broader validation scope and remaining activity/linked-subtask review. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu ef0181cd4d Repair Tamazight subtask action wording
2026-09-14: Repair four subtask actions with explicit hierarchical task wording. Remove Language and With from Add Existing Card as Subtask, preserving Existing and As. Preserve confirmation question and plural Actions. Full paraphrases and morphology remain low confidence for fluent review. All 17,780 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu f26e1da7fa Record Tamazight hierarchical subtask repairs
2026-09-14: Update audit evidence, progress, TODO Later and Upcoming with f13775594, 15,371 corrected originals, 473 pending findings and 17,776 correction records. Retain full language-validation scope and open existing-card action. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 17f7bb4ac2 Translate Tamazight hierarchical subtask labels
2026-09-14: Replace five Arabic/French subtask labels with explicit Task(s) under a Task wording. Preserve hierarchy, singular/plural, settings and deletion question. Full paraphrases, bound noun morphology and kanban terminology remain low confidence for fluent review. Existing-card action repair remains open. All 17,776 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 8ab4387dcf Record Tamazight subtask review progress
2026-09-14: Keep the short audit, TODO Later and Upcoming updated with terminology finding 92f69f58d and its unresolved hierarchical wording. Translation values and counts are unchanged. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 4559d6bacb Record Tamazight subtask terminology error
2026-09-14: Identify the unflagged use of Language in Add Existing Card as Subtask. Record indexed primary references and distinguish Work/Task evidence from the still-unverified hierarchical subtask term. Preserve relation semantics during the upcoming repair. No values or counts changed.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 93de00395e Record Tamazight custom help repair progress
2026-09-14: Update the audit, TODO Later and Upcoming with repair ef6318121, 15,368 corrected originals, 476 pending findings and 17,771 correction records. Preserve broader validation scope and low-confidence wording. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9ffc165f50 Translate Tamazight custom help link label
2026-09-14: Replace French Custom Help Link URL wording with native link and help components. Preserve URL and the custom qualifier. Full noun-chain grammar, bound link noun and specified/custom adaptation remain low confidence for fluent review. All 17,771 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 3cb39092d3 Record Tamazight domain Users repair progress
2026-09-14: Record local repair 196edd0f8, 17,770 correction records and remaining full validation scope in the audit, TODO Later and Upcoming notes. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu b0379afb88 Repair Tamazight domain Users heading
2026-09-14: Replace cross-dialect imseqdacen with the directly attested Standard Moroccan plural inssmrsn for domain account users. Preserve users rather than board members or people. MediaWiki Kabyle confirms the old form and its zgh translations attest the replacement. All 17,770 correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu a1711a1b65 Record Tamazight Board View translation repairs
2026-09-14: Update Upcoming release notes, TODO Later and the short audit with local repair commit 7a2d1caf4, 17,769 correction records and remaining validation scope. All three changelog and audit-progress checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu e5b85f2419 Translate Tamazight Board View labels
2026-09-14: Replace two Arabic Board View labels with generic view and singular board wording. The adapted full phrase and bound board noun remain low confidence for fluent Standard Moroccan Tamazight review. All 17,769 audited correction checks pass.

Thanks to xet7 !
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 3f676bf498 Record Tamazight New User translation repairs
2026-09-14: record source fb554131b and 17,767 correction records in the audit and upcoming changelog. Original pending count remains 477; full New User phrasing and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9d571595eb Translate Tamazight New and New User labels
2026-09-14: replace two Arabic labels with native New adjective and singular account-user wording. Complete New User heading remains low confidence for fluent review. All 17,767 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 8e680de9f5 Record Tamazight search instruction translation repair
2026-09-14: record source 15481a394, 15,367 corrected originals, 477 pending findings and 17,765 correction records. Full search sentence and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu b4aa7cd794 Translate Tamazight search text and Enter instruction
2026-09-14: replace French instruction preserving writing search text and pressing Enter. Native components support the wording; key-press adaptation, relative clause and full sentence remain low confidence for fluent review. All 17,765 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9476c5baf7 Record Tamazight successful unlock translation repair
2026-09-14: record source 4ba8d17d4, 15,366 corrected originals, 478 pending findings and 17,764 correction records. Full success/unblock grammar and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu e82fbbe1ad Translate Tamazight successful user unlock result
2026-09-14: replace French result while preserving success, singular user and removal of login blocking. Positive success construction, removal nominalization and full bound phrase remain low confidence for fluent review. All 17,764 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu ec5a1d1aeb Record Tamazight all locked user translation repairs
2026-09-14: record source d0791c6c4, 15,365 corrected originals, 479 pending findings and 17,763 correction records. Full unblock phrases, passive adaptation and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu eb44e6733a Translate Tamazight all locked user unlock messages
2026-09-14: replace two French confirmation/result messages preserving All Locked Users and question versus completed-result meaning. Full quantified unblock phrases and passive adaptation remain low confidence for fluent review. All 17,763 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 9fa868468d Record Tamazight account unlock translation repairs
2026-09-14: record source 2f4752ff4, 15,363 corrected originals, 481 pending findings and 17,761 correction records. Complete unblock terminology and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 1d3e91be75 Translate Tamazight account unlock actions
2026-09-14: replace three French click, confirmation and all-user unlock labels by expressing removal of login blocking. Preserve this-user versus all-users scope. Full unblock compounds and grammar remain low confidence for fluent review. All 17,761 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 4cce726a49 Record Tamazight board and card reference repairs
2026-09-14: record source 18f7fa766 and 17,758 correction records in the audit and upcoming changelog. Original pending count remains 483; board plural, full phrases and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu 14c0e79c1c Translate Tamazight board and card reference labels
2026-09-14: replace four Arabic labels preserving All versus generic Boards and This Board/Card scope. Board plural morphology and full kanban phrases remain low confidence for fluent review. All 17,758 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:12 +03:00
Lauri Ojansivu f1035c98f8 Record Tamazight card count translation repairs
2026-09-14: record source faa68bf87 and 17,754 correction records in the audit and upcoming changelog. Original pending count remains 483; full numeral phrases and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 53faea649c Translate Tamazight other card count labels
2026-09-14: replace mixed English/Arabic count prose, preserving exact __count__, And/Other and singular/plural Card meaning. Full numeral phrase and counted noun morphology remain low confidence for fluent review. All 17,754 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 56592ee4ef Record Tamazight subworkspace translation repairs
2026-09-14: record source 8dc2224c7, 15,361 corrected originals, 483 pending findings and 17,752 correction records. Update prior subworkspace review status while preserving the new compound and full-phrase confidence limits. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu f2e9cb1498 Translate Tamazight subworkspace add and name labels
2026-09-14: replace two French headings with an explicitly derived subworkspace compound, preserving Add versus Name and hierarchy. New compound, bound form, workspace extension and full phrases remain low confidence for fluent review; indexed prefix evidence does not directly attest the compound. All 17,752 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 2058c8cf5c Record Tamazight text profile and list label repairs
2026-09-14: record source 45650996e and 17,750 correction records in the audit and upcoming changelog. Original pending count remains 485; broader validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 8fd6e40514 Translate Tamazight text profile and list deletion labels
2026-09-14: replace three Arabic labels with native Text, Profile and Delete List wording supported by MediaWiki and Mastodon. Preserve singular list and question punctuation. All 17,750 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9f04cb9ed4 Record Bambara calendar terminology review progress
2026-09-14: record direct CLDR evidence 5610dff52 and full calendar terminology limits in the audit and upcoming changelog. Counts remain 485 pending originals and 17,747 correction records. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9a16d9f590 Document Bambara tabular calendar terminology limits
2026-09-14: directly review current CLDR Bambara date fields and missing localized calendar variant names. Era vocabulary does not establish reference-date Epoch; retain both tabular calendar findings pending full terminology review. No translation values or counts changed.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu ee7e57c12f Record Tamazight start spelling review progress
2026-09-14: record evidence 2219d5358 in the audit and upcoming changelog. Counts remain 485 pending originals and 17,747 correction records; direct PDF, full command and subworkspace review remain open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 045444b838 Document Tamazight start versus share spelling evidence
2026-09-14: expanded indexed conjugation excerpt distinguishes plain bdu Begin/Start from emphatic bdu Share/Divide. Record printed page 94 and direct PDF redirect limits; full command and subworkspace terminology remain under review. No locale values or counts changed. All 17,747 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu ff7b1fdfb7 Record Tamazight Planning Poker start translation repair
2026-09-14: record source f16fae64a, 15,359 corrected original findings, 485 pending findings and 17,747 correction records. Complete command, indexed-only evidence and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 1d48efb925 Translate Tamazight Planning Poker start heading
2026-09-14: replace French start heading, preserving the Planning Poker feature name and distinguishing the action from the Start date noun. Indexed conjugation evidence and full command remain low confidence: the manual currently redirects to HTML and needs direct/fluent review. All 17,747 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 6c9c536934 Record Tamazight workspace menu translation repair
2026-09-14: record source fea294be0, 15,358 corrected original findings, 486 pending findings and 17,746 correction records. Full workspace terminology and broader validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 8db529010c Translate Tamazight workspace menu label
2026-09-14: replace French Workspace menu with native Menu and content-space components. Organizational workspace extension and complete bound phrase remain low confidence for fluent review. All 17,746 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu bf2f8bf10c Record Tamazight card heading translation repairs
2026-09-14: record source ad526816b and 17,745 correction records in the audit and upcoming changelog. Original pending count remains 487; full kanban phrases and broader translation validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 6a211b7fdd Translate Tamazight card type and popup headings
2026-09-14: replace four Arabic Card, Delete Card?, Card Actions and Labels headings, preserving ordinary card type, singular card and plural actions/labels. Full kanban terminology and bound phrases remain low confidence for fluent review. All 17,745 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 82ca5a02ba Record Tamazight search and rule translation repairs
2026-09-14: record source a06565956 and 17,741 correction records in the audit and upcoming changelog. Original pending count remains 487; morphology and broader translation validation stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu a5562c1208 Translate Tamazight search and rule nouns
2026-09-14: replace six Arabic user/member/list labels using reviewed native terminology. Preserve distinct singular object types; the derived free-state Member noun remains low confidence for morphology review. All 17,741 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9af7d88d71 Record Tamazight date label translation repairs
2026-09-14: record source 82ba97005 and 17,735 correction records in the audit and upcoming changelog. Original pending count remains 487; broader translation validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 198add194c Translate Tamazight week month and year date labels
2026-09-14: replace three Arabic date predicate labels with exact CLDR native singular date-field names. Preserve date-unit meaning across tooltips, Gantt, calendar navigation and search. All 17,735 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu 9013de7987 Record Tamazight profile and board view translation repairs
2026-09-14: record source aef5ea20a and 17,732 correction records in the audit and upcoming changelog. Original pending count remains 487; broader translation validation stays open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu cbd1047b95 Translate Tamazight profile and board view labels
2026-09-14: replace six Arabic People, Edit Profile, Title, Calendar, Lists and Members labels with native terminology supported by Mastodon, MediaWiki and CLDR. Preserve action, calendar and plural scope. All 17,732 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu c0e2e18191 Record Tamazight edit heading translation repairs
2026-09-14: record source e9f1b33b9 and 17,726 correction records in the audit and upcoming changelog. Original pending count remains 487; full phrase and broader translation review stay open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:11 +03:00
Lauri Ojansivu d2d46ce5e4 Translate Tamazight team user and Planning Poker edit headings
2026-09-14: replace three French headings using native Edit terminology, preserving singular team/user objects and the Planning Poker name. Complete adapted phrases remain low confidence and need fluent review. All 17,726 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu b80256cfdd Record Tamazight People translation repair
2026-09-14: update the audit and upcoming changelog with source cf0a2f19b and 17,723 correction records. Original pending findings remain 487; broader translation validation remains open. All three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu df6b3a1e7e Translate Tamazight People label
2026-09-14: replace the Arabic People label with the native equivalent documented in Mastodon zgh. Preserve generic people scope rather than users or board members. All 17,723 correction checks pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 1a5242a1cf Record Tamazight Minguo calendar repair progress
2026-09-14: record source fix 67dbacc28 and update the audit and upcoming changelog to 15,357 corrected original findings, 487 pending findings, and 17,722 correction records. Full calendar naming and the remaining translation review stay open. Correction checks and all three metadata tests pass.

Thanks to xet7.
2026-09-14 11:08:10 +03:00
Lauri Ojansivu d791f67a87 Translate Tamazight Minguo calendar label
2026-09-14: Use the native Calendar noun and preserve the Minguo calendar name from English source, avoiding generic Chinese language/calendar substitution. LOW CONFIDENCE full mixed-script naming needs fluent review. All 17,722 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 9fa44a6b80 Record Tamazight authentication reference review progress
2026-09-14: Update short audit, TODO Later and Upcoming with directly verified authentication source provenance. Locale values and counts remain unchanged; three metadata test entries pass. Full terminology review continues.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 2a099f1e21 Verify Tamazight authentication reference provenance
2026-09-14: Direct dictionary extraction shows authentication terms marked MC£, whereas the search index renders MCF. The bibliography identifies Tuareg sources, so do not accept the candidate as Moroccan attestation. Preserve authentication, method/type, display and default scope; keep findings pending.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 037bac7f07 Record Tamazight title and details repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with two heading repairs and full-phrase review limits. All 17,721 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 329c1dd4df Translate Tamazight board title and card details headings
2026-09-14: Replace two Arabic headings, preserving singular Board Title and plural Details of a singular Card. Native title/details vocabulary is supported; LOW CONFIDENCE complete kanban phrases and bound forms require fluent review. All 17,721 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu cc2587f516 Record Tamazight server and status translation progress
2026-09-14: Update short audit, TODO Later and Upcoming with two software-label repairs and server-heading review limits. All 17,719 correction/rendering checks and three metadata test entries pass; 488 originals and broader validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 989b9c960b Translate Tamazight server error and closed status labels
2026-09-14: Replace two Arabic software labels, preserving Server Error heading and Closed status rather than Close action. Native components support the error heading; LOW CONFIDENCE complete server phrase requires fluent review. All 17,719 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 3802afd8e5 Record Tamazight member settings repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with three member/board label repairs and remaining full-phrase uncertainty. All 17,717 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 5f67771928 Translate Tamazight member and board settings labels
2026-09-14: Replace three Arabic labels, preserving singular Member Settings, singular Board Settings and plural Edit members. Native component terminology is supported; LOW CONFIDENCE complete kanban phrases and bound forms require fluent review. All 17,717 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0414b9c985 Record Tamazight add label repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with six Add repairs and full-phrase review limits. All 17,714 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu ea0dc67775 Translate Tamazight board card list and member add labels
2026-09-14: Replace six Arabic Add labels and matching popup headings. Preserve distinct objects, singular board/card/list and plural members. Native references support components; LOW CONFIDENCE full kanban commands remain subject to fluent review. All 17,714 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu c33059e3d1 Record Tamazight duration unit repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with minutes/seconds repairs and remaining seconds-plural uncertainty. All 17,708 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 7ee8c65e19 Translate Tamazight minutes and seconds duration labels
2026-09-14: Replace two Arabic duration units, retaining minutes versus seconds and plural scope. Native software reference supports plural minutes; LOW CONFIDENCE derived seconds plural needs fluent morphology review. All 17,708 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 55fb4b7ece Record Tamazight weekday and duration repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five reference-supported date/time labels. All 17,706 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0e2a70634e Translate Tamazight weekday and duration labels
2026-09-14: Replace five Arabic labels using full native CLDR weekday names and reference-supported plural days/hours. Preserve weekday identity and duration plural scope. All 17,706 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 3c9d52f1a5 Record Tamazight navigation translation repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five unflagged interface repairs. All 17,701 correction/rendering checks and three metadata test entries pass; 488 originals and broader language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu aa36776a96 Translate Tamazight navigation confirmation and settings labels
2026-09-14: Replace five Arabic interface labels with native software wording. Preserve Back versus previous-page adjacency, next versus previous, confirmation acknowledgment and generic Settings scope. All 17,701 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 0ba64ecd9f Record Tamazight invitation decline repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with the source-checked invitation rejection action. All 17,696 correction/rendering checks and three metadata test entries pass; 488 originals and wider language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 785db327d7 Translate Tamazight invitation decline action
2026-09-14: Replace the French Decline invitation button using the native request-rejection imperative. Source handlers confirm rejection rather than closing the popup. All 17,696 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 2dde68e7b9 Record Tamazight workspace deletion translation progress
2026-09-14: Update short audit, TODO Later and Upcoming with two deletion repairs and full-phrase review limits. Record 15,356 originals corrected, 488 pending and 17,695 correction records. Correction/rendering and three metadata test entries pass; wider language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:10 +03:00
Lauri Ojansivu 5cde6f4a30 Translate Tamazight workspace confirmation and board deletion
2026-09-14: Replace the French workspace deletion question and Delete Board action. Preserve certainty, singular this-workspace object and deletion rather than archive. LOW CONFIDENCE complete workspace question and kanban board phrase require fluent review. All 17,695 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 3c57ed631e Record Tamazight workspace settings repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with three repairs and remaining full-heading uncertainty. Record 15,355 originals corrected, 489 pending and 17,693 correction records. Correction/rendering and three metadata test entries pass; broader language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 059d46d0a3 Translate Tamazight workspace settings and close labels
2026-09-14: Replace two French Workspace Settings headings and the Arabic Close action. Native software references support settings and close; LOW CONFIDENCE full workspace headings and bound-state terminology remain subject to fluent review. All 17,693 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 9f0b8ac23e Record Tamazight workspace translation repair progress
2026-09-14: Update short audit, TODO Later and Upcoming with five workspace corrections and remaining terminology uncertainty. Record 15,353 originals corrected, 491 pending and 17,690 correction records. Correction/rendering and three metadata test entries pass; wider language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 870da4dd27 Translate Tamazight workspace add edit and name labels
2026-09-14: Replace five French workspace values, retaining add versus edit and singular workspace-name scope. Native institutional usage corroborates the existing space noun. LOW CONFIDENCE WeKan workspace extension, bound form and full labels require fluent review; subworkspace remains separate. All 17,690 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 65fd342d9e Record Tamazight confirmation repair progress
2026-09-14: Update the short audit, TODO Later and Upcoming with the native software confirmation button repair. All 17,685 correction/rendering checks and three metadata test entries pass; 496 originals and wider validation remain open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 5f37a017d4 Translate Tamazight confirmation button
2026-09-14: Replace the Arabic Confirm label with the native software confirmation-button wording. Keep acknowledgment distinct from invitation acceptance and confirmation questions. All 17,685 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 1ba91f3e70 Record Tamazight page terminology repair progress
2026-09-14: Update the short translation audit, TODO Later and Upcoming with the source-supported singular page label. All 17,684 correction/rendering checks and three metadata test entries pass; 496 originals and wider language validation remain open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 851bef0f13 Align Tamazight page label with native software terminology
2026-09-14: Use the exact native MediaWiki singular Page noun, retaining scope and avoiding claims about other regional synonyms or full page phrases. All 17,684 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu b19df31eac Record Tamazight Amete Alem calendar repair progress
2026-09-14: Update audit summary, TODO Later and Upcoming with the native Ethiopic base repair and retained era distinction. Record 15,348 originals corrected, 496 pending and 17,683 correction records. Correction/rendering and three metadata test entries pass; complete language validation remains open.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 794c8acdac Translate Tamazight Ethiopic Amete Alem calendar label
2026-09-14: Use the CLDR native Ethiopic calendar base while preserving the Amete Alem era variant name. LOW CONFIDENCE composed mixed-script label remains subject to fluent review. All 17,683 correction/rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu a23812c6a3 Record Tamazight email invitation repair progress
2026-09-14: Update the short audit, TODO Later and Upcoming with the email-invitation correction and its remaining dialect uncertainty. All 17,682 correction/rendering checks and three metadata test entries pass; the original pending queue remains 497.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu c2fb2749b1 Translate Tamazight email invitation action
2026-09-14: Replace the remaining French email-invitation button using the existing Invite action and native email term, preserving the email channel. LOW CONFIDENCE invitation verb and full instrumental phrase; renewed Moroccan dialect review remains required following the CNAM provenance correction. All 17,682 correction and rendering checks pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 4baaca8844 Record Silesian terminology review progress
2026-09-14: Update the short translation audit, TODO Later and Upcoming with the reference follow-up. Preserve all 497 pending originals and the wider validation scope. Three changelog and audit-progress test entries pass.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 454dd4291e Document Silesian database terminology evidence
2026-09-14: Corroborate regional human computer-database usage and distinguish it from the Polish article wrapper. Keep the raw-file qualifier and complete label pending; record retrieval limits without treating missing evidence as a language error.

Thanks to xet7 !
2026-09-14 11:08:09 +03:00
Lauri Ojansivu dfcdb6530b Record Tamazight cron severity translation progress
Update dated audit and Upcoming with unflagged repair and 17681 correction records. Explicitly retain terminology review in cron and recovery contexts. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu fb65e027b4 Use Tamazight severity terminology in cron error table
Replace French with existing recovery severity wording for identical source. Terminology remains low confidence and needs fluent review in both contexts; local consistency is not linguistic validation. All 17681 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 908e4c3365 Record Tamazight minicard cover translation progress
Update dated audit and Upcoming with three repairs, 17680 correction records and 497 pending originals. Keep full phrase and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 57685be530 Translate Tamazight minicard cover image controls
Preserve add, remove from and display on minicard cover distinctions. Local cover sense and full phrases remain low confidence pending fluent review. All 17680 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu f73c3209df Record Tamazight avatar upload translation progress
Update dated audit and Upcoming with two unflagged repairs, 17677 correction records and remaining language validation requirements. Three metadata test entries pass.
2026-09-14 11:08:09 +03:00
Lauri Ojansivu 88a9aeef4c Translate Tamazight avatar upload action and completion labels
Preserve imperative upload versus completed upload state using native action vocabulary and local profile-picture terminology. Passive morphology and full phrases remain low confidence pending fluent review. All 17677 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu aa9103128c Record Tamazight avatar popup translation progress
Update dated audit and Upcoming with three unflagged repairs, 17675 correction records and remaining language validation requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu bcc1bd4e82 Translate Tamazight change and delete avatar popup titles
Replace three Arabic and French titles using local profile-picture vocabulary and native actions. Full profile terminology remains low confidence pending fluent review. All 17675 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu aaeb0763f2 Update Tamazight troubleshooting review status
Link dated terminology evidence in audit and Upcoming while keeping unresolved full instructions visible. Three metadata test entries pass; no locale values changed.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu fd1301db02 Record Tamazight server troubleshooting terminology review
Separate native server/error vocabulary from indexed cross-dialect execution and installation terms. Preserve command and installation scope requirements; no locale values or counts changed.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 896fa82923 Record Tamazight named calendar translation progress
Update dated audit and Upcoming with source repair, 17672 correction records and 500 pending originals. Keep full phrase and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c5202dfd66 Complete Tamazight Dangi and ISO calendar labels
Use native calendar noun while preserving Dangi and exact ISO-8601 names. Full mixed-script composition remains low confidence pending fluent review. All 17672 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu d2afa814fe Record Tamazight Umm al Qura translation progress
Update dated audit and Upcoming with source repair, 17670 correction records and 501 pending originals. Retain provisional CLDR and wider language review requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu f3534ffd4d Translate Tamazight Umm al Qura calendar label
Reuse provisional CLDR Islamic calendar wording and preserve the named Umm al-Qura variant. Complete composition remains low confidence pending fluent review. All 17670 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 7f19014973 Record Tamazight rule list name translation progress
Update dated audit and Upcoming with unflagged repair and 17669 correction records. Keep 502 pending originals and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c333e96a8a Translate Tamazight rule list name label
Replace French with native name and list vocabulary. Complete kanban noun phrase remains low confidence pending fluent review. All 17669 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 4c622b41a5 Record Tamazight support not yet added translation progress
Update dated audit and Upcoming with source repair, 17668 correction records and 502 pending originals. Keep wider language validation requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 278ca9967c Translate Tamazight support information not yet added notice
Retain support information, not yet and added action using native component vocabulary. Full negative passive phrase remains low confidence pending fluent review. All 17668 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 6c8234559c Record Tamazight account and card translation progress
Update dated audit and Upcoming with three unflagged repairs and 17667 verified correction records. Keep 503 pending originals and broader language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu c6d225f644 Translate Tamazight account and card noun labels
Replace three Arabic labels while preserving plural accounts/cards and singular card distinctions. Derived account plural and technical card terminology remain low confidence pending fluent review. All 17667 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu fd6378c9c5 Record Tamazight CPU count translation repair progress
Update dated audit and Upcoming with repair commit, 17664 correction records and 503 pending originals. Keep broader language validation requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu ffd0a02e24 Repair Tamazight OS CPU count translation
Replace Arabic CPU consumption wording with CPU count using native count vocabulary. Retain conventional OS and CPU abbreviations. Full mixed-script label remains low confidence pending fluent review. All 17664 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 842ca7d7b0 Record Tamazight end date search translation progress
Update dated audit and Upcoming with repair commit and 17663 correction records. Keep 504 pending originals and wider language validation visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu dc56a74b0f Translate Tamazight end date search predicate guidance
Retain exact predicate code and cards with an end date, without implying completed or overdue cards. Full relative construction remains low confidence pending fluent review. All 17663 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 7fd5289296 Record Tamazight card member translation progress
Update dated audit and Upcoming with repaired board/card scope, 17662 correction records and 505 pending originals. Wider language review remains open. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu e5e75d14e5 Translate Tamazight card member instruction and restore board scope
Preserve adding board members to the card or removing them from the card, without implying removal from the board. Full coordinated instruction remains low confidence pending fluent review. All 17662 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 3edda4b48b Record Tamazight cron message translation progress
Update dated audit and Upcoming with repair commit and 17661 correction checks. Keep 506 pending originals and wider fluent review visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 1faf5af987 Translate Tamazight cron error message label
Retain message versus error details distinction using native component vocabulary. Complete software noun phrase remains low confidence pending fluent review. All 17661 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 3588b781e9 Record Tamazight support access translation progress
Update dated audit and Upcoming with 17660 correction records, source commit and 506 pending originals. Retain full phrase and broader language review requirements. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu cff15734b1 Translate Tamazight support authenticated user notice
Preserve support information restricted to logged-in users only. Native components support provisional wording; derived participle and full sentence remain low confidence pending fluent review. All 17660 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu 773473eb03 Record Tamazight support translation repair progress
Update dated audit and Upcoming with four unflagged repairs and 17659 verified correction records. Keep 507 pending original findings and broader language review requirements visible. Three metadata test entries pass.
2026-09-14 11:08:08 +03:00
Lauri Ojansivu cd635c2975 Translate Tamazight support page labels
Replace four Arabic and French support labels with native assistance vocabulary. Preserve title and content distinctions. Full noun phrase composition remains low confidence pending fluent review. All 17659 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a034738555 Record Tamazight planning poker translation repair progress
Update 2026-09-14 audit and Upcoming with repair commit, 17655 correction checks and 507 pending original findings. Broader fluent review remains required. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 464e8064ac Translate Tamazight planning poker delete and vote date titles
Preserve the named estimation technique, this deletion question and change vote end-date action. Full composition remains low confidence pending fluent review. All 17655 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu db9603259f Record Quechua sighting calendar translation progress
Update dated audit and Upcoming with repair commit and 509 pending original findings. Preserve astronomical epoch and broader language review requirements. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 02fa748b88 Repair Quechua Saudi Hijri sighting calendar label
Use primary CLDR Quechua calendar and sighting vocabulary, retaining the omitted sighting distinction. Complete composition remains low confidence pending fluent review. Astronomical epoch terminology remains unresolved. All 17653 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu b149c1a4d6 Update Upcoming and translation audit voting repair progress
Record the 2026-09-14 voting repair commit, 17652 verified corrections and unchanged 510 original pending findings. Retain fluent review, restored-value and provenance review limitations. Three metadata test entries pass.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9d8719dc1f Translate Tamazight card voting controls
Replace four Arabic and French voting labels with consistent Tamazight wording. Preserve question, edit and deletion actions. Election terminology adapted to card voting and complete phrases remain low confidence pending fluent review. All 17652 correction checks pass.

Reviewed 2026-09-14. Thanks to xet7.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 2c36eea6d5 Record Tamazight vote date translation progress
Update audit and upcoming changelog on 2026-09-14 with 510 pending originals. Preserve terminology confidence limits and record passing structural checks.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 5444fd2ff2 Translate Tamazight vote end date popup title
Replace French title on 2026-09-14 while preserving change-date action. Native components support provisional wording; mark election-to-card-voting and complete syntax as low confidence.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9582fd0b81 Record Tamazight search guidance translation progress
Update audit and upcoming changelog on 2026-09-14 with 511 pending originals. Preserve indexed-source limitations, low-confidence guidance adaptation and broader provenance review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e37cdd5645 Translate Tamazight search instructions heading
Replace French heading after native vocabulary review on 2026-09-14. Mark institutional directives to usage guidance adaptation as low confidence pending fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 093e5eefde Document Tamazight memory terminology follow-up
Link 2026-09-14 independent usage review in upcoming release notes. Preserve uncertainty and unchanged original pending counts.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 0b608edc68 Review independent Tamazight memory usage evidence
Record direct Moroccan RAM terminology usage on 2026-09-14 for three memory records. Preserve low-confidence flags because website translation provenance and full diagnostics grammar remain unverified. No locale values changed.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu d55d3a60c0 Document corrected translation reference provenance
Record dated 2026-09-14 attribution correction and renewed terminology review in upcoming release notes and TODO Later. Preserve unchanged pending counts and distinguish structural tests from fluency.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu c6ff27201e Correct Tamazight reference provenance assumptions
Review CNAM bibliography on 2026-09-14 and correct source notes in 98 translation records. MC£ denotes Tuareg sources and MC denotes Mokrane Chemim, not Central Moroccan dialect codes. Retain affected terminology for renewed review without altering locale values.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu afb1f9fb34 Record Tamazight due today translation progress
Update audit and upcoming changelog on 2026-09-14. Record 512 pending originals, passing checks and remaining deadline terminology review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e7e5ef563e Translate Tamazight due today status
Replace French wording on 2026-09-14 while preserving current qualifier and date placeholder. Record deadline terminology and full status syntax as low confidence pending review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a97a044b0d Record Ewe sighting calendar repair progress
Update audit and upcoming release notes on 2026-09-14 with 513 pending originals. Record restored sighting qualifier, passing structural checks and remaining full-language validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu d73bc647f8 Translate Ewe Saudi sighting calendar label
Restore the omitted sighting qualifier and native calendar wording on 2026-09-14. Preserve country identity and mark moon-sighting composition as low confidence pending fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a03d3e2e70 Document Dzongkha variant reference review
Link dated 2026-09-14 dictionary review in upcoming release notes. Keep unresolved Hijri variants and wider translation validation scope explicit.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 34e1e16d2e Review Dzongkha calendar variant reference limits
Compare directly downloaded publisher and GNU dictionary copies on 2026-09-14. Corroborate Coptic spelling and retain Hijri variants pending legible tabular, epoch and sighting terminology. Record extraction conflicts without treating indexed text as complete validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu a74567181e Record Dzongkha calendar translation progress
Update audit and upcoming changelog on 2026-09-14 with 514 pending originals. Record dictionary evidence, extraction limitation, passing checks and remaining fluent review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 3b9b9e677c Translate Dzongkha Coptic calendar label
Replace English-only label using Dzongkha computing dictionary vocabulary on 2026-09-14. Preserve Coptic identity and record full compound spelling as low confidence pending language review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 5ad0aa8405 Record Tamazight announcement translation progress
Update audit and upcoming changelog on 2026-09-14. Record 515 pending originals, one additional unflagged repair, passing checks and remaining language validation.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 3e14cc9601 Translate Tamazight announcement labels
Replace Arabic and French labels using native announcement vocabulary on 2026-09-14. Keep full administrator attribution syntax low confidence and retain separate system-wide active finding for review.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 9f976fba8c Record Tamazight external memory translation review
Update audit and upcoming release notes on 2026-09-14. Record 516 pending originals and unresolved free-memory terminology, with passing structural checks.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu e203ace1de Translate Tamazight external memory diagnostic
Replace French Node memory usage label on 2026-09-14. Preserve external qualifier without implying external storage; mark full mixed-source adaptation low confidence.
2026-09-14 11:08:07 +03:00
Lauri Ojansivu 0a08fd51a3 Record Tamazight card creator translation progress
Update audit and upcoming changelog on 2026-09-14. Record 517 pending originals, verified structural checks and remaining language validation.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu fcb0580de6 Translate Tamazight card creator display setting
Replace French setting text after native vocabulary review on 2026-09-14. Preserve creator ownership and existing terminology, with complete card label adaptation marked low confidence.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 5e2de7e7c9 Record Tamazight total memory repair progress
Update audit summary and upcoming release notes on 2026-09-14. Record 518 pending originals, passing structural checks and remaining fluent language validation.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 636e1aef81 Translate Tamazight total memory diagnostic
Replace Arabic OS total-memory label on 2026-09-14 using native total vocabulary and Moroccan computing terminology. Preserve total versus free memory distinction and mark full adaptation low confidence.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 86833045dd Record Tamazight upload status repair progress
Update audit and upcoming release notes on 2026-09-14 with 519 pending original findings and explicit low-confidence grammar review. Correction and metadata tests pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 9ecbdf30da Translate Tamazight upload completion status
Replace French status text after native vocabulary review on 2026-09-14. Mark positive completion morphology and full status sentence as low confidence pending fluent review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu a2e5a82cee Record Tamazight email imperative review
Update audit progress and upcoming changelog on 2026-09-14. Record the three refined email commands, passing correction checks, unchanged pending counts and remaining language review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu dbb9d53098 Refine Tamazight email click commands
Use the native MediaWiki imperative in three email bodies after reference review on 2026-09-14. Preserve placeholders and keep complete email wording under low-confidence language review.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 46fa0e2637 Document Tamazight memory usage repair
Update translation audit progress and upcoming release notes on 2026-09-14. Record 520 remaining original findings and preserve the wider language validation scope.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 6e7ecf2eb2 Repair Tamazight memory usage label dated 2026-09-14
Replace French diagnostics label with native usage and documented computer-memory components. Full nominal adaptation remains low confidence. All 17,637 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu cc7dec1810 Record existing account translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 521 pending originals. Custom-field and complete language review remain open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 746a10ff72 Repair Tamazight existing account prompt dated 2026-09-14
Replace French conditional prompt while preserving already-existing account. Native possession/conditional components support vocabulary; full clause remains low confidence. All 17,636 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 2e6b778f92 Record restore control repair dated 2026-09-14
Update audit, TODO Later and Upcoming with unflagged repair and remaining archive/imperative review. Original pending count remains 522. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 0e4ea74c7f Repair Tamazight restore control dated 2026-09-14
Replace unflagged Arabic Restore with native restoration-root command, recording imperative uncertainty. Archive-specific terminology remains unresolved. All 17,635 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 310def920b Record login error translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 522 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 9fbd8467a1 Repair Tamazight login attempt error dated 2026-09-14
Replace French error message while preserving error during attempted login without inventing a password or LDAP cause. Record temporal-clause uncertainty. All 17,634 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 5be4c48fee Record board scan translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 523 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu fd8b479c16 Repair Tamazight board scan labels dated 2026-09-14
Replace French checking labels while preserving separate file-attachment and member-avatar scopes. Record derived action noun and complete ownership uncertainty. All 17,633 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 67e314ccf4 Record native Tamazight opening verb review dated 2026-09-14
Add primary IRCAM transitive and indexed imperative references, distinguishing spelling variation and failed full-document retrieval from verified software phrasing. Keep values and counts unchanged. Audit-progress regression passes.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 7ef2d46405 Record card opening translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 525 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 3856f63a3a Repair Tamazight card opening labels dated 2026-09-14
Replace Arabic open action and many-cards-at-once label. Preserve imperative, multiple cards and one-operation qualifier. Record verb and full-phrase uncertainty. All 17,631 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 78ff1f98cb Record Tamazight field sum review dated 2026-09-14
Keep numeric sum distinct from addition operation, count and financial amount. Record reference limitations and failed full-PDF fetch without changing translation values or counts. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 43dda3e66b Record file size translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked maximum-size repairs and 526 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 07f7ea683d Repair Tamazight file size limits dated 2026-09-14
Replace Arabic avatar and upload file-size labels, preserving maximum, byte units and distinct scopes. Record mathematical-term adaptation and composed noun uncertainty. All 17,629 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 1c1908ead2 Record username translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked minimum-length repair and 528 pending original findings. Full language validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 7791cbb31b Repair Tamazight username length warning dated 2026-09-14
Replace French warning while preserving required minimum of three characters and username scope. Record full-composition uncertainty. All 17,627 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 17d11135dd Record removal fragment repair dated 2026-09-14
Update audit, TODO Later and Upcoming with unflagged correction and remaining passive/assignee review. Original pending count remains 529. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 35121ef8b2 Repair Tamazight removal source fragment dated 2026-09-14
Replace French Removed from while preserving passive event and source relation. Record finite-passive uncertainty; assignee terminology remains distinct and unresolved. All 17,626 correction regressions pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu d5ce846e44 Record move rule translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repairs and 529 pending originals. Full language verification remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:06 +03:00
Lauri Ojansivu 16ff43bf88 Repair Tamazight card move rule triggers dated 2026-09-14
Replace French move fragments while preserving another-list destination and when-event scope. Record derived passive and agreement uncertainty. All 17,625 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 318899a659 Record card activity translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked move/restore repairs and 530 pending findings. Keep full language validation open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu c7d630200e Repair Tamazight card move and restore activities dated 2026-09-14
Replace French messages using native move/restore components. Preserve old and new board locations and restore destination, with every placeholder intact. Full phrasing remains low confidence. All 17,623 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu edbcc0e4b7 Record member removal translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked corrections and 532 pending original findings. Preserve broader fluent review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 0e797a3aca Repair Tamazight member removal messages dated 2026-09-14
Replace French activity and Arabic removal control. Preserve member removal from card and all nested location placeholders. Native remove/member components are supported; complete activity wording remains low confidence. All 17,621 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e857407c3d Record JSON warning translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair and 533 pending original findings. Preserve full-language and clipboard terminology review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 6a3b81124b Repair Tamazight JSON validity warning dated 2026-09-14
Replace French warning with native text and negative-validity components, retaining JSON format. Complete construction remains low confidence; paste prompts remain open because clipboard terminology was not established. All 17,619 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e2c23e9e28 Record board avatar translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with source-linked repair, 15,310 corrected originals and 534 pending. Language validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e24b61f139 Repair Tamazight board avatar display label dated 2026-09-14
Replace French display label with native show/member components and existing avatar terminology. Preserve ownership by board members; full wording remains low confidence. All 17,618 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu b9afb0560d Record date translation repairs dated 2026-09-14
Update audit, TODO Later and Upcoming with five source-linked corrections and 535 pending original findings. Keep full language validation open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 8ca3f1a4a2 Repair Tamazight date editing messages dated 2026-09-14
Replace five French or Arabic popup and activity messages. Preserve start, end and received dates and destination-date/card placeholder roles. Record full-phrase and actor morphology uncertainty. All 17,617 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu ba330e49f8 Record avatar URL translation progress dated 2026-09-14
Update audit, TODO Later and Upcoming with the repair source and 15,306 corrected originals, 538 pending findings. Preserve low-confidence review scope. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 7d86e7a562 Repair Tamazight avatar URL migration labels dated 2026-09-14
Replace two French repair labels using the documented correction verb, retaining URL and existing avatar terminology. Complete wording remains low confidence pending language review. All 17,612 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 68b91c7d2a Record Excel import translation progress dated 2026-09-14
Link the Tamazight popup repair and update audit, TODO Later and Upcoming counts to 15,304 corrected originals and 540 pending. Keep fluent review and restored-value validation open. Changelog and progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 7a77db4e92 Repair Tamazight Excel import popup dated 2026-09-14
Replace French popup title while retaining Excel CSV/TSV names. Record native entry imperative and cached import terminology evidence with import-specific wording still low confidence. All 17,610 correction regressions pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu f4326910b3 Record Fulah calendar terminology review dated 2026-09-14
Distinguish education-guide calendar and grid/table terms from unresolved technical epoch qualifiers. Retain existing values pending complete evidence and refresh Upcoming to cover attachment, maintenance and calendar repairs. Audit-progress and changelog checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu e4c19c6d76 Record Fulah sighting repair progress dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked Saudi sighting fix, provisional-source issues and unresolved epoch/fluency scope. Track 15,303 corrected originals and 541 pending findings. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 8e8198e26d Restore Fulah Saudi calendar moon-sighting qualifier
Replace English label with reference-supported Fulah components and retain moon-sighting distinction. Record provisional CLDR punctuation issue, reject Swedish homograph as evidence and retain full technical-language uncertainty. All 17,609 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu a25844ff5e Record Fulah CLDR calendar repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked native Adlam names, Latin transcription caveats and remaining Hijri variant scope. Track 15,302 corrected originals and 542 pending findings. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 1582958d23 Use Fulah Adlam CLDR names for Buddhist and Coptic calendars
Transcribe full native calendar names into the Latin ff translation instead of bare English adjectives. Record exact Adlam source and low-confidence cross-script/regional transcription caveats. Three Hijri variant findings remain pending. All 17,608 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 91b654bb63 Record provisional Bambara calendar wording dated 2026-09-14
Update short audit, TODO Later and Upcoming with explicit lack of canonical native attestation and remaining epoch/fluency scope. Track 15,300 corrected originals and 544 pending findings. Mechanical correction, changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 281bc41b76 Add provisional Bambara Buddhist and Coptic calendar names
Restore calendar noun in two bare English labels using existing Bambara construction and provisional borrowed/proper names. Explicitly record lack of canonical native attestation, low-confidence spelling and composition, and unresolved epoch variants. All 17,606 mechanical correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 62557dc24a Record provisional Tamazight duplicate-list repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked repairs and explicit unresolved technical-meaning/grammar caveats. Track 15,298 corrected originals and 546 pending findings. Mechanical checks do not prove fluency; wider validation remains open. Changelog and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu c288651baa Repair Tamazight duplicate and empty-list deletion labels
Replace four French findings. Preserve duplicate and empty qualifiers using provisional repeat-derived and contains-nothing wording. Avoid private/double lexical ambiguity; record unresolved technical term and grammar explicitly. All 17,604 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu ffbd7fc60f Record Tamazight URL action repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked URL scope repairs and full language-validation caveats. Track 15,294 corrected originals and 550 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 27d9f69f48 Repair Tamazight file and attachment URL correction actions
Replace two French findings, preserving all-file versus attachment URL scope and correction action. Record exact lexicon references and dialect, acronym and noun-relation caveats. All 17,600 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 3c98f44636 Record Tamazight migration label repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked missing-list/ID and file-URL repairs. Track 15,292 corrected originals and 552 pending findings. Preserve wider language-validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 37fdff2d2f Repair Tamazight missing-list and migration correction labels
Replace four French findings, preserving create/fix, missing lists/IDs and file-URL correction scope. Record native and dialect-specific references with derived negative-plural grammar caveats. All 17,598 correction checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu d7f2fb7a80 Record Tamazight upload wording repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with three unflagged source-linked repairs. Keep original pending counts unchanged and retain full language-validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:05 +03:00
Lauri Ojansivu 62f68966a0 Repair Tamazight attached activity and upload export headers
Preserve both ordered %s tokens, attachment event meaning, upload direction and by-actor versus at-time headers. Record native roots with derived conjugation and dialect caveats. All 17,594 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4707fc9fb9 Record Tamazight filesystem wording repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked count/filesystem fixes and low-confidence adaptation caveats. Track 15,288 corrected originals and 556 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 0d1adc6879 Repair Tamazight attachment count and filesystem move wording
Replace four French/Arabic messages. Preserve minicard count, singular/all/all-of-board attachment scope and filesystem destination. Record explicit lexicon references with dialect and grammar caveats. All 17,591 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 5751d017aa Record Tamazight attachment message repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with eight source-linked repairs and exact scope caveats. Track 15,284 corrected originals and 560 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu b150142b28 Repair Tamazight attachment activities and bulk-move messages
Replace eight French/mixed-language values. Preserve deleted action, exact %s, when fragment, personal ownership, all versus all-of-board scope and GridFS/S3 destinations. Record dialect and composition caveats. All 17,587 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu c32d4cdce6 Record Tamazight attachment repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked attachment repairs, nine unflagged fixes and explicit dialect caveats. Track 15,278 corrected originals and 566 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 1dc34b1a93 Repair Tamazight attachment labels and action popups
Replace twelve French/Arabic values, preserving singular/plural attachment, distinct actions and GridFS/S3 destinations. Reference explicit Kabyle mail-attachment terminology with dialect, transcription and software-composition caveats. All 17,579 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 5e07b6c8d5 Record Tamazight field visibility repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with field scope, low-confidence grammar and source-linked correction evidence. Track 15,275 corrected originals and 569 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4dddf82cb2 Repair Tamazight field label and board-admin visibility wording
Preserve field-label/minicard scope and visible-only-to-board-admin restriction. Include the unflagged unclear visibility translation and record native components with low-confidence grammar caveats. All 17,567 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 192686d203 Record Tamazight title repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with current counts and source-linked title repairs. Preserve low-confidence and broader validation scope. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu d648d4e23f Repair Tamazight search, card import and received-date titles
Replace three French findings while preserving all-board scope, Trello import direction and received date distinct from other dates. Record native component references and low-confidence software composition. All 17,565 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu f94bae4479 Record Tamazight group display repairs dated 2026-09-14
Update short audit, TODO Later and Upcoming with source-linked evidence, native display/index distinction and low-confidence grammar caveats. Track 15,271 corrected originals and 573 pending findings. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 36313cda33 Repair Tamazight added-group display labels
Preserve added qualifier, plural team/organization scope and displayed-below relation. Reference native addition and display components without confusing indexed with displayed. Record derived agreement and dialect caveats. All 17,562 correction checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu 4203b96bfa Record Tamazight board-group repair progress dated 2026-09-14
Update the short audit, TODO Later and Upcoming source-linked entry. Track 15,269 corrected originals and 575 pending findings, including 432 Tamazight. Preserve wider validation scope and low-confidence caveats. Changelog format, release placement and audit-progress checks pass.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu ec6e915947 Repair Tamazight board-group removal and creation guidance
Replace four French findings, preserving removal from a board and contact-administrator creation instructions. Record native component references and low-confidence conjugation, dialect and full-phrase caveats. Verify all 17,560 audited corrections, rendering and placeholder invariants.
2026-09-14 11:08:04 +03:00
Lauri Ojansivu fd349e0d37 Record Tamazight deletion warning repairs dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 7a0afb3318 Repair Tamazight group deletion guards and irreversible warnings 2026-09-14 11:08:04 +03:00
Lauri Ojansivu c5be484d0b Record Tamazight team repair progress dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 36f198b383 Repair Tamazight team labels and organization name errors 2026-09-14 11:08:04 +03:00
Lauri Ojansivu ae8df560f5 Record Tamazight email template repair progress dated 2026-09-14 2026-09-14 11:08:04 +03:00
Lauri Ojansivu 97a8210e63 Repair Tamazight email test recipient and template labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 8c21b2792b Record Tamazight organization repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 3ae48d78d2 Repair Tamazight organization labels and missing-name error 2026-09-14 11:08:03 +03:00
Lauri Ojansivu c4863b52a8 Record Tamazight comment repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu b9f553d2ff Repair Tamazight comment search error and header wording 2026-09-14 11:08:03 +03:00
Lauri Ojansivu cb8a321392 Record Tamazight multi-selection repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 95c40e770b Repair Tamazight multi-selection label and member actions 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 77c01cbed3 Record Tamazight placement repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 081b2c8af9 Repair Tamazight card and swimlane placement labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 78972dbe30 Record Tamazight calendar navigation review dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 8e39144f60 Repair Tamazight previous and next month navigation labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 2e29c11a0e Record Tamazight diagnostic translation review dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu bc8ef464f8 Repair Tamazight selected and diagnostic details labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 1a5ab8b5a1 Record Tamazight card display repair progress dated 2026-09-14 2026-09-14 11:08:03 +03:00
Lauri Ojansivu ac49f847d0 Repair Tamazight card sorting and display labels 2026-09-14 11:08:03 +03:00
Lauri Ojansivu 4daac53264 Record Tamazight label repair progress dated 2026-09-14 2026-09-14 11:08:02 +03:00
Lauri Ojansivu ee1845167c Repair Tamazight label actions and minicard text visibility 2026-09-14 11:08:02 +03:00
Lauri Ojansivu ad963fc16b Record wekan22 build verification in Upcoming changelog 2026-09-14 11:08:02 +03:00
Lauri Ojansivu 8532f1d034 Record used-email and username translation progress
Update dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open grammar, fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 16d4a73dee Translate Tamazight used-email warning and username import
Replace Arabic and French while preserving already-used email address versus username import roles. Predicate agreement, derived plural nouns and import imperative remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu cfdb01f83e Record selected-list translation repair progress
Update dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain spelling and grammar plus wider validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 93c55d1fc9 Translate Tamazight selected-list position labels
Replace French and preserve opposite left/right directions and selected-list scope. Native direction vocabulary is reference-supported; emphatic spelling, bound forms and full phrase agreement remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu d1456d3598 Record board invitation translation repair progress
Update dated source commit, correction inventory and remaining original findings in Audit, TODO Later and Upcoming. Retain the open fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 288a2e7e53 Translate Tamazight board invitation templates and code label
Replace French mail/push templates and Arabic invitation-code label. Preserve inviter, recipient, board membership, cooperation purpose, link, registration code and exact placeholders. Full constructions, dialect and software adaptations remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu b6e01982c1 Record registration invitation translation progress
Refresh dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open full-language validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu fd6e6bcd7b Translate Tamazight registration invitation diagnostics
Replace French sending error and success messages. Preserve registration/account-creation purpose without claiming invitation acceptance. Derived nouns, bound forms, affirmative success and full purpose phrases remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 427efc578f Record invitation translation repair progress
Update dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Preserve the open dialect, fluency and wider validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 50a4def6a0 Translate Tamazight invitation email template labels
Replace Arabic invitation body/subject labels and Invite action. Preserve invitation versus reception or computer prompt. Dialect adaptation, imperative spelling and full label chains remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 6e6bd1a122 Record activity email label translation progress
Update dated source commit and exact correction inventory in Audit, TODO Later and Upcoming. Keep uncertain terminology and broader language validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu ccd2f80728 Translate Tamazight activity email template labels
Replace Arabic activity and template labels, restore the omitted notification meaning and preserve body versus subject. Activity terminology adaptation, bound forms and full label chains remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 0d889466b5 Record enrollment and verification translation progress
Update dated source commit, exact correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain phrases and broader language validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu bc98c07cc4 Translate Tamazight enrollment and verification email bodies
Replace French and preserve distinct service-use versus account-email verification purposes, paragraph layout and user/URL tokens. Service adaptation, nested purpose clauses, verify spelling and borrowed click remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu bfc57173fc Record account email repair progress and group Upcoming translations
Update dated source commit, correction inventory and remaining audit findings. Group the five Upcoming translation entries and refresh their overview. Preserve the open fluency and broader validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 3834d033da Translate Tamazight enrollment subject and password reset email
Replace French while preserving account ownership, password reset purpose, greeting, thanks, paragraphs and site/user/URL tokens. Recipient paraphrase, reset conjugation, borrowed click imperative and full mail composition remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu b1bf1f9d97 Record email translation repair progress
Update dated source commit, correction inventory and remaining findings in Audit, TODO Later and Upcoming. Keep uncertain grammar and broader validation open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu c55d70403a Translate Tamazight email sending diagnostics
Replace three French failure, attempt-error and SMTP success messages. Preserve negative versus affirmative result and user ownership. Derived sending noun, affirmative success predicate and full sentences remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 2077f32c7f Record lockout scope translation repair progress
Refresh dated Audit, TODO Later and Upcoming notes with the verified correction inventory and remaining findings. Keep full-language validation and uncertain phrasing open.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 193b225205 Translate Tamazight lockout account scopes and multiple operators
Replace three French values. Preserve existing-account correct-username/wrong-password versus nonexistent-username cases and multiple-operator capability. Account predicates, agreement and full phrases remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 724b0d4ce7 Record Tamazight search explanation repair progress
Update the dated audit source commit and correction inventory, refresh TODO Later counts and add Upcoming search translation notes. Preserve the open full-language validation scope.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu eab3486e69 Repair Tamazight search OR and AND explanations
Replace French and correct the mistaken optional interpretation of OR. Preserve any versus all condition scopes, example names and operator tokens. Full logical phrases and return conjugations remain low confidence pending fluent review.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 3e878a9eaa Add post-v11.76 translation repairs to Upcoming
Create Upcoming notes for the rule report and popup source commit after the new release. Refresh TODO Later validation status while leaving published release notes unchanged.
2026-09-14 11:08:02 +03:00
Lauri Ojansivu 56b805a165 Record rule popup translation repair progress
Record the dated source commit and verified correction inventory in Audit, TODO Later and Upcoming. These three unflagged repairs leave the original pending count unchanged; wider language validation remains open.
2026-09-14 11:08:01 +03:00
Lauri Ojansivu 7e3e11edaf Repair Tamazight rule report and popup wording
Replace French report and details and correct rule terminology in import/export. Preserve singular report and plural rules and both transfer actions. Import imperative derivation and full software phrasing remain low confidence pending fluent review.
2026-09-14 11:08:01 +03:00
github-actions[bot] 25a6c30785 Bump versions for v11.76 2026-09-14 01:37:00 +00:00
Lauri Ojansivu 83821962e6 Prepare v11.76 release 2026-09-14 04:35:32 +03:00
Lauri Ojansivu 4daeff9669 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:22 +03:00
Lauri Ojansivu 75a3b67702 Record rule repair progress and correct release entry placement
Update dated translation audit counts, TODO Later and Upcoming notes. Move five post-release translation entries from v11.75 to Upcoming because that release does not contain their commits. Preserve their descriptions and keep language validation open.
2026-09-14 04:35:17 +03:00
Lauri Ojansivu 207af96963 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:05 +03:00
Lauri Ojansivu b0b3520cc1 Repair Tamazight rule labels and action terminology
Replace French and Arabic values and distinguish the IRCAM rule noun from regular. Preserve singular and plural roles, board ownership and rule-title input. Software adaptation and complete phrases remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 3a5ddd1c87 Record custom HTML translation repair progress
Update the dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming notes. Preserve the open language-validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4901ec2980 Translate Tamazight custom HTML insertion actions
Replace French while preserving opening and closing body tags and opposite insertion directions. Custom qualifier adaptation and full phrase composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4b661a5bd0 Record start and end translation repair progress
Update dated source commit and exact correction inventory in the audit, TODO Later status and Upcoming notes. Keep uncertain phrasing and wider validation explicitly open.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 9143606500 Translate Tamazight start and end time messages
Replace seven French and Arabic labels and activity fragments using native start and expiration components. Preserve old versus new time placeholders. Generic calendar adaptation and full activity composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ed0b853623 Update translation audit after received-time repairs
Record the dated source commit, verified correction inventory and remaining original findings. Refresh the TODO Later status and Upcoming translation notes while retaining the open fluency and wider validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 44c26d4c9c Translate Tamazight received-time activities
Replace French in both received-time activity fragments. Preserve current and previous time placeholders and destination direction. Reception terminology from the mixed-source computing lexicon and full phrase composition are low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu a6f136a8df Document successful rebuild of the wekan22 failure
Identify the saved v11.75 missing-Moment error as already repaired. Record the fresh Linux arm64 Meteor bundle build and passing assignee, calendar and release-preflight regressions in Upcoming notes. Keep translation audit progress unchanged during build verification.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 2f572cf139 Record Tamazight operator diagnostic repair progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu e40b678fd9 Repair Tamazight operator and expected-number diagnostics
Preserve operator classification and required versus received value, retaining format tokens exactly. Mathematical terminology adaptation, derived forms and full diagnostic phrasing remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 8c7b177128 Record Tamazight visibility and sorting translation progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu 105e51ebf3 Translate Tamazight visibility and descending-sort search help
Preserve public/private board scope and literal descending-sort prefix. Moroccan references support visibility terms; complete phrases and prefix composition remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ab5b085052 Record Tamazight status and validation translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 85d88589f4 Repair Tamazight status help and validation labels
Replace French and Arabic while preserving status choices, date versus time validation and exact format tokens. Derived forms and complete diagnostics remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fd1e46de59 Record Tamazight comment and label search repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 50c35f1fb0 Translate Tamazight comment and label search help
Preserve comment containment, color-or-name alternatives, expanded and abbreviated operator syntax. Derived terminology and full phrase composition remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 4bd5565b67 Record Tamazight scoped search translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1c80a78ea4 Translate Tamazight creator label and scoped search instructions
Preserve member versus creator and board versus list title matching, retaining executable operator tokens. Complete relative clauses, plural and possessive agreement remain low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 754713e406 Record Tamazight time and due-date repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0f4d5adc3a Repair Tamazight time labels and due-date activity wording
Replace Arabic and French, distinguish now from today and preserve due-date destination/card placeholder order. Composed diagnostics, conjugation and inherited due-date terminology remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu dafa3a9a84 Record Tamazight ordering and export repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1f3156f934 Repair Tamazight creation-date sorting and export messages
Replace French and mixed-script text while preserving sort direction, card versus board scope, export restrictions and literal format names. Complete noun and capability phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0d82edf247 Record account prompt translation repairs and color review limits 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 93c1fe9ef9 Translate Tamazight account creation and existing-account prompts
Preserve completed account creation, availability of sign-in and the existing-account question using native MediaWiki components. Complete capability and affirmative possession phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 02d7f2439c Refresh upcoming release summary and translation audit totals 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 6d5c26c456 Record Tamazight Enter instruction repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e07e742d2c Translate Tamazight Enter instructions for custom fields
Replace French options/items instructions, keeping Enter as the physical key and preserving action scopes. Complete keyboard phrasing and inherited item terminology remain low confidence. All 17,413 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu f4a69c3d92 Record Tamazight week and display repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 62daaf0331 Translate Tamazight week and All Boards display settings
Preserve ISO week-of-year, selectable first weekday and All Boards page display distinctions with native components. Full genitive and selection phrases remain low confidence. All 17,411 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 7ce014fb53 Record Tamazight sorting repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e0b706b0ad Translate Tamazight sorting label and invalid-sort error
Replace Arabic/French using directly attested native sort terminology, preserving the format token and invalid-sort meaning. Full diagnostic composition remains low confidence. All 17,408 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fe502f2151 Record Tamazight comment permission repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 07f665ef0b Translate Tamazight comment and read-only permissions
Repair Arabic/French role descriptions while preserving posting, comment visibility and read-only viewing/edit restrictions. Full capability conjugations and role composition remain low confidence. All 17,406 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 133c365262 Record Tamazight access requirement repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1eca0d45b2 Translate Tamazight board access requirements
Replace French permission and board-role errors, retaining signed-in users, board membership and board administrator distinctions. Full conjugation and role/genitive composition remain low confidence. All 17,403 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 9218a4a9d2 Record Tamazight bulk-card sample repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu a72de52465 Translate Tamazight bulk-card JSON sample values
Replace French in six sample values while retaining JSON property names, three-card order and first/second/last identification. Full card genitives and derived feminine agreement remain low confidence. All 17,400 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu a142fbd341 Group upcoming translation repairs and refresh release overview 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 2ad42c8e63 Record Tamazight card-order repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e8e35db559 Translate Tamazight top and bottom card-order commands
Repair six French labels with consistent first/last place wording, preserving add/move and own/selected list distinctions. Native components are reference-supported; full software phrases and possessive composition remain low confidence. All 17,399 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0cf6c33882 Record Tamazight deletion and member repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 8682dbae5a Repair Tamazight deletion and board-member removal labels
Use native Tifinagh deletion wording, translate custom-field confirmation and member-removal activity, and preserve member/board placeholders. Full custom-field and activity composition remain low confidence. All 17,393 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu b49cce0dc7 Record Tamazight Subject and member repair progress 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 004796543a Repair Tamazight email subject and current-card members labels
Use a directly attested native Subject label and compose scoped current-card member wording. Full card/board composition remains low confidence. All 17,390 correction checks pass, including exact placeholder and newer-translation preference coverage.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5453d352a7 Record Tamazight email permission repair progress
Update dated audit and Upcoming notes to 15,167 corrected originals and 677 pending findings. Retain full-phrase confidence limits and remaining validation scope.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu bfad1aa765 Translate Tamazight email-change permission
Replace Arabic using native MediaWiki permission, change and email components. Complete composition remains low confidence pending fluent review. Verify all 17,388 correction records, placeholders, rendering and newer-translation preference.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu b199c07565 Document upcoming build and release preflight fixes
Record successful Linux arm64 bundle compilation, regression coverage and remaining browser/platform verification limits. Document the read-only Upcoming notes check.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 6f6e78a9a0 Fix assignee bundle dependency and require upcoming release notes
Use existing native date formatting instead of the removed Moment dependency. Check real Upcoming entries before release tool installation or mutations, including explicit version overrides. Cover missing, empty and duplicate notes with read-only regression tests.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu dcccb718f3 Record mail-subject translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 289231a7c6 Translate Tamazight password-reset and email-verification subjects
Replace French with native component wording and preserve the site-name placeholder. Full email phrasing, possessive attachment and verification verb dialect spelling remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 7e39fc89c1 Record dropdown translation repairs and selected-card color scope 2026-09-14 04:34:58 +03:00
Lauri Ojansivu f85bbbf5b5 Translate Tamazight dropdown choices and selection-color title
Replace French labels while keeping unknown distinct from none and selection color distinct from label creation. Complete phrases, derived noun forms and dropdown-option sense remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5d0967f7db Record field-scope translation repairs and remaining review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 614ba7687d Translate Tamazight field display and card-scope settings
Replace French field settings and the Arabic change-date popup title. Preserve new-card versus all-card scope. Full phrases, software-field usage and derived card forms remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5a64686d7a Record field translation repairs and software terminology caveats 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 9639aabe34 Translate Tamazight create-edit and date-field labels
Replace Arabic and French with native create/edit/date vocabulary and IRCAM-attested field terminology. Keep button and popup creation wording consistent. Full software-field phrasing and bound date composition remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 149aa75c4b Record notification translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 520b0d8f80 Repair Tamazight notification controls and unread-comment noun
Replace French notification labels and the incorrect image noun in the unread-comments tooltip. Preserve opposite read/unread states. Full command phrasing and inherited passive-read inflection remain low confidence despite reference-supported component vocabulary.
2026-09-14 04:34:58 +03:00
github-actions[bot] e556118a99 Bump versions for v11.75 2026-09-14 00:45:24 +00:00
Lauri Ojansivu 9c02d84414 Record member-removal and error terminology repair progress 2026-09-14 03:43:38 +03:00
Lauri Ojansivu 6e2824a6ed CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:43:37 +03:00
Lauri Ojansivu 8b34511fe8 Translate Tamazight member-removal and error-clearing labels
Replace four French values. Native sources attest remove, all, member and error components, including the error plural in the CNDH Amazigh memorandum. Full command phrasing, card compounds and software-error usage remain low confidence.
2026-09-14 03:43:10 +03:00
Lauri Ojansivu 9278de5931 Record member-selection and card-list translation repair progress 2026-09-14 03:41:09 +03:00
Lauri Ojansivu c60ea35b7d Translate Tamazight member selection and card-list controls
Replace three French labels while preserving import-member selection, full-card list display and per-list card counts. Native component vocabulary is reference-supported; complete phrases, derived bound forms and kanban card terminology remain low confidence.
2026-09-14 03:40:47 +03:00
Lauri Ojansivu 8ec1e97396 Record search-link translation repairs and current audit scope 2026-09-14 03:39:36 +03:00
Lauri Ojansivu 4f37e7278d Translate Tamazight search-link and board-renaming labels
Use native MediaWiki link, search and rename components. Full search-link demonstrative phrasing and board genitive wording remain low confidence and need fluent review. Preserve the search-link purpose and board target.
2026-09-14 03:39:08 +03:00
Lauri Ojansivu 650ceed585 Prepare v11.75 release 2026-09-14 03:38:56 +03:00
Lauri Ojansivu a6a7bb8d5a Update upcoming release summary and translation audit progress 2026-09-14 03:38:02 +03:00
Lauri Ojansivu 70784cac08 Record membership translation repairs and remaining scope 2026-09-14 03:35:08 +03:00
Lauri Ojansivu 4ca8e5d1b6 Translate Tamazight member and board-members labels
Use the native plural member noun while preserving board membership scope. The complete all-board-members compound and kanban board terminology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:34:48 +03:00
Lauri Ojansivu e6a58ef63d CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:34:40 +03:00
Lauri Ojansivu f0b85220ea Document security-aware activity rendering and audit status 2026-09-14 03:34:39 +03:00
Lauri Ojansivu e5937d5314 Render activity values with the shared security-aware viewer
Apply Markdown, emojis and permitted HTML to card and sidebar activity values. Sanitize completed sentences and honor plain-link mode, retaining existing source URL guards and avoiding nested navigation anchors. Add positive, negative and browser regression coverage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu a95bc74bff Record text-editing repair and checklist dialect review 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 0b8895ab82 Repair Tamazight checklist text-editing label
Remove an extraneous first qualifier and use native edit/text components. Full as-text phrasing and bound spelling remain low confidence; candidate checklist control vocabulary is marked Kabyle and is not established as Moroccan usage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 3a2f8b041e Record description repairs in new upcoming release 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 4dd56bc53a Translate Tamazight detailed-description and all-users choices
Replace French and Arabic using native component terms. Full description-with-more-details composition remains low confidence; all-users view usage also needs fluent review.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 1a48f2bd90 Record weekly due-date translation repairs 2026-09-14 03:34:39 +03:00
154 changed files with 37612 additions and 1444 deletions

No files matched your search

+7 -18
View File
@@ -1063,7 +1063,7 @@ jobs:
path: provenance
merge-multiple: true
- name: Compose the release notes, provenance first
- name: Compose release notes from the changelog only
# The notes go from FILE to FILE and never become a shell value. Two
# earlier shapes each broke a release: inline `${{ … }}` put them in the
# shell SOURCE, so a backtick in any `code` span ran as a command (v10.59
@@ -1073,8 +1073,7 @@ jobs:
# from CHANGELOG.md, appended with cat, the text is data all the way.
run: |
set -euo pipefail
bash releases/provenance-table.sh > release-notes.md || true
bash releases/release-notes.sh "$VERSION" >> release-notes.md
bash releases/release-notes.sh "$VERSION" > release-notes.md
echo "----- release notes -----"
head -40 release-notes.md
@@ -5317,15 +5316,8 @@ jobs:
echo "::error::nextcloud FAILED. The ::error:: line in this job's log, above, says which step and why."
fi
# ── The provenance table, completed ─────────────────────────────────────────
#
# The release is CREATED before win64, mac-arm64 and the extra architectures
# are built - those jobs need a release to upload their bundles to - so the
# table it is created with can only cover amd64 and arm64. This runs after all
# of them and rewrites the notes with every bundle's rows in.
#
# always(): a platform that failed should not cost the release its table for
# the platforms that succeeded.
# Refresh the selected changelog notes after builds. Binary provenance remains
# in build artifacts and is never appended to release notes.
release-notes:
name: complete the release notes
needs:
@@ -5359,7 +5351,7 @@ jobs:
path: provenance
merge-multiple: true
- name: Rewrite the notes with every bundle in the table
- name: Refresh release notes from the changelog only
# File to file, never a shell value: see the "Compose the release notes"
# step for the two ways that broke a release.
env:
@@ -5367,10 +5359,7 @@ jobs:
VERSION: ${{ needs.prepare.outputs.version }}
run: |
set -euo pipefail
rows=$(find provenance -name '*.tsv' 2>/dev/null | wc -l)
echo "Provenance files collected: $rows"
bash releases/provenance-table.sh > release-notes.md || true
bash releases/release-notes.sh "$VERSION" >> release-notes.md
bash releases/release-notes.sh "$VERSION" > release-notes.md
gh release edit --repo "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" --notes-file release-notes.md
echo "Release notes updated with the provenance of every bundle built."
echo "Release notes updated from the changelog; binary provenance stays in build artifacts."
head -40 release-notes.md
+11 -13
View File
@@ -555,19 +555,17 @@ directly after the merge.
`<details>` blocks below carry that information. Keep the paragraph current as
topics change, and shorten it when added commits make it grow. A finished release
keeps the paragraph it was written with.
- **No release section carries a Platform/Binary/From/Version/SHA256 table, and
none ever should again.** It used to sit right under the `**In short:**`
paragraph, then moved to a `**Binaries in these bundles:**` label at the end
of the section — both tried and both removed, because CHANGELOG.md is not
where that data belongs: it made every release's entry mostly a giant table
nobody read, on top of what `<details>` entries already say. "Which Node.js
is in the arm64 bundle of 10.69, and was it checked" is answered by the
**GitHub Release notes** instead: `releases/provenance-table.sh` puts the
same table at the TOP of those, built fresh from the `provenance.tsv` rows
each build job records (see `releases/record-provenance.sh`), every time a
release is made — so it is never stale and never needs hand-editing into
CHANGELOG.md. Adding a binaries table back into a CHANGELOG entry, in any
shape, is reintroducing something the maintainer removed on purpose.
- **Neither CHANGELOG.md nor release notes may contain a binaries provenance
section or a Platform/Bundle/Binary/From/Version/Checked/SHA256 table.**
Do not add "Binaries in these bundles" at the top or bottom of either.
Release notes summarize each Translations group as only a list of updated
languages. Add `**Languages updated:**` with comma-separated full language
names below the group label; keep detailed entries in the changelog and audit.
Release notes have only In short, Security, Translations (language list),
the standard thanks line and More details at ChangeLog with the release
anchor link. Other details stay in CHANGELOG.md. Keep download
verification and `provenance.tsv` build artifacts for diagnostics; do not
append their contents or `releases/provenance-table.sh` output to notes.
- **Inside a subsection, entries are GROUPED BY TOPIC/AREA.** A release touches a handful
of areas and repeating the area's name in every summary is the noise this
removes — twelve entries that each begin "All Boards:" say "All Boards" twelve
+4726 -33
View File
File diff suppressed because it is too large. Load diff
+11 -13
View File
@@ -555,19 +555,17 @@ directly after the merge.
`<details>` blocks below carry that information. Keep the paragraph current as
topics change, and shorten it when added commits make it grow. A finished release
keeps the paragraph it was written with.
- **No release section carries a Platform/Binary/From/Version/SHA256 table, and
none ever should again.** It used to sit right under the `**In short:**`
paragraph, then moved to a `**Binaries in these bundles:**` label at the end
of the section — both tried and both removed, because CHANGELOG.md is not
where that data belongs: it made every release's entry mostly a giant table
nobody read, on top of what `<details>` entries already say. "Which Node.js
is in the arm64 bundle of 10.69, and was it checked" is answered by the
**GitHub Release notes** instead: `releases/provenance-table.sh` puts the
same table at the TOP of those, built fresh from the `provenance.tsv` rows
each build job records (see `releases/record-provenance.sh`), every time a
release is made — so it is never stale and never needs hand-editing into
CHANGELOG.md. Adding a binaries table back into a CHANGELOG entry, in any
shape, is reintroducing something the maintainer removed on purpose.
- **Neither CHANGELOG.md nor release notes may contain a binaries provenance
section or a Platform/Bundle/Binary/From/Version/Checked/SHA256 table.**
Do not add "Binaries in these bundles" at the top or bottom of either.
Release notes summarize each Translations group as only a list of updated
languages. Add `**Languages updated:**` with comma-separated full language
names below the group label; keep detailed entries in the changelog and audit.
Release notes have only In short, Security, Translations (language list),
the standard thanks line and More details at ChangeLog with the release
anchor link. Other details stay in CHANGELOG.md. Keep download
verification and `provenance.tsv` build artifacts for diagnostics; do not
append their contents or `releases/provenance-table.sh` output to notes.
- **Inside a subsection, entries are GROUPED BY TOPIC/AREA.** A release touches a handful
of areas and repeating the area's name in every summary is the noise this
removes — twelve entries that each begin "All Boards:" say "All Boards" twelve
+1 -1
View File
@@ -20,7 +20,7 @@ LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
# TARGETARCH and TARGETVARIANT are automatically provided by Docker Buildx
ARG TARGETARCH
ARG TARGETVARIANT
ARG VERSION=11.74
ARG VERSION=11.78
ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils gnupg wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3 unzip"
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v11.74.0"
appVersion: "v11.78.0"
files:
userUploads:
- README.md
+9 -7
View File
@@ -82,7 +82,7 @@ if /i "%PROCESSOR_ARCHITECTURE%"=="ARM64" set "PLATFORM_ARCH=arm64"
if /i "%PROCESSOR_ARCHITEW6432%"=="ARM64" set "PLATFORM_ARCH=arm64"
echo Platform: %PLATFORM_OS% %PLATFORM_ARCH%
echo Repo: %REPO%
echo Note: Logs use .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\.
echo Note: Logs use .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\.
:menu
echo.
@@ -246,6 +246,8 @@ goto menu_releases
REM ---------------------------------------------------------------------------
:rel_release
REM Release notes: In short, Security, translation languages, thanks and changelog link.
REM Binary provenance stays in build artifacts.
echo.
echo -- Releases / Release -- ^(0 = Back^)
echo 1^) Release ALL platforms: push CHANGELOG, trigger release-all.yml
@@ -1055,7 +1057,7 @@ set "S_mocha=RUN" & set "S_unit=RUN" & set "S_import=RUN" & set "S_e2e=RUN"
set "S_chromium=RUN" & set "S_firefox=RUN" & set "S_webkit=RUN"
set "C_mocha=0" & set "C_unit=0" & set "C_import=0" & set "C_e2e=0"
set "C_chromium=0" & set "C_firefox=0" & set "C_webkit=0"
REM Each run gets its own .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\ dir (stamped once at run start), so
REM Each run gets its own .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\ dir (stamped once at run start), so
REM logs are never overwritten and previous runs are kept. PowerShell gives a
REM locale-independent yyyy-MM-dd_HH-mm-ss; %RUN_LOGDIR% is absolute so it works
REM from any job's working directory (e.g. the browser job runs in tests\playwright).
@@ -1199,7 +1201,7 @@ set "S_mocha=RUN" & set "S_unit=RUN" & set "S_import=RUN" & set "S_e2e=RUN"
set "S_chromium=RUN" & set "S_firefox=RUN" & set "S_webkit=RUN"
set "C_mocha=0" & set "C_unit=0" & set "C_import=0" & set "C_e2e=0"
set "C_chromium=0" & set "C_firefox=0" & set "C_webkit=0"
REM Each run gets its own .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\ dir (stamped once at run start), so
REM Each run gets its own .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\ dir (stamped once at run start), so
REM logs are never overwritten and previous runs are kept. PowerShell gives a
REM locale-independent yyyy-MM-dd_HH-mm-ss; %RUN_LOGDIR% is absolute so it works
REM from any job's working directory (e.g. the browser job runs in tests\playwright).
@@ -1500,7 +1502,7 @@ echo Log directory: %LOG_DIRECTORY%
exit /b 0
:onelog
REM Set ONELOG to .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\wekan-%1.log - the same place every other
REM Set ONELOG to .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\wekan-%1.log - the same place every other
REM test run writes, so "the newest test logs" is one directory whichever option
REM produced them. A larger run (EVERYTHING) exports WEKAN_LOGDIR first, and then
REM the whole run stays in that one directory. The Windows equivalent of build.sh's
@@ -1896,7 +1898,7 @@ REM there, and installing Go and the module dependencies if they are
REM missing), then run the whole FerretDB v1 query catalogue against every
REM database that has a Docker image for THIS CPU - one at a time, because they
REM all use the same FerretDB port - and compare that they all answered the same.
REM Results go to .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\ with every other test run's.
REM Results go to .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\ with every other test run's.
REM
REM The orchestration is one bash script, shared with build.sh rather than
REM rewritten here: a second implementation would drift, and Docker Desktop on
@@ -1919,7 +1921,7 @@ REM that .gitignore and .meteorignore already exclude, instead of one ignored
REM subdirectory each at the repo root. It is cloned here when it is not there,
REM the same as build.sh's ensure_tool_repo does, so neither script depends on
REM the other having been run first. Its build.sh installs Go and the Go modules
REM when they are missing, and writes its logs to .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\ with every
REM when they are missing, and writes its logs to .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\ with every
REM other test run's.
where bash >nul 2>&1
if errorlevel 1 (
@@ -1965,7 +1967,7 @@ goto test_everything
:test_everything
REM Every test WeKan and FerretDB have, one stage at a time: WeKan's own suite,
REM then the database conformance run for every database with an image for this
REM CPU, then all of FerretDB's tests. One .tools\log\<operation>\YYYY-MM-DD\HH-MM-SS\ directory for the
REM CPU, then all of FerretDB's tests. One .tools\log\<operation>\YYYY-MM-DD_HH-MM-SS\ directory for the
REM whole run, and nothing runs concurrently, which is what makes a failure
REM readable.
REM
+69 -33
View File
@@ -6,7 +6,7 @@ echo "Note1: If you use other locale than en_US.UTF-8 , you need to additionally
echo " with 'sudo dpkg-reconfigure locales' , so that MongoDB works correctly."
echo " You can still use any other locale as your main locale."
echo "Note2: Console output is also logged to the operation-specific path printed below."
echo "Note3: All logs use .tools/log/<operation>/YYYY-MM-DD/HH-MM-SS/."
echo "Note3: All logs use .tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/."
echo " .tools/log/ inside this repository. The path is printed when a run"
echo " starts."
echo "Note4: Two build directories, and they are not the same thing:"
@@ -357,13 +357,13 @@ function build_stage(){
# Used by menu option 2 and auto-invoked by option 9 when .build is missing.
# Also clears the rspack dev-build caches (_build and node_modules/.cache) so the
# next `meteor run` recompiles from scratch instead of serving stale modules.
# Reserve one operation/type/date/time directory, including same-second collisions.
# Reserve one operation/type/datetime directory, including same-second collisions.
function log_directory(){
local type="$1" day dir suffix=1 candidate
case "$type" in ""|*[!a-zA-Z0-9_-]*) echo "ERROR: invalid log type: $type" >&2; return 1 ;; esac
day="${WEKAN_LOG_ROOT:-.tools/log}/$type/$(date '+%Y-%m-%d')"
day="${WEKAN_LOG_ROOT:-.tools/log}/$type"
mkdir -p "$day" || return $?
dir="$day/$(date '+%H-%M-%S')"
dir="$day/$(date '+%Y-%m-%d_%H-%M-%S')"
if ! mkdir "$dir" 2>/dev/null; then
while :; do
candidate="$dir-$suffix"
@@ -872,7 +872,7 @@ function run_playwright_parallel(){
read -p "Install Playwright test dependencies first? [y/N] " INSTALL_DEPS
case "$INSTALL_DEPS" in [Yy]*) ( cd "$pwdir" && meteor npm install ) ;; esac
# This run's own .tools/log/<operation>/<date>/<time>/ dir, so logs are never overwritten.
# This run's own .tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/ dir, so logs are never overwritten.
local RUN_LOGDIR
RUN_LOGDIR="$(log_directory test-playwright-all)" || return $?
mkdir -p "$RUN_LOGDIR"
@@ -888,7 +888,7 @@ function run_playwright_parallel(){
local rc_chromium rc_firefox rc_webkit
local ts
# Stream live to the console with tee while also saving to this run's
# .tools/log/<operation>/<date>/<time>/ dir. PIPESTATUS[0] is run_pw_all_browser's exit code (the
# .tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/ dir. PIPESTATUS[0] is run_pw_all_browser's exit code (the
# left side of the pipe), not tee's, so the pass/fail result stays accurate.
for entry in "chromium:Chromium" "firefox:Firefox" "webkit:WebKit"; do
browser="${entry%%:*}"; label="${entry#*:}"
@@ -1030,7 +1030,7 @@ function run_all_tests(){
local TEST_NODE_OPTIONS="${WEKAN_TEST_NODE_OPTIONS:---max-old-space-size=$TEST_HEAP_MB}"
echo "Node heap limit for test runtime processes: ${TEST_HEAP_MB} MB."
echo " Override by exporting WEKAN_TEST_NODE_OPTIONS yourself."
# Each whole-suite run gets its own .tools/log/<operation>/<date>/<time>/ directory
# Each whole-suite run gets its own .tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/ directory
# (stamped once, when the run starts), so logs are never overwritten and
# previous runs are kept.
local RUN_TS RUN_LOGDIR
@@ -2220,7 +2220,7 @@ function ask_dev_url(){
function git_fix_changelog_links(){
local script="$WEKAN_DIR/releases/fix-changelog-hashes.sh"
[ -f "$script" ] || return 1
bash "$script" || true
bash "$script" || return 1
if [ -n "$(git status --porcelain -- CHANGELOG.md 2>/dev/null)" ]; then
git add CHANGELOG.md
git commit -q -m "CHANGELOG: repoint commit links after history moved.
@@ -2234,14 +2234,48 @@ Thanks to xet7 !"
echo "==> CHANGELOG commit links repointed and committed."
return 0
fi
return 1
return 0
}
# git pull: fast-forward or merge origin without rewriting local commit hashes.
# Preserve actual content conflicts for explicit resolution.
# Recover only Git's incomplete autostash-only setup, never an active rebase.
function git_recover_orphan_autostash(){
local directory stash
directory="$(git rev-parse --git-path rebase-merge)"
[ -d "$directory" ] || return 0
[ -f "$directory/autostash" ] || return 0
[ "$(find "$directory" -mindepth 1 -maxdepth 1 | wc -l)" -eq 1 ] || return 0
[ ! -e "$(git rev-parse --git-path index.lock)" ] || return 0
if ps -eo args | grep -E '^git (rebase|merge|stash|commit)( |$)' >/dev/null; then
echo "ERROR: another Git operation is running; recovery deferred."; return 1
fi
stash="$(cat "$directory/autostash")"
git cat-file -e "$stash^{commit}" || return 1
git stash store -m 'Recovered build.sh interrupted pull autostash' "$stash" || return 1
rm -- "$directory/autostash" && rmdir -- "$directory" || return 1
echo "==> Preserved interrupted pull autostash in git stash list."
}
function git_operation_ready(){
local state
for state in rebase-merge rebase-apply MERGE_HEAD CHERRY_PICK_HEAD REVERT_HEAD index.lock; do
if [ -e "$(git rev-parse --git-path "$state")" ]; then
echo "ERROR: existing Git operation or lock: $state. Resolve it before pulling or pushing."
echo " Run git status; do not delete a lock while another Git process is running."
return 1
fi
done
[ "$(git rev-parse --abbrev-ref HEAD)" != HEAD ] || {
echo "ERROR: detached HEAD; select a branch first."; return 1;
}
}
# git pull: fast-forward when that is all it takes, rebase when the branch has
# diverged, and never end half-way through either.
function git_pull(){
git rev-parse --git-dir >/dev/null 2>&1 || { echo "Not a git repository."; return 1; }
local branch upstream before ahead behind
git_recover_orphan_autostash || return 1
git_operation_ready || return 1
branch="$(git rev-parse --abbrev-ref HEAD)"
upstream="origin/$branch"
echo "== git pull - branch $branch =="
@@ -2269,26 +2303,18 @@ function git_pull(){
# Nothing of ours to replay: a fast-forward moves the branch pointer and
# rewrites no commit, so no link can go stale.
echo "--- fast-forward (no local commits to replay) ---"
git merge --ff-only "$upstream" || { echo "ERROR: fast-forward failed. Nothing changed."; return 1; }
git -c merge.autoStash=true merge --ff-only "$upstream" || { echo "ERROR: fast-forward failed. Nothing changed."; return 1; }
else
echo "--- rebase: replaying $ahead local commit(s) onto $upstream ---"
echo " This gives them NEW hashes, which is why the CHANGELOG links are"
echo " repaired straight after."
if ! git -c rebase.autoStash=true rebase "$upstream"; then
git rebase --abort 2>/dev/null
git stash list >/dev/null 2>&1
echo
echo "ERROR: the rebase hit a conflict, so it was ABORTED - this repo is"
echo " exactly as it was before ($(git rev-parse --short "$before"))."
echo " Resolve it by hand:"
echo " git rebase $upstream # then fix the conflicts"
echo " git rebase --continue # or: git rebase --abort"
echo " and run this option again afterwards."
return 1
fi
echo "--- merge: integrating $upstream while preserving local commit hashes ---"
if ! git -c merge.autoStash=true merge --no-edit "$upstream"; then
echo "ERROR: merge did not finish. Your edits and conflict state are preserved."
git status --short
echo "Resolve the listed conflicts, git add the resolved files, then git merge --continue."
return 1
fi
fi
git_fix_changelog_links || echo "==> CHANGELOG commit links all resolve; nothing to repoint."
git_fix_changelog_links || return 1
echo "--- git status ---"
git status --short --branch
return 0
@@ -2299,6 +2325,8 @@ function git_pull(){
function git_push(){
git rev-parse --git-dir >/dev/null 2>&1 || { echo "Not a git repository."; return 1; }
local branch ahead
git_recover_orphan_autostash || return 1
git_operation_ready || return 1
branch="$(git rev-parse --abbrev-ref HEAD)"
echo "== git push - branch $branch =="
@@ -2309,9 +2337,13 @@ function git_push(){
# Before publishing, not after: a stale link that reaches GitHub 404s for
# everyone who reads the release notes.
git_fix_changelog_links || echo "==> CHANGELOG commit links all resolve."
git_fix_changelog_links || return 1
git fetch origin "$branch" >/dev/null 2>&1 || true
git fetch origin "$branch" || { echo "ERROR: fetch failed; nothing pushed."; return 1; }
if git rev-parse --verify --quiet "origin/$branch" >/dev/null &&
[ "$(git rev-list --count HEAD.."origin/$branch")" -gt 0 ]; then
git_pull || { echo "ERROR: pull failed; nothing pushed."; return 1; }
fi
if git rev-parse --verify --quiet "origin/$branch" >/dev/null; then
ahead="$(git rev-list --count "origin/$branch"..HEAD)"
[ "$ahead" -eq 0 ] && { echo "==> Nothing to push; origin/$branch is already at this commit."; return 0; }
@@ -2400,6 +2432,10 @@ choose() {
# (a helper other scripts source), ferretdb/* (they run INSIDE the built
# snap/bundle, not on a maintainer's machine) and the superseded old-*.sh and
# translations/fill_translations.py.
# Release notes summarize translations as affected languages; other changelog
# details stay in CHANGELOG.md. Notes include only In short, Security,
# Translations language list, thanks and the changelog link. Binary provenance remains
# a build artifact and must not be appended by any release entry point.
RELEASE_SCRIPTS=( "Release|Release ALL platforms: push CHANGELOG, trigger release-all.yml|releases/release-all.sh|||"
"Release|Release (older local flow), for one version|releases/release.sh|WeKan version, e.g. 10.50||"
"Release|Show the version numbers this checkout would release|releases/version.sh|||"
@@ -2469,7 +2505,7 @@ RELEASE_SCRIPTS=( "Release|Release ALL platforms: push CHANGELOG, trigger releas
"Translations|Report English strings that regressed|releases/translations/report-english-regressions.mjs|||"
"Translations|Prove a pull keeps human translations (no network)|releases/translations/verify-human-preference.mjs|||"
"Translations|Merge a finished pull by hand|releases/translations/merge-translations.mjs|||"
"Git and repo|git pull - fetch, fast-forward or rebase, repoint moved CHANGELOG links|!git_pull|||git-pull"
"Git and repo|git pull - fetch, fast-forward or merge, repoint moved CHANGELOG links|!git_pull|||git-pull"
"Git and repo|git push - verify the CHANGELOG links, push, pull-and-retry once if origin moved|!git_push|||git-push"
"Git and repo|Commit with the editor open for a multi-line message|releases/commit.sh|||"
"Git and repo|Add everything, then revert it again|!git restore --staged|Path to unstage||git-add-revert"
@@ -2681,7 +2717,7 @@ while [ -z "$opt" ]; do
"Install dependencies|Install WeKan dependencies" \
"Build WeKan release bundle|Build WeKan release bundle" \
"Build WeKan development bundle|Build WeKan development bundle" \
"git pull|git pull: fetch, fast-forward or rebase onto origin, repoint the CHANGELOG commit links the rebase moved, and leave the repo unchanged if anything conflicts" \
"git pull|git pull: fetch, fast-forward or merge onto origin, repoint the CHANGELOG commit links the rebase moved, and preserve unresolved conflict state" \
"git push|git push: check the CHANGELOG commit links resolve before publishing them, push this branch to origin, and pull-then-retry once if origin moved meanwhile" ;;
"Dev server")
choose "Dev server" \
@@ -2867,7 +2903,7 @@ for _once in 1; do
break
;;
"git pull: fetch, fast-forward or rebase onto origin, repoint the CHANGELOG commit links the rebase moved, and leave the repo unchanged if anything conflicts")
"git pull: fetch, fast-forward or merge onto origin, repoint the CHANGELOG commit links the rebase moved, and preserve unresolved conflict state")
git_pull
break
;;
+48 -48
View File
@@ -19,58 +19,58 @@ template(name="cardActivities")
template(name="activity")
.activity(id=activityDomId data-id=activity._id)
+userAvatar(userId=activity.user._id)
p.activity-desc
div.activity-desc
span.activity-member
+memberName(user=activity.user)
//- attachment activity -------------------------------------------------
if($eq activity.activityType 'deleteAttachment')
| {{{_ 'activity-delete-attach' cardLink}}}.
| {{{activityMessage 'activity-delete-attach' cardLink}}}.
if($eq activity.activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLink}}}.
| {{{activityMessage 'activity-attached' attachmentLink cardLink}}}.
if($neq mode 'board')
if activity.attachment.isImage
img.attachment-image-preview(src=activity.attachment.url alt="")
//- board activity ------------------------------------------------------
if($eq activity.activityType 'createBoard')
| {{{_ 'activity-created' boardLabelLink}}}.
| {{{activityMessage 'activity-created' boardLabelLink}}}.
if($eq activity.activityType 'importBoard')
| {{{_ 'activity-imported-board' boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported-board' boardLabelLink sourceLink}}}.
if($eq activity.activityType 'addBoardMember')
| {{{_ 'activity-added' memberLink boardLabelLink}}}.
| {{{activityMessage 'activity-added' memberLink boardLabelLink}}}.
if($eq activity.activityType 'removeBoardMember')
| {{{_ 'activity-excluded' memberLink boardLabelLink}}}.
| {{{activityMessage 'activity-excluded' memberLink boardLabelLink}}}.
//- card activity -------------------------------------------------------
if($eq activity.activityType 'createCard')
if($eq mode 'card')
| {{{_ 'activity-added' cardLabelLink (sanitize activity.listName)}}}.
| {{{activityMessage 'activity-added' cardLabelLink (activityValue activity.listName)}}}.
else
| {{{_ 'activity-added' cardLabelLink boardLabelLink}}}.
| {{{activityMessage 'activity-added' cardLabelLink boardLabelLink}}}.
if($eq activity.activityType 'importCard')
| {{{_ 'activity-imported' cardLink boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported' cardLink boardLabelLink sourceLink}}}.
if($eq activity.activityType 'moveCard')
| {{{_ 'activity-moved' cardLabelLink (sanitize activity.oldList.title) (sanitize activity.list.title)}}}.
| {{{activityMessage 'activity-moved' cardLabelLink (activityValue activity.oldList.title) (activityValue activity.list.title)}}}.
if($eq activity.activityType 'moveCardBoard')
| {{{_ 'activity-moved' cardLink (sanitize activity.oldBoardName) (sanitize activity.boardName)}}}.
| {{{activityMessage 'activity-moved' cardLink (activityValue activity.oldBoardName) (activityValue activity.boardName)}}}.
if($eq activity.activityType 'archivedCard')
| {{{_ 'activity-archived' cardLink}}}.
| {{{activityMessage 'activity-archived' cardLink}}}.
if($eq activity.activityType 'restoredCard')
| {{{_ 'activity-sent' cardLink boardLabelLink}}}.
| {{{activityMessage 'activity-sent' cardLink boardLabelLink}}}.
//- checklist activity --------------------------------------------------
if($eq activity.activityType 'addChecklist')
| {{{_ 'activity-checklist-added' cardLink}}}.
| {{{activityMessage 'activity-checklist-added' cardLink}}}.
if($eq mode 'card')
.activity-checklist
+viewer
@@ -81,114 +81,114 @@ template(name="activity")
= activity.checklist.title
if($eq activity.activityType 'removedChecklist')
| {{{_ 'activity-checklist-removed' cardLink}}}.
| {{{activityMessage 'activity-checklist-removed' cardLink}}}.
if($eq activity.activityType 'completeChecklist')
| {{{_ 'activity-checklist-completed' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-completed' (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'uncompleteChecklist')
| {{{_ 'activity-checklist-uncompleted' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-uncompleted' (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'checkedItem')
| {{{_ 'activity-checked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checked-item' (activityValue checkItem) (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'uncheckedItem')
| {{{_ 'activity-unchecked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-unchecked-item' (activityValue checkItem) (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-item-added' (activityValue activity.checklist.title) cardLink}}}.
.activity-checklist(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.checklistItem.title
if($eq activity.activityType 'removedChecklistItem')
| {{{_ 'activity-checklist-item-removed' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-item-removed' (activityValue activity.checklist.title) cardLink}}}.
//- comment activity ----------------------------------------------------
if($eq activity.activityType 'deleteComment')
| {{{_ 'activity-deleteComment' (sanitize activity.commentDisplayText)}}}.
| {{{activityMessage 'activity-deleteComment' (activityValue activity.commentDisplayText)}}}.
if($eq activity.activityType 'editComment')
| {{{_ 'activity-editComment' (sanitize activity.commentDisplayText)}}}.
| {{{activityMessage 'activity-editComment' (activityValue activity.commentDisplayText)}}}.
if($eq activity.activityType 'addComment')
| {{{_ 'activity-on' cardLink}}}
| {{{activityMessage 'activity-on' cardLink}}}
a.activity-comment(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.comment.text
//- date activity ------------------------------------------------
if($eq activity.activityType 'a-receivedAt')
| {{{_ 'activity-receivedDate' (sanitize receivedDate) cardLink}}}.
| {{{activityMessage 'activity-receivedDate' (activityValue receivedDate) cardLink}}}.
if($eq activity.activityType 'a-startAt')
| {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
| {{{activityMessage 'activity-startDate' (activityValue startDate) cardLink}}}.
if($eq activity.activityType 'a-dueAt')
| {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
| {{{activityMessage 'activity-dueDate' (activityValue dueDate) cardLink}}}.
if($eq activity.activityType 'a-endAt')
| {{{_ 'activity-endDate' (sanitize endDate) cardLink}}}.
| {{{activityMessage 'activity-endDate' (activityValue endDate) cardLink}}}.
if($eq activity.activityType 'a-changedTitle')
| {{{_ 'activity-changedTitle' (sanitize activity.value) cardLink}}}.
| {{{activityMessage 'activity-changedTitle' (activityValue activity.value) cardLink}}}.
if($eq activity.activityType 'a-changedDescription')
| {{{_ 'activity-changedDescription' cardLink}}}.
| {{{activityMessage 'activity-changedDescription' cardLink}}}.
//- customField activity ------------------------------------------------
if($eq activity.activityType 'createCustomField')
| {{_ 'activity-customfield-created' customField}}.
| {{{activityMessage 'activity-customfield-created' (activityValue customField)}}}.
if($eq activity.activityType 'setCustomField')
| {{{_ 'activity-set-customfield' (sanitize lastCustomField) (sanitize lastCustomFieldValue) cardLink}}}.
| {{{activityMessage 'activity-set-customfield' (activityValue lastCustomField) (activityValue lastCustomFieldValue) cardLink}}}.
if($eq activity.activityType 'unsetCustomField')
| {{{_ 'activity-unset-customfield' (sanitize lastCustomField) cardLink}}}.
| {{{activityMessage 'activity-unset-customfield' (activityValue lastCustomField) cardLink}}}.
//- label activity ------------------------------------------------------
if($eq activity.activityType 'addedLabel')
| {{{_ 'activity-added-label' (sanitize lastLabel) cardLink}}}.
| {{{activityMessage 'activity-added-label' (activityValue lastLabel) cardLink}}}.
if($eq activity.activityType 'removedLabel')
| {{{_ 'activity-removed-label' (sanitize lastLabel) cardLink}}}.
| {{{activityMessage 'activity-removed-label' (activityValue lastLabel) cardLink}}}.
//- list activity -------------------------------------------------------
if($neq mode 'card')
if($eq activity.activityType 'createList')
| {{{_ 'activity-added' (sanitize listLabel) boardLabelLink}}}.
| {{{activityMessage 'activity-added' (activityValue listLabel) boardLabelLink}}}.
if($eq activity.activityType 'importList')
| {{{_ 'activity-imported' (sanitize listLabel) boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported' (activityValue listLabel) boardLabelLink sourceLink}}}.
if($eq activity.activityType 'removeList')
| {{{_ 'activity-removed' (sanitize activity.title) boardLabelLink}}}.
| {{{activityMessage 'activity-removed' (activityValue activity.title) boardLabelLink}}}.
if($eq activity.activityType 'archivedList')
| {{_ 'activity-archived' (sanitize listLabel)}}.
| {{{activityMessage 'activity-archived' (activityValue listLabel)}}}.
if($eq activity.activityType 'changedListTitle')
| {{_ 'activity-changedListTitle' (sanitize listLabel) boardLabelLink}}
| {{{activityMessage 'activity-changedListTitle' (activityValue listLabel) boardLabelLink}}}
//- member activity ----------------------------------------------------
if($eq activity.activityType 'joinMember')
if($eq user._id activity.member._id)
| {{{_ 'activity-joined' cardLink}}}.
| {{{activityMessage 'activity-joined' cardLink}}}.
else
| {{{_ 'activity-added' memberLink cardLink}}}.
| {{{activityMessage 'activity-added' memberLink cardLink}}}.
if($eq activity.activityType 'unjoinMember')
if($eq user._id activity.member._id)
| {{{_ 'activity-unjoined' cardLink}}}.
| {{{activityMessage 'activity-unjoined' cardLink}}}.
else
| {{{_ 'activity-removed' memberLink cardLink}}}.
| {{{activityMessage 'activity-removed' memberLink cardLink}}}.
//- swimlane activity --------------------------------------------------
if($eq activity.activityType 'createSwimlane')
| {{{_ 'activity-added' (sanitize activity.swimlane.title) boardLabelLink}}}.
| {{{activityMessage 'activity-added' (activityValue activity.swimlane.title) boardLabelLink}}}.
if($eq activity.activityType 'archivedSwimlane')
| {{{_ 'activity-archived' (sanitize activity.swimlane.title)}}}.
| {{{activityMessage 'activity-archived' (activityValue activity.swimlane.title)}}}.
//- I don't understand this part ----------------------------------------
@@ -198,7 +198,7 @@ template(name="activity")
i(title=currentData.timeValue).activity-meta {{ displayDate currentData.timeValue 'LLL' }}
if (currentData.timeOldValue)
= ' '
| {{{_ "previous_as" }}}
| {{{activityMessage "previous_as" }}}
= ' '
i(title=currentData.timeOldValue).activity-meta {{ displayDate currentData.timeOldValue 'LLL' }}
= ' @'
+37 -46
View File
@@ -1,8 +1,10 @@
import { ReactiveCache } from '/imports/reactiveCache';
import { ReactiveVar } from 'meteor/reactive-var';
import { Template } from 'meteor/templating';
import DOMPurify from 'dompurify';
import { sanitizeHTML, sanitizeText } from '/imports/lib/secureDOMPurify';
import { Blaze } from 'meteor/blaze';
import { HTML } from 'meteor/htmljs';
import { titleViewerHtml } from '/client/lib/titleViewer';
import { sanitizeHTML } from '/imports/lib/secureDOMPurify';
import { TAPi18n } from '/imports/i18n';
import { Utils } from '/client/lib/utils';
import { getSidebarInstance } from '/client/features/sidebar/service';
@@ -287,16 +289,9 @@ Template.activity.helpers({
// Only render a link for an http(s) URL; otherwise show the plain (sanitized)
// source name with no href.
if (source.url && /^https?:\/\//i.test(String(source.url))) {
return Blaze.toHTML(
HTML.A(
{
href: source.url,
},
sanitizeHTML(source.system),
),
);
return linkedActivityValue(source.system, source.url, 'action-source');
}
return sanitizeHTML(source.system);
return titleViewerHtml(source.system);
}
return null;
},
@@ -317,16 +312,9 @@ Template.activity.helpers({
(attachment &&
attachment.path &&
attachmentUrl &&
Blaze.toHTML(
HTML.A(
{
href: `${attachmentUrl}?download=true`,
target: '_blank',
},
sanitizeText(attachment.name),
),
)) ||
sanitizeText(this.activity.attachmentName)
linkedActivityValue(attachment.name,
`${attachmentUrl}?download=true`, 'action-attachment', '_blank')) ||
titleViewerHtml(this.activity.attachmentName)
);
},
@@ -338,8 +326,17 @@ Template.activity.helpers({
});
Template.activity.helpers({
sanitize(value) {
return sanitizeHTML(value);
activityValue(value) {
return titleViewerHtml(value == null ? '' : String(value));
},
activityMessage(key, ...values) {
const setting = ReactiveCache.getCurrentSetting();
// Spacebars appends helper options; only rendered values belong in sprintf.
const lastValue = values[values.length - 1];
if (lastValue && typeof lastValue === 'object' && 'hash' in lastValue) values.pop();
return sanitizeHTML(TAPi18n.__(key, { sprintf: values }), {
stripLinks: !!(setting && setting.renderLinksAsPlainText),
});
},
});
@@ -433,36 +430,30 @@ function createCardLink(activity, card, boardTitle) {
// Nothing named the card - an old activity from before the titles were
// recorded, on a card this client cannot see. Say "this card" rather than
// leaving a gap in the middle of a sentence.
return sanitizeHTML(TAPi18n.__('this-card'));
return titleViewerHtml(TAPi18n.__('this-card'));
}
let text = link.title;
if (link.archived) text = `${text} [${TAPi18n.__('archived')}]`;
if (boardTitle) text = `${boardTitle} > ` + text;
if (!link.url) return sanitizeHTML(text);
return Blaze.toHTML(
HTML.A(
{
href: link.url,
class: 'action-card',
},
sanitizeHTML(text),
),
);
return linkedActivityValue(text, link.url, 'action-card');
}
// Keep rich user links separate from application navigation: nested anchors
// cause browsers to move title fragments outside the activity link.
function linkedActivityValue(value, url, className, target) {
const rendered = sanitizeHTML(titleViewerHtml(value));
if (!url) return rendered;
const content = HTML.Raw(rendered);
const attributes = { href: url, class: className };
if (target) attributes.target = target;
return Blaze.toHTML(/<a\b/i.test(rendered)
? HTML.SPAN(content, ' ', HTML.A(attributes, '↗'))
: HTML.A(attributes, content));
}
function createBoardLink(board, list) {
if (!board) return '';
let text = board.title;
if (list) text += `: ${list}`;
return (
board &&
Blaze.toHTML(
HTML.A(
{
href: board.originRelativeUrl(),
class: 'action-board',
},
sanitizeHTML(text),
),
)
);
return linkedActivityValue(text, board.originRelativeUrl(), 'action-board');
}
@@ -2,7 +2,7 @@
- export buttons, then a Chart.js canvas, then the full data table, reusing
statsView.css's .stats-view/.stats-view-content shell. */
.chart-view-content {
max-width: 1100px;
max-width: none;
}
.chart-export-buttons {
@@ -1,5 +1,5 @@
import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
import moment from 'moment';
import { format } from '/imports/lib/dateUtils';
import { Template } from 'meteor/templating';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
@@ -63,7 +63,7 @@ Template.groupByAssigneeView.helpers({
return translateGroupLabel(label, key => TAPi18n.__(key));
},
formatDueAt(dueAt) {
return dueAt ? formatDateForDisplay(dueAt, true, date => moment(date).format('llll')) : '';
return dueAt ? formatDateForDisplay(dueAt, true, date => format(date, 'llll')) : '';
},
cardUrl(cardId) {
const boardId = Session.get('currentBoard');
+4 -2
View File
@@ -9,8 +9,10 @@
}
.stats-view-content {
max-width: 900px;
margin: 0 auto;
width: 100%;
max-width: none;
box-sizing: border-box;
margin: 0;
padding: 24px;
}
+1 -4
View File
@@ -1117,10 +1117,7 @@ template(name="cardDetailsActionsPopup")
a.js-save-card-as-template
i.fa.fa-clone
| {{_ 'save-card-as-template'}}
li
a.js-link-card-to-board
i.fa.fa-link
| {{_ 'linkCardToBoardPopup-title'}}
unless currentUser.isWorker
ul.pop-over-list
li
+7 -3
View File
@@ -142,10 +142,14 @@ export function translatedViewModes(GanttLib) {
function translateFrappeChrome(container, templateInstance) {
const apply = () => {
const today = container.querySelector('.today-button');
if (today && today.textContent === 'Today') today.textContent = TAPi18n.__('today');
const todayLabel = TAPi18n.__('today');
if (today && today.textContent === 'Today' && today.textContent !== todayLabel) {
today.textContent = todayLabel;
}
const placeholder = container.querySelector('.viewmode-select option[disabled]');
if (placeholder && placeholder.textContent === 'Mode') {
placeholder.textContent = TAPi18n.__('gantt-view-mode');
const modeLabel = TAPi18n.__('gantt-view-mode');
if (placeholder && placeholder.textContent === 'Mode' && placeholder.textContent !== modeLabel) {
placeholder.textContent = modeLabel;
}
};
if (!templateInstance.chromeObserver) {
+33 -8
View File
@@ -237,7 +237,7 @@
/* Auto-filling columns so as many languages as possible are visible at once when
there is browser width; collapses to a single column on narrow windows. */
display: grid;
grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
align-content: start;
column-gap: 4px;
}
@@ -389,12 +389,11 @@
position: fixed !important;
bottom: 0 !important;
top: auto !important;
inset-inline-start: auto !important;
inset-inline-end: 20px !important;
/* Wide enough for multiple language columns when the browser is wide, but never
wider than ~90% of the viewport (falls back to a single narrow column). */
width: min(90vw, 1100px) !important;
max-width: 90vw !important;
inset-inline-start: 0 !important;
inset-inline-end: 0 !important;
box-sizing: border-box;
width: 100vw !important;
max-width: 100vw !important;
height: 100vh !important;
max-height: 100vh !important;
min-height: 300px !important;
@@ -1295,10 +1294,36 @@ body.mobile-mode .pop-over .content-wrapper {
}
.pop-over[data-popup='changeLanguagePopup'] .language-label {
display: inline-flex;
display: flex;
flex-direction: column;
gap: 0.15em;
min-width: 0;
width: 100%;
}
.pop-over[data-popup='changeLanguagePopup'] .language-main-line {
display: flex;
align-items: baseline;
gap: 0.25em;
}
.pop-over[data-popup='changeLanguagePopup'] .pop-over-list li > a {
display: flex;
align-items: flex-start;
white-space: normal;
overflow: visible;
text-overflow: clip;
height: auto;
}
.pop-over[data-popup='changeLanguagePopup'] .pop-over-list li,
.pop-over[data-popup='changeLanguagePopup'] .language-name {
min-width: 0;
overflow-wrap: anywhere;
}
.pop-over[data-popup='changeLanguagePopup'] .language-region {
display: block;
white-space: normal;
overflow-wrap: anywhere;
}
.pop-over[data-popup='changeLanguagePopup'] .language-region {
unicode-bidi: isolate;
}
+3 -2
View File
@@ -244,8 +244,9 @@ template(name="changeLanguagePopup")
li(class="{{# if isCurrentLanguage}}active{{/if}}")
a.js-set-language(href="#" dir="{{languageDirection}}" data-language="{{tag}}")
span.language-label
span.emoji-icon.language-flags(dir="ltr" aria-hidden="true") {{languageFlag}}
bdi.language-name {{languageName}}
span.language-main-line
span.emoji-icon.language-flags(dir="ltr" aria-hidden="true") {{languageFlag}}
bdi.language-name {{languageName}}
if countryFlag
span.language-region
| (
+6
View File
@@ -12,6 +12,7 @@ import { computeBoardBackground } from '/models/lib/boardBackground';
import { buildCardAttachmentMeta } from '/models/lib/attachmentMeta';
import { resolveShowDragHandles, readDragHandlesPreference } from '/models/lib/dragHandles';
const { memberCan } = require('/models/lib/boardRoleCapabilities');
const { sourceRoleBlocksDelegation } = require('/models/lib/linkedWritePolicy');
// One key for both pages: they draw one menu. docs/Features/Page/Left-Menu.md
const LEFT_MENU_COLLAPSED_KEY = 'leftMenuCollapsed';
@@ -238,6 +239,11 @@ export const Utils = {
return !!(board && memberCan(board.members, userId, capability));
},
canModifyCard(card = Utils.getCurrentCard()) {
if (card && card.type === 'cardType-linkedCard') {
const source = ReactiveCache.getCard(card.linkedId);
const sourceBoard = source && ReactiveCache.getBoard(source.boardId);
if (!sourceBoard || sourceRoleBlocksDelegation(Meteor.userId(), sourceBoard)) return false;
}
const board = card && typeof card.board === 'function'
? card.board()
: Utils.getCurrentBoard();
+12 -3
View File
@@ -236,8 +236,8 @@ Or alternatively, delete wekan repo (if you did not need any changes you made),
The `build.sh` development bundle option announces cache removal, compilation to resolve Meteor plugin npm
dependencies, dependency installation and compilation before each starts.
Each stage streams its output to the terminal and the printed build log:
`.tools/log/build-dev-bundle/YYYY-MM-DD/HH-MM-SS/dev.txt` for development bundles and
`.tools/log/build-release-bundle/YYYY-MM-DD/HH-MM-SS/release.txt` for release bundles.
`.tools/log/build-dev-bundle/YYYY-MM-DD_HH-MM-SS/dev.txt` for development bundles and
`.tools/log/build-release-bundle/YYYY-MM-DD_HH-MM-SS/release.txt` for release bundles.
Both scripts print the selected build log path again when the build finishes, including
failed builds. Successful shell builds also append that completion message to the log.
Each build gets its own time directory, keeping earlier runs separate. Same-second
@@ -264,7 +264,7 @@ results. Both terminal and build log receive this output. Command arguments reda
common credential fields; the tracer does not print the process environment.
All logging managed by `build.sh` and `build.bat` uses
`.tools/log/<operation>/YYYY-MM-DD/HH-MM-SS/`. Both honor `WEKAN_LOG_ROOT`.
`.tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/`. Both honor `WEKAN_LOG_ROOT`.
Same-second runs reserve a numeric suffix; previous run directories stay intact.
| Operation | Directory type | Main log |
@@ -281,3 +281,12 @@ Same-second runs reserve a numeric suffix; previous run directories stay intact.
commands stream through PowerShell to the selected log; command exit status is
retained. Native Windows execution was not available for this change; directory
reservation logic and Windows menu/logger wiring are tested locally.
Log directory naming is shared by Unix and Windows builds and release tools:
`.tools/log/<operation>/YYYY-MM-DD_HH-MM-SS/`, using local time. Same-second
starts reserve distinct directories with `-1`, `-2`, etc. to preserve earlier
logs. Translation upload reports use `translations-push`, mirror archive/sync
reports use `mirror-data`, mirror launcher output uses `mirror`, database
conformance uses `test-db-conformance`, and speed diagnostics use `debug-speed`.
Existing log directories remain where they were written. Dates inside JSON
records retain their data format; this naming rule applies to log directories.
@@ -31,13 +31,14 @@ pins.
</details>
```
**No Platform/Binary/From/Version/SHA256 table belongs here, in any shape.**
It was tried twice - right under the summary, then moved to a `**Binaries in
these bundles:**` label at the end - and removed both times: it made the
entry mostly a giant table nobody read. That data lives in the **GitHub
Release notes** instead, built fresh by `releases/provenance-table.sh` from
`releases/record-provenance.sh`'s recordings every time a release is made -
see CLAUDE.md's/AGENTS.md's CHANGELOG section.
**Do not add a binaries provenance section or table to the changelog or
release notes.** Release notes list only updated languages for each Translations group.
Add `**Languages updated:** Esperanto, Galician` below that group label
with the actual affected full language names. Detailed entries stay here;
release notes include only In short, Security, translation languages,
the standard thanks line and a More details at ChangeLog release anchor link.
Keep checksum verification and `provenance.tsv` build artifacts separately;
never append `releases/provenance-table.sh` output to release notes.
## Why this exists instead of an auto-created empty section
@@ -62,3 +63,12 @@ Upcoming section existed to catch the entry first. That test is the real guard
and needed no empty placeholder to work. So: write the section yourself when
there is something to put in it, using the skeleton above, and let the test
catch the mistake if an entry still ends up in the wrong place.
## Read-only release preflight
Run `bash releases/check-upcoming-release.sh` to check release notes without
changing files or contacting a forge. Exactly one Upcoming section containing
a linked release entry is required. Missing, empty or duplicate sections fail
with an error. `release-all.sh` performs this check before installing tools or
changing files; explicit version arguments also require Upcoming notes. An
existing released heading is no longer reused when Upcoming notes are absent.
+29
View File
@@ -0,0 +1,29 @@
# LDAP bind investigation — issue 6692
Reviewed 2026-09-14. The complete issue and all three current comments were read.
Snap 11.76 on Ubuntu reports a service-account LDAPS bind failure;
ldapsearch succeeds and reverting to 11.72 did not help.
Local commit `5f5822f7d` fixes the confirmed empty diagnostic: Error name
and message were lost by Object.keys-based sanitization. Diagnostics now
retain name, message, code and reason through existing secret redaction.
Certificate and invalid-credential tests pass; encryption, connection-release
and REST login suites also pass. TLS verification remains enabled.
The reporter's new 11.77 diagnostic identifies a TypeError reading index 0.
Local commit `2c5cdd78a` fixes the matching post-bind failure: an unset
optional LDAP_USER_SEARCH_FILTER was indexed in getUserFilter before the
user search. Undefined/null/empty now omit only the optional filter;
configured restrictions remain active and invalid types fail explicitly.
The reproduction and encryption, connection-release and error-logging suites
pass. No live external directory or browser login was available; deployment
confirmation remains necessary. TLS verification remains unchanged.
Latest comment still uses 11.77, before the local post-bind fix. Regression
commit `dad65fb6c` exercises actual bindIfNecessary/searchUsers methods,
verifying successful UPN service binding reaches the correct user query,
configured filters remain active, and invalid credentials stop before search.
A separate oplog observer duplicate-insert error is reported one second later;
its connection to login is unproven and no database repair was guessed.
Deploy a release containing `2c5cdd78a` and confirm the LDAP login separately
from that observer error. No live directory or browser login was run.
@@ -0,0 +1,20 @@
# Activity rendering
Opened-card activities and the right sidebar share the same activity template.
Activity titles, checklist text, labels, custom-field values, comment excerpts,
source names and attachment names use the existing Markdown/emoji viewer.
HTML allowed by the existing sanitizer is rendered with the same restrictions
as other viewer fields. No new HTML tags or URL schemes are permitted.
Admin Panel → Problems → Security controls apply:
- Plain-source mode displays literal source, including Markdown and HTML.
- Render links as plain text removes clickable links from activity sentences.
- Normal mode renders Markdown, emoji and permitted HTML after sanitization.
Imported source URLs retain their HTTP/HTTPS check. When a rich title contains
its own link, activity navigation is shown beside it to avoid nested anchors.
Focused activity-link, viewer, source-URL and Jade compilation checks pass.
Browser regressions cover both feeds, permitted HTML, unsafe event attributes
and all three display modes. They are syntax-checked; live execution is pending.
File diff suppressed because it is too large. Load diff
+70 -51
View File
@@ -4,64 +4,83 @@ Audit date: **2026-09-12**. Last updated: **2026-09-14**.
| Status | Flagged keys |
| --- | ---: |
| Corrected | 15,149 |
| Restored pre-pull; awaiting validation | 4,058 |
| Reviewed; retained unchanged | 179 |
| Pending review or repair | 695 |
| Corrected | 15,571 |
| Restored pre-pull; awaiting validation | 466 |
| Reviewed; retained unchanged | 3,736 |
| Pending review or repair | 308 |
| Total tracked | 20,081 |
**Resumed at the maintainer’s request on 2026-09-13.** Reviewing and repairing the remaining local findings, beginning with Klingon. All **361** originally flagged Klingon findings are repaired. The broader check of **829** German-identical values is reviewed: **829** repaired, including the mistaken German `cron` retention corrected to the actual tool name **Cron**. Restored and unflagged translations still need validation.
Review is ongoing. The [correction ledger](../../../releases/translations/audited-corrections.json)
contain **18,173** exact before/after values, including unflagged repairs.
[Detailed evidence](Audit-Evidence.md) retains categorized findings,
source references, confidence limits and archived progress notes.
Fixed: wrong-language text, terminology, warnings, placeholders and JSON/calendar/search formatting. [Correction records](../../../releases/translations/audited-corrections.json) contain **17,356** exact before/after values, including unflagged repairs.
Latest translation fix: **2026-09-14**, local commit `2a22a42a9` —
corrected Basque rule archive/restore terminology, preserving direction.
All **18,173** correction and **3,736** review records pass.
Shared Spanish `r-is` and composed trigger grammar remain unresolved.
Attachment/member rule participles still need context-specific agreement.
Three Esperanto restored findings remain: lime color and two Complete labels.
Broader language and browser verification remain open; nothing pushed.
Latest unchanged review: **2026-09-14**, commit `ffde8e84e` — retained
17 Basque rule action and date-field labels. Shared `r-is` still contains
Spanish `es`; repair requires coordinated Basque trigger phrase composition.
Compound trigger phrases and relational top/bottom wording remain open.
Basque free wording and nine Galician restored findings remain context-dependent.
Galician export free wording remains open pending context.
Galician Complete and migration-complete wording remain open pending context.
Card-show-lists context is verified against its settings row and toggle.
Latest translation fix: **2026-09-14**, local commit `47796391a` — replaced three French Tamazight due-date labels, preserving due-date versus completion and today versus tomorrow distinctions. CLDR attests the relative-day names; native date/last components support the existing final-date adaptation. Full deadline terminology and relative-filter usage remain **low confidence** pending fluent review. All **17,353** correction/rendering checks pass. One originally flagged and two unflagged values are repaired: **696** originals remain pending, including **553** Tamazight. Earlier composed wording and restored/unflagged values still need validation. Live browser verification was not run; no translations were pushed.
**Language validation (2026-09-14), local commit `e4e3aa590`:** Wiktionary’s Veps transitive inflection tables confirm `surenda` (make larger) and `penenda` (make smaller) as second-person singular commands. Their imperative morphology is now reference-supported; screen-zoom usage remains open. The original keyboard findings remain unresolved: searches and the cached dictionary did not establish reliable keyboard-shortcut terminology. Counts are unchanged. References and the remaining scope are recorded per key in the correction ledger.
**Kashmiri reference review (2026-09-14), local commit `0db69cf6c`:** CLDR marks Islamic/civil names provisional and has no Saudi-sighting or astronomical-tabular names. Existing civil wording also lacks explicit tabular/civil-epoch qualifiers. Keep these technical terms pending further research; no values changed and counts are unchanged. All 17,236 correction checks pass.
Fixed categories include wrong-language prose, terminology, warnings,
placeholders and JSON/calendar/search formatting. All 361 originally flagged
Klingon findings and the broader 829 German-identical values were repaired;
the cron label retains the actual tool name Cron. Danish restored review
validated 611 values: 606 retained unchanged and five meanings repaired.
Four Danish context-dependent labels remain: free, Complete, Schedule and Days Old.
Esperanto lime-color wording
remains open.
Reviewed subtask actions/settings retain correct subordinate-task compounds.
**Tamazight calendar reference review (2026-09-14), local commit `dd2aaa19a`:** Current CLDR marks the Islamic name provisional and supplies no Buddhist or Hijri variant display names. Calendar terms and full variant qualifiers require additional research. No values changed; counts remain unchanged and all 17,273 correction checks pass.
| Pending locale | Findings |
| --- | ---: |
| zgh — Standard Moroccan Tamazight | 173 |
| iu — Inuktitut | 50 |
| nah — Nahuatl | 17 |
| tig — Tigre | 17 |
| wal — Wolaytta | 17 |
| ve-PP — Veps | 10 |
| kl — Greenlandic | 7 |
| dz — Dzongkha | 3 |
| gv — Manx | 3 |
| bm — Bambara | 2 |
| ff — Fulah | 2 |
| ks — Kashmiri | 2 |
| ee — Ewe | 1 |
| qu — Quechua | 1 |
| rup — Aromanian | 1 |
| sc — Sardinian | 1 |
| szl — Silesian | 1 |
**Manx calendar reference review (2026-09-14), local commit `669be8895`:** Current CLDR supplies no calendar display names. Coptic terminology was not established by dictionary searches; full tabular/civil/astronomical-epoch qualifiers and the composed sighting phrase remain open. No values changed; three Manx originals remain pending. All 17,276 correction checks pass.
Completion also requires reviewing all restored and unflagged values and
previous low-confidence repairs. In particular, 98 Tamazight correction
records have invalidated Moroccan provenance: CNAM MCΓ denotes Tuareg,
not Moroccan. Corrected source notes are not full dialect/grammar validation.
Calendar civil/astronomical epochs and moon-sighting distinctions, memory
and authentication diagnostics, migration labels, archive/logo terminology,
search-case instructions and full command grammar retain the evidence's
recorded limits. Obsolete migration strings remain in translation scope.
Veps filter syntax repairs preserve literal examples; Finnish prose still
needs full Veps translation. [Veps review](Veps-Review.md) records limits.
**Silesian reference review (2026-09-14):** [Native MediaWiki messages](https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/szl.json) use `bazy danych` in database errors and locking instructions, and both `pliki` and `zbiory` for files. These shared technical terms alone do not establish wrong-language text. No reference for the full raw-database-file label was established; `sandstorm-raw-mongodb` remains pending, with no value or count changes. Further review should focus on the raw-file qualifier and the complete phrase, preserving accepted terminology.
Placeholder, JSON and key-order checks verify structure, not fluency.
Preserve every English interpolation/format token exactly and retain correct
translations unchanged. No external translation service is used.
**Language popup follow-up, 2026-09-14:** local commit `c8d17877e` places
language flags beside language names and country flags inside regional
parentheses, reversing visual placement for RTL. All 245 registry/helper
checks and Jade compilation pass; LTR/RTL browser regressions are added and
syntax-checked but not run live. Translation repair counts are unchanged.
**Board View Settings follow-up, 2026-09-14:** local commit `3b74d2c3c`
keeps the wide popup visible and enables title dragging and bottom-right
resizing. Geometry, pointer and Jade checks pass; browser coverage is added
and syntax-checked, with live execution pending. Translation counts are
unchanged; the translation audit remains active.
**Remaining validation:** all restored/unflagged values and low-confidence replacements remain open. Detailed per-key caveats are retained in the correction ledger and source commits. These include Veps composed UI, card, notification, calendar, timing, file/archive, metric and legal terminology/inflection; Neapolitan technical checklist usage; Fulah/Bambara calendar composition; and CLDR-provisional Ewe civil-calendar and Tongan tabular-calendar/astronomical-epoch phrase composition, and Sakha civil/astronomical-calendar/era-to-epoch and sighting-phrase composition. Field sums, parent-card terminology, keyboard shortcuts, remaining migration/search messages and other calendar variants need further language research. Wrong-language/script and fluent-speaker checks remain unfinished.
**Security interruption (2026-09-14):** `c1246d720` reviews both saved `.tools/wekansec20` alerts and hardens exact archive-host checks and shell-free mirror dispatch, including direct Windows Node execution. All 25 focused mirror test entries pass; native Windows and remote CodeQL rescanning remain unverified. Translation counts and remaining validation are unchanged.
**Time view interruption (2026-09-14):** local commit `dc0855711` renders card titles through the shared Markdown/emoji viewer, respecting Admin Panel plain-text security mode. The report regression passes; both browser modes are added and syntax-checked, not run live. The shared viewer also obeys Admin Panel plain-link mode; `a7b333dad` adds both clickable/non-clickable browser regressions, syntax-checked but not run live. Timeline, DHTMLX Gantt and shared report viewers are also repaired (`457614a2a`, `5ca16f32e`); Control chart coverage is explicit (`ca8d59978`). Combined focused verification passes 33 Node entries; browser tests remain syntax-checked only. Authenticated legacy avatar prefix fallback is repaired (`c2a390928`); the production attachment 404 remains undiagnosed. Translation counts remain unchanged.
**Calendar interruption (2026-09-14):** local commit `ef12548a9` replaces the rejected FullCalendar 5 `isRTL` option with `direction` in both board calendars. Four focused calendar test entries pass, including RTL/LTR and negative legacy-option checks. Browser regressions are added and syntax-checked, not run live. Translation counts and remaining language validation are unchanged.
**Build logging update (2026-09-14):** `5f8f22f8c` unifies build.sh/build.bat logger directories; `3fedee2b9` prints completion log paths and fixes read-only server manifests in local release preparation. Linux arm64 development and release builds and release startup smoke check pass; 13 targeted test entries pass. Native Windows execution was unavailable. Translation counts and remaining review work are unchanged; translation repairs remain unfinished.
**Build interruption (2026-09-13):** local commit `6cd193879` repairs the Meteor 3.6/Rspack 2 build's undeclared body-parser import using Meteor's existing Express parsers. Seven HTTP/build regressions pass. Meteor 3.6-beta.0/Rspack 2.2 and matching Docker metadata are committed locally (`35082f7d7`), and both previously failing version checks pass. All **1,015** Node suites pass. The actual Meteor bundle build remains under verification: the local beta tool is still starting before compilation. Translation counts and the latest translation commit remain unchanged.
**Mirror interruption completed (2026-09-13):** local commit `02383540a` adds organization management, destination namespaces, host/organization/repository archives, linked comment attachments/webpage HTML, static HTML/CSV indexes and rate limits for all forges with tokenless public GitHub reads. Full Node verification: **1,014 suites, zero failures**; final targeted checks and Chromium/Firefox static checks pass. WebKit is unavailable locally (ICU 74/Docker). Translation repairs subsequently resumed; current counts and latest fix are above.
**Language workflow (2026-09-13):** all 245 popup locales are wired and country-then-language flags are checked (`8549b6c4c`). Browser preference ordering, legacy/script aliases, delayed saved profiles and no automatic profile writes pass runtime checks (`1666a2012`, `37ae64fa8`); actual browser execution remains pending. Uzbek Arabic (`uz-AR`) still contains Latin core labels and needs repair.
**Upload workflow (2026-09-13):** Colombian/French/Khmer/Guarani/Portuguese/Russian mappings are repaired, with 241 distinct targets and reported local aliases. All nine Colombian differences were reviewed (`6db460891`), retaining seven valid alternatives. Timestamped terminal/error logs and failure exit codes pass offline checks (`196c0addc`). Chinese script mapping now uses supported `zh-Hans` (`c2a9168c4`). Manx, Ladin, Aromanian, Tigre and Wolaytta remain unsupported catalogue failures; no substitution by different languages or remote uploads was performed.
**Maintainer-run upload (2026-09-13):** inspected local report `translations-push-2026-09-13T19-02-29-845Z/report.json`: **237 successful uploads**, including English source, and **five failures** (`gv`, `lld`, `rup`, `tig`, `wal`). All eight formerly failing mappings succeeded; the latest saved run confirms the same outcome. The trailing catalogue list, including `wuu-Hant`, `xcl`, `yue`, `zh_MO`, `zh_TW.Big5` and `zza`, lists supported codes without local upload targets, not failed uploads. Catalogue discovery completed: zero supported-but-failed targets, five unsupported local codes and 500 supported catalogue codes without local upload targets. Those 500 codes need suitable local translations/mappings before upload. This verifies the saved report, not current remote contents; no uploads were run here. The outcome/support summary (`637dbebd6`) passes offline regressions. Retry regression (`ad294f707`) verifies all five missing codes are added and fully uploaded on a later run once supported; prior reports never suppress retries.
**Verification (2026-09-13):** **1,014 Node suites, zero failures** after the latest Veps list/storage and mirror changes; final targeted mirror regressions pass; the final mirror retry adjustment also passes its targeted regression. Correction and audit-progress regressions pass. The original 19 failures are resolved. The first complete EVERYTHING run passes all four stages: Meteor (**527**), import (**10**), Node E2E (**10**), three browsers, **103** conformance cases on each of SQLite/PostgreSQL/MySQL/MariaDB and FerretDB unit/vet/integration. Separate URL-prefix preference/logout/invalid-cookie checks pass in all browsers. Two WebKit retries exposed refresh readiness and competing template autofocus; both are repaired, and the refresh check passes ten repetitions without retries. #6691 partial-profile/impersonation regression passes in all three browsers without retries. The second EVERYTHING run finished with failures in the now-fixed Fossil menu registration check and Chromium board-export popup readiness; database conformance, FerretDB and the other two browsers passed. Board-export verification remains outstanding. Static mirror browser checks pass in Chromium and Firefox; WebKit cannot launch locally because ICU 74 is missing and Docker is unavailable. Fluent-speaker checks remain outstanding; translation repairs resume next.
**Unresolved reviews:** Member popup click handlers in sidebarFilters.js appear to invoke opposite assignment operations; this requires separate runtime review. Apostrophe support for Klingon search operators is implemented in local commit `0026390bb`; actual Query runtime and card-number regressions pass. All 37 remaining search keywords are replaced and actual-locale parser regressions pass; localized browser verification remains pending. Silesian database terminology and 17 Tigre calendar findings need language-specific validation.
**Origin:** not all errors came from Transifex. The audit covers 4,061 pulled changes and 16,020 additional local findings; Bosnian errors predate the pull (`bdb3b15886a749b725b5290ba0109fcba955f983`). Other origins remain unverified.
[Detailed evidence](Audit-Evidence.md) retains categorized tables. Refresh counts after each repair batch with `node releases/translations/audit-progress.mjs --update-summary`, then record the fix commit and verification. No remote uploads performed.
Not all wrong values came from Transifex: the audit tracks 4,061 pulled
changes and 16,020 additional local findings; some Bosnian errors predate
the pull. Correct-language human translations remain preferred. Keep the
full review scope open until language and browser validation is supported
by evidence. Issue #6692 post-bind optional-filter TypeError is repaired in local commit
`2c5cdd78a`; live LDAP login remains unverified. Translation work continues.
+15 -1
View File
@@ -31,8 +31,22 @@ registration or upload does not stop later languages. It polls each asynchronous
upload until Transifex reports success or failure; acceptance of the job alone is
not counted as success. Source upload failure reports all targets as unpushed.
Transient GET failures (HTTP 408/500/502/503/504, network failures and
timeouts) retry the same read up to six attempts. This includes upload-job
status reads: a temporary 502 does not immediately abandon an accepted source
upload and prevent every target from uploading. HTTP 429 responses retry after
at least one minute, respecting a longer `Retry-After` value in seconds or as an
HTTP date. Other failed writes are not automatically resubmitted, because a
failed response can leave an already-created upload job. Permanent errors and
exhausted retries remain explicit failures.
Output announces each upload, job acceptance and periodic pending status, and
reports each retry with its delay. Long retry waits print progress at intervals
of at most 30 seconds. This output goes to the existing terminal/status log.
Transifex documents throttling as [HTTP 429](https://developers.transifex.com/reference/rate-limit).
At the end it lists each failed language with its local file and reason, saves a
JSON report under `.tools/log/translations-push-<timestamp>/report.json`, and
JSON report under `.tools/log/translations-push/YYYY-MM-DD_HH-MM-SS/report.json`, and
returns a nonzero exit status when any language failed. An entirely successful
run prints `None` in the failure list. Invalid JSON, missing keys, empty values
where the source is nonempty, and altered placeholders are reported as failures.
+110
View File
@@ -0,0 +1,110 @@
# Veps translation review
Reviewed: **2026-09-14**. Review is incomplete; this document does not
claim that the remaining Finnish-seeded strings are valid Veps.
The registry names `ve-PP` **Vepsän kelʹ**. Its legacy `ve` identifier must
not be interpreted as Venda when choosing terminology sources.
Directly inspected [native MediaWiki Veps strings](https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/vep.json):
| Meaning | Source key | Native value | Limit |
| --- | --- | --- | --- |
| Show | show | Ozuta | Direct imperative; full WeKan sentence still needs grammar review. |
| Activate | tags-activate | pane radho | Software tag action; adaptation to another control needs review. |
| Deactivate | tags-deactivate | kel'dä | Software tag action; distinguish disabling from deleting. |
| Enabled | default-skin-not-found-row-enabled | om lasktud | Direct state wording inside a skin report. |
| Disabled | default-skin-not-found-row-disabled | om kel'tüd | Direct state wording inside a skin report. |
The inspected source has no keyboard/shortcut keys. Do not substitute
its abbreviation term for Keyboard Shortcuts without evidence. Existing
`keyboard-shortcuts` is Finnish **Pikanäppäimet** and needs broader review,
even though it is outside the ten remaining original findings.
The enabled/disabled shortcut tooltips each contain both the current state
and an action that reverses it. Preserve both. The shortcut-list instruction
must open the list, not merely describe a shortcut.
Other original findings require complete native phrases: accessibility
information not added **yet**, accessibility page **enabled**, custom URL
schemes automatically clickable with **one per line**, **vertical**
scrollbars enabled, parent displayed **in the minicard**, and the sum of
fields displayed **at the top of the list**. Related Finnish vocabulary
or shared loanwords alone do not validate full Finnish-seeded values.
The advanced-filter description requires a separate full review. Preserve
all comparisons and Boolean operators, single-quote rules and escape
characters, left-to-right evaluation with parenthesized precedence, and
the exact regular-expression example. Lexical repairs cannot silently
simplify or omit these rules. Verify examples against English and the
actual filter parser, then run placeholder/example regression checks;
those checks do not establish fluency.
No locale values were changed by this review. Native terminology for the
full remaining labels, inflection and UI phrasing still need verification.
Follow-up review: **2026-09-14**. Direct JSON inspection confirms the
local advanced-filter example contains `Field1 = I\\'m`, while English
contains `Field1 == I\'m`. The locale has a single equality sign and two
literal backslashes rather than the source's comparison operator and single
escape. The first review description incorrectly called this an absent
escape; the exact decoded JSON establishes malformed operator/escaping.
Repairing only the example would not resolve the wrong-language sentence;
keep its language review open rather than count a syntax-only repair as a
completed translation. Literal apostrophe/backslash rules must remain
visible in the final native help.
Additional directly inspected native MediaWiki evidence: `apisandbox-alert-field`
uses `pöudon` for a field's value/size, `apisandbox-alert-page` uses plural
`Pöudod`, and `authmanager-create-from-login` asks to fill `nene pöudod`.
These provide native field terminology and inflected forms; they do not
prove a complete Sum Of Fields At Top Of List translation. Mathematical
Sum and the top-of-list position still need separate evidence and grammar
review. Preserve all three concepts when repairing that label.
Syntax repair applied **2026-09-14**: restored the comparison operator,
source escape example, control-character group, quoted field/value example
and parenthesized Boolean example. Regression coverage checks every canonical
English executable example and explicitly asserts the Veps language queue
remains open. Finnish prose is still awaiting full translation; this repair
is not entered as a completed wrong-language correction.
Further syntax repair **2026-09-14**: the standalone escape instruction
still had two literal backslashes despite the repaired examples. Reduced it
to the English single-backslash marker and extended regression coverage to
compare the complete backslash-run inventory, not just selected examples.
Full Finnish-prose translation remains pending.
Additional dictionary access review **2026-09-14**: the Language Bank of
Finland identifies the digitized Kettunen Veps lexicon, but its linked Kotus
endpoint returned HTTP 403 in this review; VepKar returned 502. Those results
do not validate or invalidate terminology. The metadata page describes
historical field notes, not modern computer vocabulary. Further sources
remain available for review; this is not a language-repair completion claim.
Source: https://www.kielipankki.fi/lexical-conceptual-resources/vepsa/
Expanded local-value review **2026-09-14** found additional unflagged
wrong-language values. These remain repair work; they must not be hidden
by the ten-row original-finding count.
| Key | Current local value | Problem |
| --- | --- | --- |
| subtask-inherit-parent-labels | Ḓadzhela zwiredzo zwa khadi ya mubebi | Venda wording in the Veps locale; requires the complete label-inheritance instruction. |
| accessibility | Saavutettavuus | Finnish, not Veps. |
| accessibility-title | Saavutettavuus otsikko | Finnish, not Veps. |
| accessibility-content | Saavutettavuus sisältö | Finnish, not Veps. |
| parent-card | Ylätehtäväkortti | Finnish, not Veps. |
| change-card-parent | Muuta kortin ylätehtävää | Finnish, not Veps. |
| prefix-with-parent | Etuliite ylätehtävällä | Finnish, not Veps. |
| subtext-with-parent | Aliteksti ylätehtävällä | Finnish, not Veps. |
| no-parent | Älä näytä ylätehtävää | Finnish, not Veps; preserve display-only meaning. |
| trello-parent-workspace-top | Ylä taso | Finnish, not Veps. |
The source-language key `subtask-inherit-parent-labels` is
“Inherit parent's labels”; local `labels` is `Znamad` and `card` is `Kart`.
Those two nouns do not establish a native inheritance verb or the complete
parent-card relationship phrase. No replacement is claimed by this review.
Direct MediaWiki inspection also confirms `pageinfo-title` uses `Tedod`
for information and `pageinfo-robot-index` / `pageinfo-robot-noindex` use
`Lasktud` / `Kel'tüd` for enabled and disabled indexing. These support
terminology, but do not validate the Finnish accessibility noun.
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-11.74-win64.zip](https://github.com/wekan/wekan/releases/download/v11.74/wekan-11.74-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
1. [wekan-11.78-win64.zip](https://github.com/wekan/wekan/releases/download/v11.78/wekan-11.78-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
2. [node.exe](https://nodejs.org/dist/latest-v24.x/win-x64/node.exe)
@@ -22,7 +22,7 @@ Right click and download files 1-4:
6. Double click `mongodb-windows-x86_64-7.0.34-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-11.74-win64.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-11.78-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+36
View File
@@ -0,0 +1,36 @@
# WeKansec21 remediation progress
Reviewed: 2026-09-14. All ten inputs have source repairs or a test-only
resolution recorded below. Broader build and live security validation remain
incomplete; no security release is claimed.
The ten saved reports in `.tools/wekansec21` are the review inputs.
Reporter credit in the advisories: Wenhao Wu, Southeast University.
| Report | Current progress |
| --- | --- |
| Private-only board creation bypass | Confirmed in current method and sibling card-to-board conversion. Both now force private visibility under the setting. Catalog key `authz.board-visibility` records blocked overrides. Two targeted suites and Hall of Fame catalog coverage pass, including logging-failure conversion and existing server board-insert inventory coverage. Local source commit `962debc12`; browser test added and syntax-checked, live execution pending. Hall of Fame pages and critical upcoming changelog added. |
| Arbitrary private boards in sendInvitation | Confirmed configuration-gated grant bypass; repaired in `af9362126`. Every requested board must exist and grant the configured inviter role, or caller must be site admin. All grants validated before code mutation or mail. Role/grant inventory and email suites pass; browser syntax-check passes, live mail/redemption not executed. Problems key `authz.invitation-boards`, critical changelog and Hall of Fame added. |
| Linked-card source writes by comment-only members | Confirmed and repaired in `26e9e7030`: method and DDP link creation/pointer changes require source write access. Explicit non-writing source roles block delegated writes even through legacy links. UI follows the ceiling and no longer offers linking to non-writers. Actual permission/role decisions and link inventories pass; browser syntax-check passes, live execution pending. Problems key `authz.linked-write`, critical changelog and Hall of Fame added. |
| Removed-member acceptInvite reentry | Confirmed and repaired in `055cf42d4`: client updates cannot plant invitedBoards through operators, parent replacement or rename destinations. Actual modifier paths preserve ordinary preferences despite top-level field reporting. Profile guard and existing invitation suites pass; browser syntax-check passes, live execution pending. Problems key `authz.invitation-profile`, critical changelog and Hall of Fame added. |
| REST board title writes by normal members | Confirmed and repaired in `c33e9c3bf`: board title, card settings and three rule mutation endpoints now use the board-admin guard, retaining site-admin access. Actual guard and endpoint inventory tests, card-settings and rule suites pass. Problems key `authz.manage-board`; browser regression syntax-checked, live execution pending. Critical changelog and Hall of Fame added. |
| moveList clone/archive by comment-only members | Confirmed and repaired in `9b1fb5214`, including moveSwimlane, moveChecklist, importScoped, renameAttachment and changeHistory write siblings. Canonical role decisions, reported method attack and sibling guard inventory pass; browser regression syntax-check passes, live execution pending. Bounded Problems key `authz.mutation`; Hall of Fame and critical changelog updated. |
| Button-rule cross-board writes | Confirmed and repaired in `64123a603`: manual method and shared action dispatcher both enforce write capability and card-to-rule board binding. Board buttons without cards remain supported. Role/boundary decisions, dispatcher inventory and existing rule suites pass; browser syntax-check passes, live execution pending. Problems key `authz.rule-button`, critical changelog and Hall of Fame added. |
| Cross-board comment creation | Confirmed REST and DDP insert boundary bypass; repaired in `d7ac619d6`, including DDP identity rebinding. Actual REST-prefix and DDP-deny decisions, foreign-card tests and server insert inventory pass; live browser execution pending. Problems key `authz.comment-card`, Hall of Fame and critical changelog added. |
| Unvalidated subtask deposit-board disclosure | Confirmed and repaired in `c50d7b4ea`: source scope excludes unvalidated deposits and null IDs. Deposit content sits below its reactive visible-board cursor, with destination assignment policy and reactive per-card children for assigned-only roles. Status counts filter visible assigned scopes. Destination writes checked before landing structures; pointer insert/update/rename gates added. Targeted and existing subtask/status suites pass; browser syntax-check passes, live revocation/DDP pending. Problems key `authz.subtask-deposit`, critical changelog and Hall of Fame added. |
| Code scanning alert 540, HTML-filter regexp | Exact location is `tests/activityViewer.test.cjs:26`, a test-only regex substitute. Replaced with the existing sanitize-html parser in `11d2fe037`; malformed closing-tag cases and negative stub-shape check pass. No application exploit is claimed; no runtime attempt exists to log or new vulnerability Hall of Fame row to publish. |
Targeted test log: `.tools/tmp/sec21-private-only-tests.log`.
No live browser/server security reproduction has been run yet.
Translation review remains open at `docs/Features/Translations/Audit.md`.
No remote writes or publishing were performed.
Broader guard-inventory review continues, including trusted board-copy/helper
inserts and compatibility of the new reactive deposit publication.
Private-only insertion follow-up — 2026-09-14: local commit `749467c80`
enforces the policy in Boards.before.insert for trusted copies, imports and
lazy helpers. Hook regression covers enabled/disabled policy and failing
security logging. The policy and visibility-settings suites pass. Live
browser/server validation remains pending.
+11
View File
@@ -65,3 +65,14 @@ No application code or dependencies changed in this report-only pass.
Next: repair confirmed findings with positive/negative/UI coverage, review
publication audiences, then expand endpoint and async-call-site coverage.
All proposed runtime changes must retain offline on-premise operation.
## Build follow-up — 2026-09-14
Meteor debugging and Rspack migration guidance identified an undeclared
Moment import in the assignee client graph. Commit `43adfe1a7` uses the
existing native date formatter, retaining selected-calendar rendering.
The Meteor bundle build passed on Linux arm64; focused date/view and
release-preflight regressions passed. Build log:
`.tools/log/build-dev-bundle/2026-09-14/03-54-13/dev.txt`.
Live browser tests and builds on other operating systems were not run.
The security findings above remain open.
+2 -2
View File
@@ -299,9 +299,9 @@
"calendar-system": "Kalandiriye fɛɛrɛ (don jira)",
"calendar-system-gregorian": "Gregoriana",
"calendar-system-jalali": "Jalali kalandiriye (perisanikan)",
"calendar-system-buddhist": "Buddhist",
"calendar-system-buddhist": "Buddha ka kalandiriye",
"calendar-system-chinese": "Siniwajamana ka kalandiriye",
"calendar-system-coptic": "Coptic",
"calendar-system-coptic": "Kɔpti kalandiriye",
"calendar-system-dangi": "Dangi kalandiriye",
"calendar-system-ethioaa": "Etiopi ka Amete Alem kalandiriye",
"calendar-system-ethiopic": "Etiopi ka kalandiriye",
+5 -5
View File
@@ -1921,7 +1921,7 @@
"Dot": "Prik-ventespinner",
"Double-Bounce": "Dobbelt hoppende ventespinner",
"Rotateplane": "Roterende plan-ventespinner",
"Scaleout": "Skalerende ventespinner",
"Scaleout": "Ventespinner, der skalerer udad",
"Wave": "Bølge-ventespinner",
"maximize-card": "Maksimér kort",
"minimize-card": "Minimér kort",
@@ -1964,9 +1964,9 @@
"Node_heap_total_available_size": "Node heap: samlet tilgængelig størrelse",
"Node_heap_used_heap_size": "Node heap: brugt heap-størrelse",
"Node_heap_heap_size_limit": "Node heap: grænse for heap-størrelse",
"Node_heap_malloced_memory": "Node heap: allokeret hukommelse",
"Node_heap_peak_malloced_memory": "Node heap: højeste allokerede hukommelse",
"Node_heap_does_zap_garbage": "Node heap: rydder ubrugte objekter",
"Node_heap_malloced_memory": "Node heap: hukommelse allokeret med malloc",
"Node_heap_peak_malloced_memory": "Node heap: højeste hukommelsesforbrug allokeret med malloc",
"Node_heap_does_zap_garbage": "Node heap: overskriver ubrugte heap-data med et bitmønster",
"Node_heap_number_of_native_contexts": "Node heap: antal native kontekster",
"Node_heap_number_of_detached_contexts": "Node heap: antal frakoblede kontekster",
"Node_memory_usage_rss": "Node hukommelsesforbrug: resident set size",
@@ -1979,7 +1979,7 @@
"to-create-organizations-contact-admin": "Kontakt administratoren for at oprette organisationer.",
"custom-legal-notice-link-url": "Brugerdefineret URL til side med juridisk meddelelse",
"acceptance_of_our_legalNotice": "Ved at fortsætte accepterer du vores",
"legalNotice": "juridiske meddelelse",
"legalNotice": "juridisk meddelelse",
"copied": "Kopieret!",
"checklistActionsPopup-title": "Tjeklistehandlinger",
"moveChecklist": "Flyt tjekliste",
+1 -1
View File
@@ -301,7 +301,7 @@
"calendar-system-jalali": "Jalali ཟླ་ཐོ (པར་ཤི་ཡཱན)",
"calendar-system-buddhist": "ནང་པའི་ཟླ་ཐོ",
"calendar-system-chinese": "རྒྱ་ནག་གི་ཟླ་ཐོ",
"calendar-system-coptic": "Coptic",
"calendar-system-coptic": "ཀོཔ་ཊིཀ་ཟླ་ཐོ",
"calendar-system-dangi": "Dangi ཟླ་ཐོ",
"calendar-system-ethioaa": "ཨི་ཐི་ཡོ་པི་ཡ་གི་ཟླ་ཐོ (Amete Alem)",
"calendar-system-ethiopic": "ཨི་ཐི་ཡོ་པི་ཡ་གི་ཟླ་ཐོ",
+1 -1
View File
@@ -309,7 +309,7 @@
"calendar-system-indian": "india dukɔ ƒe kalenda",
"calendar-system-islamic": "Hijri kalenda",
"calendar-system-islamic-civil": "islam subɔlawo ƒe sivil kalenda",
"calendar-system-islamic-rgsa": "Islamic (Saudi Arabia)",
"calendar-system-islamic-rgsa": "Hijri kalenda (Saudi Arabia nutome, ɣleti kpɔkpɔ)",
"calendar-system-islamic-tbla": "Islamic tabular",
"calendar-system-islamic-umalqura": "Hijri kalenda (Umm al-Qura)",
"calendar-system-iso8601": "ISO 8601",
+20 -20
View File
@@ -17,7 +17,7 @@
"act-activity-notify": "Agado Sciigo",
"act-addAttachment": "aldonita alligitecon __attachment__ al karto __card__ en la listo __list__ en la naĝotubo __swimlane__ en la tabulo __board__",
"act-deleteAttachment": "forigita alligitecon __attachment__ al karto __card__ en la listo __list__ en la naĝotubo __swimlane__ en la tabulo __board__",
"act-addSubtask": "aldonita subtaskon __subtask__ al karto __card__ en la listo __list__ en la naĝotubo __swimlane__ en la tabulo __board__",
"act-addSubtask": "aldonis subtaskon __subtask__ al karto __card__ en la listo __list__ en la naĝlinio __swimlane__ en la tabulo __board__",
"act-addLabel": "Aldonita etikedo __label__ al karto __card__ en la listo __list__ en la naĝvojo __swimlane__ en la tabulo __board__",
"act-addedLabel": "Aldonita etikedo __label__ al karto __card__ en la listo __list__ en la naĝvojo __swimlane__ en la tabulo __board__",
"act-removeLabel": "Forigita etikedo __label__ de karto __card__ en la listo __list__ en la naĝotubo __swimlane__ en la tabulo __board__",
@@ -210,7 +210,7 @@
"attachment-soft-delete-pop": "La kunsendaĵo estas forigita el ĉi tiu karto kaj ĝia dosiero estas konservita. Ĉiu, kiu povas redakti la karton, povas restaŭri ĝin el la historio de la karto.",
"attachmentDeletePopup-title": "Ĉu forigi aldonaĵon?",
"attachments": "Aldonaĵoj",
"auto-watch": "Aŭtomate rigardi tabulojn kiam ili estas kreitaj",
"auto-watch": "Aŭtomate observi tabulojn kiam ili estas kreitaj",
"avatar-too-big": "La avataro estas tro granda (maks. __size__)",
"back": "Reen",
"board-change-color": "Ŝanĝi koloron",
@@ -242,7 +242,7 @@
"allBoardsChangeBackgroundImagePopup-title": "Ŝanĝi fonbildon",
"boardChangeTitlePopup-title": "Renomi tavolon",
"boardChangeVisibilityPopup-title": "Ŝanĝi videblecon",
"boardChangeWatchPopup-title": "Ŝanĝi rigardadon",
"boardChangeWatchPopup-title": "Ŝanĝi observadon",
"boardMenuPopup-title": "Agordoj de tabulo",
"allBoardsMenuPopup-title": "Agordoj",
"boardChangeViewPopup-title": "Tabula vido",
@@ -589,7 +589,7 @@
"custom-field-dropdown": "Falmenuo",
"custom-field-dropdown-none": "(nenio)",
"custom-field-dropdown-options": "Opcioj de listo",
"custom-field-dropdown-options-placeholder": "Premu Enen por aldoni pliajn opciojn",
"custom-field-dropdown-options-placeholder": "Premu la klavon Enter por aldoni pliajn opciojn",
"custom-field-dropdown-unknown": "(nekonata)",
"custom-field-dropdownMultiSelect": "Falmenuo (plurelekto)",
"custom-field-number": "Nombro",
@@ -597,9 +597,9 @@
"custom-fields": "Propraj kampoj",
"date": "Dato",
"date-format": "Datformato",
"date-format-yyyy-mm-dd": "JJJJ-MM-TT",
"date-format-dd-mm-yyyy": "TT-MM-JJJJ",
"date-format-mm-dd-yyyy": "MM-TT-JJJJ",
"date-format-yyyy-mm-dd": "YYYY-MM-DD",
"date-format-dd-mm-yyyy": "DD-MM-YYYY",
"date-format-mm-dd-yyyy": "MM-DD-YYYY",
"decline": "Malakcepti",
"default-avatar": "Defaŭlta avataro",
"delete": "Forigi",
@@ -729,7 +729,7 @@
"filter-to-selection": "Filtri al elekto",
"other-filters-label": "Aliaj filtriloj",
"advanced-filter-label": "Altnivela filtrilo",
"advanced-filter-description": "La altnivela filtrilo permesas skribi ĉenon kun la jenaj operatoroj: == != <= >= && || ( ) Spaco estas uzata kiel apartigilo inter la operatoroj. Vi povas filtri laŭ ĉiuj propraj kampoj tajpante iliajn nomojn kaj valorojn. Ekzemple: Kampo1 == Valoro1. Rimarko: se kampoj aŭ valoroj enhavas spacojn, vi devas meti ilin inter unuopajn citilojn. Ekzemple: 'Kampo 1' == 'Valoro 1'. Por preterlasi unuopajn regsignojn (' \\/) vi povas uzi \\. Ekzemple: Kampo1 == I\\'m. Vi ankaŭ povas kombini plurajn kondiĉojn. Ekzemple: F1 == V1 || F1 == V2. Normale ĉiuj operatoroj estas interpretataj de maldekstre dekstren. Vi povas ŝanĝi la ordon per krampoj. Ekzemple: F1 == V1 && ( F2 == V2 || F2 == V3 ). Vi ankaŭ povas serĉi en tekstaj kampoj per regulesprimo: F1 == /Tes.*/i",
"advanced-filter-description": "La altnivela filtrilo permesas skribi ĉenon kun la jenaj operatoroj: == != <= >= && || ( ) Spaco estas uzata kiel apartigilo inter la operatoroj. Vi povas filtri laŭ ĉiuj propraj kampoj tajpante iliajn nomojn kaj valorojn. Ekzemple: Field1 == Value1. Rimarko: se kampoj aŭ valoroj enhavas spacojn, vi devas meti ilin inter unuopajn citilojn. Ekzemple: 'Field 1' == 'Value 1'. Por trakti la specialajn signojn (' \\/) kiel literalajn signojn, vi povas uzi \\. Ekzemple: Field1 == I\\'m. Vi ankaŭ povas kombini plurajn kondiĉojn. Ekzemple: F1 == V1 || F1 == V2. Normale ĉiuj operatoroj estas interpretataj de maldekstre dekstren. Vi povas ŝanĝi la ordon per krampoj. Ekzemple: F1 == V1 && ( F2 == V2 || F2 == V3 ). Vi ankaŭ povas serĉi en tekstaj kampoj per regulesprimo: F1 == /Tes.*/i",
"text-contains-trigger-label": "Teksto serĉenda",
"text-contains-trigger-description": "Kongruas kiam karto estas kreita, aŭ ĝia titolo aŭ priskribo estas ŝanĝita, kaj la nova teksto enhavas ĉi tion (sen distingo inter majuskloj kaj minuskloj).",
"fullname": "Plena nomo",
@@ -900,7 +900,7 @@
"normal-assigned-only-desc": "Nur atribuitaj kartoj videblas. Redaktas kiel normala uzanto.",
"not-accepted-yet": "Invito ankoraŭ ne akceptita",
"notify-participate": "Ricevi ĝisdatigojn pri ĉiuj kartoj, en kiuj vi partoprenas kiel kreinto aŭ membro",
"notify-watch": "Ricevi ĝisdatigojn pri ĉiuj tabuloj, listoj aŭ kartoj, kiujn vi rigardas",
"notify-watch": "Ricevi ĝisdatigojn pri ĉiuj tabuloj, listoj aŭ kartoj, kiujn vi observas",
"optional": "laŭvola",
"or": "aŭ",
"page-maybe-private": "Ĉi tiu paĝo eble estas privata. Vi eble povos vidi ĝin post <a href='%s'>ensaluto</a>.",
@@ -928,7 +928,7 @@
"remove-member": "Forigi membron",
"deleted-user": "Forigita uzanto",
"remove-member-from-card": "Forigi de karto",
"remove-member-pop": "Ĉu forigi __name__ (__username__) el __boardTitle__? La membro estos forigita el ĉiuj kartoj en ĉi tiu tabulo. Ili ricevos sciigon.",
"remove-member-pop": "Ĉu forigi __name__ (__username__) el __boardTitle__? La membro estos forigita el ĉiuj kartoj en ĉi tiu tabulo. La membro ricevos sciigon.",
"sandstorm-remove-member-warning": "Ĉi tio nur kaŝas la membron ene de WeKan. Ĝi ne nuligas la aliron al la Sandstorm-greno. Nuligu ankaŭ ties aliron en la dialogo Kunhavigi aliron de Sandstorm.",
"removeMemberPopup-title": "Ĉu forigi membron?",
"rename": "Renomi",
@@ -940,7 +940,7 @@
"search": "Serĉi",
"rules": "Reguloj",
"search-cards": "Serĉi en titoloj de kartoj/listoj, priskriboj kaj propraj kampoj en ĉi tiu tabulo",
"search-example": "Skribu la serĉatan tekston kaj premu Enen",
"search-example": "Skribu la serĉatan tekston kaj premu la klavon Enter",
"select-color": "Elekti koloron",
"select-board": "Elekti tabulon",
"set-wip-limit-value": "Agordi limon por la maksimuma nombro de taskoj en ĉi tiu listo",
@@ -979,8 +979,8 @@
"this-board": "ĉi tiu tabulo",
"this-card": "ĉi tiu karto",
"spent-time-hours": "Pasigita tempo (horoj)",
"overtime-hours": "Kroma tempo (horoj)",
"overtime": "Kroma tempo",
"overtime-hours": "Kromlaboro (horoj)",
"overtime": "Kromlaboro",
"flowtime": "Flutempo",
"flow-start": "Ekigi Fluon",
"flow-stop": "Halti Fluon",
@@ -991,7 +991,7 @@
"pomodoro-work": "Laboro",
"pomodoro-break": "Paŭzo",
"pomodoro-completed": "%s kompletigitaj",
"has-overtime-cards": "Havas kartojn kun kroma tempo",
"has-overtime-cards": "Havas kartojn kun kromlaboro",
"has-spenttime-cards": "Havas kartojn kun pasigita tempo",
"time": "Tempo",
"title": "Titolo",
@@ -1003,7 +1003,7 @@
"type": "Tipo",
"unassign-member": "Malatribui membron",
"unsaved-description": "Vi havas nekonservitan priskribon.",
"unwatch": "Ĉesi rigardi",
"unwatch": "Ĉesi observi",
"upload": "Alŝuti",
"upload-avatar": "Alŝuti avataron",
"uploaded-avatar": "Alŝutis avataron",
@@ -1228,7 +1228,7 @@
"activity-removed-label-card": "forigis etikedon '%s'",
"activity-delete-attach-card": "forigis aldonaĵon",
"activity-set-customfield": "agordis propran kampon '%s' al '%s' en %s",
"activity-unset-customfield": "malagordis propran kampon '%s' en %s",
"activity-unset-customfield": "forigis la valoron de la propra kampo '%s' en %s",
"r-rule": "Regulo",
"r-add-trigger": "Aldoni ekigilon",
"r-add-action": "Aldoni agon",
@@ -1863,7 +1863,7 @@
"custom-field-stringtemplate": "Ĉena ŝablono",
"custom-field-stringtemplate-format": "Formato (uzu %{value} kiel lokokupilon)",
"custom-field-stringtemplate-separator": "Apartigilo (uzu &#32; aŭ &nbsp; por spaco)",
"custom-field-stringtemplate-item-placeholder": "Premu Enen por aldoni pliajn erojn",
"custom-field-stringtemplate-item-placeholder": "Premu la klavon Enter por aldoni pliajn erojn",
"creator": "Kreinto",
"creator-on-minicard": "Kreinto sur minikarto",
"filesReportTitle": "Raporto pri dosieroj",
@@ -1966,10 +1966,10 @@
"Node_heap_heap_size_limit": "Node-amaso: limo de amasa grando",
"Node_heap_malloced_memory": "Node-amaso: memoro asignita per malloc",
"Node_heap_peak_malloced_memory": "Node-amaso: pinta memoro asignita per malloc",
"Node_heap_does_zap_garbage": "Node-amaso: ĉu nuligas rubon",
"Node_heap_does_zap_garbage": "Node-amaso: ĉu superskribas rubon per bitŝablono",
"Node_heap_number_of_native_contexts": "Node-amaso: nombro de indiĝenaj kuntekstoj",
"Node_heap_number_of_detached_contexts": "Node-amaso: nombro de malligitaj kuntekstoj",
"Node_memory_usage_rss": "Node-memoruzo: rezida aro (RSS)",
"Node_memory_usage_rss": "Node-memoruzo: grando de la rezida aro (RSS)",
"Node_memory_usage_heap_total": "Node-memoruzo: tuta grando de la asignita amaso",
"Node_memory_usage_heap_used": "Node-memoruzo: efektive uzata memoro",
"Node_memory_usage_external": "Node-memoruzo: ekstera",
@@ -2138,7 +2138,7 @@
"accounts-lockout-unknown-users": "Agordoj por nekonataj uzantoj (neekzistanta uzantnomo)",
"accounts-lockout-failures-before": "Malsukcesoj antaŭ ŝloso",
"accounts-lockout-period": "Ŝlosa periodo (sekundoj)",
"accounts-lockout-failure-window": "Malsukcesa fenestro (sekundoj)",
"accounts-lockout-failure-window": "Tempofenestro por malsukcesoj (sekundoj)",
"accounts-lockout-settings-updated": "Agordoj de protekto kontraŭ krudforta atako estas ĝisdatigitaj",
"accounts-lockout-locked-users": "Ŝlositaj uzantoj",
"accounts-lockout-locked-users-info": "Uzantoj nun ŝlositaj pro tro multaj malsukcesaj ensalutprovoj",
+7 -7
View File
@@ -41,10 +41,10 @@
"act-setCustomField": "__customField__ eremu pertsonalizatua editatu du: __customFieldValue__, __card__ txartelean, __list__ zerrendan, __swimlane__ errailean, __board__ arbelean",
"act-createList": "__list__ zerrenda gehitu du __board__ arbelera",
"act-addBoardMember": "__member__ kidea gehitu du __board__ arbelera",
"act-archivedBoard": "__board__ arbela biltegira eraman da",
"act-archivedCard": "__card__ txartela biltegira eraman da, __list__ zerrendatik, __swimlane__ errailean, __board__ arbelean",
"act-archivedList": "__list__ zerrenda biltegira eraman da, __swimlane__ errailean, __board__ arbelean",
"act-archivedSwimlane": "__swimlane__ erraila biltegira eraman da, __board__ arbelean",
"act-archivedBoard": "__board__ arbela artxibora eraman da",
"act-archivedCard": "__card__ txartela artxibora eraman da, __list__ zerrendatik, __swimlane__ errailean, __board__ arbelean",
"act-archivedList": "__list__ zerrenda artxibora eraman da, __swimlane__ errailean, __board__ arbelean",
"act-archivedSwimlane": "__swimlane__ erraila artxibora eraman da, __board__ arbelean",
"act-importBoard": "__board__ arbela inportatu da",
"act-importCard": "__board__ arbeleko __swimlane__  erraileko __list__  zerrendako __card__ txartela inportatu da",
"act-importList": "__board__ arbeleko __swimlane__ erraileko __list__ zerrenda inportatu da",
@@ -1339,8 +1339,8 @@
"set-filter": "Ezarri iragazkia",
"r-moved-to": "Eramaten denean hona:",
"r-moved-from": "Eramaten denean hemendik:",
"r-archived": "Biltegira eraman da",
"r-unarchived": "Biltegitik berreskuratu da",
"r-archived": "Artxibora eraman da",
"r-unarchived": "Artxibotik berreskuratu da",
"r-a-card": "txartel bat",
"r-when-a-label-is": "Etiketa bat",
"r-when-the-label": "Etiketa hau",
@@ -1773,7 +1773,7 @@
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - fitxes que es van modificar *<n>* fa dies o menys",
"globalSearch-instructions-operator-status": "`__operator_status__:<status>` - non *<status>* hauetako bat den:",
"globalSearch-instructions-status-archived": "`__predicate_archived__` - fitxes arxivades",
"globalSearch-instructions-status-all": "`__predicate_all__` - biltegiratutako eta biltegiratu gabeko txartel guztiak",
"globalSearch-instructions-status-all": "`__predicate_all__` - artxibatutako eta artxibatu gabeko txartel guztiak",
"globalSearch-instructions-status-ended": "`__predicate_ended__`: fitxes amb una data de finalització",
"globalSearch-instructions-status-public": "`__predicate_public__` - fitxes només als taulers públics",
"globalSearch-instructions-status-private": "`__predicate_private__` - arbel pribatuetako txartelak soilik",
+3 -3
View File
@@ -299,9 +299,9 @@
"calendar-system": "Njuɓɓudi haatumeere (hollirde ñalnde)",
"calendar-system-gregorian": "Gregoriana",
"calendar-system-jalali": "Haatumeere Jalali (Perseere)",
"calendar-system-buddhist": "Buddhist",
"calendar-system-buddhist": "Ñalɗimere Buudayanko",
"calendar-system-chinese": "Haatumeere Siin",
"calendar-system-coptic": "Coptic",
"calendar-system-coptic": "Ñalɗimere Koptinko",
"calendar-system-dangi": "Haatumeere Dangi",
"calendar-system-ethioaa": "Haatumeere Amete Alem Ecoppi",
"calendar-system-ethiopic": "Haatumeere Ecoppi",
@@ -309,7 +309,7 @@
"calendar-system-indian": "Haatumeere leydi (Enndo)",
"calendar-system-islamic": "Haatumeere Lislaam",
"calendar-system-islamic-civil": "Islamic civil",
"calendar-system-islamic-rgsa": "Islamic (Saudi Arabia)",
"calendar-system-islamic-rgsa": "Haatumeere Lislaam (Arabii Sawdit, yiide lewru)",
"calendar-system-islamic-tbla": "Islamic tabular",
"calendar-system-islamic-umalqura": "Haatumeere Lislaam (Umm al-Qura)",
"calendar-system-iso8601": "ISO 8601",
+10 -10
View File
@@ -752,7 +752,7 @@
"import-board-instruction-asana": "Pega un JSON de exportación de tarefas de Asana ({ \"data\": [...] } da exportación de Asana ou GET /tasks). As tarefas agrúpanse en seccións (memberships); as tarefas completadas van a Feito.",
"import-board-instruction-zenkit": "Pega un JSON de exportación de lista de ZenKit ({ \"title\", \"stages\":[...], \"items\":[...] }). As stages convértense en listas e os items en cartões.",
"import-board-instruction-markdown": "Pegue unha lista de tarefas en markdown (a convención que usan ferramentas markdown-kanban como Obsidian Kanban): cabeceiras \"## Nome da lista\", con elementos \"- [ ]\"/\"- [x]\" debaixo. As cabeceiras convértense en listas e os elementos en tarxetas; unha simple lista de viñetas sen caixas tamén se importa, como tarxetas abertas.",
"import-board-instruction-trello": "No teu taboleiro de Trello, vai a 'Menú', despois a 'Máis', 'Imprimir e exportar', 'Exportar JSON', e copia o texto resultante.",
"import-board-instruction-trello": "No teu taboleiro de Trello, vai a 'Menu', despois a 'More', 'Print and Export', 'Export JSON', e copia o texto resultante.",
"import-board-instruction-csv": "Pega os teus valores separados por comas (CSV) / valores separados por tabulacións (TSV).",
"import-board-instruction-jira": "Pega o JSON da busca de incidencias da API REST de Jira Cloud (GET /rest/api/2/search), ou un obxecto equivalente { \"issues\": [...] }. Os estados de Jira convértense en listas e as incidencias en cartões. Opcionalmente inclúe unha matriz \"automationRules\" para importar regras.",
"import-board-instruction-excel": "Escolle unha folla de cálculo .xlsx ao estilo de WeKan (as mesmas columnas que a exportación a Excel: Title, Description, Status/List, Members, Labels, datas, campos personalizados). A primeira fila é a cabeceira.",
@@ -1167,8 +1167,8 @@
"team-propagate-members-to-boards": "Propagar membros aos quadros",
"team-sync-members-from-auth": "Sincronizar membros desde o provedor de autenticación",
"active-person": "Persoa activa",
"card-received": "Recibido",
"card-received-on": "Recibido o",
"card-received": "Recibida",
"card-received-on": "Recibida o",
"card-end": "Fim",
"card-end-on": "Remata o",
"editCardReceivedDatePopup-title": "Cambiar a data de recepción",
@@ -1228,7 +1228,7 @@
"activity-removed-label-card": "quitou a etiqueta '%s'",
"activity-delete-attach-card": "eliminou un anexo",
"activity-set-customfield": "estableceu o campo personalizado '%s' a '%s' en %s",
"activity-unset-customfield": "quitou o campo personalizado '%s' en %s",
"activity-unset-customfield": "quitou o valor do campo personalizado '%s' en %s",
"r-rule": "Regra",
"r-add-trigger": "Engadir disparador",
"r-add-action": "Engadir acción",
@@ -1353,10 +1353,10 @@
"r-when-a-attach": "Cando un anexo",
"r-when-a-card-matches-advanced-filter": "Cando unha tarxeta coincide co filtro avanzado",
"r-when-a-card-title-or-description-contains": "Cando o título ou a descrición da tarxeta contén",
"r-when-a-due-date-changed": "Data limite: a data cambiou",
"r-when-a-start-date-changed": "Data de início: a data cambiou",
"r-when-a-end-date-changed": "Fim: a data cambiou",
"r-when-a-received-date-changed": "Recebido: a data cambiou",
"r-when-a-due-date-changed": "Cando se establece ou cambia a data de vencemento",
"r-when-a-start-date-changed": "Cando se establece ou cambia a data de inicio",
"r-when-a-end-date-changed": "Cando se establece ou cambia a data de fin",
"r-when-a-received-date-changed": "Cando se establece ou cambia a data de recepción",
"r-when-a-checklist": "Cando unha lista de verificación é",
"r-when-the-checklist": "Cando a lista de verificación",
"r-completed": "Completada",
@@ -1966,7 +1966,7 @@
"Node_heap_heap_size_limit": "Memoria heap de Node: límite de tamaño do heap",
"Node_heap_malloced_memory": "Memoria heap de Node: memoria asignada con malloc",
"Node_heap_peak_malloced_memory": "Memoria heap de Node: pico de memoria asignada con malloc",
"Node_heap_does_zap_garbage": "Memoria heap de Node: limpa o lixo (zap garbage)",
"Node_heap_does_zap_garbage": "Memoria heap de Node: sobrescribe o lixo cun patrón de bits",
"Node_heap_number_of_native_contexts": "Memoria heap de Node: número de contextos nativos",
"Node_heap_number_of_detached_contexts": "Memoria heap de Node: número de contextos desvinculados",
"Node_memory_usage_rss": "Uso de memoria de Node: tamaño do conxunto residente",
@@ -2480,7 +2480,7 @@
"step-fix-file-urls": "Corrixindo os URL dos ficheiros",
"cleanup": "Limpeza",
"cleanup-old-jobs": "Limpar os traballos antigos",
"completed": "Completado",
"completed": "Completada",
"conversion-info-text": "Esta conversión realízase unha vez por taboleiro e mellora o rendemento. Pode seguir usando o taboleiro con normalidade.",
"converting-board": "Convertendo o taboleiro",
"converting-board-description": "Convertendo a estrutura do taboleiro para mellorar a funcionalidade. Pode tardar uns instantes.",
+1 -1
View File
@@ -309,7 +309,7 @@
"calendar-system-indian": "Mamallaqta intiwatana (India)",
"calendar-system-islamic": "Hijri Intiwatana",
"calendar-system-islamic-civil": "Hijri Intiwatana (tabular, epoca civil)",
"calendar-system-islamic-rgsa": "Islamic (Saudi Arabia)",
"calendar-system-islamic-rgsa": "Hijri Intiwatana (Arabia Saudita rikusqa)",
"calendar-system-islamic-tbla": "Islamic tabular",
"calendar-system-islamic-umalqura": "Hijri Intiwatana (Umm al-Qura)",
"calendar-system-iso8601": "ISO-8601 Intiwatana",
+1 -1
View File
@@ -729,7 +729,7 @@
"filter-to-selection": "Suodata valintaan",
"other-filters-label": "Muut suodattimet",
"advanced-filter-label": "Edistynyt suodatin",
"advanced-filter-description": "Edistynyt suodatin mahdollistaa merkkijonon, joka sisältää seuraavat operaattorit: == != <= >= && || ( ) Operaattorien välissä käytetään välilyöntiä. Voit suodattaa kaikki mukautetut kentät kirjoittamalla niiden nimet ja arvot. Esimerkiksi: Field1 == Value1. Huom: Jos kentillä tai arvoilla on välilyöntejä, sinun on sijoitettava ne yksittäisiin lainausmerkkeihin. Esimerkki: 'Kenttä 1' == 'Arvo 1'. Voit hypätä yksittäisen kontrollimerkkien (' \\\\/) yli käyttämällä \\\\. Esimerkki: Field1 = I\\\\'m. Voit myös yhdistää useita ehtoja. Esimerkiksi: F1 == V1 || F1 == V2. Yleensä kaikki operaattorit tulkitaan vasemmalta oikealle. Voit muuttaa järjestystä asettamalla sulkuja. Esimerkiksi: F1 == V1 && (F2 == V2 || F2 == V3). Voit myös etsiä tekstikentistä regexillä: F1 == /Tes.*/i",
"advanced-filter-description": "Edistynyt suodatin mahdollistaa merkkijonon, joka sisältää seuraavat operaattorit: == != <= >= && || ( ) Operaattorien välissä käytetään välilyöntiä. Voit suodattaa kaikki mukautetut kentät kirjoittamalla niiden nimet ja arvot. Esimerkiksi: Field1 == Value1. Huom: Jos kentillä tai arvoilla on välilyöntejä, sinun on sijoitettava ne yksittäisiin lainausmerkkeihin. Esimerkki: 'Field 1' == 'Value 1'. Voit hypätä yksittäisen kontrollimerkkien (' \\/) yli käyttämällä \\. Esimerkki: Field1 == I\\'m. Voit myös yhdistää useita ehtoja. Esimerkiksi: F1 == V1 || F1 == V2. Yleensä kaikki operaattorit tulkitaan vasemmalta oikealle. Voit muuttaa järjestystä asettamalla sulkuja. Esimerkiksi: F1 == V1 && ( F2 == V2 || F2 == V3 ). Voit myös etsiä tekstikentistä regexillä: F1 == /Tes.*/i",
"text-contains-trigger-label": "Umbhalo ozofunwa",
"text-contains-trigger-description": "Iyahambisana lapho ikhadi lidalwa, noma isihloko noma incazelo yalo ishintshwa, futhi umbhalo omusha unalokhu (akunandaba nosayizi wezinhlamvu).",
"fullname": "Koko nimi",
File diff suppressed because it is too large. Load diff
+2 -6
View File
@@ -1,3 +1,4 @@
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
import { ReactiveCache } from '/imports/reactiveCache';
import { Meteor } from 'meteor/meteor';
import { MongoInternals } from 'meteor/mongo';
@@ -378,12 +379,7 @@ Meteor.methods({
throw new Meteor.Error('board-not-found', 'Board not found');
}
if (!allowIsBoardMember(currentUserId, board)) {
if (process.env.DEBUG === 'true') {
console.warn(`Blocked unauthorized attachment rename attempt: user ${currentUserId} tried to rename attachment ${fileObjId} in board ${fileObj.meta?.boardId}`);
}
throw new Meteor.Error('not-authorized', 'You do not have permission to modify this attachment');
}
requireBoardMutation(currentUserId, board, 'renameAttachment', Meteor);
rename(fileObj, newName, fileStoreStrategyFactory);
},
+7
View File
@@ -3079,6 +3079,13 @@ Boards.helpers({
},
async setSubtasksDefaultBoardId(subtasksDefaultBoardId) {
if (Meteor.isServer && subtasksDefaultBoardId) {
const { canWriteSubtaskDeposit, recordSubtaskDepositDenial } = require('/server/lib/subtaskDepositAccess');
if (!(await canWriteSubtaskDeposit(Meteor.userId(), subtasksDefaultBoardId))) {
recordSubtaskDepositDenial('setSubtasksDefaultBoardId');
throw new Meteor.Error('not-authorized');
}
}
return await Boards.updateAsync(this._id, { $set: { subtasksDefaultBoardId } });
},
+2 -6
View File
@@ -1,3 +1,4 @@
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
import { Meteor } from 'meteor/meteor';
import { ReactiveCache } from '/imports/reactiveCache';
import { TrelloCreator } from './trelloCreator';
@@ -179,12 +180,7 @@ Meteor.methods({
const board = await ReactiveCache.getBoard(target.boardId);
if (!board) throw new Meteor.Error('board-not-found', 'Board not found');
// Importing WRITES to this board, so it is not the export's "can you see
// it": it is "may you change it".
if (!board.isVisibleBy(await ReactiveCache.getCurrentUser())
|| !board.isBoardMember()) {
throw new Meteor.Error('forbidden', 'Not allowed to import into this board');
}
requireBoardMutation(userId, board, 'importScoped', Meteor);
if (doc._format && doc._format !== 'wekan-board-1.0.0') {
throw new Meteor.Error('invalid-format', `Unknown export format: ${doc._format}`);
}
+3 -6
View File
@@ -1,13 +1,10 @@
'use strict';
// The selector matching cards that belong to a board: the board itself, plus its
// subtasks-default board when one is configured.
//
// Keep the ordinary MongoDB selector shape. FerretDB is responsible for pushing
// the null-containing `$in` into its backend without requiring clients to rewrite it.
// A destination pointer is not read permission. Foreign deposit content is
// published beneath its own reactive, authorized board cursor instead.
function boardScopeIds(board) {
if (!board || typeof board._id !== 'string' || board._id.length === 0) return [];
return [board._id, board.subtasksDefaultBoardId ?? null];
return [board._id];
}
// Spread this into a card selector: `{ ...boardCardScope(board), archived: false }`.
+19
View File
@@ -0,0 +1,19 @@
'use strict';
const { memberCan } = require('./boardRoleCapabilities');
// Shared by server methods and their client stubs. The capability decision is
// identical on both; only the server records attempted unauthorized writes.
function requireBoardMutation(userId, board, source, Meteor) {
if (board && memberCan(board.members, userId, 'write')) return;
if (Meteor.isServer) {
try {
require('/server/lib/securityLog').record({
key: 'authz.mutation', action: 'blocked', source,
detail: 'Board mutation denied because the caller lacks write access.',
});
} catch (e) { /* logging must never break the guard */ }
}
throw new Meteor.Error('not-authorized', 'You cannot change this board.');
}
module.exports = { requireBoardMutation };
+20
View File
@@ -0,0 +1,20 @@
'use strict';
const { memberCan } = require('./boardRoleCapabilities');
function buttonRuleAllowed(userId, board, cardId, card) {
return Boolean(board && memberCan(board.members, userId, 'write') &&
(cardId === undefined || (card && card._id === cardId && card.boardId === board._id)));
}
function requireButtonRuleContext(userId, board, cardId, card, Meteor) {
if (buttonRuleAllowed(userId, board, cardId, card)) return;
try {
require('/server/lib/securityLog').record({
key: 'authz.rule-button', action: 'blocked', source: 'rule:button',
detail: 'Button rule denied because its caller or card is outside the writable board context.',
});
} catch (e) { /* logging must never break the guard */ }
throw new Meteor.Error('not-authorized', 'Button rule context is not authorized.');
}
module.exports = { buttonRuleAllowed, requireButtonRuleContext };
+18
View File
@@ -0,0 +1,18 @@
'use strict';
function commentCardMatchesBoard(card, cardId, boardId) {
return Boolean(card && typeof cardId === 'string' && cardId &&
typeof boardId === 'string' && boardId &&
card._id === cardId && card.boardId === boardId);
}
function recordCommentBoundaryDenial(source) {
try {
require('/server/lib/securityLog').record({
key: 'authz.comment-card', action: 'blocked', source,
detail: 'Comment refused because its card does not belong to the requested board.',
});
} catch (e) { /* logging must never break the guard */ }
}
module.exports = { commentCardMatchesBoard, recordCommentBoundaryDenial };
+10
View File
@@ -0,0 +1,10 @@
'use strict';
const { memberRoleOf } = require('./boardRoleCapabilities');
function canInviteToBoard(user, board, allowedRoles) {
if (!user || !board) return false;
if (user.isAdmin) return true;
const member = Array.isArray(board.members) && board.members.find(item => item.userId === user._id);
const role = memberRoleOf(member);
return Boolean(role && Array.isArray(allowedRoles) && allowedRoles.includes(role));
}
module.exports = { canInviteToBoard };
+15
View File
@@ -0,0 +1,15 @@
'use strict';
const { memberCan, memberRoleOf } = require('./boardRoleCapabilities');
function sourceRoleBlocksDelegation(userId, board) {
const member = board && Array.isArray(board.members) && board.members.find(item => item.userId === userId);
return Boolean(memberRoleOf(member) && !memberCan(board.members, userId, 'write'));
}
function recordLinkedWriteDenial(source) {
try {
require('/server/lib/securityLog').record({
key: 'authz.linked-write', action: 'blocked', source,
detail: 'Linked-card write or link creation denied by the source board write policy.',
});
} catch (e) { /* logging must never break the guard */ }
}
module.exports = { sourceRoleBlocksDelegation, recordLinkedWriteDenial };
+9
View File
@@ -9,6 +9,15 @@
// so both the server ESM code and the tests/*.test.cjs guards can load it.
const CATALOG = {
'authz.subtask-deposit': { category: 'authz', bleed: 'SubtaskDepositBleed', severity: 'high', cwe: 'CWE-639' },
'authz.linked-write': { category: 'authz', bleed: 'LinkedWriteBleed', severity: 'high', cwe: 'CWE-863' },
'authz.invitation-boards': { category: 'authz', bleed: 'InvitationBoardBleed', severity: 'high', cwe: 'CWE-639' },
'authz.invitation-profile': { category: 'authz', bleed: 'InviteProfileBleed', severity: 'high', cwe: 'CWE-863' },
'authz.rule-button': { category: 'authz', bleed: 'RuleButtonBleed', severity: 'high', cwe: 'CWE-639' },
'authz.manage-board': { category: 'authz', bleed: 'ManageBoardBleed', severity: 'high', cwe: 'CWE-863' },
'authz.comment-card': { category: 'authz', bleed: 'CommentBoundaryBleed', severity: 'high', cwe: 'CWE-639' },
'authz.mutation': { category: 'authz', bleed: 'MutationBleed', severity: 'high', cwe: 'CWE-863' },
'authz.board-visibility': { category: 'authz', bleed: 'VisibilityBleed', severity: 'medium', cwe: 'CWE-863' },
'ssrf.redirect': { category: 'ssrf', bleed: 'RedirectBleed', severity: 'high', cwe: 'CWE-918' },
'ssrf.attachment': { category: 'ssrf', bleed: 'LiveBleed', severity: 'high', cwe: 'CWE-918' },
'ssrf.fetch': { category: 'ssrf', bleed: 'DnsBleed', severity: 'high', cwe: 'CWE-918' },
+11 -2
View File
@@ -1191,6 +1191,7 @@ Users.attachSchema(
export const USER_UPDATE_ALLOWED_EXACT = ['username', 'profile', 'modifiedAt'];
export const USER_UPDATE_ALLOWED_PREFIXES = ['profile.'];
export const USER_UPDATE_FORBIDDEN_PREFIXES = [
'profile.invitedBoards',
'services',
'emails',
'roles',
@@ -1210,8 +1211,16 @@ export function isUserUpdateAllowed(fields) {
return result;
}
export function hasForbiddenUserUpdateField(fields) {
const result = fields.some((f) => USER_UPDATE_FORBIDDEN_PREFIXES.some((p) => f === p || f.startsWith(p + '.')));
export function hasForbiddenUserUpdateField(fields, modifier) {
// Meteor may report the top-level "profile" field for a leaf update. Inspect
// operator paths so ordinary preferences do not become forbidden merely
// because another profile descendant is a server-issued capability.
const paths = modifier && typeof modifier === 'object'
? Object.entries(modifier).flatMap(([operator, value]) => {
if (!operator.startsWith('$') || !value || typeof value !== 'object') return [operator];
return operator === '$rename' ? [...Object.keys(value), ...Object.values(value)] : Object.keys(value);
}) : fields;
const result = paths.some((f) => USER_UPDATE_FORBIDDEN_PREFIXES.some((p) => f === p || f.startsWith(p + '.') || p.startsWith(f + '.')));
return result;
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "wekan",
"version": "v11.74.0",
"version": "v11.78.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "wekan",
"version": "v11.74.0",
"version": "v11.78.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v11.74.0",
"version": "v11.78.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
+7 -1
View File
@@ -369,7 +369,13 @@ export default class LDAP {
getUserFilter(username) {
const filter = [];
if (this.options.User_Search_Filter !== '') {
// The optional filter may be unset, especially in snap configurations.
// Binding succeeds before this method runs; indexing undefined made the
// subsequent search look like a bind failure (#6692).
if (this.options.User_Search_Filter != null && this.options.User_Search_Filter !== '') {
if (typeof this.options.User_Search_Filter !== 'string') {
throw new Error('LDAP_USER_SEARCH_FILTER must be a string');
}
if (this.options.User_Search_Filter[0] === '(') {
filter.push(`${this.options.User_Search_Filter}`);
} else {
+9
View File
@@ -22,6 +22,15 @@ function sanitizeForLogging(value) {
if (value && typeof value === 'object') {
const sanitized = {};
// Error.name/message are non-enumerable. Object.keys alone turned
// bind, connection and certificate failures into an unhelpful {}.
if (value instanceof Error) {
['name', 'message', 'code', 'reason'].forEach((key) => {
if (value[key] !== undefined) {
sanitized[key] = sanitizeForLogging(value[key]);
}
});
}
Object.keys(value).forEach((key) => {
if (isSensitiveKey(key)) {
sanitized[key] = '[REDACTED]';
+7 -7
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf8" />
<title>WeKan REST API v11.74</title>
<title>WeKan REST API v11.78</title>
<!-- needed for adaptive design -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
@@ -427,7 +427,7 @@ data-styled.g139[id="sc-iIvZUO"]{content:"kAmnlO,"}/*!sc*/
55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864
-231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688,
-104.0616 -231.873,-231.248 z
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v11.74<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v11.78<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
&lt;p&gt;If you are an end-user and not a dev or a tester, &lt;a href=&quot;https://github.com/wekan/wekan/issues/new&quot;&gt;create an issue&lt;/a&gt; to request new APIs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All API calls in the documentation are made using &lt;code&gt;curl&lt;/code&gt;. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.&lt;/p&gt;
@@ -1197,13 +1197,13 @@ data-styled.g139[id="sc-iIvZUO"]{content:"kAmnlO,"}/*!sc*/
key of the board, as &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;) and of the card-aging thresholds
(&lt;code&gt;cardAgingDays1&lt;/code&gt;..&lt;code&gt;cardAgingDays3&lt;/code&gt;, non-negative integers). Keys not in
the body are left as they are; a body with no recognised key is a 400.
Requires board write access. Returns the settings in effect, in the same
Requires board administrator access. Returns the settings in effect, in the same
shape as GET.&lt;/p&gt;
" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"><p>Sets any subset of the card feature toggles (any <code>allows*</code>
key of the board, as <code>true</code>/<code>false</code>) and of the card-aging thresholds
(<code>cardAgingDays1</code>..<code>cardAgingDays3</code>, non-negative integers). Keys not in
the body are left as they are; a body with no recognised key is a 400.
Requires board write access. Returns the settings in effect, in the same
Requires board administrator access. Returns the settings in effect, in the same
shape as GET.</p>
</div></div><div class="sc-fuYIqi kGZLat"><div class="sc-dalEhJ jdqJPb"><h5 class="sc-iqkkDd sc-jQQpTv jprlAr kEkHzF">Authorizations:</h5><svg class="sc-dYjPD bEEWJa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTPGds cVAkzL"><span class="sc-dtnsVa hFacFb"><span class="sc-hPfayn hAYuWG"><i>UserSecurity</i></span></span></div></div><div><h5 class="sc-iqkkDd jprlAr">path<!-- --> Parameters</h5><table class="sc-hHopjF bsjUmE"><tbody><tr class="last "><td kind="field" title="board" class="sc-hCcPtG sc-fFCZOx jFNAwF lcdEEX"><span class="sc-ieCSdj kkMuqc"></span><span class="property-name">board</span><div class="sc-gSILEF sc-eIYgEQ jMRTsl dHYagA">required</div></td><td class="sc-bjLslk gLpZiQ"><div><div><span class="sc-gSILEF sc-lbpDNm jMRTsl NncTE"></span><span class="sc-gSILEF sc-iNyHtD jMRTsl kUjPnZ">string</span></div> <div><div html="&lt;p&gt;the board ID&lt;/p&gt;
" class="sc-iJSMbW sc-cBEgGa fiNpIH bWgCZK"><p>the board ID</p>
@@ -1215,13 +1215,13 @@ data-styled.g139[id="sc-iIvZUO"]{content:"kAmnlO,"}/*!sc*/
key of the board, as &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;) and of the card-aging thresholds
(&lt;code&gt;cardAgingDays1&lt;/code&gt;..&lt;code&gt;cardAgingDays3&lt;/code&gt;, non-negative integers). Keys not in
the body are left as they are; a body with no recognised key is a 400.
Requires board write access. Returns the settings in effect, in the same
Requires board administrator access. Returns the settings in effect, in the same
shape as GET.&lt;/p&gt;
" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"><p>Sets any subset of the card feature toggles (any <code>allows*</code>
key of the board, as <code>true</code>/<code>false</code>) and of the card-aging thresholds
(<code>cardAgingDays1</code>..<code>cardAgingDays3</code>, non-negative integers). Keys not in
the body are left as they are; a body with no recognised key is a 400.
Requires board write access. Returns the settings in effect, in the same
Requires board administrator access. Returns the settings in effect, in the same
shape as GET.</p>
</div></div><div class="sc-fuYIqi kGZLat"><div class="sc-dalEhJ jdqJPb"><h5 class="sc-iqkkDd sc-jQQpTv jprlAr kEkHzF">Authorizations:</h5><svg class="sc-dYjPD bEEWJa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTPGds cVAkzL"><span class="sc-dtnsVa hFacFb"><span class="sc-hPfayn hAYuWG"><i>UserSecurity</i></span></span></div></div><div><h5 class="sc-iqkkDd jprlAr">path<!-- --> Parameters</h5><table class="sc-hHopjF bsjUmE"><tbody><tr class="last "><td kind="field" title="board" class="sc-hCcPtG sc-fFCZOx jFNAwF lcdEEX"><span class="sc-ieCSdj kkMuqc"></span><span class="property-name">board</span><div class="sc-gSILEF sc-eIYgEQ jMRTsl dHYagA">required</div></td><td class="sc-bjLslk gLpZiQ"><div><div><span class="sc-gSILEF sc-lbpDNm jMRTsl NncTE"></span><span class="sc-gSILEF sc-iNyHtD jMRTsl kUjPnZ">string</span></div> <div><div html="&lt;p&gt;the board ID&lt;/p&gt;
" class="sc-iJSMbW sc-cBEgGa fiNpIH bWgCZK"><p>the board ID</p>
@@ -2543,7 +2543,7 @@ trigger and action stay as they are); true resumes it</p>
" class="sc-iJSMbW sc-cBEgGa sc-ciCrSJ fiNpIH iHFyeq dDDioG"><p>200 response</p>
</div></button></div></div></div><div class="sc-jSppWd sc-gKkgUA fpMlmc bdQQyo"><div class="sc-fXwuWv fYxpnv"><button class="sc-jWMFtl jzaJhV"><span type="post" class="sc-eEFuoE hOENFc http-verb post">post</span><span class="sc-FpjRO dsIRaZ">/api/boards/{board}/swimlanes/{swimlane}/move</span><svg class="sc-dYjPD bQKUih" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fmtEmb tUxhh"><div class="sc-ljIcGq bAnPPh"><div html="" class="sc-iJSMbW sc-cBEgGa fiNpIH bWgCZK"></div><div tabindex="0" role="button"><div class="sc-jlJOIR PEJyb"><span></span>/api/boards/{board}/swimlanes/{swimlane}/move</div></div></div></div></div></div></div></div></div><div class="sc-ekVkVN bjzTxL"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v11.74","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the Line truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v11.78","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the Line truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);
+2 -2
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v11.74
version: v11.78
description: |
The REST API allows you to control and extend Wekan with ease.
@@ -1139,7 +1139,7 @@ paths:
key of the board, as `true`/`false`) and of the card-aging thresholds
(`cardAgingDays1`..`cardAgingDays3`, non-negative integers). Keys not in
the body are left as they are; a body with no recognised key is a 400.
Requires board write access. Returns the settings in effect, in the same
Requires board administrator access. Returns the settings in effect, in the same
shape as GET.
tags:
- Boards
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
# Read-only preflight; safe to run independently of release/publishing commands.
set -e
changelog="${1:-$(cd "$(dirname "$0")/.." && pwd)/CHANGELOG.md}"
if [ ! -f "$changelog" ]; then
echo "Error: changelog not found: $changelog" >&2
exit 1
fi
if ! awk '
/^# / { active = ($0 ~ /^# Upcoming WeKan ® release[[:space:]]*$/) }
active && /^# / { headings++ }
active && /<summary>.*<a[[:space:]][^>]*href="[^"]+"[^>]*>[^<[:space:]]/ { entries++ }
END { exit !(headings == 1 && entries > 0) }
' "$changelog"; then
echo "Error: CHANGELOG.md must contain one '# Upcoming WeKan ® release' section with release entries." >&2
echo "Add Upcoming release notes before running releases/release-all.sh." >&2
exit 1
fi
+1 -1
View File
@@ -52,7 +52,7 @@ RUN_TS="$(date '+%Y-%m-%d_%H-%M-%S')"
if [ -z "${WEKAN_LOG_ROOT:-}" ]; then
WEKAN_LOG_ROOT=".tools/log"
fi
LOGDIR="${WEKAN_LOGDIR:-$WEKAN_LOG_ROOT/$RUN_TS}"
LOGDIR="${WEKAN_LOGDIR:-$WEKAN_LOG_ROOT/test-db-conformance/$RUN_TS}"
mkdir -p "$LOGDIR"
LOGDIR="$(cd "$LOGDIR" && pwd)"
+1 -1
View File
@@ -7,7 +7,7 @@ set -euo pipefail
WEKAN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
FERRET_DIR="$WEKAN_DIR/.tools/FerretDB"
STAMP="$(date +%Y-%m-%d_%H-%M-%S)"
LOG_DIR="${DEBUGSPEED_LOG_DIR:-$WEKAN_DIR/.tools/log/$STAMP/debug-speed}"
LOG_DIR="${DEBUGSPEED_LOG_DIR:-$WEKAN_DIR/.tools/log/debug-speed/$STAMP}"
FERRET_PORT="${DEBUGSPEED_FERRETDB_PORT:-37017}"
FERRET_STATE="${DEBUGSPEED_FERRETDB_STATE:-$FERRET_DIR/state-debug-speed}"
+1 -1
View File
@@ -42,7 +42,7 @@ if [ ! -x "$METEOR_BIN" ]; then
fi
STAMP="$(date +%Y-%m-%d_%H-%M-%S)"
LOG_DIR="${DEBUGSPEED_LOG_DIR:-$WEKAN_DIR/.tools/log/$STAMP/debug-speed}"
LOG_DIR="${DEBUGSPEED_LOG_DIR:-$WEKAN_DIR/.tools/log/debug-speed/$STAMP}"
mkdir -p "$LOG_DIR"
FERRET_PID=''
BRIDGE_PID=''
+3 -1
View File
@@ -181,8 +181,10 @@ fix_commit_hashes() {
if [ "$fixed" -gt 0 ]; then
echo "--- Repointed $fixed of $checked commit link(s) in $CHANGELOG_FILE (history was rewritten since they were written) ---"
else
elif [ "${#unresolved[@]}" -eq 0 ]; then
echo " All $checked commit link(s) checked resolve to a commit in this clone."
else
echo " $((checked - ${#unresolved[@]})) of $checked checked commit link(s) resolve; ${#unresolved[@]} remain unresolved."
fi
if [ "${#unresolved[@]}" -gt 0 ]; then
echo ""
+42 -3
View File
@@ -159,7 +159,7 @@ to that category rather than assuming it was empty. Other categories and mirrors
continue, and any failures/conflicts produce a nonzero exit status.
Console status, `status.txt`, `report.json` and `source.json` snapshot are saved in
`.tools/log/mirror-<timestamp>/`. Reports list copied/planned/checked items,
`.tools/log/mirror-data/YYYY-MM-DD_HH-MM-SS/`. Reports list copied/planned/checked items,
archive renames and each failure reason. Transfer files stay in `.tools/tmp`;
completed source files remain in the persistent archive below. Available archived
release binaries are reused for destination uploads. SourceForge also receives
@@ -242,7 +242,7 @@ reviews, releases and binaries through the existing engine. The source repositor
actual default branch is used for merge recovery. Repositories with issues disabled
still export PRs and their issue-style conversations. Errors in one repository or
data category do not stop the remaining repositories. Reports and terminal output
are saved under `.tools/log/mirror-organization-<timestamp>/`.
are saved under `.tools/log/mirror-organization/YYYY-MM-DD_HH-MM-SS/`.
Enabled wiki repositories are retained locally as `wiki.git` with files and Git
history. GitLab/Codeberg use their native wiki Git repositories; empty native wikis
@@ -493,7 +493,7 @@ GitHub API requests identify the endpoint, page and retry attempt before fetchin
without printing authentication headers or tokens. Rate-limit waits remain in effect.
The `releases/mirror.sh` launcher also saves stdout and stderr to
`.tools/log/mirror/YYYY-MM-DD_HH-MM_SS/mirror-log.txt` while printing them
`.tools/log/mirror/YYYY-MM-DD_HH-MM-SS/mirror-log.txt` while printing them
to stdout. It prints the log path at startup, after each sync/check menu operation (including
failures), and on command exit, preserving command failure status.
@@ -501,3 +501,42 @@ If a comment references a parent missing from the paginated issue inventory, the
collector fetches that issue and any pull metadata through the same rate-limited
API client, saves them directly to their issue/pull directory and continues. A
failed parent fetch preserves the checkpoint so a subsequent run retries the page.
### Staged synchronization and concurrent destinations
Menu option 1 first synchronizes the selected source Git branches and tags
with every active destination. Only after Git succeeds does it collect source
issues, pull conversations, releases and linked files into the durable
`.tools/mirror/<host>/<organization>/<repo>/` archive and generate static pages.
An archive failure stops destination content writes.
After the local archive is ready, separate destination processes synchronize
its content concurrently. They reuse the same snapshot, preserve completed
resume checkpoints, and retain each forge's rate-limit handling. Live progress
shows every active mirror together: start time, processed issues/total,
processed releases/total and running/finished/failed state. Processed counters
include checked existing items, failed items and unsupported/draft releases;
they measure work examined, while copied/failed logs describe the result.
Each run retains the combined mirror-log.txt plus github.txt, gitlab.txt,
codeberg.txt or sourceforge.txt beside it, according to active destinations,
in `.tools/log/mirror/YYYY-MM-DD_HH-MM-SS/`. These separate logs include Git
and destination content output. Starting this script performs remote writes
and is a human maintainer operation; offline tests use injected local commands.
### Unavailable linked files and historical recovery
Unavailable public issue/comment links are checked against archive.org's
Wayback availability API using the content creation timestamp. The closest
available successful capture is downloaded into the same comment directory,
with recoveredFrom and captureTimestamp provenance in mirror-index.json.
Original URLs remain the synchronization identity. Current links bypass this
fallback; archive.org failures do not cause recursive recovery attempts.
Attachment requests have a 30-second deadline covering redirects and body
transfer. Long saved cooldowns and new rate limits defer the attachment to a
later run instead of waiting; the saved cooldown remains respected. Optional
linked-file failures are logged as skipped and preserve existing local bytes,
so remaining content and target synchronization can continue. Repository/API
inventory failures still stop incomplete synchronization. Private/local links
remain blocked and no forge credentials are sent to archive.org or linked sites.
+9 -2
View File
@@ -27,8 +27,15 @@ mirror "sourceforge" "ssh://wekan@git.code.sf.net/p/wekan/code"
}
# Bitbucket is inactive because its repository access is unreliable.
# Stream both output channels to the terminal and retain the complete run log.
MIRROR_LOG_DIR="$TOOLS_DIR/log/mirror/$(date +%Y-%m-%d_%H-%M_%S)"
mkdir -p "$MIRROR_LOG_DIR"
MIRROR_LOG_DIR="$TOOLS_DIR/log/mirror/$(date +%Y-%m-%d_%H-%M-%S)"
if ! mkdir -p "$(dirname "$MIRROR_LOG_DIR")"; then exit 1; fi
MIRROR_LOG_BASE="$MIRROR_LOG_DIR"
MIRROR_LOG_SUFFIX=0
until mkdir "$MIRROR_LOG_DIR" 2>/dev/null; do
if [ ! -d "$MIRROR_LOG_DIR" ]; then echo "Cannot create mirror log directory: $MIRROR_LOG_DIR" >&2; exit 1; fi
MIRROR_LOG_SUFFIX=$((MIRROR_LOG_SUFFIX + 1))
MIRROR_LOG_DIR="$MIRROR_LOG_BASE-$MIRROR_LOG_SUFFIX"
done
MIRROR_LOG_FILE="$MIRROR_LOG_DIR/mirror-log.txt"
export WEKAN_MIRROR_LOG_FILE="$MIRROR_LOG_FILE"
{
+2 -1
View File
@@ -1,7 +1,8 @@
#!/bin/bash
#
# provenance-table.sh - turn the collected provenance rows into the markdown
# table that goes at the TOP of the release notes.
# diagnostic table for manual inspection; never append it to release notes
# or CHANGELOG.md. Build provenance stays in artifacts.
#
# Reads every provenance.tsv the build jobs uploaded (given as arguments, or
# found under ./provenance/) and prints a markdown section. Sorted by bundle,
+25 -60
View File
@@ -24,8 +24,8 @@ if [ -n "${ZSH_VERSION:-}" ]; then exec /bin/bash "$0" "$@"; fi
# amend or squash between writing an entry and releasing it changes the hashes,
# and the links would 404 once pushed. Each is remapped by commit subject.
# 2. Determines PREVIOUS and NEW version automatically: renames the "# Upcoming
# WeKan ® release" heading to the next version, or (if already renamed) uses the
# newest release heading. An explicit "PREVIOUS NEW" pair overrides this.
# WeKan ® release" heading to the next version. Missing or empty Upcoming notes
# stop the script. An explicit "PREVIOUS NEW" pair overrides the versions.
# 3. Commits and pushes pending changes (your CHANGELOG.md edit) to main so the
# workflow can read them.
# 4. Triggers .github/workflows/release-all.yml.
@@ -40,6 +40,13 @@ if [ -n "${ZSH_VERSION:-}" ]; then exec /bin/bash "$0" "$@"; fi
# - builds: tags v<new>, builds amd64/arm64/win64/mac bundles, creates the
# GitHub Release, builds+pushes Docker images, builds the snap.
#
# Release notes summarize translation details as updated language names.
# Add **Languages updated:** metadata beneath the Translations group label.
# Notes include only In short, Security, translation languages, thanks and
# the changelog link. Other details stay in CHANGELOG.md. Never append
# "Binaries in these bundles" or a provenance table; retain provenance.tsv
# build artifacts and checksum verification separately.
#
# Track progress at: https://github.com/wekan/wekan/actions
#
# Required GitHub secrets (DOCKERHUB_AUTH, QUAY_AUTH, GHCR_AUTH, SNAP_AUTH,
@@ -48,13 +55,16 @@ if [ -n "${ZSH_VERSION:-}" ]; then exec /bin/bash "$0" "$@"; fi
set -e
# Install the tools this trigger needs (Ubuntu apt / macOS brew) if missing.
. "$(cd "$(dirname "$0")" && pwd)/ensure-tools.sh"
ensure_tools git gh
# Resolve repo root from script location so this works regardless of CWD.
# Check release notes before installing tools, changing files or contacting forges.
REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_DIR"
bash "$REPO_DIR/releases/check-upcoming-release.sh" "$REPO_DIR/CHANGELOG.md"
mkdir -p "$REPO_DIR/.tools/tmp"
export TMPDIR="$REPO_DIR/.tools/tmp"
# Install the tools this trigger needs if missing.
. "$REPO_DIR/releases/ensure-tools.sh"
ensure_tools git gh
# ── Version helpers ─────────────────────────────────────────────────────────
# WeKan versions are NN.MM with a 2-digit minor. Encode NN.MM as the integer
@@ -81,69 +91,24 @@ while IFS= read -r line; do RELEASED+=("$line"); done < <(grep -oE '^# v[0-9]+\.
bash "$(dirname "$0")/fix-changelog-hashes.sh" || true
# ── Determine PREVIOUS (OLD) and NEW version — no version argument needed ────
# Explicit args still win. Otherwise:
# * if there is a "# Upcoming WeKan ® release" section, RENAME it to the next
# version (always +1 minor) dated today; OLD = newest release, NEW = that
# next version.
# * if there is NO Upcoming section, the newest heading is already the prepared
# release, so use it as NEW (checked to be the expected increment of OLD, and
# referenced by a recent commit, so an old entry is never re-released).
# An Upcoming section with real entries is mandatory, including explicit versions.
if [ -n "${1:-}" ] && [ -n "${2:-}" ]; then
OLD="${1#v}"
NEW="${2#v}"
elif grep -qE '^# Upcoming WeKan' CHANGELOG.md; then
else
OLD="${RELEASED[0]:-}"
if [ -z "$OLD" ]; then
echo "Error: no released '# vNN.MM <date>' heading found in CHANGELOG.md." >&2
exit 1
fi
# Always +1, never "whatever the last gap between two headings happened to
# be": that used to be measured from RELEASED[0] vs RELEASED[1], so ONE
# missing or deleted heading (a release number that was prepared, then
# never published, then its CHANGELOG section removed instead of renamed
# back to Upcoming) made the gap look like the new normal cadence and
# every following release re-applied and widened it - v11.56 -> v11.58 ->
# v11.60 -> v11.62 skipped v11.57/59/61 this way, compounding a single
# incident into a permanent, ever-growing habit of skipping a number.
NEW="$(wekan_dec $(( $(wekan_enc "$OLD") + 1 )) )"
DATE="$(date +%F)"
echo "--- Renaming '# Upcoming WeKan ® release' -> '# v$NEW $DATE WeKan ® release' ---"
_tmp="$(mktemp)"
sed "s|^# Upcoming WeKan ® release.*|# v$NEW $DATE WeKan ® release|" CHANGELOG.md > "$_tmp" && mv "$_tmp" CHANGELOG.md
# NO NEW EMPTY "# Upcoming" IS OPENED HERE ON PURPOSE. It used to be, with an
# "**In short:** nothing here yet." placeholder, so the file always had
# somewhere for the next entry to go and never carried a section saying
# nothing. Add "# Upcoming WeKan ® release" yourself, by hand, the moment
# there is a real entry for it - see
# docs/DeveloperDocs/Changelog-Upcoming-Template.md for the skeleton and why
# this is safe: tests/changelogEntriesBelongToTheirRelease.test.cjs is what
# actually catches an entry landing in the wrong (already-published)
# section, by asking git which commits a release contains, and it does that
# regardless of whether an empty Upcoming section existed first.
else
NEW="${RELEASED[0]:-}"
OLD="${RELEASED[1]:-}"
if [ -z "$NEW" ] || [ -z "$OLD" ]; then
echo "Error: could not detect NEW and PREVIOUS version from CHANGELOG.md" >&2
echo "(no '# Upcoming WeKan ® release' section, and fewer than two '# vNN.MM' releases)." >&2
echo "Add an Upcoming section (preferred) or pass versions: $0 9.35 9.36" >&2
exit 1
fi
EXPECTED="$(wekan_dec $(( $(wekan_enc "$OLD") + 1 )) )"
if [ "$NEW" != "$EXPECTED" ]; then
echo "Error: newest CHANGELOG version v$NEW is not the +1 increment (v$EXPECTED) of the previous v$OLD." >&2
echo "Releases always advance by exactly one minor version. A gap here means a version" >&2
echo "number was prepared and never published, and its CHANGELOG section was deleted" >&2
echo "instead of renamed back to '# Upcoming WeKan ® release' (see this script's header" >&2
echo "comment on a failed-vs-broken release). Fix CHANGELOG.md, or if v$NEW is really" >&2
echo "the intended next release, say so explicitly: $0 $OLD $NEW" >&2
exit 1
fi
if git log -15 --format='%s' 2>/dev/null | grep -qF "$NEW"; then
echo " (v$NEW is referenced in a recent commit — treating it as the prepared release.)"
fi
fi
DATE="$(date +%F)"
echo "--- Renaming '# Upcoming WeKan ® release' -> '# v$NEW $DATE WeKan ® release' ---"
_tmp="$(mktemp)"
sed "s|^# Upcoming WeKan ® release.*|# v$NEW $DATE WeKan ® release|" CHANGELOG.md > "$_tmp" && mv "$_tmp" CHANGELOG.md
# Do not open an empty Upcoming section. Add real notes before the next release.
echo "=== WeKan remote release: v$OLD -> v$NEW ==="
echo " Previous version (from CHANGELOG.md): v$OLD"
+51 -5
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Print the CHANGELOG.md section that is this release's notes, to stdout.
# Print release notes, summarizing translation details as affected languages.
#
# Usage: releases/release-notes.sh <version> [changelog-file]
#
@@ -55,13 +55,59 @@ with open(os.environ["CHANGELOG_FILE"], encoding="utf-8") as f:
content = f.read()
patterns = [
rf"(# v{re.escape(version)} .*?)(?=\n# v[0-9]|\Z)",
r"(# Upcom\w* WeKan.*?)(?=\n# v[0-9]|\Z)",
rf"(^# v{re.escape(version)} [^\n]*\n.*?)(?=^# v[0-9]|\Z)",
r"(^# Upcom\w* WeKan [^\n]*\n.*?)(?=^# v[0-9]|\Z)",
]
for pat in patterns:
m = re.search(pat, content, re.DOTALL)
m = re.search(pat, content, re.DOTALL | re.MULTILINE)
if m:
print(m.group(1).strip())
notes = m.group(1).strip()
summary = re.search(r"^\*\*In short:\*\* (.*?)(?=\n\s*\n|\Z)", notes, re.MULTILINE | re.DOTALL)
if not summary:
sys.stderr.write("::error::release-notes: selected release needs an **In short:** summary.\n")
sys.exit(1)
lines = notes.splitlines(keepends=True)
security, languages = [], set()
i = 0
while i < len(lines):
line = lines[i]
is_translation = bool(re.match(r"^\*\*Translations\*\*", line))
is_security = bool(re.match(r"^\*\*Security(?: hardening)?\*\* - ", line, re.IGNORECASE))
is_security_header = bool(re.match(r"^(?:This release |and ).*(?:CRITICAL SECURITY ISSUE|security hardening)", line, re.IGNORECASE))
if not (is_translation or is_security or is_security_header):
i += 1
continue
j, depth = i + 1, 0
while j < len(lines):
next_line = lines[j]
boundary = re.match(r"^(?:\*\*[^\n]+\*\* - |and |This release |Thanks to above GitHub)", next_line)
if depth == 0 and boundary:
break
depth += len(re.findall(r"<details(?:\s[^>]*)?>", next_line))
depth -= next_line.count("</details>")
j += 1
block = "".join(lines[i + 1:j]).strip()
if is_translation:
names = re.search(r"^\*\*Languages updated:\*\* (.+)$", block, re.MULTILINE)
if not names:
sys.stderr.write("::error::release-notes: Translations group needs **Languages updated:** followed by comma-separated language names.\n")
sys.exit(1)
languages.update(name.strip() for name in names.group(1).split(",") if name.strip())
elif block:
security.append((line.strip() + "\n\n" if is_security else "") + block)
i = j
heading = notes.splitlines()[0].removeprefix("# ")
if heading.startswith("Upcoming"):
from datetime import date
heading = f"v{version} {date.today().isoformat()} WeKan ® release"
anchor = re.sub(r"[^\w\s-]", "", heading.lower())
anchor = re.sub(r"\s", "-", anchor)
output = ["## In short\n\n" + summary.group(1).strip(),
"## Security\n\n" + ("\n\n".join(security) if security else "No security changes."),
"## Translations\n\n" + ("\n".join("- " + name for name in sorted(languages, key=str.casefold)) if languages else "No translation updates."),
"Thanks to above GitHub users for their contributions and translators for their translations.",
f"[More details at ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md#{anchor})"]
print("\n\n".join(output))
sys.exit(0)
# Neither section exists. Print nothing; the caller turns that into an error
# with a message that says what to add, rather than publishing an empty release.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+38 -10
View File
@@ -2,11 +2,37 @@
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import logDirectory from '../../tools/log-directory.cjs';
import { api, readConfig, localLanguages, readToken } from './sync-transifex-languages.mjs';
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
const wait = milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds));
export function retryingRequest(request, { sleep = wait, log = console.log, maxAttempts = 6 } = {}) {
return async (method, url, body) => {
for (let attempt = 1; ; attempt++) {
try { return await request(method, url, body); }
catch (error) {
const transientRead = method === 'GET' && (
[408, 500, 502, 503, 504].includes(error.status) ||
error instanceof TypeError || ['AbortError', 'TimeoutError'].includes(error.name));
// A 429 explicitly refuses the request; other failed writes may already
// have created a job, so do not blindly resubmit them.
if (attempt >= maxAttempts || !(transientRead || error.status === 429)) throw error;
let remaining = Math.max(error.retryAfterMs || 0,
error.status === 429 ? 60000 : Math.min(32000, 2000 * 2 ** (attempt - 1)));
log(`[tx] ${method} ${url}: ${error.status || error.name}; retry ${attempt + 1}/${maxAttempts} after ${Math.ceil(remaining / 1000)}s`);
while (remaining > 0) {
const chunk = Math.min(30000, remaining);
await sleep(chunk);
remaining -= chunk;
if (remaining > 0) log(`[tx] retry wait: ${Math.ceil(remaining / 1000)}s remaining`);
}
}
}
};
}
export function validateTranslation(content, source) {
const data = JSON.parse(content);
if (!data || Array.isArray(data) || typeof data !== 'object') throw new Error('Expected a JSON object');
@@ -20,7 +46,7 @@ export function validateTranslation(content, source) {
return data;
}
export async function uploadFile({ request, resource, language, content, source = false, sleep = wait, maxPolls = 300 }) {
export async function uploadFile({ request, resource, language, content, source = false, sleep = wait, log = console.log, maxPolls = 300 }) {
const type = source ? 'resource_strings_async_uploads' : 'resource_translations_async_uploads';
const relationships = { resource: { data: { type: 'resources', id: resource } } };
if (!source) relationships.language = { data: { type: 'languages', id: `l:${language}` } };
@@ -30,6 +56,7 @@ export async function uploadFile({ request, resource, language, content, source
? { replace_edited_strings: true, keep_translations: true }
: { file_type: 'default' }) };
let job = await request('POST', `/${type}`, { data: { type, attributes, relationships } });
log(`[tx] upload accepted: ${source ? 'source' : language}; checking job status`);
const pollURL = job?.data?.links?.self || (job?.data?.id && `/${type}/${encodeURIComponent(job.data.id)}`);
for (let poll = 0; poll < maxPolls; poll++) {
const state = job?.data?.attributes;
@@ -39,6 +66,7 @@ export async function uploadFile({ request, resource, language, content, source
}
if (!pollURL) throw new Error('Upload response has no job ID or status link');
if (state?.status !== 'pending' && state?.status !== 'processing') throw new Error(`Unknown upload status: ${state?.status}`);
if (poll % 15 === 0) log(`[tx] ${source ? 'source' : language}: ${state.status} (status check ${poll + 1}/${maxPolls})`);
await sleep(2000);
job = await request('GET', pollURL);
}
@@ -55,10 +83,12 @@ export async function pushTranslations({ config, languages, request, readContent
const content = readContent(config.sourceFile);
source = JSON.parse(content);
validateTranslation(content, source);
await uploadFile({ request, resource, content, source: true, sleep });
log(`[tx] uploading source ${config.sourceLanguage}`);
await uploadFile({ request, resource, content, source: true, sleep, log });
succeeded.push({ file: config.sourceFile, code: config.sourceLanguage, source: true });
log(`[tx] uploaded source ${config.sourceLanguage}`);
} catch (error) {
log(`[tx] FAILED source ${config.sourceLanguage}: ${error.message}; target uploads cannot proceed`);
failures.push({ file: config.sourceFile, code: config.sourceLanguage, reason: error.message });
for (const language of languages) failures.push({ ...language, reason: 'Not uploaded because the source upload failed' });
return { succeeded, failures };
@@ -109,7 +139,8 @@ export async function pushTranslations({ config, languages, request, readContent
}
existing.add(language.code);
}
await uploadFile({ request, resource, language: language.code, content, sleep });
log(`[tx] uploading ${language.code} (${language.file}.i18n.json)`);
await uploadFile({ request, resource, language: language.code, content, sleep, log });
succeeded.push(language);
log(`[tx] uploaded ${language.code} (${language.file}.i18n.json)`);
} catch (error) {
@@ -170,9 +201,8 @@ export function printUploadSummary(result, log = console.log) {
}
async function main() {
const stamp = new Date();
const pad = value => String(value).padStart(2, '0');
const timestamp = `${stamp.getFullYear()}-${pad(stamp.getMonth() + 1)}-${pad(stamp.getDate())}_${pad(stamp.getHours())}-${pad(stamp.getMinutes())}-${pad(stamp.getSeconds())}`;
const logDir = logDirectory.reserve(path.join(root, '.tools/log'), 'translations-push');
const timestamp = path.basename(logDir);
const statusFile = path.join(root, '.tools/log', `push-all-translations_${timestamp}.txt`);
fs.mkdirSync(path.dirname(statusFile), { recursive: true });
// Append so simultaneous invocations cannot truncate another run's status.
@@ -215,17 +245,15 @@ async function main() {
}
const token = readToken();
if (!token) throw new Error('Set TX_TOKEN or configure ~/.transifexrc before uploading');
const request = async (method, url, body) => {
const request = retryingRequest(async (method, url, body) => {
try { return await api(token, method, url, body); }
catch (error) { error.message = error.message.replaceAll(token, '[redacted]'); throw error; }
};
});
const result = await pushTranslations({ config, languages, request,
readContent: filename => fs.readFileSync(filename, 'utf8'),
});
result.languageSupport = await languageSupportReport({ request, languages, result });
const safeResult = JSON.parse(JSON.stringify(result).replaceAll(token, '[redacted]'));
const logDir = path.join(root, '.tools/log', `translations-push-${new Date().toISOString().replace(/[:.]/g, '-')}`);
fs.mkdirSync(logDir, { recursive: true });
fs.writeFileSync(path.join(logDir, 'report.json'), `${JSON.stringify(safeResult, null, 2)}\n`);
printUploadSummary(safeResult);
console.log(`[tx] report: ${logDir}/report.json`);
@@ -120,6 +120,13 @@ export async function api(token, method, url, body) {
const detail = json?.errors?.map(e => e.detail || e.title).join('; ') || text.slice(0, 300);
const err = new Error(`${method} ${url} -> ${res.status}: ${detail}`);
err.status = res.status;
const retryAfter = res.headers.get('retry-after');
if (retryAfter !== null) {
const seconds = Number(retryAfter);
const date = Date.parse(retryAfter);
const delay = Number.isFinite(seconds) ? seconds * 1000 : date - Date.now();
if (Number.isFinite(delay) && delay >= 0) err.retryAfterMs = delay;
}
err.errors = json?.errors || [];
throw err;
}
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 1174,
appVersion = 1178,
# Increment this for every release.
appMarketingVersion = (defaultText = "11.74~2026-09-14"),
appMarketingVersion = (defaultText = "11.78~2026-09-14"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+12 -1
View File
@@ -82,7 +82,18 @@ export const Authentication = {
const board = await ReactiveCache.getBoard(boardId);
Authentication.checkBoardExists(board);
const adminAccess = board.members.some(e => e.userId === userId && e.isActive && e.isAdmin);
await Authentication.checkAdminOrCondition(userId, adminAccess);
try {
await Authentication.checkAdminOrCondition(userId, adminAccess);
} catch (error) {
try {
require('/server/lib/securityLog').record({
key: 'authz.manage-board', action: 'blocked',
source: 'rest:board-admin',
detail: 'Board management denied because the caller is not an administrator.',
});
} catch (e) { /* logging must never break the guard */ }
throw error;
}
},
// Helper function. Throws a 404 error when the board does not exist, so REST
+8
View File
@@ -2,6 +2,7 @@ import Boards from '/models/boards';
import Cards from '/models/cards';
import { allowIsBoardMemberWithWriteAccess } from '/server/lib/utils';
import { canUserSeeBoard } from '/server/lib/visibleBoardIds';
import { sourceRoleBlocksDelegation, recordLinkedWriteDenial } from '/models/lib/linkedWritePolicy';
// Editing a linked card is delegated by the board that contains the link. A
// user may therefore edit the source when they can write either the source
@@ -13,6 +14,13 @@ export async function canEditCardOrLinkedCard(userId, card, knownSourceBoard) {
const sourceBoard = knownSourceBoard || await Boards.findOneAsync(card.boardId);
if (allowIsBoardMemberWithWriteAccess(userId, sourceBoard)) return true;
// An explicit non-writing source role is a ceiling, including for links
// minted before link creation was restricted. A self-owned destination must
// not turn source comment/read access into general source write access.
if (sourceRoleBlocksDelegation(userId, sourceBoard)) {
recordLinkedWriteDenial('linked-card:source-write');
return false;
}
// Delegation applies only to a link whose source is still visible. If source
// access is revoked, a stale link on another board must not remain a write
// tunnel into the now-hidden card.
+16
View File
@@ -0,0 +1,16 @@
import Boards from '/models/boards';
import { allowIsBoardMemberWithWriteAccess } from '/server/lib/utils';
export async function canWriteSubtaskDeposit(userId, boardId) {
if (!userId || typeof boardId !== 'string' || !boardId) return false;
return allowIsBoardMemberWithWriteAccess(userId, await Boards.findOneAsync(boardId));
}
export function recordSubtaskDepositDenial(source) {
try {
require('/server/lib/securityLog').record({
key: 'authz.subtask-deposit', action: 'blocked', source,
detail: 'Subtask deposit reference or creation denied because the destination is not writable.',
});
} catch (e) { /* logging must never break the guard */ }
}
+43
View File
@@ -0,0 +1,43 @@
import Cards from '/models/cards';
import CardComments from '/models/cardComments';
import Checklists from '/models/checklists';
import ChecklistItems from '/models/checklistItems';
import CardTextNotes from '/models/cardTextNotes';
import Attachments from '/models/attachments';
const { assignedOnlyCardScope } = require('/models/lib/boardCardScope');
// These cursors sit BELOW a reactive, visibility-filtered Boards cursor. Losing
// destination visibility removes its entire subtree, rather than leaving a
// snapshot of permission attached to a long-lived cards cursor.
export function subtaskDepositChildren(userId, isArchived, boardIsLazy) {
const entries = [
[Cards, 'boardId'], [CardComments, 'boardId'], [Checklists, 'boardId'],
[ChecklistItems, 'boardId'], [CardTextNotes, 'boardId'], [Attachments, 'meta.boardId'],
];
return entries.map(([collection, boardField]) => ({
async find(deposit, sourceBoard) {
if (await boardIsLazy(sourceBoard)) return null;
const assigned = assignedOnlyCardScope(deposit, userId);
let selector;
if (collection === Cards) {
selector = { boardId: deposit._id, archived: isArchived, ...assigned };
} else if (assigned) {
return null; // Assigned-only contents follow the reactive card cursor below.
} else {
selector = { [boardField]: deposit._id };
}
const result = collection.find(selector);
return result.cursor || result;
},
children: collection === Cards ? entries.slice(1).map(([child]) => ({
find(card, deposit) {
if (!assignedOnlyCardScope(deposit, userId)) return null;
const selector = {
[child === Attachments ? 'meta.cardId' : 'cardId']: card._id,
};
const result = child.find(selector);
return result.cursor || result;
},
})) : [],
}));
}
@@ -234,8 +234,8 @@ describe('CloneBleed authorization', function() {
it('denies moving a checklist from a source card on a board the caller cannot access', async function() {
sinon.stub(ReactiveCache, 'getChecklist').resolves({ _id: 'checklist-1', cardId: 'source-card' });
sinon.stub(ReactiveCache, 'getCard').resolves({ _id: 'card', boardId: 'board-1' });
// allowIsBoardMemberByCard resolves the board via Boards.findOneAsync; deny membership.
sinon.stub(Boards, 'findOneAsync').resolves({ hasMember: () => false });
// The write guard resolves both card boards and denies an outsider.
sinon.stub(ReactiveCache, 'getBoard').resolves({ members: [] });
let thrown;
try {
+34 -4
View File
@@ -146,7 +146,7 @@ Meteor.methods({
const {
title,
slug,
permission = 'private',
permission: requestedPermission = 'private',
type = 'board',
migrationVersion = 1,
swimlanes = [],
@@ -182,6 +182,22 @@ Meteor.methods({
}
}
// Apply the instance visibility policy on this server-side insert too.
// Collection allow/deny does not run for insertAsync inside a method.
const privateOnly = await TableVisibilityModeSettings.findOneAsync(
'tableVisibilityMode-allowPrivateOnly',
);
const permission = privateOnly?.booleanValue ? 'private' : requestedPermission;
if (privateOnly?.booleanValue && requestedPermission === 'public') {
try {
require('/server/lib/securityLog').record({
key: 'authz.board-visibility', action: 'blocked',
source: 'createBoardWithInitialSwimlanes',
detail: 'Public board creation overridden by private-only policy.',
});
} catch (e) { /* logging must never break the guard */ }
}
const boardId = await Boards.insertAsync({
title,
slug,
@@ -683,6 +699,20 @@ Meteor.methods({
});
Boards.before.insert(async (userId, doc) => {
// Trusted copies, imports and lazy helper creation bypass collection allow
// rules too. Enforce the instance policy at the shared insertion boundary.
if (doc.permission === 'public') {
const privateOnly = await TableVisibilityModeSettings.findOneAsync('tableVisibilityMode-allowPrivateOnly');
if (privateOnly?.booleanValue) {
doc.permission = 'private';
try {
require('/server/lib/securityLog').record({
key: 'authz.board-visibility', action: 'blocked', source: 'board:insert-policy',
detail: 'Public board insertion overridden by private-only policy.',
});
} catch (e) { /* logging must never break the guard */ }
}
}
const lastBoard = await ReactiveCache.getBoard(
{ sort: { $exists: true } },
{ sort: { sort: -1 } },
@@ -1099,7 +1129,7 @@ WebApp.handlers.delete('/api/boards/:boardId', async function(req, res) {
WebApp.handlers.put('/api/boards/:boardId/title', async function(req, res) {
try {
const boardId = req.params.boardId;
await Authentication.checkBoardWriteAccess(req.userId, boardId);
await Authentication.checkBoardAdmin(req.userId, boardId);
const title = req.body.title;
await Boards.direct.updateAsync({ _id: boardId }, { $set: { title } });
@@ -1294,7 +1324,7 @@ WebApp.handlers.get('/api/boards/:boardId/cardSettings', async function(req, res
* key of the board, as `true`/`false`) and of the card-aging thresholds
* (`cardAgingDays1`..`cardAgingDays3`, non-negative integers). Keys not in
* the body are left as they are; a body with no recognised key is a 400.
* Requires board write access. Returns the settings in effect, in the same
* Requires board administrator access. Returns the settings in effect, in the same
* shape as GET.
*
* @param {string} boardId the board ID
@@ -1312,7 +1342,7 @@ WebApp.handlers.get('/api/boards/:boardId/cardSettings', async function(req, res
*/
WebApp.handlers.put('/api/boards/:boardId/cardSettings', async function(req, res) {
const id = req.params.boardId;
await Authentication.checkBoardWriteAccess(req.userId, id);
await Authentication.checkBoardAdmin(req.userId, id);
const board = await ReactiveCache.getBoard(id);
if (!board) {
sendJsonResult(res, { code: 404, data: { error: 'Board not found' } });
+8
View File
@@ -1,3 +1,4 @@
import { commentCardMatchesBoard, recordCommentBoundaryDenial } from '/models/lib/commentCardBoundary';
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import { Authentication } from '/server/authentication';
@@ -166,6 +167,13 @@ WebApp.handlers.post('/api/boards/:boardId/cards/:cardId/comments', async functi
allowIsBoardMemberCommentOnly(req.userId, board),
);
const card = await ReactiveCache.getCard({ _id: paramCardId, boardId: paramBoardId });
if (!commentCardMatchesBoard(card, paramCardId, paramBoardId)) {
recordCommentBoundaryDenial('rest:comment-insert');
sendJsonResult(res, { code: 404, data: { error: 'Card not found' } });
return;
}
// Validate the required `comment` parameter before inserting. Without this
// an empty/missing comment reaches the schema-validated insert and throws a
// circular validation error that previously surfaced as HTTP 500. See #5804.
+25 -2
View File
@@ -1,3 +1,5 @@
import { canWriteSubtaskDeposit, recordSubtaskDepositDenial } from '/server/lib/subtaskDepositAccess';
import { recordLinkedWriteDenial } from '/models/lib/linkedWritePolicy';
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import { check, Match } from 'meteor/check';
@@ -17,6 +19,7 @@ import { assertParentCardIsVisible } from '/server/lib/visibleBoardIds';
import { computeSubtaskLabelIds } from '/models/lib/subtaskLabelInheritance';
import Activities from '/models/activities';
import Boards from '/models/boards';
import TableVisibilityModeSettings from '/models/tableVisibilityModeSettings';
import Cards, {
addCronJob,
cardAssignees,
@@ -84,6 +87,21 @@ Meteor.methods({
const boardTitle = (title && title.trim()) || card.title || '';
if (!boardTitle) throw new Meteor.Error('invalid-title');
const privateOnly = await TableVisibilityModeSettings.findOneAsync(
'tableVisibilityMode-allowPrivateOnly',
);
const requestedPermission = sourceBoard.permission === 'public' ? 'public' : 'private';
const permission = privateOnly?.booleanValue ? 'private' : requestedPermission;
if (privateOnly?.booleanValue && requestedPermission === 'public') {
try {
require('/server/lib/securityLog').record({
key: 'authz.board-visibility', action: 'blocked',
source: 'createBoardFromCard',
detail: 'Inherited public visibility overridden by private-only policy.',
});
} catch (e) { /* logging must never break the guard */ }
}
const boardId = await Boards.insertAsync({
title: boardTitle,
slug: getSlug(boardTitle) || 'board',
@@ -97,7 +115,7 @@ Meteor.methods({
isWorker: false,
},
],
permission: sourceBoard.permission === 'public' ? 'public' : 'private',
permission,
color: sourceBoard.color,
migrationVersion: 1,
});
@@ -140,7 +158,8 @@ Meteor.methods({
throw new Meteor.Error('not-found');
}
const sourceBoard = await Boards.findOneAsync(sourceCard.boardId);
if (!sourceBoard || !allowIsBoardMember(this.userId, sourceBoard)) {
if (!sourceBoard || !allowIsBoardMemberWithWriteAccess(this.userId, sourceBoard)) {
recordLinkedWriteDenial('createLinkedCard');
throw new Meteor.Error('not-authorized');
}
if (!allowIsBoardMemberWithWriteAccess(this.userId, destinationBoard)) {
@@ -348,6 +367,10 @@ Meteor.methods({
// board + landing list. These getters never duplicate on the server.
const targetBoard = await parentBoard.getDefaultSubtasksBoardAsync();
if (!targetBoard) return undefined;
if (!(await canWriteSubtaskDeposit(this.userId, targetBoard._id))) {
recordSubtaskDepositDenial('addSubtaskCard');
throw new Meteor.Error('not-authorized');
}
const targetList = await targetBoard.getDefaultSubtasksListAsync();
if (!targetList) return undefined;
+2 -3
View File
@@ -1,3 +1,4 @@
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
import { Meteor } from 'meteor/meteor';
import { check, Match } from 'meteor/check';
import { ReactiveCache } from '/imports/reactiveCache';
@@ -67,9 +68,7 @@ const requireBoardVisible = async (userId, boardId) => {
const requireBoardWrite = async (userId, boardId) => {
const board = await ReactiveCache.getBoard(boardId);
if (!board || !board.hasMember(userId) || board.hasCommentOnly(userId)) {
throw new Meteor.Error('not-authorized', 'You cannot change this board.');
}
requireBoardMutation(userId, board, 'changeHistory:write', Meteor);
};
async function requireHistoryIntegrity(row, context) {
+5 -9
View File
@@ -3,7 +3,7 @@ import { WebApp } from 'meteor/webapp';
import { Authentication } from '/server/authentication';
import { sendJsonResult } from '/server/apiMiddleware';
import { ReactiveCache } from '/imports/reactiveCache';
import { allowIsBoardMemberByCard } from '/server/lib/utils';
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
import Checklists from '/models/checklists';
import ChecklistItems from '/models/checklistItems';
import Activities from '/models/activities';
@@ -29,15 +29,11 @@ Meteor.methods({
throw new Meteor.Error('card-not-found', 'Target card not found');
}
// allowIsBoardMemberByCard is async; it was previously both unimported and
// un-awaited, so the membership check never actually ran. Import + await it.
const sourceCard = await ReactiveCache.getCard(checklist.cardId);
if (!(await allowIsBoardMemberByCard(this.userId, sourceCard))) {
throw new Meteor.Error('not-authorized', 'Not authorized to move checklist from source card');
}
if (!(await allowIsBoardMemberByCard(this.userId, newCard))) {
throw new Meteor.Error('not-authorized', 'Not authorized to move checklist to target card');
}
const sourceBoard = sourceCard && await ReactiveCache.getBoard(sourceCard.boardId);
const targetBoard = await ReactiveCache.getBoard(newCard.boardId);
requireBoardMutation(this.userId, sourceBoard, 'moveChecklist:source', Meteor);
requireBoardMutation(this.userId, targetBoard, 'moveChecklist:destination', Meteor);
const activities = await ReactiveCache.getActivities({ checklistId });
for (const activity of activities) {
+7 -30
View File
@@ -17,25 +17,10 @@ import { getFeatureFlags } from '/models/lib/featureFlags';
import { softDeleteSet, restoreModifier, canPurge } from '/models/lib/softDelete';
import { listsToUnbind } from '/models/lib/listUnbindRepair';
import ChangeHistory from '/models/changeHistory';
import { allowIsBoardMemberWithWriteAccess } from '/server/lib/utils';
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
const hasBoardWriteAccess = (userId, board) => {
if (!userId || !board) {
return false;
}
if (typeof allowIsBoardMemberWithWriteAccess === 'function') {
return allowIsBoardMemberWithWriteAccess(userId, board);
}
return (
board.hasMember(userId) &&
!board.hasNoComments(userId) &&
!board.hasCommentOnly(userId) &&
!board.hasWorker(userId) &&
!board.hasReadOnly(userId) &&
!board.hasReadAssignedOnly(userId)
);
};
const hasBoardWriteAccess = allowIsBoardMemberWithWriteAccess;
// Soft delete (docs/Features/Undo/Undo.md): mark a list — and cascade-mark its live
// cards with the SAME deleteBatchId — instead of destroying them, and record a
@@ -333,18 +318,14 @@ Meteor.methods({
}
const sourceBoard = await Boards.findOneAsync(list.boardId);
if (!sourceBoard || !sourceBoard.hasMember(this.userId)) {
throw new Meteor.Error('not-authorized', 'Not a member of the source board.');
}
requireBoardMutation(this.userId, sourceBoard, 'moveList:source', Meteor);
const targetBoard = await ReactiveCache.getBoard(boardId);
if (!targetBoard) {
throw new Meteor.Error('board-not-found', 'Target board not found');
}
if (!hasBoardWriteAccess(this.userId, targetBoard)) {
throw new Meteor.Error('not-authorized', 'Not a member of the target board.');
}
requireBoardMutation(this.userId, targetBoard, 'moveList:destination', Meteor);
let sort = (await ReactiveCache.getLists({ boardId, archived: false })).length;
if (neighborListId) {
@@ -403,9 +384,7 @@ Meteor.methods({
}
const sourceBoard = await Boards.findOneAsync(list.boardId);
if (!sourceBoard || !sourceBoard.hasMember(this.userId)) {
throw new Meteor.Error('not-authorized', 'Not a member of the source board.');
}
requireBoardMutation(this.userId, sourceBoard, 'moveList:source', Meteor);
const desiredTitle = typeof title === 'string' && title.trim().length > 0
? title.trim()
@@ -416,9 +395,7 @@ Meteor.methods({
throw new Meteor.Error('board-not-found', 'Target board not found');
}
if (!hasBoardWriteAccess(this.userId, targetBoard)) {
throw new Meteor.Error('not-authorized', 'Not a member of the target board.');
}
requireBoardMutation(this.userId, targetBoard, 'moveList:destination', Meteor);
// #6670: a move within the same board now BINDS the list to the chosen
// swimlane, so that swimlane has to be one of the target board's - binding a
+3 -3
View File
@@ -140,7 +140,7 @@ if (Meteor.isServer) {
WebApp.handlers.post('/api/boards/:boardId/rules', async function(req, res) {
try {
const paramBoardId = req.params.boardId;
await Authentication.checkBoardWriteAccess(req.userId, paramBoardId);
await Authentication.checkBoardAdmin(req.userId, paramBoardId);
const { title, trigger, action } = req.body;
if (!trigger || !action) {
throw new Meteor.Error('bad-request', 'trigger and action are required');
@@ -190,7 +190,7 @@ if (Meteor.isServer) {
WebApp.handlers.put('/api/boards/:boardId/rules/:ruleId', async function(req, res) {
try {
const paramBoardId = req.params.boardId;
await Authentication.checkBoardWriteAccess(req.userId, paramBoardId);
await Authentication.checkBoardAdmin(req.userId, paramBoardId);
const rule = await ReactiveCache.getRule({
_id: req.params.ruleId,
boardId: paramBoardId,
@@ -234,7 +234,7 @@ if (Meteor.isServer) {
WebApp.handlers.delete('/api/boards/:boardId/rules/:ruleId', async function(req, res) {
try {
const paramBoardId = req.params.boardId;
await Authentication.checkBoardWriteAccess(req.userId, paramBoardId);
await Authentication.checkBoardAdmin(req.userId, paramBoardId);
const rule = await ReactiveCache.getRule({
_id: req.params.ruleId,
boardId: paramBoardId,
+20 -1
View File
@@ -8,6 +8,9 @@ import { WebApp } from 'meteor/webapp';
import { DDP } from 'meteor/ddp';
import Settings from '/models/settings';
import InvitationCodes from '/models/invitationCodes';
import Boards from '/models/boards';
import InviteToBoardRolesSettings from '/models/inviteToBoardRolesSettings';
import { canInviteToBoard } from '/models/lib/invitationBoardPermission';
import EmailLocalization from '/server/lib/emailLocalization';
import { ensureIndex } from '/server/lib/mongoStartup';
import { Authentication } from '/server/authentication';
@@ -654,13 +657,29 @@ Meteor.methods({
let rc = 0;
check(emails, [String]);
check(boards, [String]);
if (!this.userId) throw new Meteor.Error('not-allowed');
const user = await getReactiveCache().getCurrentUser();
if (!user.isAdmin && !(await isNonAdminAllowedToSendMail(user))) {
if (!user || (!user.isAdmin && !(await isNonAdminAllowedToSendMail(user)))) {
rc = -1;
throw new Meteor.Error('not-allowed');
}
// Validate the complete grant before changing a code or sending any mail.
const allowedRoles = await InviteToBoardRolesSettings.allowedRoles();
for (const boardId of new Set(boards)) {
const board = await Boards.findOneAsync(boardId);
if (!canInviteToBoard(user, board, allowedRoles)) {
try {
require('/server/lib/securityLog').record({
key: 'authz.invitation-boards', action: 'blocked', source: 'sendInvitation',
detail: 'Invitation refused because the caller cannot invite to a requested board.',
});
} catch (e) { /* logging must never break the guard */ }
throw new Meteor.Error('not-allowed');
}
}
for (const rawEmail of emails) {
// #4043: store the invitee address lowercase — the sign-up form
// lowercases the typed address and MongoDB string matching is case
+21
View File
@@ -2,6 +2,27 @@ import Boards from '/models/boards';
import TableVisibilityModeSettings from '/models/tableVisibilityModeSettings';
import { findWhere, where } from '/imports/lib/collectionHelpers';
import { allowIsBoardAdminOrSiteAdmin, canUpdateBoardSort, canUpdateBoardSameWidthValue } from '/server/lib/utils';
import { canWriteSubtaskDeposit, recordSubtaskDepositDenial } from '/server/lib/subtaskDepositAccess';
Boards.deny({
async insert(userId, doc) {
if (!doc.subtasksDefaultBoardId) return false;
if (await canWriteSubtaskDeposit(userId, doc.subtasksDefaultBoardId)) return false;
recordSubtaskDepositDenial('ddp:board-insert');
return true;
},
async update(userId, doc, fields, modifier) {
if (modifier.$rename && Object.values(modifier.$rename).includes('subtasksDefaultBoardId')) {
recordSubtaskDepositDenial('ddp:board-deposit-rename');
return true;
}
const id = modifier.$set && modifier.$set.subtasksDefaultBoardId;
if (!id) return false;
if (await canWriteSubtaskDeposit(userId, id)) return false;
recordSubtaskDepositDenial('ddp:board-deposit');
return true;
},
});
Boards.allow({
async insert(userId, doc) {
+18
View File
@@ -1,6 +1,24 @@
import Boards from '/models/boards';
import CardComments from '/models/cardComments';
import Cards from '/models/cards';
import { allowIsBoardMemberCommentOnly, allowIsBoardAdmin } from '/server/lib/utils';
import { commentCardMatchesBoard, recordCommentBoundaryDenial } from '/models/lib/commentCardBoundary';
CardComments.deny({
async insert(userId, doc) {
const card = await Cards.findOneAsync(doc.cardId);
if (commentCardMatchesBoard(card, doc.cardId, doc.boardId)) return false;
recordCommentBoundaryDenial('ddp:comment-insert');
return true;
},
update(userId, doc, fields) {
// Comments have no client move operation. Rebinding would otherwise skip
// the insert boundary check and inject an existing comment onto another card.
if (!fields.some(field => field === 'cardId' || field === 'boardId')) return false;
recordCommentBoundaryDenial('ddp:comment-rebind');
return true;
},
});
CardComments.allow({
async insert(userId, doc) {
+22
View File
@@ -6,6 +6,28 @@ import { canUserSeeBoard } from '/server/lib/visibleBoardIds';
import { tripCanary, tripCanaryDeny } from '/server/lib/canary';
import { canEditCardOrLinkedCard } from '/server/lib/linkedCardPermission';
const { workerMayUpdateCard } = require('/models/lib/workerCardWrite');
import { recordLinkedWriteDenial } from '/models/lib/linkedWritePolicy';
async function denyUnauthorizedCardLink(userId, type, linkedId) {
if (type !== 'cardType-linkedCard') return false;
const source = typeof linkedId === 'string' && await Cards.findOneAsync(linkedId);
const board = source && await Boards.findOneAsync(source.boardId);
if (allowIsBoardMemberWithWriteAccess(userId, board)) return false;
recordLinkedWriteDenial('ddp:card-link');
return true;
}
Cards.deny({
async insert(userId, doc) {
return await denyUnauthorizedCardLink(userId, doc.type, doc.linkedId);
},
async update(userId, doc, fields, modifier) {
if (!fields.some(field => field === 'type' || field === 'linkedId')) return false;
const set = modifier.$set || {};
return await denyUnauthorizedCardLink(userId, set.type || doc.type, set.linkedId || doc.linkedId);
},
fetch: ['type', 'linkedId'],
});
// GHSA-jvv9-498p-hxrg: may this user name that card as a parent? Only if they
// may see the board it is on — the same question the `board` publication asks
+13 -4
View File
@@ -1,7 +1,7 @@
import Users, { isUserUpdateAllowed, hasForbiddenUserUpdateField } from '/models/users';
Users.allow({
update(userId, doc, fields /*, modifier */) {
update(userId, doc, fields, modifier) {
// Only the owner can update, and only for allowed fields
if (!userId || doc._id !== userId) {
return false;
@@ -10,7 +10,7 @@ Users.allow({
return false;
}
// Disallow if any forbidden field present
if (hasForbiddenUserUpdateField(fields)) {
if (hasForbiddenUserUpdateField(fields, modifier)) {
return false;
}
// Allow only username and profile.*
@@ -28,8 +28,17 @@ Users.allow({
// Deny any attempts to touch forbidden fields from client updates
Users.deny({
update(userId, doc, fields /*, modifier */) {
const denied = hasForbiddenUserUpdateField(fields);
update(userId, doc, fields, modifier) {
const denied = hasForbiddenUserUpdateField(fields, modifier);
if (denied && fields.some(field => field === 'profile' ||
field === 'profile.invitedBoards' || field.startsWith('profile.invitedBoards.'))) {
try {
require('/server/lib/securityLog').record({
key: 'authz.invitation-profile', action: 'blocked', source: 'ddp:user-profile',
detail: 'Client modification of server-issued board invitations denied.',
});
} catch (e) { /* logging must never break the guard */ }
}
return denied;
},
fetch: [],
+21 -11
View File
@@ -1,3 +1,4 @@
import { subtaskDepositChildren } from '/server/lib/subtaskDepositPublication';
// This is the publication used to display the board list. We publish all the
// non-archived boards:
// 1. that the user is a member of
@@ -25,7 +26,7 @@ const {
effectiveBoardCardsMode,
DEFAULT_LAZY_THRESHOLD,
} = require('/models/lib/cardsLoading');
const { boardCardScope } = require('/models/lib/boardCardScope');
const { boardCardScope, assignedOnlyCardScope } = require('/models/lib/boardCardScope');
const { boardVisibilitySelectors } = require('/models/lib/boardVisibilitySelectors');
// Card-loading mode (Admin Panel / Features): 'all' ships every card/checklist to
@@ -819,6 +820,15 @@ publishComposite('board', async function(boardId, isArchived, generation) {
);
},
children: [
{
find(board) {
if (!board.subtasksDefaultBoardId || board.subtasksDefaultBoardId === board._id) return null;
return Boards.find({ _id: board.subtasksDefaultBoardId, $or }, {
fields: { title: 1, permission: 1, members: 1 },
});
},
children: subtaskDepositChildren(thisUserId, isArchived, boardIsLazy),
},
// Lists
{
async find(board) {
@@ -897,7 +907,6 @@ publishComposite('board', async function(boardId, isArchived, generation) {
// Lazy mode: checklists are published per visible card by boardCardsWindow.
if (await boardIsLazy(board)) return null;
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
// Assigned-only members must not receive checklists for cards they are
// not assigned to; boardId alone cannot express that, so fall back to
// the assigned cards' ids for those members.
@@ -922,7 +931,6 @@ publishComposite('board', async function(boardId, isArchived, generation) {
// Lazy mode: checklist items are published per visible card by boardCardsWindow.
if (await boardIsLazy(board)) return null;
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
if (thisUserId && board.members) {
const member = findWhere(board.members, { userId: thisUserId, isActive: true });
if (member && (member.isNormalAssignedOnly || member.isCommentAssignedOnly || member.isReadAssignedOnly)) {
@@ -946,7 +954,6 @@ publishComposite('board', async function(boardId, isArchived, generation) {
// Lazy mode: comments are published per visible card by boardCardsWindow.
if (await boardIsLazy(board)) return null;
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
// Assigned-only members must only receive comments for cards assigned to
// them; boardId alone cannot express that, so fall back to the assigned
// cards' ids for those members (same as checklists above).
@@ -971,7 +978,6 @@ publishComposite('board', async function(boardId, isArchived, generation) {
async find(board) {
if (await boardIsLazy(board)) return null;
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
if (thisUserId && board.members) {
const member = findWhere(board.members, { userId: thisUserId, isActive: true });
if (member && (member.isNormalAssignedOnly || member.isCommentAssignedOnly || member.isReadAssignedOnly)) {
@@ -994,7 +1000,6 @@ publishComposite('board', async function(boardId, isArchived, generation) {
// Lazy mode: attachments are published per visible card by boardCardsWindow.
if (await boardIsLazy(board)) return null;
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
if (thisUserId && board.members) {
const member = findWhere(board.members, { userId: thisUserId, isActive: true });
if (member && (member.isNormalAssignedOnly || member.isCommentAssignedOnly || member.isReadAssignedOnly)) {
@@ -1316,11 +1321,16 @@ Meteor.methods({
if (!board || !board.isVisibleBy({ _id: this.userId })) {
throw new Meteor.Error('not-authorized');
}
const boardIds = [board._id];
if (board.subtasksDefaultBoardId) boardIds.push(board.subtasksDefaultBoardId);
const statusClauses = [{ boardId: board._id, ...assignedOnlyCardScope(board, this.userId) }];
const visibleDeposits = await visibleBoardIds(this.userId, [board.subtasksDefaultBoardId]);
if (visibleDeposits.has(board.subtasksDefaultBoardId)) {
const deposit = await Boards.findOneAsync(board.subtasksDefaultBoardId);
if (deposit) statusClauses.push({ boardId: deposit._id, ...assignedOnlyCardScope(deposit, this.userId) });
}
const statusCardScope = { $or: statusClauses };
const cards = await Cards.find({ boardId: { $in: boardIds }, archived: false }).countAsync();
const archivedCards = await Cards.find({ boardId: { $in: boardIds }, archived: true }).countAsync();
const cards = await Cards.find({ ...statusCardScope, archived: false }).countAsync();
const archivedCards = await Cards.find({ ...statusCardScope, archived: true }).countAsync();
const swimlanes = (await ReactiveCache.getSwimlanes({ boardId: board._id, archived: false })).length;
const lists = (await ReactiveCache.getLists({ boardId: board._id, archived: false })).length;
const customFields = (await ReactiveCache.getCustomFields({ boardIds: { $in: [board._id] } })).length;
@@ -1332,7 +1342,7 @@ Meteor.methods({
// and how many are flagged overtime. Only cards WITH time are fetched (spentTime
// > 0), so this stays cheap even on a large board.
const timeCards = await Cards.find(
{ boardId: { $in: boardIds }, archived: false, spentTime: { $gt: 0 } },
{ ...statusCardScope, archived: false, spentTime: { $gt: 0 } },
{ fields: { spentTime: 1, isOvertime: 1 } },
).fetchAsync();
const timeSpentTotal = timeCards.reduce((sum, c) => sum + (Number(c.spentTime) || 0), 0);
+3 -4
View File
@@ -1,3 +1,4 @@
import { requireBoardMutation } from '/models/lib/boardMutationGuard';
import { ReactiveCache } from '/imports/reactiveCache';
import Boards from '/models/boards';
import { allowIsBoardMember, allowIsBoardMemberWithWriteAccess } from '/server/lib/utils';
@@ -36,12 +37,10 @@ Meteor.methods({
const swimlane = await ReactiveCache.getSwimlane(swimlaneId);
if (!swimlane) throw new Meteor.Error('not-found');
const sourceBoard = await Boards.findOneAsync(swimlane.boardId);
if (!allowIsBoardMember(this.userId, sourceBoard))
throw new Meteor.Error('not-authorized');
requireBoardMutation(this.userId, sourceBoard, 'moveSwimlane:source', Meteor);
const toBoard = await ReactiveCache.getBoard(toBoardId);
if (!toBoard) throw new Meteor.Error('not-found');
if (!allowIsBoardMemberWithWriteAccess(this.userId, toBoard))
throw new Meteor.Error('not-authorized');
requireBoardMutation(this.userId, toBoard, 'moveSwimlane:destination', Meteor);
await swimlane.move(toBoardId, targetSwimlaneId, position, title);
return true;
+5 -4
View File
@@ -8,6 +8,7 @@ import Actions from '/models/actions';
import { canDeleteBoardRule } from '/models/lib/ruleDeletePermission';
import { allowIsBoardMemberWithWriteAccess } from '/server/lib/utils';
import { tripCanary } from '/server/lib/canary';
import { requireButtonRuleContext } from '/models/lib/buttonRulePermission';
// Button rules are manual: a user clicks a card/board button and we run the
// rule's action immediately. This method runs one button rule on demand.
@@ -15,6 +16,7 @@ Meteor.methods({
async 'rules.runButton'(ruleId, cardId) {
check(ruleId, String);
check(cardId, Match.Optional(String));
if (!this.userId) throw new Meteor.Error('not-authorized');
const rule = await ReactiveCache.getRule(ruleId);
if (!rule) throw new Meteor.Error('not-found', 'Rule not found');
@@ -24,11 +26,10 @@ Meteor.methods({
throw new Meteor.Error('not-a-button', 'Rule is not a button rule');
}
// The user must be a member of the board the rule belongs to.
// A manual rule is a write, and its card must be on the rule's board.
const board = await ReactiveCache.getBoard(rule.boardId);
if (!board || !board.hasMember(this.userId)) {
throw new Meteor.Error('not-authorized', 'Not a board member');
}
const card = cardId === undefined ? undefined : await ReactiveCache.getCard(cardId);
requireButtonRuleContext(this.userId, board, cardId, card, Meteor);
const action = await ReactiveCache.getAction(rule.actionId);
if (!action) throw new Meteor.Error('not-found', 'Action not found');
+5
View File
@@ -1,3 +1,4 @@
import { requireButtonRuleContext } from '/models/lib/buttonRulePermission';
import { DDP } from 'meteor/ddp';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
@@ -266,6 +267,10 @@ export const RulesHelper = {
},
async performAction(activity, action) {
const card = await ReactiveCache.getCard(activity.cardId);
if (activity.activityType === 'button') {
const sourceBoard = await ReactiveCache.getBoard(activity.boardId);
requireButtonRuleContext(activity.userId, sourceBoard, activity.cardId, card, Meteor);
}
// Most actions operate on a card. Scheduled / button rules may run a
// board-level action with no card context (e.g. create a card every Monday),
// so allow those specific action types to proceed without a card.
+4 -4
View File
@@ -19,7 +19,7 @@
# base: core24 (not core26) · no build-base: devel · grade: stable
# ─────────────────────────────────────────────────────────────────────────────
name: wekan
version: '11.74'
version: '11.78'
base: core24
confinement: strict
grade: stable
@@ -693,18 +693,18 @@ parts:
armhf) WEKAN_ARCH="armhf" ;;
*) echo "Unsupported architecture: ${CRAFT_ARCH_BUILD_FOR}"; exit 1 ;;
esac
WEKAN_ZIP="wekan-11.74-${WEKAN_ARCH}.zip"
WEKAN_ZIP="wekan-11.78-${WEKAN_ARCH}.zip"
echo "Cleaning environment first"
rm -rf .build
mkdir .build
cd .build
#wget https://github.com/wekan/wekan/releases/download/v11.74/wekan-11.74-amd64.zip
#wget https://github.com/wekan/wekan/releases/download/v11.78/wekan-11.78-amd64.zip
# Retry: a release asset can 404 for a short while right after it is
# uploaded (CDN/propagation lag), and a plain wget treated that as
# fatal. --retry-on-http-error covers the 404/5xx window; a genuinely
# missing bundle still fails after the tries are spent.
wget --tries=20 --waitretry=20 --retry-on-http-error=404,403,500,502,503 \
"https://github.com/wekan/wekan/releases/download/v11.74/${WEKAN_ZIP}"
"https://github.com/wekan/wekan/releases/download/v11.78/${WEKAN_ZIP}"
unzip "${WEKAN_ZIP}"
rm "${WEKAN_ZIP}"
# Copy to Snap. Use the bundle's OWN arch-correct Node.js: the
+73
View File
@@ -0,0 +1,73 @@
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
const test = require('node:test');
const sanitizeHTML = require('sanitize-html');
const source = fs.readFileSync('client/components/activities/activities.js', 'utf8');
const jade = fs.readFileSync('client/components/activities/activities.jade', 'utf8');
test('both activity feeds render values through the shared HTML/Markdown/emoji viewer', () => {
assert.match(jade, /\+activity\(activity=activityData card=card mode=mode\)/);
assert.doesNotMatch(jade, /\(sanitize |\{\{\{_ /);
assert.match(jade, /activityMessage 'activity-changedTitle' \(activityValue activity.value\)/);
assert.match(source, /activityValue\(value\)[\s\S]*?return titleViewerHtml/);
assert.match(source, /stripLinks: !!\(setting && setting.renderLinksAsPlainText\)/);
assert.match(source, /\^https\?:/);
assert.match(jade, /div\.activity-desc/);
});
test('rich activity links preserve allowed HTML and avoid nested anchors', () => {
const html = {
Raw: value => value,
A: (attrs, text) => `<a href="${attrs.href}">${text}</a>`,
SPAN: (...values) => `<span>${values.join('')}</span>`,
};
const context = { HTML: html, Blaze: { toHTML: value => value },
titleViewerHtml: value => value,
sanitizeHTML,
};
const start = source.indexOf('function linkedActivityValue(');
const end = source.indexOf('\nfunction createBoardLink', start);
vm.runInNewContext(source.slice(start, end), context);
assert.equal(context.linkedActivityValue('<strong>👍</strong>', '', 'card'), '<strong>👍</strong>');
assert.equal(context.linkedActivityValue('<strong>👍</strong><script>bad()</script>', '/card', 'card'),
'<a href="/card"><strong>👍</strong></a>');
const linked = context.linkedActivityValue('<a href="https://example.com">Title</a>', '/card', 'card');
assert.equal(linked, '<span><a href="https://example.com">Title</a> <a href="/card">↗</a></span>');
});
// Browsers accept malformed closing tags; exercise the real parser rather
// than a regex substitute that could hide a sanitizer regression.
test('activity sanitizer handles malformed script end tags', () => {
for (const input of ['<script>bad()</script foo="bar">', '<SCRIPT>bad()</SCRIPT >']) {
assert.equal(sanitizeHTML('<strong>Title</strong>' + input), '<strong>Title</strong>');
}
assert.doesNotMatch(fs.readFileSync(__filename, 'utf8'), /sanitizeHTML:\s*value\s*=>\s*value\.replace/);
});
// Use the actual formatter so literal placeholders cannot pass a mocked API.
test('activity messages substitute all values and discard Spacebars options', async () => {
const i18next = require('i18next');
const sprintf = require('i18next-sprintf-postprocessor');
const i18n = i18next.createInstance().use(sprintf);
await i18n.init({ lng: 'en', resources: { en: { translation: {
added: "added label '%s' to %s", moved: 'moved %s from %s to %s',
comment: 'on %s', deleted: 'deleted an attachment from %s',
} } }, postProcess: ['sprintf'], interpolation: { escapeValue: false } });
let plainLinks = false;
const body = source.split(' activityMessage(key, ...values) {')[1].split('\n },')[0];
const helper = new Function('ReactiveCache', 'TAPi18n', 'sanitizeHTML', `return function(key, ...values) {${body}}`)(
{ getCurrentSetting: () => ({ renderLinksAsPlainText: plainLinks }) },
{ __: (key, options) => i18n.t(key, options) },
(value, options) => sanitizeHTML(value, { allowedTags: options.stripLinks ? ['strong', 'em'] : ['a', 'strong', 'em'], allowedAttributes: { a: ['href'] } }),
);
const link = '<a href="/card">Demo 👍</a>';
assert.equal(helper('added', '<em>Feature</em>', link, { hash: {} }), "added label '<em>Feature</em>' to " + link);
assert.equal(helper('moved', 'CARD', 'OLD', 'NEW', { hash: {} }), 'moved CARD from OLD to NEW');
assert.equal(helper('comment', link, { hash: {} }), 'on ' + link);
assert.equal(helper('deleted', 'CARD', { hash: {} }), 'deleted an attachment from CARD');
assert.equal(helper('comment', '100% safe %s', { hash: {} }), 'on 100% safe %s');
assert.doesNotMatch(helper('comment', '<script>bad()</script><strong>Good</strong>', { hash: {} }), /script|bad/);
plainLinks = true;
assert.equal(helper('comment', link, { hash: {} }), 'on Demo 👍');
});
@@ -9,7 +9,7 @@ const examples = ['== != <= >= && || ( )', 'Field1 == Value1', "'Field 1' == 'Va
(async () => {
const { repairProgress } = await import('../releases/translations/audit-progress.mjs');
const result = repairProgress();
for (const locale of ['ar', 'ar-DZ', 'ar-EG', 'lt', 'mn', 'el', 'el-GR', 'sk']) {
for (const locale of ['ar', 'ar-DZ', 'ar-EG', 'lt', 'mn', 'el', 'el-GR', 'sk', 'eo']) {
const data = read(locale);
const help = data['advanced-filter-description'];
assert.notEqual(help, source, locale);
@@ -25,6 +25,17 @@ const examples = ['== != <= >= && || ( )', 'Field1 == Value1', "'Field 1' == 'Va
assert.doesNotMatch(data['import-board-instruction-trello'], /In your Trello board/);
}
}
assert.match(read('eo')['advanced-filter-description'], /specialajn signojn.*literalajn signojn/);
assert.doesNotMatch(read('eo')['advanced-filter-description'], /regsignojn|Kampo1|Valoro1/);
// Syntax-only repair: Finnish prose remains an open Veps language finding.
const vepsHelp = read('ve-PP')['advanced-filter-description'];
for (const example of examples) {
assert.ok(vepsHelp.includes(example), `Veps: exact executable example ${example}`);
}
assert.deepEqual(vepsHelp.match(/\\+/g), source.match(/\\+/g),
'Veps: standalone escape markers match source inventory');
assert.ok(result.pendingByLocale['ve-PP'] > 0, 'Veps language review stays open');
assert.ok(!vepsHelp.includes("Field1 = I"), 'Veps: reject malformed comparison');
assert.match(read('lt')['advanced-filter-description'], /Išplėstinis filtras/);
assert.match(read('mn')['advanced-filter-description'], /Нарийвчилсан шүүлтүүр/);
assert.match(read('el')['advanced-filter-description'], /προηγμένο φίλτρο/);
+80 -2
View File
@@ -21,6 +21,11 @@ const tokens = value => [...value.matchAll(/__[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*__|%
assert.notEqual(row.before, row.after, identity);
assert.equal(repairLocale(row.locale, { [row.key]: row.before }).data[row.key], row.after);
assert.equal(repairLocale(row.locale, { [row.key]: 'NEW REVIEWED TRANSLATION' }).data[row.key], 'NEW REVIEWED TRANSLATION', 'preserve newer wording');
if (row.locale === 'zgh' && ['board-public-info', 'board-private-info'].includes(row.key)) {
assert.deepEqual(row.after.match(/<[^>]+>/g), english[row.key].match(/<[^>]+>/g), 'visibility notice retains source HTML emphasis');
assert.ok(!/[\u0600-\u06ff]/u.test(row.after), 'visibility notice no longer contains Arabic');
assert.ok(row.after.includes('ⵔⴰ ⴰⴷ ⵜⵉⵍⵉ'), 'visibility notice retains the future state');
}
if (row.key === 'copyManyCardsPopup-format') {
const example = JSON.parse(row.after);
assert.ok(Array.isArray(example));
@@ -35,6 +40,8 @@ const tokens = value => [...value.matchAll(/__[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*__|%
assert.doesNotMatch(cache.zgh[key], /Mot de passe|Nom d.utilisateur|requis/);
assert.match(cache.zgh[key], /ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ/);
}
assert.equal(cache.zgh['predicate-all'], 'ⴰⴽⴽⵯ');
assert.doesNotMatch(cache.zgh['predicate-all'], /[\s:]/, 'All remains a single query predicate token');
assert.equal(cache.zgh.labels, 'ⵉⵔⵛⵓⵎⵏ');
assert.equal(cache.zgh['no-results'], 'ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⵢⴰⴼⵓⵜⵉⵏ');
for (const key of ['user-username-not-found', 'label-not-found', 'label-color-not-found']) {
@@ -2893,8 +2900,8 @@ const tokens = value => [...value.matchAll(/__[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*__|%
assert.doesNotMatch(value, /[\u0600-\u06FF]|Connexion|Déconnexion|Les mots/, key);
}
assert.notEqual(cache.zgh.login, cache.zgh.logout);
assert.equal(cache.zgh['delete-all-notifications'], 'ⴽⴽⵙ ⵉⵍⵖⴰ ⴰⴽⴽ');
assert.match(cache.zgh['delete-all-notifications'], /ⵉⵍⵖⴰ ⴰⴽⴽ$/);
assert.equal(cache.zgh['delete-all-notifications'], 'ⴽⴽⵙ ⴰⴽⴽⵯ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ');
assert.match(cache.zgh['delete-all-notifications'], /ⴰⴽⴽⵯ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ$/);
assert.doesNotMatch(cache.zgh['delete-all-notifications'], /Supprimer|notifications/);
const quechuaBasicColors = {"color-black": "yana", "color-red": "puka", "color-white": "yuraq"};
for (const [key, value] of Object.entries(quechuaBasicColors)) {
@@ -2931,3 +2938,74 @@ const tokens = value => [...value.matchAll(/__[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*__|%
assert.notEqual(cache.chr['calendar-system-islamic-rgsa'], cache.chr['calendar-system-islamic-tbla']);
console.log(`auditedTranslationCorrections: ${corrections.length} corrections verified; tokens, JSON examples, key order, idempotency and newer translations preserved`);
})().catch(error => { console.error(error); process.exitCode = 1; });
// Danish restored-value review: legal-link agreement and the malloc metric.
{
const da = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/da.i18n.json'), 'utf8'));
require('node:assert/strict').equal(da.legalNotice, 'juridisk meddelelse');
require('node:assert/strict').match(da.Node_heap_malloced_memory, /hukommelse allokeret med malloc$/);
require('node:assert/strict').notEqual(da.Node_heap_malloced_memory, 'Node heap: allokeret hukommelse');
}
// Galician automation date triggers must cover both first setting and changes.
{
const gl = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/gl.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
const kinds = { due: 'vencemento', start: 'inicio', end: 'fin', received: 'recepción' };
for (const [kind, noun] of Object.entries(kinds)) {
const value = gl[`r-when-a-${kind}-date-changed`];
assert.equal(value, `Cando se establece ou cambia a data de ${noun}`);
assert.doesNotMatch(value, /início|Fim|Recebido|limite/);
}
}
// Clearing a Galician card field value must not claim its definition was deleted.
{
const gl = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/gl.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
assert.equal(gl['activity-unset-customfield'], "quitou o valor do campo personalizado '%s' en %s");
assert.notEqual(gl['activity-unset-customfield'], "quitou o campo personalizado '%s' en %s");
}
{
const gl = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/gl.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
assert.equal(gl.Node_heap_does_zap_garbage, 'Memoria heap de Node: sobrescribe o lixo cun patrón de bits');
assert.notEqual(gl.Node_heap_does_zap_garbage, 'Memoria heap de Node: limpa o lixo (zap garbage)');
}
// Received date captions describe a feminine Galician tarxeta.
{
const gl = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/gl.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
assert.equal(gl['card-received'], 'Recibida');
assert.equal(gl['card-received-on'], 'Recibida o');
assert.notEqual(gl['card-received'], 'Recibido');
assert.notEqual(gl['card-received-on'], 'Recibido o');
}
// Completed subtask tooltip agrees with feminine Galician subtarefa.
{
const gl = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/gl.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
assert.equal(gl.completed, 'Completada');
assert.notEqual(gl.completed, 'Completado');
}
// Basque archived activity states use archive terminology, not generic storage.
{
const eu = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/eu.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
for (const kind of ['Board', 'Card', 'List', 'Swimlane']) {
assert.match(eu['act-archived' + kind], /artxibora eraman da/);
assert.doesNotMatch(eu['act-archived' + kind], /biltegira/);
}
}
// Basque all-status search distinguishes archiving from generic storage.
{
const eu = JSON.parse(require('node:fs').readFileSync(require('node:path').join(__dirname, '../imports/i18n/data/eu.i18n.json'), 'utf8'));
const assert = require('node:assert/strict');
assert.equal(eu['globalSearch-instructions-status-all'], '`__predicate_all__` - artxibatutako eta artxibatu gabeko txartel guztiak');
assert.doesNotMatch(eu['globalSearch-instructions-status-all'], /biltegiratu/);
}
+2 -1
View File
@@ -24,10 +24,11 @@ const root = path.resolve(__dirname, '..');
assert.equal(reviews.find(row => row.locale === 'gl-ES' && row.key === 'r-items-list').value, 'elemento1,elemento2,elemento3', 'correct Galician example remains unchanged');
const placeholderTemplate = fs.readFileSync(path.join(root, 'client/components/rules/actions/checklistActions.jade'), 'utf8');
assert.match(placeholderTemplate, /input\(id="checklist-items",type=text,placeholder="{{_'r-items-list'}}"\)/);
for (const review of reviews.filter(row => row.key === 'r-items-list' && !['sk', 'gl', 'gl-ES', 'an'].includes(row.locale))) {
for (const review of reviews.filter(row => row.key === 'r-items-list' && !['sk', 'gl', 'gl-ES', 'an', 'eo'].includes(row.locale))) {
assert.deepEqual(review.value.split(',').map(value => value.trim().replace(/ /g, '')), ['item1', 'item2', 'item3']);
assert.match(review.reason, /placeholder demonstrates/);
}
assert.equal(reviews.find(row => row.locale === 'eo' && row.key === 'r-items-list').value, 'ero1,ero2,ero3', 'Esperanto example item names remain translated; commas preserve input syntax');
assert.equal(reviews.find(row => row.locale === 'an' && row.key === 'r-items-list').value, 'elemento1,elemento2,elemento3', 'native Aragonese example restored after mistaken English replacement');
assert.equal(reviews.find(row => row.locale === 'sk' && row.key === 'r-items-list').value, 'položka1,položka2,položka3', 'valid Slovak example vocabulary remains unchanged');
for (const locale of ['de', 'de-AT', 'de-CH', 'de_DE', 'sk', 'fr', 'fr-BE', 'fr-CA', 'fr-CH', 'fr-FR', 'cs', 'cs-CZ', 'hu', 'it', 'es', 'es-LA', 'pt', 'pt-BR', 'pt-PT', 'pt_PT', 'nl', 'nl-NL', 'nb', 'sv', 'vl-SS']) {
+12
View File
@@ -0,0 +1,12 @@
const assert = require('node:assert/strict');
const fs = require('node:fs');
const test = require('node:test');
test('Basque rule labels distinguish archiving from storage and restoration direction', () => {
const data = JSON.parse(fs.readFileSync('imports/i18n/data/eu.i18n.json', 'utf8'));
assert.equal(data['r-archived'], 'Artxibora eraman da');
assert.equal(data['r-unarchived'], 'Artxibotik berreskuratu da');
for (const key of ['r-archived', 'r-unarchived']) assert.doesNotMatch(data[key], /bilteg/i);
const template = fs.readFileSync('client/components/rules/triggers/boardTriggers.jade', 'utf8');
assert.match(template, /value="archived".*r-archived/);
assert.match(template, /value="unarchived".*r-unarchived/);
});
+8 -8
View File
@@ -20,29 +20,29 @@ const {
let passed = 0;
function check(name, fn) { fn(); passed += 1; console.log(' ok -', name); }
check('a board with no subtasks-default board keeps the null $in member', () => {
assert.deepStrictEqual(boardScopeIds({ _id: 'B' }), ['B', null]);
assert.deepStrictEqual(boardCardScope({ _id: 'B' }), { boardId: { $in: ['B', null] } });
check('a board without a deposit excludes null and orphan card boards', () => {
assert.deepStrictEqual(boardScopeIds({ _id: 'B' }), ['B']);
assert.deepStrictEqual(boardCardScope({ _id: 'B' }), { boardId: { $in: ['B'] } });
});
check('null and undefined subtasksDefaultBoardId use the same MongoDB selector', () => {
assert.deepStrictEqual(boardCardScope({ _id: 'B', subtasksDefaultBoardId: null }),
{ boardId: { $in: ['B', null] } });
{ boardId: { $in: ['B'] } });
assert.deepStrictEqual(boardCardScope({ _id: 'B' }),
{ boardId: { $in: ['B', null] } });
{ boardId: { $in: ['B'] } });
});
check('a real subtasks-default board -> an all-string $in (still pushes down)', () => {
assert.deepStrictEqual(boardScopeIds({ _id: 'B', subtasksDefaultBoardId: 'S' }), ['B', 'S']);
assert.deepStrictEqual(boardScopeIds({ _id: 'B', subtasksDefaultBoardId: 'S' }), ['B']);
assert.deepStrictEqual(boardCardScope({ _id: 'B', subtasksDefaultBoardId: 'S' }),
{ boardId: { $in: ['B', 'S'] } });
{ boardId: { $in: ['B'] } });
});
check('tolerates a missing board', () => {
assert.deepStrictEqual(boardScopeIds(undefined), []);
assert.deepStrictEqual(boardScopeIds({}), []);
assert.deepStrictEqual(boardCardScope({ _id: 'B', subtasksDefaultBoardId: 5 }),
{ boardId: { $in: ['B', 5] } });
{ boardId: { $in: ['B'] } });
});
// ── source guards: no card query still uses the null-containing $in ────────────
Loaded 100 of 154 files, more files were not shown because too many files have changed in this diff. Show more