@gotcos/glasses-server 6.71.4 → 6.71.9

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
@@ -74,6 +74,10 @@ BIND_HOST=0.0.0.0
74
74
  # unset / other hold both
75
75
  # Keep these here, not only in the LaunchAgent plist: this file survives Update Server.
76
76
  # COS_PERMISSION_BROKER=questions
77
+ # 6.71.7: after Reinstall hooks, stamped interactive questions can wait at the desk
78
+ # while their native dialog stays available. Their card appears at the idle threshold
79
+ # and remains until answer/cancel/expiry. Approvals and old hooks keep the prior rules.
80
+ # Per-hook rollback without reinstall: echo 0 > ~/.cos-glasses/hook-ask-hold
77
81
  # COS_PERMISSION_BROKER_DESK_IDLE_S=90 # never below 30
78
82
  # COS_PERMISSION_BROKER_TIMEOUT_S=110 # clamped to 5..120 (under the hook's 125 s)
79
83
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,32 @@
1
+ ## 6.71.9 · Phone image text in Meeting Ask (candidate)
2
+
3
+ - Read text from phone screenshots and photos locally with Apple Vision on macOS, matching Control Meeting Ask's image-text path. Preserve table row positions and admit extracted text as revisioned F evidence. No extra model call or cloud OCR is introduced.
4
+ - Check the full extract for credentials before truncation. Bound extraction concurrency/time/output; recheck media lifecycle and file revisions after extraction. Cancellation, removal and maintenance cannot revive image evidence. Saved answers keep their admitted revision.
5
+ - Explain unreadable text and extraction failures. This supports image text, not general photo descriptions or video understanding. Small figures and skewed tables still require confirmation.
6
+ - Includes 6.71.8 grounding and the pending 6.71.7 broker update. Existing 629 companions are compatible. Transcription/live-cue flags stay disabled. Acceptance gates: `docs/test-plan-6.71.9.md`.
7
+
8
+ ## 6.71.8 · Grounded Meeting Ask follow-ups (candidate)
9
+
10
+ - Select connected transcript passages so corrections, historical dates, units and hypothetical scenarios stay with their amounts. Broad financial questions retain relevant topics across the recording within the existing evidence budget.
11
+ - Follow-ups recover bounded, server-owned transcript quotations and remove prior request-local citation labels. A later answer cannot lend evidence to an earlier cutoff; changed file revisions are not silently restored. Finalized quotations keep unique citation IDs after recovery.
12
+ - A narrow cash guard withholds hypothetical proceeds presented as current balances, including scenarios split across adjacent audio chunks. Financial summaries distinguish participant reports from verified documents and omit unrelated purchasing boilerplate. No additional model call or automatic web lookup is introduced.
13
+ - Includes the pending 6.71.7 question broker changes and its hook reinstall requirement. Existing companions remain compatible; this server change does not require another EHPK or Control build.
14
+ - Experimental transcription and live-cue flags remain disabled. Candidate replay and release gates: `docs/test-plan-6.71.8.md`. This is not a published release or a claim of general financial fact-checking.
15
+
16
+ ## 6.71.7 · Session questions stay answerable when you step away
17
+
18
+ - After Reinstall hooks in COS Control, interactive AskUserQuestion requests from the new hook can stay pending while the native Mac dialog remains available. With an answering client connected, the glasses card appears when the Mac reaches its desk-idle threshold (90 seconds by default), then stays visible until answered, canceled, expired or handed back. First answer wins.
19
+ - A current hold-capable client poll qualifies the new questions without fresh wearer input. No connected client or recent presence still means Mac-only. Approvals, unstamped hooks and background sessions retain their existing rules. Pending questions poll every three seconds; idle polling remains ten seconds.
20
+ - Disable the new hook rule without reinstalling with `echo 0 > ~/.cos-glasses/hook-ask-hold`. Downgrading to 6.71.5 requires Reinstall hooks afterward. Codex may ask to trust the reinstalled hooks.
21
+ - No Control update or app reinstall is required for the question rule. Companion 6.10.629 separately fixes the Meeting Ask status-row layout jump and includes 628. Physical phone/glasses acceptance remains a release gate. All transcription and grounded-cue experiments stay disabled.
22
+
23
+ ## 6.71.5 · public-topic meeting fact-checks
24
+
25
+ - Meeting Ask can use recent public-topic passages for fact-checks and cost comparisons after an explicit persisted opt-in. It defaults off; private topics, speaker identities, unrelated passages, files, calendar and memory cannot lend search vocabulary. Older companion builds remain compatible.
26
+ - A consented fact-check retrieves the admitted claim before answering. Questions about average costs reserve a further bounded lookup, cite available benchmarks, and distinguish an actual average from one comparable project. Missing dimensions limit precision rather than stopping research.
27
+ - Read at most two linked text pages per search with bounded excerpts, time and bytes. Every destination and redirect is checked and DNS is pinned to the actual connection; no cookies or credentials are sent.
28
+ - Timestamp and HQ transcription canaries remain disabled. This release improves retrieval and interpretation; it does not claim a passed 30-second audio-refinement gate.
29
+
1
30
  ## 6.71.4 · public meeting evidence release
2
31
 
3
32
  - 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.
package/README.md CHANGED
@@ -232,20 +232,16 @@ own) replays rather than repeats.
232
232
  sub-agents omitted) and `recent_turns_more` to the detail payload, read backward from
233
233
  the end of the transcript; without `turns` the payload is unchanged. The glasses use it
234
234
  to scroll back through a running session's conversation.
235
- Since 6.52.0 a session question (the AskUserQuestion card) or a tool approval can be
236
- answered from the glasses or the phone while you are away from the Mac. There is nothing
237
- to reinstall: the hook script is the 6.51.0 one, and the server now answers the URL it
238
- already calls, `POST /api/permission-requests/ask` (hook-token auth, checked before the
239
- body is read; that one method and path is exempt from the API token, nothing else is).
240
- The hook posts only after the desk has been idle 90 s; the server holds the request only
241
- while the desk stays idle and a client that can answer keeps polling, and answers `{}`
242
- (the Mac's own dialog) to everything else at once. A client that never polls (COS
243
- Glasses 6.9.511 and earlier, COS Control) changes nothing.
235
+ Session questions (AskUserQuestion) and tool approvals can be answered from the glasses or phone through `POST /api/permission-requests/ask`. That route uses the per-install hook token checked before the body is read; other routes retain API-token authentication.
236
+
237
+ **6.71.7: Reinstall hooks in COS Control after updating.** The new hook stamps interactive questions with `askHold:1`. When an answering client is connected (a qualifying poll in the last 30 seconds), or wearer presence is still recent, COS holds the question while its native Mac dialog stays available. The card appears on the glasses after the Mac is idle for 90 seconds (the configured desk threshold). Once visible, returning to the desk does not remove it mid-read. The first desk or glasses answer wins; a matching completion, cancellation, session end, expired deadline, disconnected hook or maintenance drain clears it. A connected hold-capable app counts without a fresh touch. Without a connected client or recent presence, the question stays Mac-only.
238
+
239
+ The existing away-hold and hook timeout ceilings still apply; a question never outlives its hook. Approvals, unstamped hooks and background/child sessions keep the older desk-idle and presence rules described below. Roll back only the new question rule with `echo 0 > ~/.cos-glasses/hook-ask-hold` (no reinstall). Restore it with `echo 1 > ~/.cos-glasses/hook-ask-hold`. Downgrading the server requires **Reinstall hooks** again. Until reinstalling, Codex/ Cursor desk-cancel can be unavailable; Codex may request hook trust again. No Control release is needed.
244
240
 
245
241
  The client contract (also at `/api/models` `capabilities.sessionQuestions`):
246
242
 
247
243
  - Poll `GET /api/session-questions?client=glasses` (or `client=phone`) with X-Cos-Token
248
- every `pollIntervalMs` (10,000). Only those two `client` values count as a live
244
+ every `pollIntervalMs` (3,000 while requests are pending; otherwise 10,000). Only those two `client` values count as a live
249
245
  answerer; a poll without `client`, or with any other value, is answered but never
250
246
  counts. A client quiet for `liveWindowMs` (30,000) hands every held request back,
251
247
  except one the away hold holds (6.60.0, below).
@@ -261,10 +257,10 @@ The client contract (also at `/api/models` `capabilities.sessionQuestions`):
261
257
  404 `not_found` after a server restart or once a settled item is pruned (10 minutes);
262
258
  503 during a maintenance drain, when every held item has already gone back to the Mac.
263
259
 
264
- Touching the Mac hands a held request back to its dialog at once; the deadline is 110 s,
260
+ For approvals and unstamped questions, touching the Mac hands a held request back to its dialog at once; the deadline is 110 s,
265
261
  or the away hold's.
266
262
 
267
- **The away hold (6.60.0).** A request that starts while you are away (the desk idle 90 s,
263
+ **The older away hold (6.60.0, retained for approvals and unstamped questions).** A request that starts while you are away (the desk idle 90 s,
268
264
  the same threshold as above) is held for up to 10 minutes, but only when the glasses or the
269
265
  phone that show held questions report that you touched them in the last 30 minutes.
270
266
  The client contract (COS Glasses 6.9.563 and later):
@@ -472,7 +468,7 @@ both), `COS_PERMISSION_BROKER_DESK_IDLE_S` (default 90, never below 30),
472
468
  `COS_PERMISSION_BROKER_AWAY_HOLD_S` (6.60.0: default 600, clamped to 30 through 600, never
473
469
  past the installed hook's wait; `0` turns the away hold off),
474
470
  `COS_PERMISSION_BROKER_AWAY_RECENT_CLIENT_S` (6.60.0: default 1800; the away hold applies
475
- only when a `hold=1` client reported its wearer present within it; under 30 means the 30 s
471
+ for unstamped questions/approvals only when a `hold=1` client reported its wearer present within it; under 30 means the 30 s
476
472
  live window),
477
473
  `COS_DIARIZER` (6.61.0: default `nemotron`; `embedding` keeps the voiceprint only),
478
474
  `COS_NEMOTRON_CLI` and `COS_NEMOTRON_MODELS` (6.61.0: the FluidAudio CLI and its
@@ -886,7 +882,7 @@ BIND_HOST=0.0.0.0 npm run start:server
886
882
  phone disconnects; COS Control's maintenance status counts it (`heldJobs`). The phone sends
887
883
  one prompt at a time, so anything you ask meanwhile waits on the phone behind it. The
888
884
  interrupted run itself is not re-run automatically; retry it if you want it.
889
- - *Session questions never reach the glasses?* The server holds one only when every
885
+ - *Session questions never reach the glasses?* For 6.71.7 stamped questions, reinstall hooks, check the kill switch and a connected answering client; the card appears only after the desk-idle threshold. For older hooks the server holds one only when every
890
886
  gate passes. `/api/health` `permissionBroker.lastFastPath` names the last reason a
891
887
  request went straight to the Mac's dialog: `no_client` (no client could answer: no poll
892
888
  with `client=glasses|phone` and without `hold=1` in the last 30 s, no `hold=1` poll in the
@@ -949,3 +945,32 @@ promoting the matching Control appcast entry.
949
945
  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
946
 
951
947
  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.
948
+
949
+ ### Meeting Ask grounding in server 6.71.8 (candidate)
950
+
951
+ The candidate selects connected transcript passages and recovers bounded original
952
+ quotations for follow-ups. Previous answers' citation labels are removed before
953
+ reasoning so an older label cannot be mistaken for another passage in the new
954
+ selection. Hypothetical cash proceeds are kept separate from current balances,
955
+ including scenarios split across short audio chunks. The guard is deliberately
956
+ narrow: confidence notes and citations do not constitute a financial audit or
957
+ verified tax treatment. Later files enrich a new Ask without rewriting earlier
958
+ answers. Existing companions and COS Control remain compatible; no new EHPK is
959
+ needed for these server changes. Transcription experiments stay disabled. See
960
+ `docs/test-plan-6.71.8.md` for replay, regression and combined release gates.
961
+
962
+ ### Public-topic fact-checks in server 6.71.5
963
+
964
+ Meeting Ask supports an explicit `publicTopics` choice in `/api/meeting-ask/config`. It defaults false; companion 6.10.628 exposes the choice in its Model sheet. Enabling it applies to the next Ask on that paired Mac, including COS Control. A bare “fact-check this” can select a public claim from recent transcript quotations. “How much more is that than the average?” retrieves public cost benchmarks using the previously admitted public topic. Summaries and action presets do not send transcript topics to the web.
965
+
966
+ A tools-off selector proposes the public topic locally through the configured meeting provider. Admission requires selected supporting transcript passages and adjacent ASR fragments, a public category, observed subject words and amounts, and no sensitive details or speaker identity. Generic research terms may be added; unsupported descriptive words are dropped. Only the admitted query reaches web search. Linked pages are untrusted bounded excerpts; answers cite them and state confidence. The selector is semantic, so ambiguous topics are withheld rather than treated as public.
967
+
968
+ The new companion also removes the native-console feedback loop observed during stale bridge errors. Physical iPhone/Even app crash recovery still requires device acceptance. Timestamp/HQ flags remain disabled.
969
+
970
+ ### Meeting Ask phone image text (6.71.9 candidate)
971
+
972
+ On macOS, phone screenshots and photos containing text now use local Apple Vision
973
+ OCR, like Control Meeting Ask. Extracted words become cited file evidence.
974
+ Small numbers and tables may be misread; photos without text are not visually
975
+ interpreted. No new EHPK or Control build is required for existing 629 companions.
976
+ [Acceptance plan](docs/test-plan-6.71.9.md). Experimental transcription flags remain off.
@@ -2,8 +2,8 @@
2
2
  # COS session hook (glasses-server 6.48.0; Cursor Stop follow-up 6.51.0; halt check 6.53.0; single entry 6.53.3; away hold wait 6.60.0; Codex and Cursor parity 6.62.0). Installed into ~/.claude/settings.json by
3
3
  # `--hooks install`; Claude Code runs it with the hook event name as $1 and the event
4
4
  # payload on stdin. It spools one JSON file per event into the hook spool and exits 0
5
- # on every path. Only PermissionRequest ever talks to the server, and only when the
6
- # desk has been idle. Everything else is a file write, so the server being down or
5
+ # on every path. Only PermissionRequest ever talks to the server, for approvals only when the
6
+ # desk has been idle; stamped questions can also wait while the Mac dialog is visible. Everything else is a file write, so the server being down or
7
7
  # restarting never delays a Claude session.
8
8
  #
9
9
  # 6.53.0: PreToolUse is SYNCHRONOUS with no matcher, so the first branch below runs before
@@ -157,9 +157,19 @@ if [ "$EVENT" = PermissionRequest ]; then
157
157
  if [ ${#2} -le 4 ] && [ "$2" -ge 20 ] && [ "$2" -le 3600 ]; then WAIT=$2; STAMP_WAIT=",\"hookWaitS\":$2"; fi ;;
158
158
  esac
159
159
  fi
160
+ # 6.71.x: only a correctly read question from the new script skips the desk fast path.
161
+ # The first tool_name is the payload's own. A failed read keeps the legacy path.
162
+ STAMP_ASK=''
163
+ if [ "$EVENT" = PermissionRequest ] && [ "$(cat "$GH/hook-ask-hold" 2>/dev/null)" != 0 ]; then
164
+ ASK_HEAD=$(head -c 4096 "$T.in")
165
+ case "$ASK_HEAD" in *'"tool_name"'*)
166
+ ASK_TN=${ASK_HEAD#*'"tool_name"'}; ASK_TN=${ASK_TN#"${ASK_TN%%[!:[:space:]]*}"}
167
+ case "$ASK_TN" in '"AskUserQuestion"'*) STAMP_ASK=',"askHold":1' ;; esac ;;
168
+ esac
169
+ fi
160
170
  # 6.62.0: the provider, when the command said it (only the Codex command does).
161
171
  STAMP_PROV=''; [ -z "$PROV" ] || STAMP_PROV=",\"provider\":\"$PROV\""
162
- { printf '{"ts":%s,"ppid":%s,"event":"%s"%s%s,"payload":' "$TS" "$PPID" "$EVENT" "$STAMP_WAIT" "$STAMP_PROV"; cat "$T.in"; printf '}\n'; } > "$T"
172
+ { printf '{"ts":%s,"ppid":%s,"event":"%s"%s%s%s,"payload":' "$TS" "$PPID" "$EVENT" "$STAMP_WAIT" "$STAMP_PROV" "$STAMP_ASK"; cat "$T.in"; printf '}\n'; } > "$T"
163
173
  rm -f "$T.in"
164
174
  # 6.51.0, CURSOR ONLY. Cursor runs this hook from ~/.claude/settings.json for its own
165
175
  # composers, and submits a Stop hook's {"followup_message":...} as that composer's next
@@ -193,9 +203,11 @@ cleanup() { rm -f "$T.req"; }
193
203
  # Desk-active fast path decided HERE (about 30 ms): no HTTP at all when someone is at the
194
204
  # keyboard. An unreadable idle time fails the same way: nothing is contacted, the native
195
205
  # dialog shows.
206
+ if [ -z "$STAMP_ASK" ]; then
196
207
  IDLE_NS=$(ioreg -c IOHIDSystem 2>/dev/null | awk -F'= ' '/HIDIdleTime/{print $2; exit}')
197
208
  DESK_S=$(cat "$GH/hook-desk-idle-s" 2>/dev/null || echo 90)
198
209
  { [ -n "$IDLE_NS" ] && [ "$(( ${IDLE_NS%.*} / 1000000000 ))" -ge "$DESK_S" ]; } || { cleanup; exit 0; }
210
+ fi
199
211
  TOK=$(cat "$GH/hook-token" 2>/dev/null); [ -n "$TOK" ] || { cleanup; exit 0; } # no token, no request
200
212
  PORT=$(cat "$GH/hook-port" 2>/dev/null || echo 3141)
201
213
  # 6.60.0 (QA round 1, W7): curl runs as a tracked child, not only inside $(...), and this
@@ -0,0 +1,47 @@
1
+ # Meeting public-topic fact-check acceptance: server 6.71.5 / companion 6.10.628
2
+
3
+ The server retains 6.71.4 final-evidence behavior and remains compatible with older companion and Control builds. The public-topic setting starts false. Companion 628 exposes explicit consent; the setting is saved on the paired Mac and applies to subsequent Meeting Ask requests, including Control. No background search or preset transcript export is introduced. Timestamp and HQ evidence canaries remain disabled.
4
+
5
+ ## Automated gates
6
+
7
+ - Full server suite, types, production dependency audit and frozen npm inventory; exact published integrity and a fresh-cache installation.
8
+ - Public-topic admission: recent bounded public passages plus adjacent ASR fragments, observed names and amounts, selected passage IDs, no speaker names, no private categories, no secrets, no invented prices. Unsupported descriptive words are filtered. Semantic classification fails closed for ambiguous topics; this is not a guarantee against every classification error.
9
+ - Consent defaults off, validates before persistence, survives restart and freezes at request admission. Identical request IDs keep the original evidence and consent. Comparisons preserve the admitted public subject in the same meeting only.
10
+ - A consented fact-check retrieves the claim before planning. A cost comparison retrieves the claim plus a benchmark, with at most two searches. Links contain page excerpts or explicitly labeled search-result evidence. No page result is treated as instructions.
11
+ - Article retrieval checks public destinations, all DNS addresses and every redirect, pins the verified socket address, excludes cookies and credentials, limits two redirects, 512 KB, 6,000 text characters and five seconds per page. Nontext, oversized, aborted, private and rebinding cases are refused.
12
+ - Normalize a provider's final complete JSON correction and a confidence row without retrying inference. Reject unknown section labels and incomplete trailing JSON. Keep citation validation and one qualitative Confidence row.
13
+ - Companion: strict WebKit suite, types, manufacturer contract, actual final-entry timer-failure probe, no native-console feedback in stale bridge rejection handling, and real WKWebView layouts at four viewport sizes. Preserve typed drafts, immutable uncertain-request retry, files, model choices and transcript anchors.
14
+
15
+ ## Live device script
16
+
17
+ Use the current server and 628 on the iPhone. In Meeting Ask's Model sheet, explicitly select “Use public topics from this meeting.” Read this public claim aloud:
18
+
19
+ > We saw a public report about New York City allocating $750,000 to replace a fire station roof. Someone said that was ten times normal. We do not have the roof area or a contract breakdown.
20
+
21
+ Ask these exact questions separately:
22
+
23
+ 1. “Can you fact check this?” — find and cite the matching public article; distinguish an allocation from a contract and report uncertainty.
24
+ 2. “Compare cost to other similar fixes in that area.” — retrieve benchmarks; cite their scope, dates and geography. Do the permitted lookup without asking whether to search.
25
+ 3. “How much more is that than the average?” — retain the public subject. Calculate the difference, ratio and percentage when a defensible benchmark exists. Otherwise identify a comparable as an example rather than an average; do not claim the 10x assertion is established.
26
+ 4. “What remains unverified?” — flag roof area, scope and noisy numbers; do not infer an ASR correction without evidence.
27
+
28
+ Then switch off public-topic consent. A subjectless fact-check must not export transcript words. A question naming a public topic still follows the existing typed-question search policy.
29
+
30
+ In a separate private test recording, discuss a fictional private client contract and family medical details, then ask “Can you fact check this?” Public-topic consent must not produce a web query for those details. Do not use real credentials or private client data for this device test.
31
+
32
+ During a 10-minute recording, scroll up in Transcript while fresh/refined chunks arrive: the visible passage remains anchored; Jump to now follows live text. Switch Ask/Transcript, lock/unlock, background/foreground and reconnect. Earlier answers, drafts, files and the recording identity remain intact. Check diagnostics after each transition: stale bridge errors must not create a console feedback storm.
33
+
34
+ ## Outstanding physical gate
35
+
36
+ WKWebView probes and the reproduced error-loop negative canary do not establish that the Even host will survive every iPhone/G2 background transition. Public companion promotion requires the device test above. Server and Control can ship independently while the versioned 628 companion remains a private candidate. The frozen 627 artifact and public companion 624 remain available for rollback.
37
+
38
+ ## Public release verification — October 11, 2026
39
+
40
+ - Frozen runtime source: `85a3e61`. Full suite: 424 files, 6,562 passed / two existing skips. Typecheck passed; production dependency audit reported zero vulnerabilities.
41
+ - Published `@gotcos/glasses-server@6.71.5` as latest after official npm web/passkey approval. Registry download and integrity verified; fresh-cache npx installation and launcher help passed.
42
+ - Exact tested tarball: 422 files, 3,981,207 bytes; shasum `24c194244a9ee5ac0b8dbc8c95d379d57f77944c`; integrity `sha512-C9ucAmOVYiN4pB+p7gpKkO6ofw/E0PWXqTRPY8ql3J6sV9wSYsTNWzMQPTYXOfr26KIERegmHW+XpO6dMSl4pA==`.
43
+ - Six actual-provider field replays passed. Haiku fact/compare/average: 27.102 / 39.132 / 33.127 seconds; Sonnet: 21.906 / 31.129 / 28.601 seconds. Both fact-checks found the matching article; both comparisons and average follow-ups executed two public searches, provided evidence confidence and calculated cited example comparisons without claiming an established average. These timings measure research-answer completion, not audio refinement.
44
+ - Eight real-provider privacy/topic-selection canaries passed: six private or injected topics produced no public query; two public topics admitted only observed vocabulary. Classification is not a universal privacy guarantee.
45
+ - The unchanged 624 phone/lens renderers displayed all six answers, confidence and linked article sources. The current Hub main alias remains byte-identical to 624; the repository is private and no anonymous Hub download is claimed.
46
+ - Companion 628 strict suite: 6,949 passed / one skip; types and manufacturer contracts passed. Twenty WKWebView cases passed, including four transcript anchors at zero pixel drift. Final timer-failure and bridge-error feedback gates passed. The iPhone/G2 physical transition and audio-continuity gate remains pending; 628 is a private candidate.
47
+ - Control 0.5.285/build338 is signed, notarized, stapled and publicly downloadable; its full source suite and isolated onboarding with public server 6.71.4 passed. The ZIP SHA-256 is `5dd189f9ce9f7b49a404327a8bf5087de814fc765035122b95a8ed1756173696`. A clean-Mac/TCC/updater-swap test is not claimed.
@@ -0,0 +1,56 @@
1
+ # 6.71.7 / companion 6.10.629 acceptance plan
2
+
3
+ Candidate only. Server base is public 6.71.5; 6.71.6 is reserved by the separate God's Eye session. App base is frozen 628 (5a42294). Control 0.5.285/build338 can manage this update without a new Control build. This plan adds to the 6.71.5/628 meeting and bridge gates; it does not replace them.
4
+
5
+ ## Automated evidence
6
+
7
+ - Desktop D1 passed before building: a synchronous 60-second PermissionRequest hook started at 21:32:43 CDT; the native question was visible and Red was accepted at 21:32:59, before the hook ended at 21:33:43. A second question canceled with Esc while its card had focus; the hook received SIGTERM and no process remained. Esc in the chat composer did not cancel the card. Remote Control remains untested.
8
+ - Complete server suite: 6,574 passed / 2 skipped. A final focused installer/broker pass also covers the previous exact script fixture and current reinstall state.
9
+ - New broker tests compare 144 approval/unstamped admission and tick cases to the actual 6.71.5 implementation. Stamped questions cover connected/no-client, active/idle/unknown desk, 90-second visibility latch, timeout ceilings, canceled hooks, session boundaries/Interrupt, child events, background requests, parallel questions and first-answer races. A desk completion may add either string or array answers to its input without changing which question it settles.
10
+ - Eleven isolated guard mutations are killed by their named assertions after a green baseline. Original source bytes are restored and the release checkout is never mutated.
11
+ - Companion status probe measures 20 updates per Ask/Transcript case at 390x844, 320x568 and 390x420, with long content scrolled above the bottom. Composer position, reading height, scroll position and status height must stay within 0.5 px. The private old-CSS control must fail. Standard/full WebKit-strict tests, release typechecks, manufacturer contracts, startup timer quarantine and package asset hashes must pass on final bundles.
12
+ - Receipts/logs: `/Users/ukaoma/cos-release-candidates/glasses-question-answering-2026-10-11/`. Local automated evidence does not prove stability inside the physical Even host.
13
+
14
+ ## Phone status canary (629 on the current server)
15
+
16
+ 1. Sideload the new **6.10.629** file; preserve 628 for rollback. Start a five-minute G2 recording. Open VIEWS > live meeting > Ask.
17
+ 2. Ask: **“Catch me up on this meeting so far.”** Watch Checking COS appear and disappear. The composer and reading area must stay in place. Scroll up through an answer and repeat the question; your position must stay steady.
18
+ 3. Switch to Transcript, scroll up, and wait through at least two refreshes. New chunks and COS checks must not move the passage you are reading. Jump to live must still work.
19
+ 4. Open the keyboard and repeat in Ask, then hide it. The Ask button remains reachable. Changes caused by opening/closing the keyboard are expected; status polling while it is open must not cause additional movement.
20
+ 5. Briefly disconnect the phone's network. Connection notices remain readable, recording status remains honest, and reconnect restores Ask. A long notice/Retry must be accessible within the scrollable status area.
21
+ 6. Lock the phone for five minutes, return to Even, and verify G2 capture, transcript continuity, reconnect and no crash. Stop/save, reopen the meeting and check the saved transcript and Ask history. Include the original 628 dead-bridge/background gate; a WebKit layout probe does not qualify host crashes.
22
+
23
+ Pass: no status-related movement, no inaccessible controls, no recording loss/crash, and saved evidence/history retained. Record actual observed results rather than assuming a pass.
24
+
25
+ ## Question broker canary (candidate server installed, hooks reinstalled)
26
+
27
+ Install the frozen candidate through the supported Control-managed server path with the retained 6.71.5 generation/tarball available. Do not start an unmanaged second server. Then click **Reinstall hooks** in Control once. A Codex hook-trust prompt, if shown, must be approved by the user. Do not infer that an app upgrade reinstalled server hooks.
28
+
29
+ Use a disposable interactive Claude Desktop Code session and this prompt:
30
+
31
+ > Call AskUserQuestion once with the question "Pick a color" and options Red and Blue, then tell me which I picked.
32
+
33
+ | Test | Action | Required result |
34
+ | --- | --- | --- |
35
+ | T1 desk answer | Answer Red immediately at the Mac, with glasses connected | Native dialog remains usable; model reports Red; no card appears later |
36
+ | T2 step away | Ask again and leave the Mac untouched | Card appears after the configured desk-idle threshold (90 s default), within two 3-second polls; answer Blue from glasses; model reports Blue |
37
+ | T3 return to desk | After T2's card appears, return and answer at the Mac | Card stays until the desk answer, then closes within two polls; no late duplicate answer |
38
+ | T4 quiet wearer | Leave glasses connected but untouched for over 30 minutes, then ask and step away | Connected hold polling still qualifies; the card arrives after desk idle |
39
+ | T5 no answerer | Disconnect all answering clients and ensure no recent wearer presence | Question stays Mac-only immediately; no ten-minute orphan hold |
40
+ | T6 race | In separate runs, answer first at desk, then first on glasses; attempt late answer from the other surface | Exactly one model result; late answer ignored/rejected |
41
+ | T7 Esc | Ask at desk, focus the question card, press Esc | Tool/hook stops; no delayed card, stuck request or stray curl process |
42
+ | T8 approval | Request a harmless permission-controlled tool at desk, then while away | Existing approval policy and return-to-desk handback unchanged |
43
+ | T9 reinstall/provider | Check Claude, Codex and Cursor hook status after reinstall | Current scripts; desk-cancel readiness restored; new question routing only where supported |
44
+ | T10 rollback switch | `echo 0 > ~/.cos-glasses/hook-ask-hold`, then ask at desk | Today's immediate desk rule returns; `echo 1 > ~/.cos-glasses/hook-ask-hold` restores the new rule |
45
+ | T11 old companion | Exercise question cards on frozen public 624 and 627/628 | Existing routes/answer shapes still work; no new client-ID rejection |
46
+ | T12 stop/drain | Cancel a held tool; end its session; perform a controlled server drain | Corresponding card closes; no stale resurrection or orphan request |
47
+
48
+ Known copy limitation: an answer at the Mac may close the old companion card with “Handed back to the Mac.” Answer-source provenance/security is deferred; this build does not require a new client identity header from 627/628.
49
+
50
+ ## Rollout and rollback
51
+
52
+ All physical rows are pending until witnessed. Do not declare a public release qualified from the local checks alone. Preserve other sessions' worktrees, changes and 6.71.6 reservation. Merge only the tested source branches once all required gates pass; publish a frozen npm tarball and promote the companion/Hub only within explicit release authorization.
53
+
54
+ Cue/transcription experiment flags stay off: `COS_LIVE_CUES_FOUNDATION_DEV`, `COS_LIVE_CUES_GROUNDED_V2`, `COS_LIVE_CUES_RESEARCH`, `COS_BATCH_HQ_TIMESTAMPS`, `COS_MEETING_ASK_HQ_EVIDENCE`. Existing `COS_MEETING_PROGRESSIVE_HQ=1` baseline is retained. There is no claim that the experimental transcription or Haiku cues passed accuracy qualification.
55
+
56
+ To roll back the new question behavior quickly, write `0` to `~/.cos-glasses/hook-ask-hold`. To downgrade the server, reinstall retained 6.71.5 through Control and **Reinstall hooks again** (mandatory: the old package does not recognize the new script SHA). Roll the companion back to the preserved versioned 628 EHPK; the server question rule does not require 629. No Control upgrade is necessary.
@@ -0,0 +1,123 @@
1
+ # Server 6.71.8 candidate: Meeting Ask grounding and citations
2
+
3
+ Includes the pending 6.71.7 interactive-question broker update. This plan adds to
4
+ `test-plan-6.71.7.md` and the 6.71.5 web/privacy acceptance gates; none is replaced.
5
+ The candidate is built in `codex/meeting-grounding`, based on `595ebf4`. Server
6
+ 6.71.6 remains reserved for the separate workstream. No public release is implied.
7
+
8
+ ## Behavior and boundaries
9
+
10
+ - Select complete neighborhoods within the existing 32,000-character transcript
11
+ budget. Broad money questions retain corrections, dates, units, balance
12
+ statements and conditional setups across the recording. The last-ten-minutes
13
+ contract for What to ask is unchanged.
14
+ - Prior answers remain navigation context. Strip their request-local citation
15
+ tokens; recover at most 16 server-owned transcript quotations within 6,000
16
+ characters of quoted text and metadata. Current admitted wording wins for the
17
+ same turn. Keep the prior four question/answer pairs bounded. Scope by meeting,
18
+ server instance and audio cutoff. Do not restore old file revisions or invent
19
+ a canonical turn target for finalized quotations.
20
+ - Keep current and recovered transcript IDs distinct from finalized quotation
21
+ IDs. Saved answer records remain immutable. Later uploads enrich a new Ask;
22
+ they do not rewrite an earlier answer.
23
+ - A narrow cash backstop prevents cited hypothetical proceeds from becoming
24
+ current balances or a fabricated conflict with a current screenshot. It carries
25
+ scenario wording across nearby short chunks, preserves explicitly separate
26
+ current evidence, and does not use unrelated liability amounts as cash proof.
27
+ This is not general numeric entailment, tax validation or a financial audit.
28
+ - Prompt guidance preserves explicit corrections while keeping final documents
29
+ unverified, distinguishes historical transactions from proposals, avoids
30
+ guessed bill types and unnecessary ordering language, and favors central
31
+ personal-conversation facts. Confidence remains qualitative on every answer.
32
+ - No additional provider call, new dependency, automatic public lookup, ASR
33
+ rewrite, timestamp configuration or background job is introduced.
34
+
35
+ ## Automated gates
36
+
37
+ 1. Typecheck and the complete server suite on frozen source.
38
+ 2. Regression cases: conditional cash, independent current balances, false
39
+ current-versus-future conflicts, split scenario chunks, correction neighborhoods,
40
+ broad financial retrieval, repeated citation labels, future/cross-meeting
41
+ recovery, forged client source metadata, old file revisions and finalized-ID
42
+ collisions. Existing old-client routes, web consent/privacy, canceled requests,
43
+ completed-record immutability and question broker tests must stay green.
44
+ 3. Isolated mutation gate: stale labels, cross-meeting/future/file recovery,
45
+ disabled cash guard, fragmented evidence, finalized citation collision and
46
+ loss of scenario context. Require a green baseline and assertion failures for
47
+ all eight mutations. Never mutate the release checkout or live data.
48
+ 4. Pack inventory: test files and private recording/replay artifacts are absent;
49
+ the new runtime modules and this plan are present. Verify the frozen tarball
50
+ SHA-256 and a fresh-cache local-tarball CLI help invocation.
51
+
52
+ ## Private recording replay
53
+
54
+ Keep the actual recordings, screenshots, request snapshots, provider answers and
55
+ receipts outside this public repository and npm package. Use the original
56
+ question cutoffs: Summary at 20:59.633 and money highlights at 37:53.548. Later
57
+ financial passages and files must not leak backward into these comparisons.
58
+
59
+ Replay the original selected provider with tools, connectors and hooks disabled,
60
+ using isolated data/audit directories and a 30-second cancellation deadline.
61
+ Compare the original field answers, a fresh baseline, and three candidate money
62
+ answers. Also run one candidate summary and a new Ask with the uploaded files.
63
+ Record all failed rounds; do not replace the original negative evidence with
64
+ only a passing scorecard. Inspect actual prose and supporting quotations: a
65
+ citation-membership check alone does not prove that a claim is true.
66
+
67
+ Required observations:
68
+
69
+ - Conditional proceeds stay conditional; present cash is not invented.
70
+ - The explicit bill correction is available and recognized; the final invoice
71
+ remains unverified. A corrected subissue does not settle the entire bill.
72
+ - Earlier reported savings retain an original quote and a current scoped citation.
73
+ - Historical conversions are distinguished from the later stop-converting stance.
74
+ - A file-aware answer cites the current file revision, distinguishes present
75
+ balances from future scenarios, leaves ambiguous OCR labels unresolved, and
76
+ treats nonmatching exact totals as a discrepancy rather than rounding them equal.
77
+ - One provider call and no public/private search per replay; each observed run
78
+ completes within 30 seconds. This small recording replay is not a general
79
+ latency guarantee or a transcription-accuracy qualification.
80
+
81
+ ## Field acceptance before the combined public release
82
+
83
+ Use the supported COS Control-managed candidate installation path. Preserve the
84
+ known-good 6.71.5 generation; do not start another server. Reinstall hooks once
85
+ because this candidate includes 6.71.7. Complete the existing phone 629 status
86
+ and question-broker acceptance rows in `test-plan-6.71.7.md`.
87
+
88
+ On a saved meeting, ask:
89
+
90
+ > What are the money highlights so far?
91
+
92
+ Then:
93
+
94
+ > Separate current balances, past transactions, and hypothetical plans. Show what
95
+ > still needs confirmation and cite each source.
96
+
97
+ Attach a document or screenshot, then:
98
+
99
+ > Update the highlights using the new file. Which figures are supported by the
100
+ > file, and which were only discussed as possibilities?
101
+
102
+ Open each citation on both phone and Control. It must show the supporting
103
+ quotation/file revision, not the passage that happened to reuse an older number.
104
+ Repeat while new chunks arrive; prior completed answers remain unchanged. Check
105
+ old 624/627/628 companion compatibility and the existing 629 status stability gate.
106
+
107
+ ## Flags, rollout and rollback
108
+
109
+ Keep `COS_BATCH_HQ_TIMESTAMPS`, `COS_MEETING_ASK_HQ_EVIDENCE`,
110
+ `COS_LIVE_CUES_FOUNDATION_DEV`, `COS_LIVE_CUES_GROUNDED_V2` and
111
+ `COS_LIVE_CUES_RESEARCH` disabled. Retain the existing progressive-HQ baseline
112
+ configuration. These changes do not claim better raw transcription.
113
+
114
+ The candidate combines both server updates without altering their other
115
+ worktrees. Merge only tested branches. npm publication, registry integrity,
116
+ clean-cache registry install and marketplace promotion remain separate release
117
+ steps. Assess release notes/docs and current companion/Control compatibility at
118
+ that time. The grounding change needs no new client API or EHPK; frozen 629
119
+ remains the separate phone-status candidate.
120
+
121
+ Rollback: reinstall retained public server 6.71.5 through Control and reinstall
122
+ hooks again. The question-rule off switch from 6.71.7 remains available. Keep the
123
+ previous 628 EHPK and its hash; no completed Ask records are migrated or rewritten.
@@ -0,0 +1,61 @@
1
+ # Server 6.71.9 candidate: phone image text in Meeting Ask
2
+
3
+ Adds to the 6.71.8 grounding, 6.71.7 question-broker and 6.71.5 web/privacy gates.
4
+ Experimental transcription and live-cue flags remain disabled; the released
5
+ progressive HQ baseline remains unchanged. Companion 6.10.629 is compatible;
6
+ no new Control app or EHPK is required for this server addition.
7
+
8
+ ## Behavior
9
+
10
+ Phone screenshots and photos containing text are read locally using macOS Apple
11
+ Vision, like COS Control's Meeting Ask image-text companions. Results become
12
+ revisioned file evidence with F citations. OCR rows preserve spatial association;
13
+ small numbers, merged cells and skewed tables remain imperfect. The assistant
14
+ must distinguish the displayed metric from overall strength or preference.
15
+ This is text extraction, not general visual reasoning. Photos without readable
16
+ text and videos are not silently treated as understood. Non-macOS servers return
17
+ an explicit failed extraction. Existing TXT/MD/CSV/JSON/PDF-text behavior stays.
18
+
19
+ Two OCR processes maximum, 10 seconds per image and 20 seconds per attachment
20
+ batch, bounded output and no network/model call for extraction. Credential checks
21
+ cover the whole extract before truncation. Removal, expiry, reservation, changed
22
+ revisions and maintenance admission are rechecked after OCR. Shutdown aborts and
23
+ waits for extraction. Historical answers retain the revision they actually used.
24
+ Re-add an old unsupported image after installing; old answers are never rewritten.
25
+
26
+ ## Automated gates
27
+
28
+ - Native Apple Vision replay of the actual uploaded IMG_7299.jpeg.
29
+ - Replay the original "Who is miles top character?" and explicit Crit Value
30
+ question with the original transcript cutoff in an isolated Ask/media store.
31
+ Require completion, Mavuika first, named metric, a resolving F citation,
32
+ qualitative confidence, no unsupported overall-strength conclusion and less
33
+ than 30 seconds including OCR. Searches are disabled in this replay.
34
+ - Credential screen labels, gutters and credentials past the text cap; empty and
35
+ failed OCR; retry; concurrent removal/deletion; maintenance/shutdown cancellation;
36
+ durable F evidence; table rows; output bounds; authenticated HTTP route.
37
+ - Full server suite, TypeScript check, production audit, clean diff and packaged
38
+ native JXA helper. Production publish gates still apply.
39
+
40
+ ## Exact phone canary (Claude Sonnet)
41
+
42
+ 1. Open the saved test meeting on the phone. Re-add IMG_7299.jpeg with +. Wait for
43
+ the attachment to become readable. Do not submit before upload/read finishes.
44
+ 2. Ask: "Using the attached image, who is first in the displayed character table,
45
+ and what metric is shown? Cite the image."
46
+ Pass: Mavuika, Crit Value, an expandable image/file citation, uncertainty about
47
+ any unreadable digits. It must not substitute personality or writing style.
48
+ 3. Ask: "Does that prove this is my strongest character overall?"
49
+ Pass: distinguishes the displayed metric from overall strength, with a current
50
+ image citation; no invented damage/build/team assessment.
51
+ 4. Attach a clear screenshot of text or a price list. Ask for one exact visible
52
+ item/amount. Check the original and its citation. Then ask a follow-up.
53
+ 5. Attach a photo without text. Pass: explicitly no readable text; no invented
54
+ visual description. Upload a synthetic credential screenshot (never a real
55
+ password). Pass: held; credential absent from answer and export.
56
+ 6. Check Ask/Transcript, keyboard and background/resume behavior. The image row
57
+ should settle without losing the reading position. Saved history must retain
58
+ answers/citations. Repeat after reopening the saved meeting.
59
+
60
+ Public latest promotion remains gated by phone acceptance and the outstanding
61
+ question-broker / older-client / lifecycle checks from the earlier plans.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotcos/glasses-server",
3
- "version": "6.71.4",
3
+ "version": "6.71.9",
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": {
@@ -89,7 +89,12 @@
89
89
  "bin/whisper-runtime.d.cts",
90
90
  "docs/test-plan-6.71.2.md",
91
91
  "!server/scripts/meeting-evidence-canary.ts",
92
- "docs/test-plan-6.71.3.md"
92
+ "docs/test-plan-6.71.3.md",
93
+ "docs/test-plan-6.71.5.md",
94
+ "docs/test-plan-6.71.7.md",
95
+ "!server/scripts/question-hold-mutation-gate.mjs",
96
+ "docs/test-plan-6.71.8.md",
97
+ "docs/test-plan-6.71.9.md"
93
98
  ],
94
99
  "author": "COS Contributors",
95
100
  "license": "MIT",
package/server/index.ts CHANGED
@@ -24,7 +24,7 @@ import { agentSessionStreamRouter } from './routes/agent-session-stream.js'
24
24
  import { createAttachedTurnStream } from './lib/session-stream-producer.js'
25
25
  import { claudeSessionsRouter } from './routes/claude-sessions.js'
26
26
  import { createSessionHooksRouter } from './routes/session-hooks.js'
27
- import { cachedHookStatus, claudeDeskRunning, onSessionRowEnded, deskIdleSeconds, deskTurnEndedAt, haltHandedOffTurn, providerHookSeen, registerDrainKickStats, registryIdleAfterStop, sessionHooksEnabled, sessionSignalStore, signalFor, startSessionHooksRuntime } from './lib/session-hooks-runtime.js'
27
+ import { cachedHookStatus, isCosSpawnedPid, registryEntrypointSync, claudeDeskRunning, onSessionRowEnded, deskIdleSeconds, deskTurnEndedAt, haltHandedOffTurn, providerHookSeen, registerDrainKickStats, registryIdleAfterStop, sessionHooksEnabled, sessionSignalStore, signalFor, startSessionHooksRuntime } from './lib/session-hooks-runtime.js'
28
28
  import { clearingHaltOnSpawn, writeHaltMarker } from './lib/session-halt.js'
29
29
  import { startProviderObserveRefresh } from './lib/provider-observe.js'
30
30
  import { appendSessionCancelLedger, cancelHoldUntil as cancelHoldUntilFor, noteThreadCancelled, setDeskCancelReaders, threadCancel } from './lib/session-cancel.js'
@@ -277,6 +277,10 @@ const permissionBroker = new PermissionBroker({
277
277
  mode: () => permissionBrokerMode(process.env, sessionHooksEnabled()),
278
278
  admissionsOpen: maintenanceAdmissionsOpen,
279
279
  lastQuestionsPollAt,
280
+ isBackgroundRequest: body => {
281
+ const b = body as { ppid?: number; payload?: {session_id?: string; agent_id?: unknown} }
282
+ return !!b.payload?.agent_id || isCosSpawnedPid(b.ppid ?? null) || registryEntrypointSync(b.payload?.session_id ?? '') === 'sdk-cli'
283
+ },
280
284
  readDeskIdleSeconds: readHidIdleSeconds,
281
285
  deskIdleSeconds,
282
286
  timeoutMs: () => permissionBrokerTimeoutMs(process.env),
@@ -396,6 +396,7 @@ export const HALT_CAPABLE_PRIOR_SCRIPT_SHAS: readonly string[] = [
396
396
  'df54677f79908893509ee87608cfe3f4a53ced03f88f337f16a63741d6b3d547',
397
397
  '0e1bbb9816c9475436f89f6326d5504eccc9aa6519ff5e466b949d53a73d8439',
398
398
  '1877c90c5359571dfc74c6d03395104a73925868147e8a50cd9d7b4226b1b5ca',
399
+ '0fd4f98801333399625701bdc83ed1a5906bbf18c449d0586daa6b8e58ada7f3',
399
400
  ]
400
401
 
401
402
  /**