@gotcos/glasses-server 6.70.0 → 6.71.4

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/.env.example CHANGED
@@ -234,6 +234,14 @@ BIND_HOST=0.0.0.0
234
234
  # COS_MEETING_PROGRESSIVE_HQ=1
235
235
  # COS_MEETING_PROGRESSIVE_HQ_THREADS=2 # optional lower override; cannot raise the tier cap
236
236
 
237
+ # Experimental HQ timing and Meeting Ask evidence. Both default OFF. The native
238
+ # timestamp candidate uses CLI JSON plus its own VAD mapping; live JSON and DTW
239
+ # retain their crash protections. Ask additionally requires progressive HQ.
240
+ # This path FAILED the 30-second live refinement gate on the test machine;
241
+ # human-corrected fact accuracy is also pending. Do not enable for public use.
242
+ # COS_BATCH_HQ_TIMESTAMPS=1
243
+ # COS_MEETING_ASK_HQ_EVIDENCE=1
244
+
237
245
  # Early Sync writes stable meeting identity to the Operations pipeline before
238
246
  # HQ finishes, then enriches that same artifact in place. It is I/O-only and
239
247
  # deliberately independent from the progressive-HQ compute switch.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,50 @@
1
+ ## 6.71.4 · public meeting evidence release
2
+
3
+ - New questions about completed G2 recordings receive accepted finalized transcript passages alongside original live evidence. Earlier answer quotations and turn targets stay unchanged. Final passages are frozen at admission, bounded, redacted and restricted to the requested audio cutoff.
4
+ - Meeting Ask distinguishes an uncaptured commitment from an explicit refusal, recognizes evidenced fictional tests, and includes evidence confidence in each answer.
5
+ - Includes 6.71.1 through 6.71.3 saved-Ask, file, model, COS search and confirmed meeting-context improvements. Live timestamp and progressive refinement canaries remain disabled by default; this release does not claim higher raw ASR accuracy or a passed 30-second refinement gate.
6
+
7
+ ## 6.71.3 · private meeting evidence candidate
8
+
9
+ - Every completed Meeting Ask answer includes a qualitative evidence-confidence row. G2 microphone/ASR limitations guide reasoning; names remain unverified when unclear, explicit later corrections resolve the earlier value, and evidenced rehearsals are not treated as real commitments.
10
+ - Per-meeting calendar suggestions match recording start. A user explicitly confirms a configured domain and optional calendar match; COS searches then focus on that domain. Context freezes at request admission, survives navigation/restart, and stale edits cannot overwrite newer confirmations. Calendar context never lends words to web queries or proves meeting decisions.
11
+ - Includes every 6.71.2 saved-Ask, file, search and canary change. Timestamp and HQ refinement canaries remain disabled: prior live latency exceeded 30 seconds. No claim of improved raw ASR accuracy.
12
+ - Plan: `docs/test-plan-6.71.3.md`. Old clients still receive sections and composed Markdown; the context capability is additive.
13
+
14
+ ## 6.71.2 · private combined candidate · transcription canary, disabled by default
15
+
16
+ - Combines the 6.71.1 Meeting Ask changes with disabled transcription canaries. Saved meeting fallback, recent-topic questions, phone files and COS search settings are retained. See `docs/test-plan-6.71.2.md` for the combined acceptance gates.
17
+
18
+ - An explicit `COS_BATCH_HQ_TIMESTAMPS=1` candidate enables ordinary timestamps for meeting batch CLI decoding and maps compressed VAD times through the table emitted by the same native process. Incomplete or inconsistent timing evidence rejects the candidate result. Empty PCM audio returns an empty result; missing JSON fails cleanly. Live ASR retains compact JSON and DTW remains disabled.
19
+ - `COS_MEETING_ASK_HQ_EVIDENCE=1`, together with progressive HQ and the timestamp flag, can freeze verified sealed passages into a Meeting Ask request. It supports Control's direct transcript submissions, retains recent live turns, preserves source turn IDs and request idempotency, and withholds mixed speaker attribution. Corrupt, incomplete or changed caches leave the live transcript available. The canonical meeting transcript is untouched by an Ask.
20
+ - Qualification is blocked: the production background CPU probe took 142.641 seconds after sealing, exceeding the accepted 30-second refinement delay. Human-corrected facts and a complete live pipeline replay remain pending. See `docs/asr-canaries.md`; this is not a rollout or accuracy claim.
21
+
22
+ ## 6.71.1 · private test candidate
23
+
24
+ - Meeting Ask works after a meeting ends. In the Oct 11 live test, VIEWS offered a meeting that had ended at 10:42 and its Ask screen opened, but every question failed with 404 `session_not_available`: `GET /api/meeting-ask/transcript` read only the in-memory session, which is cleared on save. It now reads, in order, the live session, the durable active-session file of an unsaved capture, the saved record's chunk sidecar (same chunk ids as the live recording, so turn ids in earlier answers still match), and the saved Markdown transcript (without turn times). Nothing is written. An ended meeting answers with `ended: true`, `endedAt` when known (the close time, else start plus duration), `source` and a notice. Only when no source holds its words is it 404 `meeting_transcript_unavailable`. Contract: `MeetingAskTranscript` in `shared/meeting-ask.ts`.
25
+ - What to ask leads with what is being discussed now. In the same test the conversation changed topic and the first questions were about how the meeting began.
26
+ - Evidence: when the meeting is over the 32,000-character budget, the last ten minutes are read in full (including the turn that straddles the start of that window), then earlier passages, evenly spaced across the rest of the recording, fill what is left. If the last ten minutes alone overflow, the newest turns win and nothing earlier is added. The notice says which happened. The other presets keep the whole-recording sample.
27
+ - The task tells the model to start with the most recent topic, not to ask about a topic the meeting has left unless it is still unresolved, and gives it `recentSinceMs`.
28
+ - The server orders the Ask rows newest first, by the latest transcript turn each one cites; a row that cites no transcript turn goes last and ties keep the model's order. So what stays first. Clients number them Ask 1, Ask 2, Ask 3 in this order.
29
+ - What to ask may look in COS once. The model may request one search of COS memory and earlier meetings, planned from the recent discussion, so a question can draw on prior cases or notes, cited `[H1]`. It never reaches the web: a web-scoped request from any preset is searched in COS, the explicit web request is honored only for a typed question, and the runtime sends nothing from a preset to the web search even if asked. A typed question keeps its two lookups and three model calls; What to ask has at most one lookup and two model calls; Catch me up, Summarize and Action items never search.
30
+ - The phone can add files to a meeting's Ask context. `POST /api/meeting-ask/files/media` `{ sessionId, serverInstanceId, media: [{ id, name? }] }` takes 1 to 10 uploads already made through `/api/media` (the CHAT tab's photo and file path, same 64 MB and type limits) and answers `{ files }`, the meeting's whole file list, as `PUT files` does. Each becomes a row `phone_<mediaId>` with `origin: "phone"`, beside COS Control's rows, in the same Meeting Ask file list, so the next Ask uses it and history and export show it. The same media id again updates the same row.
31
+ - Text comes from the media store's extract made at upload (TXT, MD, CSV, JSON and PDF text layers), capped at 100,000 bytes with a notice when cut. It then goes through the same rules as Control's files: a secret in the text makes it `secret-held`, and the meeting limits (100 files, 500,000 bytes, 413 `file_context_limit`) apply. Statuses are final in the answer: `ready`, `secret-held`, `unsupported` (files with no words; photos and videos, since the server has no OCR: "Photos can't be read from the phone yet. Add them from COS Control on your Mac.") or `failed` (no text extract).
32
+ - Errors: 400 `invalid_media` or `invalid_session_id`, 409 `server_instance_mismatch` or `media_conflict` (reserved by a CHAT queue item), 404 `media_not_found`, 410 `media_expired`, 503 `media_unavailable` or `maintenance`.
33
+ - `capabilities.phoneFiles: true` on `GET /api/meeting-ask/config` and `capabilities.meetingAsk` on `/api/health` (now built from one constant). `meeting_context.py list` in the COS scripts also lists these rows for a `g2:` key. COS Control's own drop folder is not written by the server.
34
+ - A Meeting assistant setting chooses how Meeting Ask searches COS memory and earlier meetings, for typed questions and What to ask alike. `cosSearch: "meaning"` (the default) adds the embedding search: the search phrase is embedded by the COS install's embedding provider (the memory and meeting indexes' `embedding_client`). For What to ask that phrase is written by the model from the meeting, so meeting words can reach that provider. `cosSearch: "keyword"` matches words locally only: no embedding request, no tokens, and each Ask that searched says "COS search used keywords only, as set in Meeting assistant settings." Neither is a web search. `GET /api/meeting-ask/config` returns `cosSearch` and `capabilities.cosSearchMode: true`; `PUT /api/meeting-ask/config {"cosSearch":"keyword"}` changes it alone (a model may be sent with it), saved in the journal folder beside the model setting; a bad value is 400 `invalid_cos_search` and nothing is written. It applies from the next question.
35
+
36
+ ## 6.71.0 · private test candidate
37
+
38
+ - Meeting Ask answers come as labeled sections. The model returns `{"sections":[{"label","text"}],"searchQuery":null}` instead of free Markdown, and every answer leads with **So what**. Server only; additive to the 6.69.0 contract in `shared/meeting-ask.ts`. Pairs with the Meeting Ask polish round in COS Glasses and COS Control.
39
+ - Each action has its own labels, in this order. `catch_up`: So what, Decided, Open, You owe, Next. `summary`: So what, Covered, Decided, Open, Next. `actions`: So what, You owe, Others owe, Unowned, Proposed. `questions`: So what, then up to three Ask rows, each one question and one short reason. `ask`: So what, Details. "You asked" is the client's to render from the question; the model never writes it.
40
+ - The server checks every answer. Labels match regardless of case or a trailing colon and are written in their canonical case. Rows are put in the action's order. A repeated label joins into one row, except Ask, which keeps up to three. Empty rows and padding such as "None" or "n/a" are dropped. In a sections array, a label the action does not allow, a malformed row, more than 12 rows, or a missing or empty So what is 502 `invalid_answer`, as before, with no retry. Empty or non-JSON output is `invalid_answer` too.
41
+ - A reply in the 6.70.0 `{"answer":"..."}` shape still answers, because Codex, Cursor and Ollama can be picked for Meeting Ask. Its `**Label:** text` lines are read through the same rules; a line with no label continues the row above it. If that gives no valid So what (no labels, text above the first label, or a label the action does not allow), the whole answer becomes one So what row, line breaks kept, with the notice "This answer was not in the skim format."
42
+ - **You owe** lists only actions the transcript ties to the wearer: a line spoken by "You", or one naming the wearer. The prompt now carries the wearer's profile name (`wearer`, null when unset) and the action's `labels`. A You owe row that cites no transcript passage is dropped; owners and dates are never guessed.
43
+ - Each section carries `sources`: the ids it cites (`T3`, `H1`, `W2`, `F1`), once each, in first-cited order. A citation to an id the evidence does not hold still reads `[source unavailable]` and is left out. Line breaks inside a row are flattened and secrets redacted per row.
44
+ - `answer` is still filled, as one `**Label:** text` paragraph per section (rows separated by a blank line, so CommonMark clients keep them apart) with inline citations kept, so older clients show the labeled look unchanged. `sections` is saved in the v2 journal and returned by `POST requests`, `GET requests/<id>`, `GET history`, and the legacy `POST /api/meetings/live-ask`. An answer kept in memory after a failed journal write keeps its sections too.
45
+ - Catch me up reads the whole meeting. 6.70.0 read only the last 60 seconds. The task is now "Catch me up on the meeting so far." Long meetings keep the 32,000-character evidence budget, which samples across the whole recording, and its "selected passages" notice. A catch-up result is reused for at most one 10-second step of recording time; any new turn asks again.
46
+ - `shared/meeting-ask.ts` adds helpers clients can import or copy: `MEETING_ASK_LABELS`, `meetingAskCitations`, `meetingAskAnswerMarkdown`, and `meetingAskFromLine` for the lens "From:" row. It returns null when an answer cites only this meeting, and otherwise one line of at most 80 characters, such as "the web, example.com", "COS memory", "earlier meeting, Sep 30 pricing sync" or "file, Q4 pricing.pdf". Only cited ids count; uncited results from the same web search do not.
47
+
1
48
  ## 6.70.0 — private test candidate
2
49
 
3
50
  - Meeting Ask public web search works for ordinary public questions. 6.69.0 withheld every search tried in the Oct 10 live test: "Who is alt coin daily?", "What's the latest news on our competitor Acme?" and the follow-up "Run the web search". Server only; no contract change. Works with COS Control 0.5.280 and later and COS Glasses 6.10.623 and later; COS Control 0.5.282 and COS Glasses 6.10.624 add a model control to the Ask chat.
@@ -4933,6 +4980,11 @@ unsaved capture, and makes batch status stop lying about finished work.
4933
4980
 
4934
4981
  # Changelog
4935
4982
 
4983
+ ## 6.71.4
4984
+
4985
+ - New questions about completed G2 recordings receive accepted finalized transcript passages alongside the original live evidence. Earlier answer quotations and turn targets remain unchanged. Final passages are frozen at admission, bounded, redacted and restricted to the requested audio cutoff.
4986
+ - Meeting Ask distinguishes an uncaptured commitment from an explicit refusal and reports evidence confidence. Live high-quality timestamp and progressive refinement canaries remain disabled by default.
4987
+
4936
4988
  ## [6.36.4] - 2026-08-17
4937
4989
 
4938
4990
  ### A cloned Codex conversation gets its own identity
package/README.md CHANGED
@@ -943,3 +943,9 @@ Runtime/model setup is local; the existing provider sign-in requirements remain.
943
943
 
944
944
  Candidate only: publish the versioned runtime asset and server package before
945
945
  promoting the matching Control appcast entry.
946
+
947
+ ### Meeting evidence in server 6.71.4
948
+
949
+ Meeting Ask includes a qualitative evidence-confidence note. New questions about completed G2 recordings can use accepted final transcript passages alongside preliminary live evidence. Those final quotations are frozen at admission and bounded by the submitted audio cutoff; earlier answer quotations and original turn IDs stay unchanged. Final quotations have no precise word timestamp or live turn target.
950
+
951
+ Transcription can mishear names, numbers, negations and speakers. Missing or incomplete words do not prove a refusal or commitment. Calendar and user-confirmed meeting context guide retrieval, without proving what was said. Timestamp and progressive-refinement canaries remain disabled by default; this release does not claim improved raw ASR accuracy or a passed 30-second refinement gate. Existing companion clients remain compatible.
@@ -0,0 +1,103 @@
1
+ # Transcription qualification
2
+
3
+ The objective is reliable answers during a live meeting: names, quantities,
4
+ negation, owners, deadlines, decisions and corrections must survive ASR. The
5
+ initial live transcript remains available immediately. Refined passages must be
6
+ available within 30 seconds of speech, including buffering, scheduling and decode.
7
+
8
+ ## Current decision
9
+
10
+ **Hold rollout. Both new flags default off.** Ordinary CLI timestamps plus native
11
+ VAD remapping are promising on the private silver corpus. The historical live
12
+ verbose-JSON and DTW crash mechanisms retain their existing protections.
13
+
14
+ Native probes exercised silence, near silence, a 5 ms clip, empty PCM WAV,
15
+ malformed/truncated input, eight real speech clips, cancellation, Metal
16
+ preemption and CPU retry. Eight remapped clips had finite ordered token clocks;
17
+ some tokens still have zero duration. These are heuristic token timestamps, not
18
+ human-validated word boundaries or speaker identities.
19
+
20
+ A concurrent private probe ran 50 compact-JSON ASR requests and 50 warm ANE
21
+ diarizer runs for each of the baseline and candidate. Candidate ASR p95 was
22
+ 325 ms versus 339 ms; diarizer p95 was 173 ms versus 185 ms. API health p95 rose
23
+ from 53 ms to 87 ms (maximum 220 ms). These small samples do not establish zero
24
+ regression risk. Initial isolated diarizer cold loads timed out; the successful
25
+ comparison used the same warm, isolated model cache for both arms.
26
+
27
+ The CPU batch used production progressive settings: six threads, CPU only and
28
+ macOS background task policy. It took **142.641 seconds**, versus 131.797 seconds
29
+ for baseline. Adding its 36.25-second sealed window gives a first-word delay
30
+ lower bound of **178.891 seconds**, before ingest or queue time. Even the last
31
+ words wait longer than 30 seconds. Foreground CPU and idle Metal timings cannot
32
+ substitute for this production policy.
33
+
34
+ ## Experimental boundaries
35
+
36
+ - `COS_BATCH_HQ_TIMESTAMPS=1` applies only to meeting batch CLI decoding. It omits
37
+ `--no-timestamps` and preserves native diagnostics needed for the exact VAD
38
+ table. Timestamp mode partitions checkpoint fingerprints. Missing JSON or
39
+ timing evidence fails closed; rollback uses the existing legacy decoder.
40
+ - `COS_MEETING_ASK_HQ_EVIDENCE=1` additionally requires timestamps and
41
+ `COS_MEETING_PROGRESSIVE_HQ=1`. Ask reads completed sealed checkpoints; it
42
+ never starts a decode. Audio hash, configuration, context chain, session and
43
+ ASR completion must match. Runtime coverage/number/clock guards catch obvious
44
+ corruption; they cannot establish semantic accuracy.
45
+ - Current Control submits live turns directly. Refinement occurs at v2 request
46
+ admission and in the optional transcript endpoint. Latest uncovered turns are
47
+ retained. Refined source IDs point to the first original chunk. Mixed voices
48
+ use `Unidentified`; no owner is inferred from guessed token attribution.
49
+ - A request's submitted fingerprint remains unchanged. The answer's saved source
50
+ text records the evidence used. A retry reuses the saved exchange even if new
51
+ checkpoints arrive. Files, web search policy and answer model are unchanged.
52
+ - The legacy live-ask endpoint retains its original transcript behavior.
53
+
54
+ ## Repeatable checks
55
+
56
+ From the isolated server worktree:
57
+
58
+ ```sh
59
+ npm run typecheck
60
+ npm test
61
+ npm run mutation:gate -- asr-canary-raw-clock asr-canary-native-count \
62
+ asr-canary-lost-tail asr-canary-changed-number \
63
+ asr-canary-control-bypasses-refinement asr-canary-future-evidence \
64
+ asr-canary-stale-cache
65
+ ```
66
+
67
+ The native workers are excluded from the npm package. They require an explicit
68
+ private `COS_ASR_CANARY_ROOT`, `COS_DATA_DIR`, `COS_PROFILE_PATH`, and a read-only
69
+ `COS_ASR_CANARY_ACTIVE_DIR` pointing at the real server's active-session directory.
70
+ Data, profile, audio and outputs must reside under the private root. The guard
71
+ refuses work during a real meeting and aborts owned work if one starts. Native
72
+ results and audio stay outside this public repository.
73
+
74
+ ```sh
75
+ node --import tsx/esm server/scripts/hq-native-canary.ts INPUT.wav OUTPUT.json cpu
76
+ # Other modes: metal, abort, preempt. Set the timestamp flag for candidate runs.
77
+ ```
78
+
79
+ The contention worker additionally requires a separately owned persistent
80
+ Whisper server at `COS_ASR_CANARY_PORT=18278`, an offline `COS_NEMOTRON_CLI` wrapper,
81
+ and explicit `COS_NEMOTRON_MODELS`. The wrapper must preserve the isolated
82
+ CoreFoundation home, model cache and network-denying sandbox. It accepts a batch
83
+ WAV, live-chunk WAV and output JSON path. It reads the actual API health endpoint
84
+ but never starts, restarts or sends transcription to the real live server.
85
+
86
+ ## Required before adoption
87
+
88
+ 1. Replace machine reference drafts with human-corrected transcripts across the
89
+ four speech strata and at least 200 verified entity mentions. Add question
90
+ fixtures for negation, changed decisions, numbers, owners and deadlines.
91
+ 2. Replay the actual capture-to-Ask pipeline on at least 13 meetings. Include
92
+ buffering, queue time, CPU fallback, concurrent ASR/diarization and time to
93
+ refined evidence. A faster preview estimate excludes lookahead and is not
94
+ this measurement. The current sealed-HQ mechanism fails this requirement.
95
+ 3. Preserve quality gains in the same production path, with paired meeting
96
+ confidence intervals and non-speech positive controls. Prompt removal was
97
+ rejected: WER rose from 15.47% to 16.87% on 13 paired silver windows. Its
98
+ confidence interval includes zero, so this is a rejection of qualification,
99
+ not proof that every use of a shorter prompt is worse.
100
+ 4. Repeat native failure/cancellation checks and confirm saved raw audio and
101
+ canonical transcript survive. Include cold start and longer thermal runs.
102
+
103
+ No flag, silver score, unit test or native probe grants deployment approval.
@@ -0,0 +1,111 @@
1
+ # Server 6.71.2 combined test plan
2
+
3
+ Private candidate, October 11, 2026. Combines server 6.71.1 (`ce35151`)
4
+ with the transcription canary branch. No client binary changes are included.
5
+ Public distribution and transcription adoption are separate gates.
6
+
7
+ ## Release decision
8
+
9
+ The production live decoder keeps compact JSON and disabled DTW. Both new flags
10
+ remain unset/off: `COS_BATCH_HQ_TIMESTAMPS` and `COS_MEETING_ASK_HQ_EVIDENCE`.
11
+ The legacy batch fingerprint is unchanged with timestamps off. The combined
12
+ server retains the 6.71.1 Meeting Ask features. Do not enable refinement during
13
+ normal meetings until its latency and human accuracy gates pass.
14
+
15
+ ## Automated regression checks
16
+
17
+ Run from the combined worktree, with Vitest's isolated data/profile configuration:
18
+
19
+ ```sh
20
+ npm run typecheck
21
+ npm test
22
+ npm run mutation:gate -- asr-canary-raw-clock asr-canary-native-count \
23
+ asr-canary-lost-tail asr-canary-changed-number \
24
+ asr-canary-control-bypasses-refinement asr-canary-future-evidence \
25
+ asr-canary-stale-cache asr-merge-ended-overlay asr-merge-lost-source
26
+ npm pack --dry-run --json
27
+ ```
28
+
29
+ | Contract | Required result |
30
+ | --- | --- |
31
+ | Disabled flags | Same live transcript response and batch cache identity as the released path; no HQ cache read on GET. |
32
+ | Ended meeting | Saved sidecar IDs, source, duration, ended notice and close time survive with HQ on or off. Active-file and Markdown fallback still work; missing words return the released 404. |
33
+ | Direct Control submission | Refine only admitted, normalized evidence. Saved source quotes reflect the frozen evidence. Original request fingerprint governs retries. |
34
+ | Live tail and cutoff | New uncovered speech remains; no checkpoint ending after the question cutoff may replace evidence. Mixed voices receive no inferred identity. |
35
+ | Phone files | Real uploaded text remains ready/citable beside Control files; secret, unsupported, expired, missing and oversized statuses retain their contracts. |
36
+ | COS lookup | Meaning is default; keyword causes no embedding request. Settings survive restart and malformed updates write nothing. |
37
+ | What to ask | Recent topic gets evidence priority and citation ordering. At most one COS lookup/two model calls; no preset web request escapes to web. |
38
+ | Combined answer | One refined direct request can cite the real phone document, use keyword COS search, preserve notices and replay once without re-running refinement/model. |
39
+ | Capture protections | Compact live JSON, disabled DTW, raw audio persistence, cancellation, Metal preemption and CPU fallback remain covered. |
40
+ | Packaging | Candidate version differs from installed 6.71.1. Private audio, receipts, fixtures, test suites and native canary workers are excluded. |
41
+
42
+ The mutation run must start with a green baseline, reject every selected mutant
43
+ through an assertion failure (not compilation/setup failure), and restore sources.
44
+ Full-suite counts and artifact checksums are recorded in the private release receipt.
45
+
46
+ ## Native evidence carried into this merge
47
+
48
+ The timestamp parser, native batch call and checkpoint validation are unchanged
49
+ from the qualified canary commit `7479e21`; the merge adds the released Ask
50
+ resolver and phone/search work. Previous private probes covered CPU/Metal silence,
51
+ near silence, short/empty/malformed inputs, eight real speech clips, cancellation,
52
+ preemption and CPU retry. Native output clocks were finite/bounded. Some tokens
53
+ have zero duration; these are heuristic token clocks, not precise word boundaries.
54
+
55
+ Concurrent probes used 50 compact-JSON ASR requests and 50 warm ANE diarizer runs
56
+ per arm. ASR p95 was 339 ms baseline / 325 ms candidate; diarizer 185 / 173 ms;
57
+ API health 53 / 87 ms (candidate maximum 220 ms). The cold isolated diarizer failed
58
+ to load in the first bounded attempts; the paired comparison used a warm cache.
59
+ This is limited evidence, not proof of zero regressions or of cold-start safety.
60
+ Repeat native probes if decoder/parser/checkpoint code, native binary, model,
61
+ thread policy or hardware changes. See [transcription qualification](asr-canaries.md).
62
+
63
+ ## Local installed acceptance and client checks
64
+
65
+ Keep the previous managed 6.71.1 generation and package as rollback. Before a
66
+ candidate switch, confirm no active capture or Ask; use the COS Control managed
67
+ runtime installation, never the retired app LaunchAgent installer. Record before
68
+ and after generation/version, exact listener ownership and API/Whisper health.
69
+ New flags must remain off in the installed launch environment.
70
+
71
+ The following require an actual client/device session and remain pending until
72
+ observed; server tests alone do not count:
73
+
74
+ - Start a short controlled meeting. Speak an owner, a number, a negative statement
75
+ and a deadline; change the topic and correct one decision. Verify initial text
76
+ continues immediately and ask about each fact. Check source quote, time and ID.
77
+ - On Control and the current phone build, use Catch me up, Summarize, Action items,
78
+ What to ask and a typed question. Check recent-topic questions and the section
79
+ rendering. Retry one request after navigation; history/export remain consistent.
80
+ - Add a real TXT or PDF text file from the phone and a file from Control. Ask a
81
+ question requiring both meeting text and the file. Verify ready/unsupported
82
+ notices, removal and saved historical citations.
83
+ - Switch COS search to keyword and back. Trigger a COS lookup, check its notice,
84
+ and verify a preset cannot invoke web search. A public typed lookup retains its
85
+ established privacy policy.
86
+ - End and save the meeting; reopen Ask, ask a follow-up, then open an earlier
87
+ source in the transcript. IDs and ended notice must still match.
88
+ - Read the answer on the lens and phone, including sources and scrolling. Capture
89
+ glitches, wrong facts, missing text, crashes or an unhealthy service block release.
90
+
91
+ Rollback the candidate through the managed generation selector if any installed
92
+ regression occurs. Do not delete raw audio, canonical transcripts or Ask history.
93
+
94
+ ## Tangible transcription improvement gate (currently blocked)
95
+
96
+ 1. Human-correct the reference transcripts in all speech strata and verify at
97
+ least 200 entity mentions. ASR silver transcripts cannot certify fact fidelity.
98
+ 2. Replay the actual capture-to-Ask path across at least 13 meetings. Measure
99
+ speech-to-refined-evidence p95 including buffering, ingest, queueing and decode,
100
+ with concurrent capture, diarization, CPU fallback and cold start. It must be
101
+ within the accepted **30 seconds** and preserve the initial live transcript.
102
+ 3. Require paired meeting accuracy gains with uncertainty intervals, plus reliable
103
+ answers for names, amounts, negation, owners, deadlines and changed decisions.
104
+ 4. Run silence/non-speech positive controls, native failures and longer thermal
105
+ contention trials; preserve saved raw audio and canonical transcript hashes.
106
+
107
+ Current production-policy CPU candidate decode took **142.641 seconds** after
108
+ sealing a **36.25-second** window, so the first-word lower bound is **178.891 seconds**
109
+ before ingest/queue time. The sealed window alone exceeds 30 seconds. This blocks
110
+ refinement adoption even though the silver WER improved from 15.718% to 12.986%.
111
+ No ASR engine, prompt or accuracy claim is being promoted by this combined build.
@@ -0,0 +1,30 @@
1
+ # Private meeting-evidence release: 6.71.3 + Glasses 6.10.627 + Control 0.5.285
2
+
3
+ This candidate includes 6.71.2, Glasses 626 and Control 284 without replacing their frozen artifacts. Production aliases and marketplace promotion stay on their current version until physical acceptance. Timestamp and HQ evidence flags remain unset/off.
4
+
5
+ ## Automated gates
6
+
7
+ - Complete server tests and typecheck; complete companion tests, release typecheck and official Even SDK/manufacturer gate; guarded Control setup and Meeting Ask contracts, signed/notarized build and fresh extracted-app Gatekeeper proof.
8
+ - Tools-off Haiku and Sonnet canaries: explicit correction 10 → 12 (exclude 20), truly unresolved proposals, negated approval/commitment. Every answer includes a qualitative confidence note and grounded citations. Names must not be silently normalized. Review semantic answers as well as assertions; lexical assertions are bounded checks, not calibrated accuracy.
9
+ - Replay the submitted transcript and exact question from the user's reported failure with candidate prompt. No canonical transcript or original exchange is overwritten.
10
+ - WKWebView replay at 320×568, 390×844, 844×390 and 390×420: twelve earlier/tail text updates and one new speaker; preserve visible line identity and offset within 1 px; composer, presets, jump and model controls remain reachable. Desktop replay is not physical iPhone acceptance.
11
+ - Optional Jev alone must not keep Finish setup visible. Genuine counted gaps still appear. Existing Hide and Skip choices persist.
12
+ - Calendar suggestions match recording start, never a later current event; stale, all-day, malformed and unrelated events excluded. No auto-confirmed match/domain. Domains come from the install's configured/discovered domain registry, not baked-in business names.
13
+ - Context revision guards and meeting/server isolation; frozen request context on retries and mid-answer domain change; domain-restricted COS retrieval; no calendar/transcript/file words admitted to public web search; no AI call for confirmation.
14
+ - Old clients/new server: 626 and Control 284 accept arbitrary section labels, including Confidence. New app/old server: context button absent without capability; original Ask/files/history remain compatible.
15
+
16
+ ## Physical acceptance
17
+
18
+ 1. Sideload 627. Start a fresh recording, scroll several paragraphs up, wait for validated text and a speaker change. Reading position should remain steady. Jump to now should follow the tail; selection, composer and tab positions should survive.
19
+ 2. Dictate an explicitly labeled test pilot: owner Nora, budget $2,400, deadline Friday October 16; order ten, then twelve replacing ten, not twenty. Ask the original factual question. Expect 12; flag an unclear owner spelling separately. A quantity proposed without a correction remains unresolved. Negated approval must remain negated.
20
+ 3. Run every preset and one typed question. Each new output on phone, Control and lens must include Confidence; low/limited evidence must identify the relevant uncertainty. Sources still open and saved answers retain their original model and context.
21
+ 4. Open Confirm meeting context. Confirm a configured domain and optional suggested calendar event. Next COS lookup must focus on that domain. Switch to All domains/No calendar match and confirm. Reopen the same meeting, then another meeting, to verify persistence and isolation. Calendar does not imply attendance or decisions.
22
+ 5. Stop/save/reopen; retain questions, file revisions and transcript citation IDs. Exercise phone file upload, COS keyword toggle and compact model details inherited from 626/284. Control Finish setup should clear when Jev is its only unfinished row.
23
+
24
+ ## Audio refinement hold
25
+
26
+ Do not enable COS_BATCH_HQ_TIMESTAMPS or COS_MEETING_ASK_HQ_EVIDENCE on this release. Prior CPU end-to-end refinement exceeds the accepted 30-second limit, and the human-reference accuracy set is unfinished. Improvements here are transcript interpretation and display behavior, not proof of improved raw ASR. Future adoption requires paired human references, entity/negation fidelity, real incremental latency including sealing/queue/decode, crash/silence/cancellation and contention canaries, plus fallback to the existing live transcript.
27
+
28
+ ## Rollback
29
+
30
+ Retain server 6.71.2 tarball/generation, EHPK 6.10.626 (f008d422...), and Control 0.5.284 build 337. Update only through the managed helper and only when every active-work/drain gate permits it. Never interrupt a recording or another session to install.
@@ -22,6 +22,8 @@
22
22
  "COS_LIVE_CUES_AUTO",
23
23
  "COS_BATCH_HQ_METAL",
24
24
  "COS_BATCH_HQ_FORCE_CPU",
25
+ "COS_BATCH_HQ_TIMESTAMPS",
26
+ "COS_MEETING_ASK_HQ_EVIDENCE",
25
27
  "COS_WHISPER_PREVIEW_MODEL",
26
28
  "COS_WHISPER_REALTIME_MODEL",
27
29
  "COS_UNSAVED_AUDIO_RETENTION_HOURS",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.70.0",
3
+ "version": "6.71.4",
4
4
  "description": "COS Glasses: self-hosted AI heads-up-display server for Even G2 smart glasses, powered by Claude Code, Codex, Cursor Agent CLI, or local Ollama",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,6 +41,8 @@
41
41
  "shared",
42
42
  "!server/**/*.test.ts",
43
43
  "!server/scripts/engine-canary.ts",
44
+ "!server/scripts/hq-native-canary.ts",
45
+ "!server/scripts/hq-contention-canary.ts",
44
46
  "!server/scripts/live-cos-ask-canary.ts",
45
47
  "!server/scripts/work-review-candidate.ts",
46
48
  "!server/scripts/work-hardening-fixture.ts",
@@ -80,10 +82,14 @@
80
82
  "!server/scripts/build-work-task-runtime.py",
81
83
  "bin/hooks/cos-cursor-observer.cjs",
82
84
  "docs/provider-parity.md",
85
+ "docs/asr-canaries.md",
83
86
  "docs/pairing-contract.md",
84
87
  "docs/pairing-fixture.json",
85
88
  "bin/whisper-runtime.cjs",
86
- "bin/whisper-runtime.d.cts"
89
+ "bin/whisper-runtime.d.cts",
90
+ "docs/test-plan-6.71.2.md",
91
+ "!server/scripts/meeting-evidence-canary.ts",
92
+ "docs/test-plan-6.71.3.md"
87
93
  ],
88
94
  "author": "COS Contributors",
89
95
  "license": "MIT",
@@ -337,11 +337,12 @@ export function mergeContextSearchHits(
337
337
  .slice(0, Math.max(1, Math.min(limit, 50)))
338
338
  }
339
339
 
340
- export async function searchMemories(options: { query: string; limit?: number; signal?: AbortSignal }): Promise<ContextSearchResult> {
340
+ /** `semantic: false` (6.71.1, Meeting Ask "keyword only") skips the embedding search: no query leaves the Mac. */
341
+ export async function searchMemories(options: { query: string; limit?: number; signal?: AbortSignal; semantic?: boolean }): Promise<ContextSearchResult> {
341
342
  const query = options.query.trim()
342
343
  const limit = Math.max(1, Math.min(options.limit ?? 20, 50))
343
344
  const keywordHits = keywordSearchMemories(query)
344
- const semantic = await semanticSearchMemories(query, limit, options.signal)
345
+ const semantic = options.semantic === false ? { hits: [], reason: 'keyword_only' } : await semanticSearchMemories(query, limit, options.signal)
345
346
  return {
346
347
  hits: mergeContextSearchHits(keywordHits, semantic.hits, limit),
347
348
  keywordCount: keywordHits.length,