Skip to content

feat(google-meet): retain the full caption transcript per session (#103387) - #103811

Merged
steipete merged 4 commits into
openclaw:mainfrom
lonexreb:feat/103387-googlemeet-transcript-retention
Jul 12, 2026
Merged

steipete merged 4 commits into
openclaw:mainfrom
lonexreb:feat/103387-googlemeet-transcript-retention

Conversation

@lonexreb

@lonexreb lonexreb commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes #103387.

Google Meet transcribe mode kept only a five-line health tail over a 50-line page buffer. Longer meetings therefore discarded most captions, and external pollers could still miss bursts between reads.

Why This Change Was Made

This is a complete rewrite of the original PR on current main. The issue's maintainer review recommended a plugin-owned, bounded ephemeral stream at the Chrome capture owner rather than poll-side merging or durable storage of sensitive meeting content.

The rewrite therefore:

  • keeps up to 2,000 completed caption lines in the exact tracked Meet tab;
  • exposes cursor reads through googlemeet.transcript, openclaw googlemeet transcript, and the google_meet tool;
  • keeps progressive text pending until its caption lifecycle completes, so a saved cursor cannot skip later text expansion;
  • binds reads to the exact tab, meeting URL, and logical OpenClaw session;
  • serializes overlapping reads and leave finalization, and preserves an absolute cursor across page reload epochs;
  • snapshots before leave and retains only the four most recently ended session transcripts;
  • stores no durable transcript history and adds no config surface.

User Impact

Transcribe-mode users can retrieve the complete bounded session transcript incrementally with --since <next-index> and can still read the four newest ended-session snapshots until the Gateway restarts. droppedLines and evicted make both cap-related loss modes explicit.

Existing status health fields and the five-line recentTranscript tail remain available. Restarting the Gateway, closing the tab before finalization, or exceeding the documented caps can still lose captions by design.

Thanks @lonexreb for the original implementation and contribution.

Evidence

  • Linux Crabbox run run_c54f7805476c: corepack pnpm test extensions/google-meet — 18 files, 243 tests passed.
  • Focused fallback: node scripts/run-vitest.mjs extensions/google-meet/index.test.ts extensions/google-meet/src/cli.test.ts extensions/google-meet/src/transports/chrome.test.ts — 3 files, 180 tests passed.
  • Final structured autoreview: clean, no accepted or actionable findings.
  • Regression coverage includes progressive caption finalization, DOM rerenders, repeated utterances, tab/session isolation, page reload epochs, cursor gaps, concurrent reads/leaves, exact-tab navigation safety, four-session eviction, CLI output, Gateway validation, and agent-tool schema.
  • Live-call gap: the existing Chrome DevTools bridge returned HTTP 403 and Chrome exposed no shareable browser window, so a real Meet call could not be completed in this run. No isolated-profile result is presented as equivalent proof.

@chatgpt-codex-connector

Copy link
Copy Markdown
Contributor

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation plugin: google-meet size: M labels Jul 10, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jul 10, 2026
@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 10, 2026, 10:37 PM ET / July 11, 2026, 02:37 UTC.

Summary
The PR adds bounded in-memory Google Meet caption accumulation with incremental retrieval through a gateway method, tool action, CLI command, regression tests, and documentation.

PR surface: Source +377, Tests +537, Docs +12. Total +926 across 7 files.

Reproducibility: yes. for the existing limitation: current source and shipped behavior provide a high-confidence path showing only a bounded page buffer and five-line exposed tail. No live setup has reproduced the proposed after-fix behavior.

Review metrics: 2 noteworthy metrics.

  • New public retrieval surfaces: 1 gateway method, 1 tool action, 1 CLI command. All three surfaces establish a new plugin API contract and must retain identical cursor and loss semantics.
  • New fixed runtime policies: 4 added. The 2000-line cap, 512-key dedupe cap, four-ended-session retention, and 20-second drain govern data loss, memory, and recurring browser work.

Stored data model
Persistent data-model change detected: serialized state: extensions/google-meet/index.test.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #103387
Summary: This PR is the direct implementation candidate for the open Google Meet transcript-retention feature issue.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🐚 platinum hermit
Result: blocked until real behavior proof from a real setup is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Provide redacted live captioned-Meet evidence covering progressive text, unattended rollover, incremental retrieval, explicit leave, remote end, and post-meeting access.
  • Obtain the feature owner's decision on bounded memory versus durable transcript storage.
  • Rebase onto current main and trigger a fresh exact-head review.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR provides extensive stubbed browser-proxy tests but explicitly lacks a live captioned Google Meet run; add redacted live output, logs, or a recording, update the PR body to trigger review, or ask a maintainer for @clawsweeper re-review.

Risk before merge

  • [P1] The new API intentionally loses transcript history on gateway restart, after the 2000-line cap, and when more than four ended sessions are retained; those are product-level meeting-record semantics.
  • [P1] Each active transcribe session adds recurring tab discovery, focus, and page evaluation every 20 seconds; stubbed tests do not prove latency, overlap, cleanup, or browser behavior in a real call.
  • [P1] Live Meet caption nodes may update text progressively; the synthetic tests cover exact repeats and scroll-out/reappearance but do not demonstrate that a real utterance is retained once rather than as partial snapshots.
  • [P1] The branch is behind current main and needs an exact-head review refresh after rebase, although the current three-way merge check is conflict-free.

Maintainer options:

  1. Prove and accept the bounded contract (recommended)
    Rebase, obtain feature-owner approval, and add redacted live Meet evidence for progressive captions, rollover, incremental reads, explicit leave, remote end, and post-meeting access.
  2. Persist meeting transcripts
    Replace volatile retention with plugin-owned SQLite or KV and prove restart, cleanup, and cursor behavior before exposing post-meeting retrieval.
  3. Pause the retrieval feature
    Defer or close the PR if maintainers do not want OpenClaw to own either an ephemeral or durable transcript-history contract.

Next step before merge

  • [P1] No remaining line-level defect is proven, but feature-owner product judgment, contributor live proof, and an exact-head refresh are required before merge.

Maintainer decision needed

  • Question: Should Google Meet expose post-meeting transcripts as a runtime-memory-only contract capped at 2000 lines and four ended sessions?
  • Rationale: The implementation can enforce either an explicitly ephemeral contract or durable SQLite storage, but repository policy and source inspection cannot choose how much meeting history users should expect OpenClaw to preserve.
  • Likely owner: steipete — The merged history most strongly connects steipete to the plugin, caption collector, and session-runtime contract.
  • Options:
    • Accept bounded memory (recommended): Keep the current caps and explicit loss signals, require live lifecycle proof, and document restart and eviction loss as supported behavior.
    • Require durable storage: Pause the API and persist transcripts through plugin-owned SQLite or KV before promising post-meeting retrieval.
    • Limit active-session retrieval: Remove post-meeting retention and expose only explicitly ephemeral incremental captions while a session is active.

Security
Cleared: The seven-file patch adds no dependencies, workflow permissions, secret handling, downloads, package metadata, or new third-party code-execution source.

Review details

Best possible solution:

Keep the additive plugin-local API, but merge only after a live captioned Meet run proves clean utterance capture and the full lifecycle, and after the feature owner explicitly accepts the documented bounded-memory loss semantics.

Do we have a high-confidence way to reproduce the issue?

Yes for the existing limitation: current source and shipped behavior provide a high-confidence path showing only a bounded page buffer and five-line exposed tail. No live setup has reproduced the proposed after-fix behavior.

Is this the best way to solve the issue?

Unclear pending proof and owner intent; gateway-side accumulation is the narrowest plugin-local alternative to external poller stitching, but the live caption contract and durability expectations are not yet established.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 5c38f62b27b0.

Label changes

Label justifications:

  • P2: This is a useful plugin-scoped feature with bounded impact, but it is neither an urgent regression nor emergency work.
  • merge-risk: 🚨 session-state: Merging establishes volatile per-session transcript state with restart, line-cap, and ended-session eviction semantics.
  • merge-risk: 🚨 message-delivery: Incorrect live caption mutation, dedupe, or drain behavior could lose, duplicate, or fragment retrieved caption lines.
  • merge-risk: 🚨 availability: The PR adds recurring browser tab focus and page evaluation plus new session-end cleanup that could affect active calls.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR provides extensive stubbed browser-proxy tests but explicitly lacks a live captioned Google Meet run; add redacted live output, logs, or a recording, update the PR body to trigger review, or ask a maintainer for @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +377, Tests +537, Docs +12. Total +926 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 5 385 8 +377
Tests 1 537 0 +537
Docs 1 12 0 +12
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 934 8 +926

Acceptance criteria:

  • [P1] Live captioned Google Meet showing progressive caption text produces clean transcript lines.
  • [P1] Unattended session exceeding the 50-line page buffer without consumer polling.
  • [P1] Incremental openclaw googlemeet transcript <session-id> --since <nextIndex> --json retrieval.
  • [P1] Explicit leave final drain and post-leave transcript access.
  • [P1] Remote meeting-end transition with no subsequent drain polls.

What I checked:

  • Existing limitation remains on main: Current main still keeps at most 50 page-side caption lines and exposes only the last five through recentTranscript, so the linked feature request remains necessary. (extensions/google-meet/src/transports/chrome.ts:531, 5c38f62b27b0)
  • Exact feature patch: The true merge-base-to-head delta is limited to seven Google Meet and documentation files and passes the read-only whitespace check. (94c0f7ebe68a)
  • Prior findings repaired: The head performs a best-effort final health refresh before explicit leave and preserves an eviction tombstone with dropped-line accounting, addressing both findings from the previous review cycle. (extensions/google-meet/src/runtime.ts:660, 94c0f7ebe68a)
  • Bounded transcript lifecycle: The runtime caps transcripts at 2000 lines, bounds dedupe state, drains active transcribe sessions every 20 seconds, retains four ended transcripts, and exposes loss through absolute indices, droppedLines, and evicted. (extensions/google-meet/src/runtime.ts:56, 94c0f7ebe68a)
  • Mock-only validation: The PR body explicitly states that no live captioned Google Meet call was tested; its after-fix evidence consists of the stubbed browser-proxy harness and static checks. (extensions/google-meet/index.test.ts:2546, 94c0f7ebe68a)
  • Current-main merge check: A read-only merge-tree between current main and the PR head completed without conflict diagnostics; GitHub still reports the branch behind, so the rebased head needs review refresh. (94c0f7ebe68a)

Likely related people:

  • steipete: Introduced the Google Meet plugin and transcribe caption-health behavior, then recently changed session ownership in the same runtime. (role: introduced behavior and recent area contributor; confidence: high; commits: c775d6298eff, f221bc85a0c8, f85d438164eb; files: extensions/google-meet/index.ts, extensions/google-meet/src/runtime.ts, extensions/google-meet/src/transports/chrome.ts)
  • BsnizND: Authored merged Google Meet chrome-node bridge cleanup affecting the same session and transport lifecycle. (role: adjacent session-lifecycle contributor; confidence: medium; commits: f2a17b299119; files: extensions/google-meet/src/runtime.ts, extensions/google-meet/src/transports/chrome.ts)
  • vincentkoc: Authored malformed browser-status parsing hardening relevant to the new transcriptWindow transport contract. (role: adjacent transport contributor; confidence: medium; commits: ae0cb0ac6fd9; files: extensions/google-meet/src/transports/chrome.ts)
  • unayung: Recent merged locale hardening changed the Google Meet automation surface that the caption collector depends on. (role: recent caption-automation contributor; confidence: medium; commits: 5342effebcf7; files: extensions/google-meet/src/transports/chrome.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (10 earlier review cycles; latest 8 shown)
  • reviewed 2026-07-10T23:27:27.899Z sha 189c9c3c6514689fdfc3cc6da0566273eb804dfe :: needs real behavior proof before merge. :: [P2] Reject fractional transcript cursors
  • reviewed 2026-07-10T23:39:30.427Z sha 189c9c3c6514689fdfc3cc6da0566273eb804dfe :: needs real behavior proof before merge. :: [P2] Reject fractional transcript cursors
  • reviewed 2026-07-11T00:12:40.295Z sha 904d4affcf503d4bf5f6b26f03f25bec4d08e4f0 :: needs real behavior proof before merge. :: [P1] Preserve legitimate repeated caption utterances
  • reviewed 2026-07-11T00:39:12.798Z sha 08c0f46e2c8dcce86470f83cbfb05c7fc89f7556 :: needs real behavior proof before merge. :: [P2] Bound transcript retention after sessions end
  • reviewed 2026-07-11T01:09:03.987Z sha a46445d619792031579fb3df94e9b1d21e2ec3cb :: needs real behavior proof before merge. :: [P1] Drain captions before the 50-line page buffer rolls over | [P3] Replace lint-rejected innerText assignments
  • reviewed 2026-07-11T01:33:38.670Z sha 7b28c4f08398a0bfaaedf62a9da6de18f61aa8a8 :: needs real behavior proof before merge. :: [P2] Restrict the drain to caption-capturing sessions | [P2] Stop draining when the Chrome meeting ends remotely
  • reviewed 2026-07-11T01:52:41.611Z sha 295fc197df1cda01fe614a78c44b2e46d96e8c01 :: needs real behavior proof before merge. :: [P2] Retire transcripts when the meeting ends remotely | [P2] Evict transcripts by session end order
  • reviewed 2026-07-11T02:11:28.557Z sha d54ad35140687fa62673dc872149d717c9e28482 :: needs real behavior proof before merge. :: [P1] Drain the final caption window before ending the session | [P2] Expose ended-transcript eviction instead of returning an empty result

@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed the review findings in 3f4ce00b0bd:

  • [P2] Reject invalid transcript cursors — malformed sinceIndex (non-numeric, negative, non-finite) now returns INVALID_REQUEST instead of silently resetting to a full read; regression added (rejects.toThrow("sinceIndex must be a non-negative number")). The CLI already validated --since.
  • [P1 docs] Eviction/restart semantics — docs now state the transcript is runtime-memory only (lost on gateway restart), the 2000-line cap is unrecoverable once trimmed, and startIndex > sinceIndex signals the eviction gap with droppedLines reporting the count.

207/207 plugin tests pass (plus the new cursor rejection), tsgo/oxfmt clean. The bounded runtime-memory-only API direction and live captioned-Meet proof remain maintainer calls, as flagged.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 10, 2026
@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from 3f4ce00 to 189c9c3 Compare July 10, 2026 23:13
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed the P2 (Bound the transcript dedupe state) in 189c9c3c651 and rebased onto current main:

  • The per-session seen key set is now bounded: after every merge it is trimmed (insertion order, oldest first) to max(512, mergedWindow.length). The 512 floor gives a 10x margin over the ≤50-line in-page caption buffer, and the never-below-window rule guarantees a key for a line still visible in the page window always survives the merge — so an overlapping poll can never re-append it. Long sessions no longer grow gateway memory after transcript eviction begins.
  • New eviction-overlap regression: 83 overlapping 50-line windows (2100 unique lines, past both the 512-key bound and the 2000-line cap) followed by a verbatim repeat of the final window — the retained tail is exactly lines 100..2099 with no duplicates, droppedLines=100, cursor indices intact.

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 118/118 pass; tsgo:extensions + oxfmt clean.

Still outstanding and not addressable from this side: the P0 feature-owner call on the runtime-memory-only transcript contract, and live captioned-Meet proof (flagged to the PR author).

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from 189c9c3 to 904d4af Compare July 10, 2026 23:57
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed the new P2 (Reject fractional transcript cursors) in 904d4affcf5 and rebased onto current main:

  • A fractional sinceIndex (e.g. 2.5) is now rejected with INVALID_REQUEST instead of being truncated — truncation would silently re-read a line and break the never-re-read cursor contract. Both the gateway method and the CLI --since path now require a non-negative integer; regressions added for the fractional case alongside the existing negative/non-numeric ones.

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts extensions/google-meet/src/cli.test.ts — 150/150 pass; tsgo:extensions + oxfmt clean.

The P1 transcript-durability contract (restart loss + cap eviction) stays a feature-owner decision, and live captioned-Meet proof stays with the PR author, as flagged.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 11, 2026
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed the new P1 (Preserve legitimate repeated caption utterances) in 08c0f46e2c8:

  • The in-page collector no longer dedupes by speaker+text for the whole page lifetime. Each scrape pass now dedupes only against captions still visible in the previous pass: a line that scrolled out of the caption region and reappears later is a legitimate repeated utterance and is recorded again (with a fresh at, so the gateway-side merge keeps it as a distinct line). This also makes the page-side key state bounded by the visible window instead of growing per meeting.
  • Mid-mutation robustness: a childList tick that momentarily detaches the caption region keeps the previous keys, so re-attached lines still dedupe instead of duplicating.
  • New script-level regression: same line across passes dedupes; a detached-region tick doesn't reset state; a scrolled-out utterance repeated later is recorded again (yes, okay, yes).

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 119/119 pass; tsgo:extensions + oxfmt clean.

The transcript-durability P0/P1 remains the feature-owner call, and live captioned-Meet proof remains with the PR author.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label Jul 11, 2026
@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from 4efab62 to 7b28c4f Compare July 11, 2026 01:20
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed both actionable findings in 7b28c4f0839:

  • [P1] Drain captions before the 50-line page buffer rolls over — active managed-Chrome sessions now run a per-session drain interval (20s, unref'd): the gateway absorbs the page window automatically, so captions no longer depend on a consumer polling status/transcript before the in-page buffer rolls over. The drain starts on join and on session reuse (idempotent — no timer stacking), and stops on leave, on the Twilio ended path, and self-stops if the session is no longer active. New regression with fake timers covers all three asks: rollover (two disjoint 50-line windows, zero consumer polls → all 100 lines retained), reuse (one tick → exactly one browser poll), and leave/end cleanup (no polls after leave).
  • [P3] Lint-rejected innerText assignments — the caption-region test now drives textContent; oxlint is clean on the changed files (including the destructuring rule my first draft tripped).

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 121/121 pass; tsgo:extensions + oxfmt + oxlint clean.

Remaining, unchanged: the volatile durability contract (restart loss, 2000-line cap, 4-ended-session retention window, and no pre-accumulation-loss signal in the cursor response) is one coherent feature-owner acceptance decision; live captioned-Meet proof stays with the PR author.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. label Jul 11, 2026
@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from a0e7adb to 295fc19 Compare July 11, 2026 01:39
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed both drain P2s in 295fc197df1:

  • [P2] Restrict the drain to caption-capturing sessions — the drain now starts only for mode: "transcribe" sessions, matching the page script's captureCaptions = mode === "transcribe" contract; talk-back sessions are never polled for a caption window that cannot exist.
  • [P2] Stop draining when the Chrome meeting ends remotely — after each drain tick, a reported leaveReason in the refreshed browser health (remote kick, host ended the call) stops the interval; no local leave needed. New regression: the tick that observes the remote end is the last browser poll, with zero polls over the following 60s.

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 122/122 pass; tsgo:extensions + oxfmt + oxlint clean.

Unchanged human gates, as consolidated before: feature-owner acceptance of the transcript lifetime semantics (restart loss, 2000-line cap, 4-ended-session window), and live captioned-Meet proof (unattended rollover, incremental retrieval, remote-end cleanup, post-leave access) from the PR author's setup.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from 295fc19 to 67315bc Compare July 11, 2026 01:58
@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from 67315bc to d54ad35 Compare July 11, 2026 02:00
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed both lifecycle P2s in d54ad351406 and rebased onto current main:

  • [P2] Retire transcripts when the meeting ends remotely — a drain tick that observes a leaveReason now ends the session like the Twilio path (state: "ended", note recorded, stop/speaker/health cleanup, drain stopped, transcript retired). Remotely-closed meetings no longer sit "active" forever holding an unevictable transcript, and transcript() stops polling them. The fix also surfaced a subtle stale-replay hazard: merges are now ignored for non-active sessions, so a status refresh on an ended session can't duplicate the transcript tail after retirement drops the dedupe keys — regression covers state transition, note, no-duplicate replay, and no transcript-path polls.
  • [P2] Evict transcripts by session end order — retirement re-inserts the entry so map order becomes end order; the eviction now drops the earliest-ended meeting instead of the earliest-joined one. Regression: five concurrent meetings ended in reverse order — the first to end is evicted, the long-running first-joined one is retained.

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 123/123 pass; tsgo:extensions + oxfmt + oxlint clean.

Unchanged human gates: feature-owner acceptance of the transcript lifetime contract, and live captioned-Meet proof from the PR author.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. label Jul 11, 2026
@lonexreb
lonexreb force-pushed the feat/103387-googlemeet-transcript-retention branch from d54ad35 to 94c0f7e Compare July 11, 2026 02:17
@lonexreb

Copy link
Copy Markdown
Contributor Author

Addressed both findings in 94c0f7ebe68 and rebased onto current main:

  • [P1] Drain the final caption window before ending the session — explicit leave now performs one best-effort health refresh (transcribe-mode, still-active sessions only) before the end transition, so captions that arrived since the last drain tick are absorbed instead of lost; a dead browser can never fail the leave. The remote-end path already merges in the same tick that observes the leaveReason. Regression: a line that appears after the join poll is present post-leave with no consumer poll in between.
  • [P2] Expose ended-transcript eviction instead of returning an empty result — eviction now leaves a near-zero-memory tombstone rather than deleting the entry: droppedLines absorbs every lost line and the response carries evicted: true, so an evicted transcript is distinguishable from an empty one and the existing cursor-loss contract (startIndex > sinceIndex, droppedLines) reports the gap. Tombstones don't consume retention slots. Both eviction regressions assert the flag and count; docs updated with the ended-session retention window, evicted semantics, and the leave-time final drain.

node scripts/run-vitest.mjs run extensions/google-meet/index.test.ts — 124/124 pass; tsgo:extensions + oxfmt + oxlint clean.

Unchanged human gates: feature-owner acceptance of the transcript lifetime contract, and live captioned-Meet proof.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@steipete steipete self-assigned this Jul 12, 2026
@steipete
steipete force-pushed the feat/103387-googlemeet-transcript-retention branch from 94c0f7e to 286f26c Compare July 12, 2026 08:00
@steipete
steipete merged commit 43e138c into openclaw:main Jul 12, 2026
102 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 13, 2026
…enclaw#103387) (openclaw#103811)

* feat(google-meet): retain bounded transcripts

Co-authored-by: lonexreb <reach2shubhankar@gmail.com>

* chore: leave changelog to release tooling

* fix(google-meet): satisfy transcript CI checks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
@lonexreb

Copy link
Copy Markdown
Contributor Author

Post-merge acknowledgement: thank you @solavrc for defining the transcript-retention gap and @steipete for the maintainer rewrite/fixups, rebase, release-note cleanup, CI corrections, and landing work.

The landed squash commit correctly records @lonexreb as author and @steipete as co-author: 43e138c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. plugin: google-meet rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: google-meet: retain the full caption transcript per session (recentTranscript is a 5-line window over a 50-line buffer)

2 participants