Skip to main content

Have something to say?

Tell us how we could make the product more useful to you.
Deployed to QA.

Localization for NA/EU

Localization for NA/EU

Completed And Live In Production

Scoring recalibration — new rating conversion 0/20/45/70/88

Approved by Joon on Sep 4, 2026. This changes the scoring arithmetic only — nothing changes about what the scorer judges. What ships 1. New rating → percent conversion: 0 / 20 / 45 / 70 / 88 (replaces 0/20/40/60/80). Each rating now pays the middle of its band rather than its floor: 2 = Developing (45), 3 "generally effective" = Solid (70), 4 "integrated, limited gaps" = Strong (88), 5 = Exceptional (100). The 4 sits at the upper end of Strong rather than the true middle (85) so an otherwise all-4 session with one meaningful 5 can reach roughly 90. At 85, one 5 lands around 87–88 and an associate would need several 5s — quietly recreating the problem that made Exceptional nearly unreachable. The 4 anchor is demanding ("fully executed and meaningfully tailored," foundational capabilities present, no foundational gap), so upper-Strong is defensible. 2. Exceptional eligibility relaxed: requires one standout moment rather than a 5-rated behavior in every engagement zone. The human audit on Exceptional is retained. Considered and dropped Automatic full Cultural Fluency credit for a 3 when no cultural opening existed — not implemented. The persona-specific 5/10/15% CF weighting already accounts for differing opportunity, so auto-credit double-corrects for the same issue, and it would let a 3 earn 100% while a genuinely stronger 4 earns 88%. It also overstates the constraint: an associate can surface influences (social media, community, personal style, travel, work, friends) without a customer-provided opening. Existing CF structure and the standard 0–5 conversion stand — at a 5% weight the maximum difference is 1.5 points. Alternative scales rejected: +10 across the board (30/50/70/90) and 25/45/70/90 both pay a 4 at 90, putting an all-4 session on the Exceptional line; the flat +10 also gives the weakest sessions the largest lift. The 20/45/67/89 curve is effectively the 85 version. Impact — retroactive re-score of all ~11,000 sessions to date Sessions at 80 or better: 1.3% → 9.2% Sessions at 70 or better: 14% → 33% Average score: 51 → 58 About 25% of sessions move up a band; none move down Typical gain is 6–9 points, roughly the size of one re-try gain today, so repeat practice still shows visible progress. Implementation notes Deterministic conversion in server/alb-identity/elxScoring.js — the model returns ratings and evidence only; all arithmetic stays in application code and remains auditable and replayable from the persisted record. Category weights, the CF flex (5/10/15), gates, critical overrides and the 60% eligibility floors are unchanged. Confirm the My Team / Teams layer aggregates, band labels, admin reporting and exports all pick up the new scale, and account for the mixed-scale period across the cutover. Build over the weekend of Sep 5–6, targeting production the following week via the normal CAB path.

Completed And Live In Production

Rename EU group: "France & Benelux" becomes "France, Netherlands, and Belgium"

**Rename only.** The merged EU group currently labelled **France & Benelux** should read **France, Netherlands, and Belgium**. Nothing else changes. Same 11 stores, same group, same underlying district and area codes, same access. This is the display label and only the display label. ## Where it lives The label sits in the display-group mapping table, held as data rather than code. It is read by all three surfaces — My Team, Analytics and the consumer hierarchy — so **one edit changes it everywhere at once**. There is no per-surface string to hunt down. ## What must not change - The group key. Group by the code, never the name. - The three underlying district codes (TPR_BE_D1, TPR_FR_D1, TPR_NL_D1) and their area codes. - Store counts. Still 11: Belgium 1, France 8, Netherlands 2. - Access. A manager scoped to Belgium still sees Belgium only. ## Test - My Team, Analytics and the consumer hierarchy all read "France, Netherlands, and Belgium" - The group still returns 11 stores in all three - Filtering to it returns every store in it - Nothing else in the EU list moved ## Note "France & Benelux" was a FutureProof proposal, not a Coach decision, so this is a correction rather than a change of mind. Worth confirming the exact wording and punctuation with Shanelle before it ships — serial comma or not, and whether the order should be alphabetical.

Admin #338 — Market Experience v2: Global is content every market receives, not a market of its own

The foundation the rest of the market work sits on. Treating Global as a third bucket alongside NA and EU was the single cause of the empty market view, the header disagreeing with the market count, and curators being unable to find posts associates could plainly see. **Test (Tier 3, indirect):** verified through #340, #344, #350, #354 and #356. A market view should return All Markets content plus that market, never that market alone.

Completed And Live In Production

Admin #328 — Analytics HQ: a cancelled query no longer renders as a real zero

A cancelled query was displaying as zero, indistinguishable from a genuine zero result. Also adds a RAG identity join index. **Test (Tier 3):** cancel a query mid-flight and confirm no zero appears in its place.

Admin #332 — Transcript rendered in the shape RDS actually stores

Plus an explanation of why a voice-agent list can legitimately be empty. **Test (Tier 3):** compare a rendered transcript against the stored record for the same session.

Admin #342 — Probe parses date types the way the pool does

The probe was parsing dates differently from the connection pool, so it reported a state that did not match reality. **Test (Tier 3):** compare probe output against a real query returning date columns.

Consumer #704 / Admin #358 — Recombee made dormant behind RECOMBEE_ENABLED

A master switch, off by default. Publish-time item sync on admin is dormant unless `RECOMBEE_ENABLED=true`. Consumer half is #704, admin half is #358. **Test (Tier 3):** verified by absence. Publish an item with the switch off and confirm no sync fires.

Consumer #700 / Admin #348 — nginx header buffers sized for the ALB cookie

ALB identity 400s. The header buffers were too small for the ALB session cookie and OIDC headers, and a 400 now names its own cause instead of being opaque. Consumer half is #700, admin half is #348. **Test (Tier 3):** only reproducible under whatever condition was producing the 400s, typically a large session cookie.

Completed And Live In Production

Consumer #688 — Sentry: one issue per failing named query instead of one shared bucket

All query failures were collapsing into a single issue, so a new failure was invisible inside an existing one. **Test (Tier 3):** in Sentry. Two different failing queries should produce two issues.

Consumer #694 — Sentry issue titles carry the failing query name

Previously a failing query produced a title that did not identify which query failed. **Test (Tier 3):** in Sentry. Trigger a query failure and confirm the issue title names it.

Consumer #690 — Identity memo keyed on the identity, not the token

COACH-PULSE-4H, the 100% cache miss. The memo was keyed on a value that changed every request, so it never hit. **Test (Tier 3):** watch cache hit rates. Not observable from the interface.

Consumer #676 — Store-group hierarchy resolved by district, then area, then country

The consumer half of the EU hierarchy fix. Recovers the 19 European stores that carried no district and were appearing nowhere. **Test (Tier 2):** confirm the consumer hierarchy shows seven EU groups totalling 72 stores, matching admin and analytics exactly.

Consumer #706 / Admin #360 — Week boundary moves Monday to Tuesday, cutover 2026-09-01

A week now runs Tuesday through the following Monday. Going forward only, no historical recompute. Consumer half is #706, admin half is #360. **Test (Tier 2):** the picker snapping to Tuesday rather than Monday is checkable now. Full behaviour only observable across the 1 September cutover. **Still open:** whether the changeover week runs short or long, and whoever publishes needs to know before scheduling a required set into it.

Completed And Live In Production

Consumer #678 — Zero-retention transcript access

Advice gets the words, and the transcript fetch is never skipped on an empty buffer. **Test (Tier 2):** complete a practice session and confirm the coaching feedback references what was actually said, including on a session where the buffer starts empty.

Completed And Live In Production

Consumer #682 — Sidecar culture_feed_sound_set never bound its identity param

The feed sound setting was not being written against the right user. **Test (Tier 2):** change the Culture Feed sound setting, reload, and confirm it persisted for that user and not for another.

Consumer #680 — Failed audio worklet load retries instead of dead-ending

Plus `audioEngineFailed` translated in all 15 locales. **Test (Tier 2):** force a worklet failure and confirm it retries. Check the failure message renders in a non-English locale.

Consumer #686 — Audio device refusal gets its own retry budget

COACH-PULSE-4T. A refused microphone was consuming the general retry budget. **Test (Tier 2):** deny microphone permission and confirm a readable error rather than a dead end, and that other retries are unaffected.

Consumer #692 — Audio device released when the practice screen unmounts

COACH-PULSE-4T. The microphone was being held after leaving the practice screen. **Test (Tier 2):** start a practice session, leave the screen, and confirm the device microphone indicator goes out.

Admin #334 — Analytics district level resolved through the shared hierarchy rule

Analytics had its own district resolution in SQL and could not call the shared rule, because the rule lived in TypeScript and the analytics compute is plain JS. The rule now lives in a .mjs with a typed facade, and all three surfaces import one file. **Test (Tier 2):** open the analytics district dropdown. Seven groups, no country names, no "no district" entry, and identical to My Team for the same region.