Inventory + probe the 123 UNMAPPED live RPCs from the registry capture (71 consumer-callable)

Author: teng-linCreated Sep 1, 2026Updated Sep 5, 2026
Labelsenhancement

Summary

A live capture of NotebookLM's RPC-id registry (scripts/capture_rpc_registry.py, run 2026-08-31 against bl=boq_labs-tailwind-frontend) parsed 171 registrations. All 48 ids then in rpc/types.py were CONFIRMED (0 ABSENT, 0 PRESENT-UNPARSED), and every -> Method annotation matched the live bundle exactly.

It also surfaced 123 UNMAPPED live RPCs — declared by the frontend, not exposed by this client. This issue inventories them, prioritises the consumer-callable subset, and tracks live probing on both front doors (web batchexecute and the native Android gRPC channel, which serve the same LabsTailwindOrchestrationService).

Status (2026-09-01): probing is complete — 53 of the 71 consumer-callable ids were live-probed, the remaining 18 are mutating / write-only / realtime and were deliberately left alone. 8 ids shipped as public API (#2291, #2299, #2300), three defects it uncovered are fixed (#2284, #2289, #2290), and the residual follow-ups are listed in comment 8. A strict re-parse of the same bundle found 16 more registrations the scraper dropped (#2289, fixed in #2295), and a walk of the lazy modules found 4 more it still cannot see; the useful ones are probed in comments 4 and 6.

Buckets:

Bucket Count Status
consumer backend (LabsTailwind*) — callable on our cohort, just unexposed 71 probed; see comments 2–8
enterprise (Discovery Engine / Agentspace) — VPC-SC-gated 38 out of scope, not consumer-callable
other / unclassified 14 mostly telemetry + promotions

Consumer-callable inventory (71) — with final disposition

Legend: ✅ works · shipped · gated for this cohort · ⚰️ dead / stub / unimplemented · streaming transport only · ❓ shape unresolved · ⏸️ not probed (mutating)

Sources & upload (10) — comment 2

X1snv    AddSourcesAsync               #2291 sources.add_urls_async()   both front doors (the "impersonation policy" block was the web finalize path with an Android bearer)
QsNTEd   AppendSource                  #2291 sources.append_text()
Z8UXi    CopySources                  ⚰️ dead sync twin — R27wvc CopySourcesAsync (from the #2289 set) shipped instead as sources.copy()
dtT1F    BatchRefreshSources          ✅ accepted on both tiers; candidate replacement for the rejected FLmJqe (#2296 follow-up)
NYrLZ    CreateFailedSource            16 on web; not tried natively
bfVDO    PollSourceDiscoveryStatus    ⚰️ 13 INTERNAL on both transports, incl. with runs in flight
NJVyMd   GetDriveSourceStatus         ⚰️ 12 UNIMPLEMENTED on both front doors
PBKZtb   GetDriveFile                 ❓ two required strings; NOT_FOUND for every consumer id pairing (not the auth tier)
szZSpe   UploadFile                   ✅ works natively, mutating — redundant with the shipped Scotty upload path; do not model
tKY5Tb   RecordNotebookEntrySource    ⚰️ 12 UNIMPLEMENTED on both front doors

Artifacts & studio (15) — comment 3

ExHMqd   ActOnArtifactStreamed         v1 path only
zVGIdd   CopyArtifacts                ⚰️ no-op stub — accepts garbage, copies nothing; never model
mKDdke   CopyArtifactsAsync            #2291 artifacts.copy()
AHyHrd   CreateAudioOverview          ❓ uniform 3; enterprise-switch reference only
sJDbic   DeleteAudioOverview          ❓ DATA [] on [artifact_id], unverified
VUsiyb   GetAudioOverview             ✅ [notebook_id] — notebook-scoped
f3dkp    GenerateTableArtifact        ❓ arg 1 is looked up but is not the notebook id
sqTeoe   GetArtifactCustomizationChoices   #2291 artifacts.get_customization_choices(); account-level; #2284 tripwire replaced
sODAg    GetArtifactDeferredGenerationQuota   7 on the empty request
ulBSjf   GetArtifactUserState         ✅ [ctx, artifact_id]
Fxmvse   UpsertArtifactUserState      ✅ round-trip verified
hRBcub   UpdateArtifactPlan           ❓ envelope known; repeated-item field number open
SHTSY    SuggestArtifacts             ✅ Android-only ("watch next" suggestions); web 16
nRZAQd   ExecuteDeferredGeneration     7 on the empty request
XgrPMd   CancelGeneration             ✅ chat-stream cancel keyed on the stream's clientType=WEB; not gated (earlier "7" was an artifact id at f2)

Magic view / knowledge index (5) — comment 7

uK8f7c   GenerateMagicView             launch gate — 3 before validation on both transports; experiment flag 45701857 false on all profiles
rtY7md   GetMagicView                 ✅ served; 5 NOT_FOUND = nothing generated yet
XpqOp    GetMagicIndex                reclassified: internal, dormant — always []
nmltpc   GenerateKnowledgeTree        reclassified: internal — web 16, Android 3
Tuchcd   IndexKnowledge               reclassified: internal — web 16, Android no-op ack

This is the surface behind MagicArtifactType in _types/enums.py. Park all five; the "Magic Index" UI is the label organiser already shipped as agX4Bc.

Chat & query (4, + 3 recovered via #2289) — comment 4

laWbsf   GenerateFreeFormStreamed     ours — streaming (`_.eC`), v1 path only; full web field map in comment 4
oXwmh    GetChatSessionStatus         ✅ live generation signal keyed on the chat session id (1 idle / 2 generating)
VVafVb   GetQueryFocussedContent      reachable, looked up, empty everywhere; dormant
likKIe   ExecuteWritingFunction       ⚰️ 12 on both transports
OcvKNc*  NextStepSuggestions           #2291 notebooks.suggest_next_steps()
WJkjP*   GetSuggestedArtifactFromChat reachable, always []; wants a turn reference
itA0pc*  GuidebookGenerateAnswer      ⚰️ 12; re-probe on cohort change

Realtime audio / Interactive Mode (2) — comment 7

Of0kDd   GetIceConfig                 ⏸️
eyWvXc   SendSdpOffer                 ⏸️

Research (2) — comment 6

Es3dTe   DiscoverSources               #2299 research.discover() — sync discovery that also records a job
E1lmYc   UpdateDiscoverSourcesStatus  ✅ [ctx?, msg, job_id, 4|5|6]; 5 = finished-nothing-imported, 6 = imported; not yet shipped

Discovery, search & featured (11) — comment 6

GtGWLe   ListProjects                  9 FAILED_PRECONDITION
hdU2Oe   SearchAllNotebooks            7 — shape [query]
iSSZ9e   DiscoveryService.SearchNotebooks   7 — shape [query]
AX2G1c   ComputeTailwindRecommendations    ⚰️ 13 on every shape
ub2Bae   ListFeaturedProjects         ✅ [] — params ignored
DemIHe   UpdateFeaturedNotebookStatus ⏸️ builder shape [notebook_id, bool]
einaIc   UpdateOnlineProjectRankingSignalsAsync  ⏸️
Hq716e   ListAvailableContent         reachable, []
mVtEUb   ListExpertIntelligenceContent   #2300 — Google Play Books library; sources.list_play_books() / add_play_book() (Android add → #2302)
fEkck    AnalyzeNotebook              ⏸️
AUrzMb   GetProjectAnalytics          reachable, [] — [project_id]

Notebook cosmetics (3) — comment 7

U4KVxb   AddCustomNotebookImage       ⏸️
diF09c   AddCustomNotebookImageAsync  ⏸️
wgK8N    GenerateNotebookTitleCard    ⏸️

Account, quota & user state (11) — comment 5

SatQRc   GetAccount                   ✅ [] — side-effect-free twin of ZwVcOc; carries the credit-meter flag Si
gzAChb   GetQuota                     ✅ [ctx] — the enforced per-feature namespace, but no counters (-1 / unset even when exhausted)
EylDcb   ListQuotaSummary             ✅ [ctx] — tier-invariant credit price list over two windows; meter off (Si=false), not accruing
EnujNd   ListModelOptions             reachable, [] — model picker not offered to this cohort
shTref   GetUserAppState              reachable, []
lA7CIe   UpdateUserProfile            ⏸️
LQhfEb   UpdateProjectUserState       ⏸️ builder shape [ctx, project_id, state, mask?]
J1DK9e   BatchGetProjectUserActivities  ❓ uniform 3
preRPe   GenerateAccessToken           16 — the Drive OAuth consent gap; the only genuine credential wall in the inventory
r7Krzb   AddWaitlist                  ⏸️
ANxkT    CheckWaitlist                 9

Sharing (4) — comment 7

n3dkHd   CreateAccessRequest          ⏸️ builder shape [project_id, None, enum, ctx@f4]
bLZXde   ShareArtifact                ⏸️ probably the generic successor to RGP97b ShareAudio — needs a UI capture
OTl0K    ShareGuidebook               ⏸️
LJyzeb   GetGuidebookDetails          ❓ 3 / 13

Telemetry & feedback (4) — comment 7

VdOUQc   LogInteractionEvent          ⏸️
uNyJKe   SubmitFeedback               ⏸️
OmVMXc   ReportContent                ⏸️
CJHszf   RecordTransparencyNotice     ⏸️

* = from the 16 registrations the scraper had dropped (#2289). Four more exist only in lazy module DR4Ugf and are still invisible to the scraper: ASU5Oe RetrieveRelevantChunks (✅ works — semantic chunk retrieval, the best unshipped surface), pGjVxd, Iiyueb, eNlMuc — comment 6 §7.

The two open questions — both answered

  1. GtGWLe ListProjects vs wXbhsf ListRecentlyViewedProjects. GtGWLe parses but is gated (9). The question was settled another way: on a 75-notebook account wXbhsf with include_own_projects = 1 returns 75/75 in one unpaginated call — the union of all three ListNotebooks methods (wXbhsf, fprTef, rBs0R) — while include_own_projects = 0 returns 0 rows. It is the full owned set, not a truncated recents list; keep it (the alternatives are paginated at 20 and drop the embedded source counts). Comment 6 §6.
  2. mVtEUb ListExpertIntelligenceContent. It is the producer for SourceType.EXPERT_INTELLIGENCE (code 20): the account's Google Play Books library, addable as sources via an ExpertIntelligenceContent spec on the ordinary AddSources path. Verified end to end and shipped in #2300; SourceType 20 is now live-observed. Comment 6 §1.

Probing methodology

Read-only probes freely; mutators only with empty requests, well-formed nonexistent ids, or on throwaway scratch notebooks with every effect verified by re-listing. The gRPC status is the signal, calibrated against mapped RPCs (full calibration and the six traps that produced false readings are in comment 1):

Signal Meaning
DATA request converted and the handler answered
code 3 INVALID_ARGUMENT structural refusal (field absent / wrong type / wrong nesting) — or a launch gate refusing before validation
code 5 NOT_FOUND request validated, entity lookup failed — proves the shape
code 7 / 9 parsed, then refused at authorization level — cohort gating (vary the id first: XgrPMd's 7 was "not your session")
code 12 / 13 / 16 the service answered — a backend verdict, not a routing one. Web 16 is usually a front-door restriction that the native Android channel does not have
HTTP 400 id not routable from this frontend — the only "not served here" signal
HTTP 500 streaming-family id (_.eC) over the unary envelope — needs the v1 path

Where the web ladder stalls, the same service is probed over Android gRPC with individual field tags (the "mobile tag oracle"), and where the 1.55.10 APK declares the message (docs/android/schema.proto, #2301) the shape is read from there first.

Live results are consolidated by bucket in comments 1–7, with the overall disposition, corrections log, and remaining follow-ups in comment 8.