Period: 2026-01-23 to 2026-01-30
Generated: 2026-01-30 08:15
| Metric | Value |
|---|---|
| Total commits | 89 |
| Contributors | 29 |
| Lines added | +8,225 |
| Lines removed | -1,789 |
| Net change | +6,436 |
| Files changed | 392 |
| Type | Count |
|---|---|
| SECURITY | 11 |
| FIX | 20 |
| FEATURE | 7 |
| UX | 15 |
| DEV | 25 |
| PERF | 1 |
| I18N | 4 |
| WIP | 2 |
| Other | 4 |
Strong security week with multiple permission enforcement fixes:
| SHA | Description |
|---|---|
9c0642a2e7 |
Download allowlist for uploaded files |
e26dbdda29 |
Secure subscription endpoints |
c4be081373 |
Loose hostname matching in FinalDestination |
3d0119bae5 |
Enforce group-access restrictions to AI discover's continue convo |
e4dc4c3b85 |
Add maximum length limit for new_username param |
8f82f1206f |
AdminDetailedUserSerializer#latest_export leaking user exports |
357febfb47 |
Better protection for drafts |
bcd5a7ae04 |
Ensure moderator can see post/topic before allowing them to change owner |
9e088bc3c7 |
Add guardian check on PM to topic conversion |
9892628a50 |
Restrict staff action logs visibility for moderators |
bd46c2e64a |
Moderators can no longer edit user's emails |
250c54e302 |
Prevent permalink redirects from leaking restricted slugs |
β Assessment: Comprehensive security batch with proper test coverage (259 new test lines in download allowlist alone).
Author: Penar Musaraj
Issue: Invalid CSS value border-radius: none;
// β Current (invalid)
border-radius: none;
// β
Should be
border-radius: 0;Impact: Low - browsers ignore invalid property, but stylelint should catch this.
Author: Jarek Radosz
Issue: Enables rule globally but adds blanket /* eslint-disable ember/no-side-effects */ to 15 files.
Files affected:
composer.jssite-setting.gjsadmin-nav-manager.jspost/menu.gjsd-multi-select.gjs- Multiple AI plugin components
Recommendation: Prefer scoped disables or refactor the actual side effects rather than file-wide suppressions.
Author: Jarek Radosz
Issues:
- Getter
showSuggestionButtonmutates DOM (classList.toggle) - Getter
showDropdowncallsthis.dMenu.close()(side effect)
// β Side effect in getter
get showDropdown() {
if (this.suggestions?.length === 0) {
this.dMenu.close(); // <-- side effect
return false;
}
return !this.loading;
}Recommendation: Move DOM manipulation to actions triggered by {{did-update}} modifiers.
Author: Jarek Radosz
Issues:
- Same
showSuggestionButtongetter DOM mutation issue tagSelectorHasValuesgetter assumesthis.modelexists (potential null access)
// β Missing null check
get tagSelectorHasValues() {
return this.model.get("tags")?.length > 0;
}
// β
Safer
get tagSelectorHasValues() {
return this.model?.get?.("tags")?.length > 0;
}Author: Rafael dos Santos Silva
Issue: Behavior change in action ordering without test coverage.
// Before: action() called after closeFn
// After: action() called before closeFn (sync) or awaited after (async)Recommendation: Add test to verify expected ordering behavior.
Author: Kris
Why excellent:
- β Accessibility improvement: error links now focus the associated field
- β
Proper i18n pluralization (
count=this.errorCount) - β Strong test coverage (49 new test lines)
- β
Smooth scroll behavior with
focusVisible: true
Author: Jake Goldsborough
Why excellent:
- β
Real-world robustness for
Errno::EMLINK(hardlink limits vary by filesystem) - β Graceful fallback to copy
- β
Improved logging with new
copiedstat - β Clean error handling
Author: Arpit Jalan
Why excellent:
- β Correct edge case handling for moderation workflow
- β Two new specs: pending reviewable + resolved reviewable cases
- β
SQL query properly checks
Reviewable.statuses[:pending]
Why excellent:
- β 259 new test lines
- β Covers S3 and local storage paths
- β Proper URL validation
Why excellent:
- β Permission enforcement at correct layer
- β Addresses real security gap for moderators
Why excellent:
- β Large UX improvement with good default behaviors
- β Progressive disclosure pattern
Why excellent:
- β Consistent dark mode support
- β Respects user preferences
Author: Jarek Radosz
Why excellent:
- β Clean deprecation removal (was deprecated in 3.4.0.beta4)
- β Reduces maintenance surface
| Contributor | Commits | Focus Area |
|---|---|---|
| Kris | 10 | UX/Styling |
| Martin Brennan | 9 | Core |
| Alan Guo Xiang Tan | 7 | Core |
| RΓ©gis Hanol | 7 | Security |
| Jake Goldsborough | 6 | Backend |
| David Battersby | 5 | Features |
| Jarek Radosz | 5 | Refactoring |
-
Fix invalid CSS:
border-radius: noneβborder-radius: 0in color-palette-editor.scss -
Reduce lint suppression scope: Instead of file-wide
/* eslint-disable ember/no-side-effects */, either:- Refactor getters to be pure (move side effects to actions/modifiers)
- Use line-specific disables with explanatory comments
-
Address getter side effects in AI suggester components:
- Move DOM class toggling to
{{did-insert}}/{{did-update}}modifiers - Move menu closing to explicit actions
- Move DOM class toggling to
-
Add test for chat composer button ordering: The async/sync behavior change in
chat-composer-dropdown.gjsshould have test coverage. -
Run stylelint: Consider adding stylelint rule to catch invalid CSS values like
border-radius: none.
plugins/discourse-ai/ - Multiple refactors
frontend/discourse/ - FormKit, composer, admin components
lib/backup_restore/ - Hardlink handling
app/assets/stylesheets/ - Various UX fixes
Report generated from git history analysis