@gotcos/glasses-server 6.27.10 → 6.27.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 6.27.11
4
+ - **SAFETY REVERT: the 6.27.10 relabel enrolment is disabled.** It joined two
5
+ different index spaces. `plan.value.changed` are positions in the COMPACTED sidecar
6
+ array (`meeting-relabel.ts:119`, over rows already filtered to those carrying text)
7
+ while the chunk-embedding store is keyed on the RAW capture index
8
+ (`transcribe-stream.ts:1868`). They diverge at the first text-less chunk.
9
+ - Measured on a live session: naming ONE voice enrolled **73 of 103 rows belonging to
10
+ other people**, including **22 chunks of the owner**, plus five colleagues. It
11
+ reported success because rows do come back — the wrong ones. 73 of 74 live sessions
12
+ with embeddings have gaps, so this was the normal case, not an edge case.
13
+ - `attachRawChunkIndices` is the conversion for exactly this. It was already imported
14
+ in the file, used correctly by the review path, and carries a comment three hundred
15
+ lines above the change reading "`chunks` is NOT the WAV number".
16
+ - **Anyone on 6.27.10 should update.** Naming a voice in the review panel could write
17
+ other people — including the owner — into that person's profile, permanently and
18
+ across every future meeting. The relabel itself was always correct; only the
19
+ enrolment side effect was wrong.
20
+
21
+ Re-enabling requires all of: the `attachRawChunkIndices` mapping with a refusal when
22
+ it is unavailable; a coherence gate (an `Ext` bucket is many voices — 98% of its
23
+ pairwise cosines fall below the identifier's own 0.55 accept threshold); a
24
+ `correction:<sessionId>` source tag so samples are human-tier, quota-protected and
25
+ retractable by the existing de-attribute path (a bare `meeting-relabel` tag matches
26
+ none of the three prefixes `isSampleFromSession` accepts, so "Not in this meeting"
27
+ silently retracts nothing); `greedyDiversitySelect` to bound the loop (~41ms per
28
+ cycle against a 7.9 MB store x 109 chunks blocks the event loop past the helper's
29
+ 30s timeout); and honest reporting so a zero enrolment is distinguishable from
30
+ success. The COS Control scope-picker copy also still reads "Corrects this meeting
31
+ only. Other meetings are left alone."
32
+
3
33
  ## 6.27.10
4
34
  - **Naming an unidentified voice now creates a real profile.** `POST /api/meeting/:id/relabel`
5
35
  was TEXT ONLY: it rewrote `speaker` strings in the sidecar and never touched the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.27.10",
3
+ "version": "6.27.11",
4
4
  "description": "COS Glasses \u2014 self-hosted AI heads-up-display server for Even G2 smart glasses, powered by Claude Code, Codex, or Cursor Agent CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1195,7 +1195,24 @@ export function createMeetingRouter(deps: MeetingRouteDependencies = {}): Router
1195
1195
  // user asked for, and a voice store that refuses must not undo it. Reported so
1196
1196
  // the panel can say a profile was created rather than leaving the user to
1197
1197
  // discover, in another meeting, that it was not.
1198
- const enrolled = enrolNamedVoice(sessionId, from, to, plan.value.changed)
1198
+ // DISABLED in 6.27.11. 6.27.10 shipped this joining the WRONG INDEX SPACE:
1199
+ // `plan.value.changed` are positions in the COMPACTED sidecar array
1200
+ // (meeting-relabel.ts:119, over rows already filtered to those with text) while
1201
+ // the embedding store is keyed on the RAW capture index
1202
+ // (transcribe-stream.ts:1868). They diverge at the first text-less chunk.
1203
+ //
1204
+ // Measured on a live session: naming one voice enrolled 73 of 103 rows belonging
1205
+ // to OTHER people, including 22 chunks of the owner. It reported success because
1206
+ // rows do come back — just the wrong ones. 73 of 74 live sessions have gaps, so
1207
+ // this was the normal case.
1208
+ //
1209
+ // `attachRawChunkIndices` is the conversion for this and is imported at line 126,
1210
+ // used correctly by the review path at 755 and 856. Re-enable only WITH that
1211
+ // mapping, a refusal when the mapping is unavailable, a coherence gate (an `Ext`
1212
+ // bucket is many voices — 98% of its pairwise cosines fall below the identifier's
1213
+ // own 0.55 accept threshold), and a `correction:<sessionId>` source tag so the
1214
+ // samples are human-tier, quota-protected and retractable.
1215
+ const enrolled = 0
1199
1216
  res.json({ ok: true, correctionId: id, enrolledEmbeddings: enrolled, ...preview })
1200
1217
  })
1201
1218