Skip to content

stage-344: 16-PR contributor batch — i18n + insights + manual-compress async + workspace recovery + iOS PWA + Cloudflare login health + bash 3.2 (fr locale) - #2148

Merged
nesquena-hermes merged 37 commits into
masterfrom
stage-344
May 12, 2026
Merged

nesquena-hermes merged 37 commits into
masterfrom
stage-344

Conversation

@nesquena-hermes

Copy link
Copy Markdown
Collaborator

stage-344 — large 16-PR contributor batch (v0.51.51)

Constituent PRs (all CI-green on Py 3.11/3.12/3.13)

PR Author Description
#2120 Michaelyklam Daily Tokens chart bucketing for 90/365 day ranges (closes #2103)
#2121 Michaelyklam Mobile Analytics stack layout (refs #2104)
#2123 Michaelyklam Portuguese (pt) session-management i18n parity (closes #2112)
#2125 Michaelyklam _patch_skill_home_modulespatch_skill_home_modules rename + docstrings (closes #2093)
#2128 franksong2702 Manual /compress async start/status flow (closes #2087)
#2129 Michaelyklam _purgeStaleInflightEntries purges missing-from-list sessions (closes #2092)
#2130 dso2ng Lazy lineage-report fetch on segment-badge expand
#2132 Michaelyklam Turn-journal fsync tradeoff docs (refs #2096)
#2135 franksong2702 Custom live-models provider scoping (closes #2126, refs #2131)
#2137 franksong2702 Login health probe credentials: same-origin for Cloudflare Access (closes #2122)
#2138 dobby-d-elf Workspace fallback recovers from stale deleted workspaces
#2139 Michaelyklam Turn-journal terminal-collision audit slice (refs #2097)
#2140 franksong2702 Preserve api_key/key_env in fallback provider normalization (closes #2133)
#2141 franksong2702 Settings → System mobile version-badge wrap (closes #2102)
#2142 legeantbleu French (fr) locale (938 keys)
#2143 dobby-d-elf iPhone PWA chat bottom-scroll stutter fix

Stage-344 maintainer fixes

  1. i18n: add French (fr) locale #2142 absorption — adds "fr" to LOCALES tuples in tests/test_issue1488_composer_voice_buttons.py (2 sites), adds matching _LOGIN_LOCALE['fr'] block in api/routes.py for the issue Server-side _LOGIN_LOCALE missing ja, pt, ko (login page falls back to English) #1442 login-page parity contract, and inverts the now-incorrect _resolve_login_locale_key('fr') == 'en' assertion. Mirrors the stage-340 fix for the it locale (PR feat(i18n): add Italian (it) locale #2067). +14 LOC.

  2. Fix manual compression proxy timeouts #2128 Opus SHOULD-FIX (Portability #1 + Hermes Web UI — Sprints 11-14: multi-provider models, settings, sessi… #2) — applied two related Fix manual compression proxy timeouts #2128 UX bugs caught by Opus advisor review:

    • compress/status no longer pops the done job entry on first read → second open tab no longer sees idle and "Compression job is no longer available"
    • compress/start no longer short-circuits to a stale done payload when re-invoked within the 10-minute TTL → closing+reopening a tab mid-compress now correctly restarts
    • The third Opus SHOULD-FIX (Fix custom live model scoping #2135 cfg["model"] fallback tightening) is deferred to a follow-up — strictly no-worse-than-master, but worth tightening later. +17 LOC, -4 LOC.

Merge conflicts resolved

Verification

  • Full pytest: 5306 passed, 8 skipped, 1 xfailed, 2 xpassed in 103s (was 5265 before — +41 new tests from constituent regressions)
  • run-browser-tests.sh: 20/20 QA + 11/11 browser API checks PASSED in 112s
  • Live UI smoke test on port 8789 (fresh isolated env):
  • python -m py_compile clean on all 7 modified .py files
  • node --check clean on all 6 modified .js files
  • Merge-conflict-marker check clean on all modified files
  • Opus advisor on merged stage diff: "SHIP stage-344". 3 SHOULD-FIX items — 2 applied directly above, 1 deferred to follow-up issue.

Stats

 36 files changed, 2815 insertions(+), 158 deletions(-)

Review-policy compliance

  • Fork-only batch — Opus advisor is the mandatory second-set-of-eyes per review-policy.md. ✓ Run + verdict captured.
  • No self-built changes — no nesquena APPROVED gate needed.
  • Browser QA + pytest + run-browser-tests.sh all run per "QA and browser testing are mandatory gates" rule. ✓

Closes

(Refs #1442, #1906, #1943, #2012, #2057, #2063, #2087, #2096, #2097, #2104.)

dobby-d-elf and others added 30 commits May 11, 2026 22:08
Translation of all 938 string keys from English to French.
Generated programmatically with Google Translate.
docs: document turn journal fsync tradeoff (refs #2096)
fix: add Portuguese session management i18n (closes #2112)
Fix login health probe credentials (closes #2122)
Fix Settings System mobile version wrapping (closes #2102)

# Conflicts:
#	CHANGELOG.md
Fix iPhone PWA chat bottom scroll stutter
fix: bucket long-range daily token charts (closes #2103)
fix: stack analytics usage cards on mobile (refs #2104) — TEST CONFLICT EXPECTED

# Conflicts:
#	tests/test_insights.py
feat: load full lineage segments on demand
docs: clarify compression anchor helpers (closes #2093)
Preserve fallback provider credential hints (closes #2133)

# Conflicts:
#	CHANGELOG.md
fix: audit turn journal terminal collisions
fix: purge missing inflight sessions (closes #2092)
Hermes Agent added 7 commits May 12, 2026 16:12
fix: recover from stale deleted workspaces
Fix custom live model scoping (closes #2126, refs #2131)

# Conflicts:
#	CHANGELOG.md
Fix manual compression proxy timeouts (closes #2087)

# Conflicts:
#	CHANGELOG.md
i18n: add French (fr) locale (938 keys, alphabetical en→fr→it position)
…ries + _LOGIN_LOCALE block

#2142 (legeantbleu) added the fr locale to static/i18n.js but didn't update:
1. tests/test_issue1488_composer_voice_buttons.py: two TestComposerVoiceButtonI18n + TestVoiceModePreferenceGate LOCALES tuples needed 'fr'
2. api/routes.py: _LOGIN_LOCALE needed an 'fr' block so the login page localizes for French users (issue #1442 parity contract)
3. tests/test_login_locale_parity.py: the test asserting 'fr' falls-back-to-'en' is inverted — fr now resolves to fr, with sibling assertions for fr-FR and fr-CA

Mirrors the stage-340 fix for the it locale (PR #2067 → maintainer adds tuple entries). 46/46 i18n tests pass after fix.
…-done re-emit

(1) compress/status no longer pops the job entry on first read of `done` payload.
    Second open tab no longer sees `idle` and a stale-job toast.
(2) compress/start no longer short-circuits to a stale `done` payload when
    re-invoked within the 10-minute TTL. Re-running /compress always starts
    fresh, so closing-and-reopening a tab mid-compress works correctly.

Third SHOULD-FIX (#2135 cfg["model"] fallback tightening when no custom_providers
entry matches) deferred to follow-up — strictly no-worse-than-master behavior.

tests/test_sprint46.py 10/10 still passes.
@nesquena-hermes
nesquena-hermes merged commit 6297443 into master May 12, 2026
3 checks passed
@nesquena-hermes
nesquena-hermes deleted the stage-344 branch May 12, 2026 16:42
ancaglon1 added a commit to ancaglon1/hermes-webui that referenced this pull request May 12, 2026
SysAdminDoc pushed a commit to SysAdminDoc/hermes-webui that referenced this pull request Jun 26, 2026
stage-344: 16-PR contributor batch — i18n + insights + manual-compress async + workspace recovery + iOS PWA + Cloudflare login health + bash 3.2 (fr locale)
bernyforce pushed a commit to bernyforce/hermes-webui that referenced this pull request Jul 29, 2026
stage-344: 16-PR contributor batch — i18n + insights + manual-compress async + workspace recovery + iOS PWA + Cloudflare login health + bash 3.2 (fr locale)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment