@webex/internal-plugin-metrics 3.12.0-next.55 → 3.12.0-next.56

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.
@@ -0,0 +1,626 @@
1
+ {
2
+ "manifest_version": 1,
3
+ "repository": {
4
+ "name": "@webex/internal-plugin-metrics",
5
+ "purpose": "Internal Webex SDK plugin that collects, enriches, batches and submits every SDK-owned telemetry family — legacy client metrics, tagged behavioral/operational/business events, Call Analyzer diagnostic events, WebRTC stats, browser unhandled exceptions and SDK network-request summaries — to the Webex metrics and unified-telemetry services.",
6
+ "category": "cat2-legacy",
7
+ "primary_languages": [
8
+ "typescript",
9
+ "javascript"
10
+ ]
11
+ },
12
+ "topology": "Single-repo",
13
+ "commands": {
14
+ "clone": {
15
+ "command": "git clone https://github.com/webex/webex-js-sdk.git",
16
+ "source_file": "package.json",
17
+ "role": "other"
18
+ },
19
+ "install": {
20
+ "command": "yarn install",
21
+ "source_file": "package.json",
22
+ "role": "install"
23
+ },
24
+ "consumer-install": {
25
+ "command": "npm install --save @webex/internal-plugin-metrics",
26
+ "source_file": "package.json",
27
+ "role": "other"
28
+ },
29
+ "compile": {
30
+ "command": "yarn workspace @webex/internal-plugin-metrics build",
31
+ "source_file": "package.json",
32
+ "role": "compile"
33
+ },
34
+ "package": {
35
+ "command": "yarn workspace @webex/internal-plugin-metrics build:src",
36
+ "source_file": "package.json",
37
+ "role": "package"
38
+ },
39
+ "unit-test": {
40
+ "command": "yarn workspace @webex/internal-plugin-metrics test:unit",
41
+ "source_file": "package.json",
42
+ "role": "unit-test"
43
+ },
44
+ "unit-test-focused": {
45
+ "command": "yarn workspace @webex/internal-plugin-metrics test:unit --targets network-telemetry.ts",
46
+ "source_file": "package.json",
47
+ "role": "other"
48
+ },
49
+ "lint": {
50
+ "command": "yarn workspace @webex/internal-plugin-metrics test:style",
51
+ "source_file": "package.json",
52
+ "role": "lint"
53
+ },
54
+ "build": "[NEEDS HUMAN INPUT] -- the package defines no working full-build-with-tests command. Its `test` script chains test:style && test:unit && test:integration && test:browser, but test:integration and test:browser are not defined in this package's package.json and no test/integration directory exists, so the chain cannot complete. Recorded as unresolved by explicit owner decision rather than substituting test:unit, which would hide the broken aggregate.",
55
+ "deploy": {
56
+ "command": "yarn workspace @webex/internal-plugin-metrics deploy:npm",
57
+ "source_file": "package.json",
58
+ "role": "deploy"
59
+ }
60
+ },
61
+ "toolchain": [
62
+ {
63
+ "name": "node",
64
+ "version": ">=18",
65
+ "origin": "repo-config",
66
+ "source_file": "package.json"
67
+ },
68
+ {
69
+ "name": "node",
70
+ "version": "22.14",
71
+ "origin": "human-declared",
72
+ "declared_by": "rarajes2@cisco.com (repository owner; declared 2026-10-07 as the Node.js version for running this package's tests and build commands from the monorepo, matching the monorepo agent instructions; package.json engines >=18 remains the consumer runtime floor)"
73
+ }
74
+ ],
75
+ "tests": {
76
+ "unit": {
77
+ "command_ref": "unit-test",
78
+ "dir": "test/unit/spec",
79
+ "framework": "mocha"
80
+ }
81
+ },
82
+ "quality_gates": {
83
+ "code_coverage": {
84
+ "origin": "none",
85
+ "declared_by": "rarajes2@cisco.com (repository owner; verified in the 2026-10-05 bootstrap questionnaire that no repo-specific coverage gate applies to this package — its test:unit runs mocha with no threshold, and the package defines no test:coverage script for the CI coverage job to invoke)"
86
+ }
87
+ },
88
+ "coverage_status_definitions": {
89
+ "specced": ">=80% public surface specced, drift <5% — spec is authoritative",
90
+ "partial": "40-80% specced — spec is a hint, cross-check code",
91
+ "untracked": "<40% specced — code is the source of truth"
92
+ },
93
+ "spec_source_policy": {
94
+ "mode": "reconcile",
95
+ "migrated_source_disposition": "retain",
96
+ "disposition_decided_by": "rarajes2@cisco.com",
97
+ "disposition_decided_at": "2026-10-05T06:22:10Z",
98
+ "decided_by": "rarajes2@cisco.com",
99
+ "decided_at": "2026-10-05T06:22:10Z",
100
+ "decision_record": ".generated/sdd/spec-source-policy/decision.md"
101
+ },
102
+ "spec_sources": [
103
+ {
104
+ "path": "README.md",
105
+ "scope": "module",
106
+ "module": "src/",
107
+ "role": "source-material",
108
+ "canonical": false,
109
+ "use_by_agents": "source-for-reconciliation",
110
+ "canonical_target": "src/docs/README.md",
111
+ "post_migration_action": "retain",
112
+ "deletion_status": "not-applicable",
113
+ "notes": "The published npm landing page, and the only source carrying authored design/intent for network telemetry and unhandled-exception telemetry: the request-event flow, the ordered failure-classification table, the endpoint-normalization cardinality rationale, the telemetry self-exclusion rule, and the redaction/metadata rules. Content the code supports is reconciled by meaning into src/docs/README.md and src/unhandled-exception-telemetry/docs/README.md; the Install and focused-test instructions reconcile into docs/getting-started.md. Its two executable blocks were checked under the Migrated Executable Contract Gate: the NetworkTelemetry type block is current and the initialize(...) block is stale. Neither is copied forward; both are replaced by native-declaration links plus current behavior summaries. Retained in place as the npm readme and never a deletion candidate."
114
+ },
115
+ {
116
+ "path": "README.md",
117
+ "scope": "module",
118
+ "module": "src/unhandled-exception-telemetry/",
119
+ "role": "source-material",
120
+ "canonical": false,
121
+ "use_by_agents": "source-for-reconciliation",
122
+ "canonical_target": "src/unhandled-exception-telemetry/docs/README.md",
123
+ "post_migration_action": "retain",
124
+ "deletion_status": "not-applicable",
125
+ "notes": "Module-scope half of the same npm landing page. Its 'Unhandled exception telemetry' section is the only authored source for the browser-only scope limits, the one-second deduplication window, the URL and credential redaction rules, the name/message/stack truncation caps, the getMetadata callback contract and the prohibition on personally identifiable information in metadata. Those units reconcile by meaning into this module's canonical spec; the configuration example is replaced by a native-declaration link plus a current behavior summary. Per-unit routing across both halves is authoritative in the decision record, not in a single primary route."
126
+ },
127
+ {
128
+ "path": "package.json",
129
+ "scope": "reference",
130
+ "role": "reference-only",
131
+ "canonical": false,
132
+ "use_by_agents": "context-only",
133
+ "post_migration_action": "retain",
134
+ "deletion_status": "not-applicable",
135
+ "notes": "Ecosystem-native build and dependency declaration. Linked as the authoritative source for commands, the published entry points and the pinned Call Analyzer event schema; never transcribed into Markdown."
136
+ },
137
+ {
138
+ "path": "src/index.ts",
139
+ "scope": "reference",
140
+ "role": "reference-only",
141
+ "canonical": false,
142
+ "use_by_agents": "context-only",
143
+ "post_migration_action": "retain",
144
+ "deletion_status": "not-applicable",
145
+ "notes": "Ecosystem-native package entry point and export surface. Linked from the contract index and the module specs' Public surface sections as the authoritative export declaration; never transcribed into Markdown."
146
+ }
147
+ ],
148
+ "modules": [
149
+ {
150
+ "path": "src/",
151
+ "coverage_status": "Partial",
152
+ "coverage_evidence": "Canonical spec generated at src/docs/README.md from src/index.ts, src/metrics.js, src/new-metrics.ts, src/generic-metrics.ts, src/batcher.js, src/network-telemetry.ts and src/config.js, with per-requirement unit evidence in test/unit/spec/metrics.js, test/unit/spec/new-metrics.ts, test/unit/spec/network-telemetry.ts, test/unit/spec/batcher.js and test/unit/spec/prelogin-metrics.ts. Held at Partial pending the first generator-side coverage measurement; promotion is a coverage-review decision, not a generation decision.",
153
+ "canonical_spec": "src/docs/README.md",
154
+ "contracts": {
155
+ "provides": [
156
+ "metrics-package-entry",
157
+ "metrics-internal-plugin-sdk",
158
+ "new-metrics-internal-plugin-sdk",
159
+ "metrics-event-types",
160
+ "network-request-summary-metric"
161
+ ],
162
+ "requires": [
163
+ "webex-core-plugin-sdk",
164
+ "webex-core-request-events",
165
+ "webex-metrics-http",
166
+ "call-analyzer-event-schema",
167
+ "call-diagnostic-event",
168
+ "privacy-permission-enricher-sdk",
169
+ "unhandled-exception-metric"
170
+ ]
171
+ },
172
+ "last_assessed": "2026-10-05",
173
+ "section_profile": {
174
+ "has_ui": false,
175
+ "crosses_service_boundaries": true,
176
+ "enforces_domain_rules": true,
177
+ "is_concurrent_async": true,
178
+ "owns_persistence": false,
179
+ "returns_caller_errors": true,
180
+ "has_design_tradeoff": true,
181
+ "stateful_transitions": true,
182
+ "exposes_wire_protocol": true,
183
+ "ui_multi_screen": false,
184
+ "large_data_model": false,
185
+ "has_tiers": false,
186
+ "module_specific_conventions": true,
187
+ "published_package": true,
188
+ "embedded_in_host": true,
189
+ "holds_client_state": true,
190
+ "has_submodules": true,
191
+ "has_submodules_computed_by": "scripts/module_tree.py",
192
+ "has_submodules_computed_at": "2026-10-05T09:08:58Z",
193
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from src/index.ts, src/metrics.js, src/new-metrics.ts, src/network-telemetry.ts and src/config.js)",
194
+ "resolved_at": "2026-10-05T09:06:56Z"
195
+ },
196
+ "source_policy": {
197
+ "mode": "reconcile",
198
+ "existing_sources": [
199
+ "README.md"
200
+ ],
201
+ "conflict_status": "resolved",
202
+ "decision_record": ".generated/sdd/spec-source-policy/decision.md"
203
+ }
204
+ },
205
+ {
206
+ "path": "src/call-diagnostic/",
207
+ "coverage_status": "Partial",
208
+ "coverage_evidence": "Canonical spec generated at src/call-diagnostic/docs/README.md from src/call-diagnostic/call-diagnostic-metrics.ts, src/call-diagnostic/call-diagnostic-metrics-latencies.ts, src/call-diagnostic/call-diagnostic-metrics.util.ts, src/call-diagnostic/call-diagnostic-metrics-batcher.ts and src/call-diagnostic/config.ts, with per-requirement unit evidence in test/unit/spec/call-diagnostic/. Held at Partial pending the first generator-side coverage measurement.",
209
+ "canonical_spec": "src/call-diagnostic/docs/README.md",
210
+ "contracts": {
211
+ "provides": [
212
+ "call-diagnostic-event"
213
+ ],
214
+ "requires": [
215
+ "webex-core-plugin-sdk",
216
+ "webex-metrics-http",
217
+ "call-analyzer-event-schema"
218
+ ]
219
+ },
220
+ "last_assessed": "2026-10-05",
221
+ "section_profile": {
222
+ "has_ui": false,
223
+ "crosses_service_boundaries": true,
224
+ "enforces_domain_rules": true,
225
+ "is_concurrent_async": true,
226
+ "owns_persistence": false,
227
+ "returns_caller_errors": true,
228
+ "has_design_tradeoff": true,
229
+ "stateful_transitions": true,
230
+ "exposes_wire_protocol": true,
231
+ "ui_multi_screen": false,
232
+ "large_data_model": false,
233
+ "has_tiers": false,
234
+ "module_specific_conventions": true,
235
+ "published_package": true,
236
+ "embedded_in_host": false,
237
+ "holds_client_state": true,
238
+ "has_submodules": false,
239
+ "has_submodules_computed_by": "scripts/module_tree.py",
240
+ "has_submodules_computed_at": "2026-10-05T09:08:58Z",
241
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from src/call-diagnostic/)",
242
+ "resolved_at": "2026-10-05T09:06:56Z"
243
+ }
244
+ },
245
+ {
246
+ "path": "src/privacy-and-security-permission-enricher/",
247
+ "coverage_status": "Partial",
248
+ "coverage_evidence": "Canonical spec generated at src/privacy-and-security-permission-enricher/docs/README.md from the module's index.ts, constants.ts, types.ts and utils.ts, with per-requirement unit evidence in test/unit/spec/privacy-and-security-permission-enricher.ts. Held at Partial pending the first generator-side coverage measurement.",
249
+ "canonical_spec": "src/privacy-and-security-permission-enricher/docs/README.md",
250
+ "contracts": {
251
+ "provides": [
252
+ "privacy-permission-enricher-sdk"
253
+ ],
254
+ "requires": [
255
+ "call-analyzer-event-schema"
256
+ ]
257
+ },
258
+ "last_assessed": "2026-10-05",
259
+ "section_profile": {
260
+ "has_ui": false,
261
+ "crosses_service_boundaries": false,
262
+ "enforces_domain_rules": true,
263
+ "is_concurrent_async": false,
264
+ "owns_persistence": false,
265
+ "returns_caller_errors": false,
266
+ "has_design_tradeoff": true,
267
+ "stateful_transitions": true,
268
+ "exposes_wire_protocol": false,
269
+ "ui_multi_screen": false,
270
+ "large_data_model": false,
271
+ "has_tiers": false,
272
+ "module_specific_conventions": true,
273
+ "published_package": false,
274
+ "embedded_in_host": false,
275
+ "holds_client_state": true,
276
+ "has_submodules": false,
277
+ "has_submodules_computed_by": "scripts/module_tree.py",
278
+ "has_submodules_computed_at": "2026-10-05T09:08:58Z",
279
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from src/privacy-and-security-permission-enricher/)",
280
+ "resolved_at": "2026-10-05T09:06:56Z"
281
+ }
282
+ },
283
+ {
284
+ "path": "src/rtcMetrics/",
285
+ "coverage_status": "Partial",
286
+ "coverage_evidence": "Canonical spec generated at src/rtcMetrics/docs/README.md from src/rtcMetrics/index.ts and src/rtcMetrics/constants.ts, with per-requirement unit evidence in test/unit/spec/rtcMetrics/index.ts. Held at Partial pending the first generator-side coverage measurement.",
287
+ "canonical_spec": "src/rtcMetrics/docs/README.md",
288
+ "contracts": {
289
+ "provides": [
290
+ "rtc-metrics-payload"
291
+ ],
292
+ "requires": [
293
+ "webex-unified-telemetry-http"
294
+ ]
295
+ },
296
+ "last_assessed": "2026-10-05",
297
+ "section_profile": {
298
+ "has_ui": false,
299
+ "crosses_service_boundaries": true,
300
+ "enforces_domain_rules": true,
301
+ "is_concurrent_async": true,
302
+ "owns_persistence": false,
303
+ "returns_caller_errors": false,
304
+ "has_design_tradeoff": true,
305
+ "stateful_transitions": true,
306
+ "exposes_wire_protocol": true,
307
+ "ui_multi_screen": false,
308
+ "large_data_model": false,
309
+ "has_tiers": false,
310
+ "module_specific_conventions": true,
311
+ "published_package": true,
312
+ "embedded_in_host": false,
313
+ "holds_client_state": true,
314
+ "has_submodules": false,
315
+ "has_submodules_computed_by": "scripts/module_tree.py",
316
+ "has_submodules_computed_at": "2026-10-05T09:08:58Z",
317
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from src/rtcMetrics/)",
318
+ "resolved_at": "2026-10-05T09:06:56Z"
319
+ }
320
+ },
321
+ {
322
+ "path": "src/unhandled-exception-telemetry/",
323
+ "coverage_status": "Partial",
324
+ "coverage_evidence": "Canonical spec generated at src/unhandled-exception-telemetry/docs/README.md from src/unhandled-exception-telemetry/index.ts and src/unhandled-exception-telemetry/utils.ts, reconciled with the authored README.md section, with per-requirement unit evidence in test/unit/spec/unhandled-exception-telemetry.ts and test/unit/spec/unhandled-exception-telemetry/utils.ts. Held at Partial pending the first generator-side coverage measurement.",
325
+ "canonical_spec": "src/unhandled-exception-telemetry/docs/README.md",
326
+ "contracts": {
327
+ "provides": [
328
+ "unhandled-exception-metric"
329
+ ],
330
+ "requires": [
331
+ "metrics-internal-plugin-sdk"
332
+ ]
333
+ },
334
+ "last_assessed": "2026-10-05",
335
+ "section_profile": {
336
+ "has_ui": false,
337
+ "crosses_service_boundaries": true,
338
+ "enforces_domain_rules": true,
339
+ "is_concurrent_async": true,
340
+ "owns_persistence": false,
341
+ "returns_caller_errors": false,
342
+ "has_design_tradeoff": true,
343
+ "stateful_transitions": true,
344
+ "exposes_wire_protocol": true,
345
+ "ui_multi_screen": false,
346
+ "large_data_model": false,
347
+ "has_tiers": false,
348
+ "module_specific_conventions": true,
349
+ "published_package": false,
350
+ "embedded_in_host": false,
351
+ "holds_client_state": true,
352
+ "has_submodules": false,
353
+ "has_submodules_computed_by": "scripts/module_tree.py",
354
+ "has_submodules_computed_at": "2026-10-05T09:08:58Z",
355
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from src/unhandled-exception-telemetry/ and the routed README.md section)",
356
+ "resolved_at": "2026-10-05T09:06:56Z"
357
+ },
358
+ "source_policy": {
359
+ "mode": "reconcile",
360
+ "existing_sources": [
361
+ "README.md"
362
+ ],
363
+ "conflict_status": "resolved",
364
+ "decision_record": ".generated/sdd/spec-source-policy/decision.md"
365
+ }
366
+ }
367
+ ],
368
+ "contract_catalog": {
369
+ "index_path": "docs/architecture.md",
370
+ "definitions": {
371
+ "metrics-package-entry": {
372
+ "kind": "sdk",
373
+ "publication": "internal",
374
+ "source_kind": "repository-path",
375
+ "source": "src/index.ts",
376
+ "summary": "Package entry point. Calls registerInternalPlugin('metrics', Metrics, {config, onBeforeLogout}) and registerInternalPlugin('newMetrics', NewMetrics, {config}), and re-exports the plugin default plus the named helper, class and type surface. Importing the package is what makes webex.internal.metrics and webex.internal.newMetrics available."
377
+ },
378
+ "metrics-internal-plugin-sdk": {
379
+ "kind": "sdk",
380
+ "publication": "internal",
381
+ "source_kind": "repository-path",
382
+ "source": "src/metrics.js",
383
+ "summary": "Legacy internal plugin surface reached as webex.internal.metrics: submit, submitClientMetrics, getClientMetricsPayload, aliasUser, the four network-telemetry operations (flushNetworkTelemetry, stopNetworkTelemetry and the record* request-event handlers) and the three Batcher children."
384
+ },
385
+ "new-metrics-internal-plugin-sdk": {
386
+ "kind": "sdk",
387
+ "publication": "internal",
388
+ "source_kind": "repository-path",
389
+ "source": "src/new-metrics.ts",
390
+ "summary": "Current internal plugin surface reached as webex.internal.newMetrics. Single façade over Call Analyzer client/feature/MQE submission, behavioral/operational/business/pre-login tagged events, readiness probes, delayed-submission control, permission enrichment and the beforeunload fetch path."
391
+ },
392
+ "metrics-event-types": {
393
+ "kind": "sdk",
394
+ "publication": "internal",
395
+ "source_kind": "repository-path",
396
+ "source": "src/metrics.types.ts",
397
+ "summary": "Exported TypeScript surface for every event family: the Event/ClientEvent/FeatureEvent/MediaQualityEvent envelopes, the Submit* call signatures, PreComputedLatencies, PrivacyAndSecurityPermission and the Table enum. Derived from @webex/event-dictionary-ts rather than hand-declared."
398
+ },
399
+ "network-request-summary-metric": {
400
+ "kind": "event",
401
+ "publication": "internal",
402
+ "source_kind": "repository-path",
403
+ "source": "src/network-telemetry.ts",
404
+ "summary": "The JS_SDK_NETWORK_REQUEST_SUMMARY operational client metric: a per-window aggregate of SDK request outcomes carrying metricsSummary, per host+endPoint metrics with average/p90/p99 network duration, grouped errorMetrics with bounded trackingIds, and errorMetricsSummary by status code."
405
+ },
406
+ "call-diagnostic-event": {
407
+ "kind": "event",
408
+ "publication": "internal",
409
+ "source_kind": "repository-path",
410
+ "source": "src/call-diagnostic/call-diagnostic-metrics.ts",
411
+ "summary": "The Call Analyzer event envelope this module builds and submits: eventId, version, origin, originTime, senderCountryCode and the client, feature or media-quality event body, typed ['diagnostic-event'] for client events and ['business'] for feature events."
412
+ },
413
+ "privacy-permission-enricher-sdk": {
414
+ "kind": "sdk",
415
+ "publication": "internal",
416
+ "source_kind": "repository-path",
417
+ "source": "src/privacy-and-security-permission-enricher/index.ts",
418
+ "summary": "Internal enrichment surface consumed only by src/new-metrics.ts: setPermission stores the latest normalized browser permission snapshot and enrich returns either the original client-event payload or a copy carrying the per-scope permission delta."
419
+ },
420
+ "rtc-metrics-payload": {
421
+ "kind": "event",
422
+ "publication": "internal",
423
+ "source_kind": "repository-path",
424
+ "source": "src/rtcMetrics/index.ts",
425
+ "summary": "The webrtcMedia metric batch posted to the unified telemetry service: type, version, userId, correlationId, connectionId, either meetingId or callId, and the queued WCME metric items with candidate IP addresses anonymized."
426
+ },
427
+ "unhandled-exception-metric": {
428
+ "kind": "event",
429
+ "publication": "internal",
430
+ "source_kind": "repository-path",
431
+ "source": "src/unhandled-exception-telemetry/index.ts",
432
+ "summary": "The JS_SDK_OBSERVED_CLIENT_UNHANDLED_EXCEPTION client metric: schemaVersion 1 with capturedAt, eventId, occurrenceCount, common app/runtime fields, the sanitized error details plus deduplication fingerprint, and optional application metadata or a metadataCaptureStatus reason."
433
+ },
434
+ "webex-core-plugin-sdk": {
435
+ "kind": "sdk",
436
+ "publication": "internal",
437
+ "source_kind": "external",
438
+ "source": "@webex/webex-core (workspace package; WebexPlugin, StatelessWebexPlugin, Batcher, WebexHttpError and registerInternalPlugin)",
439
+ "summary": "Sibling workspace package supplying the plugin base classes, the Batcher queue/retry machinery and the internal-plugin registration entry point. Declared as a workspace dependency in package.json."
440
+ },
441
+ "webex-core-request-events": {
442
+ "kind": "event",
443
+ "publication": "internal",
444
+ "source_kind": "external",
445
+ "source": "@webex/webex-core request pipeline events request:start, request:success and request:failure emitted on the WebexCore instance",
446
+ "summary": "SDK-wide request lifecycle events this plugin subscribes to for network telemetry. Owned by the core request pipeline, not by this package, and carrying no shared TypeScript contract — src/network-telemetry.ts declares a local structural type for only the fields telemetry reads."
447
+ },
448
+ "webex-metrics-http": {
449
+ "kind": "http",
450
+ "publication": "published",
451
+ "source_kind": "external",
452
+ "source": "Webex metrics service (service 'metrics'; resources 'metrics', 'clientmetrics' and 'clientmetrics-prelogin', pre-discovery URL in src/config.js)",
453
+ "summary": "Upstream Webex metrics ingestion API every batcher posts to. Owned by the metrics service, not by this repository. The clientmetrics-prelogin resource is called unauthenticated with an x-prelogin-userid header."
454
+ },
455
+ "webex-unified-telemetry-http": {
456
+ "kind": "http",
457
+ "publication": "published",
458
+ "source_kind": "external",
459
+ "source": "Webex unified telemetry service (service 'unifiedTelemetry', resource 'metric/v2')",
460
+ "summary": "Upstream unified telemetry ingestion API consumed only by the WebRTC stats reporter, with the webrtcMedia type and a fixed application identifier header. Owned by the telemetry service, not by this repository."
461
+ },
462
+ "call-analyzer-event-schema": {
463
+ "kind": "file",
464
+ "publication": "published",
465
+ "source_kind": "external",
466
+ "source": "@webex/event-dictionary-ts (pinned in package.json; RawEvent, RawClientEvent and the event-name unions imported by src/metrics.types.ts)",
467
+ "summary": "Externally owned Call Analyzer event schema. It is the authoritative definition of every diagnostic event name and payload field; this package derives its exported types from it and must not restate field-level detail."
468
+ }
469
+ }
470
+ },
471
+ "spec_policy": {
472
+ "require_what_and_why": true,
473
+ "require_provenance": true,
474
+ "protected_specs": [
475
+ "src/docs/README.md",
476
+ "src/call-diagnostic/docs/README.md",
477
+ "src/privacy-and-security-permission-enricher/docs/README.md",
478
+ "src/rtcMetrics/docs/README.md",
479
+ "src/unhandled-exception-telemetry/docs/README.md"
480
+ ]
481
+ },
482
+ "validation": {
483
+ "generator_runtime": "claude-code",
484
+ "generator_model": "claude-opus-5",
485
+ "generator_run_id": "fe09609b-469d-498e-965b-69cb2832f51a",
486
+ "generator_runtime_source": "host-metadata",
487
+ "minimum_independence": "different-runtime",
488
+ "blocking_severities": [
489
+ "Blocking"
490
+ ],
491
+ "source_commit": "d6202dd73d",
492
+ "base_ref": "master",
493
+ "head_ref": "sdd-internal-plugin-metrics",
494
+ "validator_runtime": "01a1147a-c744-7083-9b15-95e91170c79a",
495
+ "validator_run_id": "01a1147a-c744-7083-9b15-95e91170c79a",
496
+ "validator_runtime_source": "invocation-input",
497
+ "runtime_fallback_tier": "different-runtime"
498
+ },
499
+ "layout": {
500
+ "sdd_root": ".sdd",
501
+ "docs_root": "docs",
502
+ "agent_entry_path": "AGENTS.md",
503
+ "standing_docs_root": "docs",
504
+ "spec_index_path": "docs/specs/README.md",
505
+ "module_docs_strategy": "source-local",
506
+ "module_docs_relative_path": "docs/README.md",
507
+ "module_docs_decision": {
508
+ "basis": "repo-standards-default",
509
+ "reason": "The package owns no pre-existing module-local documentation convention and no protected file occupies any source-local route. Markdown is excluded from the inherited eslint configuration in .eslintrc.js, so test:style is unaffected, and no ignore rule covers packages/**/docs. The repo-standards default <module-path>/docs/README.md therefore applies unchanged to all five modules.",
510
+ "decided_by": "rarajes2@cisco.com",
511
+ "decided_at": "2026-10-05T06:22:10Z"
512
+ },
513
+ "repo_context_decision": {
514
+ "path": ".repo-context.json",
515
+ "schema_path": "schemas/repo-context.schema.json",
516
+ "action": "create",
517
+ "schema_action": "create",
518
+ "reason": "Neither the repository operational-context manifest nor its schema exists at its fixed path in this package; both are created, the context from verified repository evidence and the schema as an exact copy of the bundled Repo Standards schema.",
519
+ "decided_by": "rarajes2@cisco.com",
520
+ "decided_at": "2026-10-05T06:22:10Z"
521
+ },
522
+ "artifact_decisions": [
523
+ {
524
+ "path": "docs/service.md",
525
+ "action": "omit",
526
+ "reason": "This package is a library plugin, not a deployable service. It has no Dockerfile, process entry point, deployment manifest or runtime configuration of its own; it runs inside a host WebexCore instance.",
527
+ "decided_by": "rarajes2@cisco.com",
528
+ "decided_at": "2026-10-05T06:22:10Z"
529
+ },
530
+ {
531
+ "path": "api-specs/openapi.yaml",
532
+ "action": "omit",
533
+ "reason": "The package owns no HTTP surface. Every HTTP contract it touches is owned upstream by the Webex metrics or unified telemetry service, and its own published surface is an ecosystem-native SDK export recorded in package.json and src/index.ts. An empty paths scaffold is an explicit blocker.",
534
+ "decided_by": "rarajes2@cisco.com",
535
+ "decided_at": "2026-10-05T06:22:10Z"
536
+ },
537
+ {
538
+ "path": "mkdocs.yml",
539
+ "action": "omit",
540
+ "reason": "No MkDocs publishing workflow exists for this package or the surrounding monorepo.",
541
+ "decided_by": "rarajes2@cisco.com",
542
+ "decided_at": "2026-10-05T06:22:10Z"
543
+ },
544
+ {
545
+ "path": "SECURITY.md",
546
+ "action": "omit",
547
+ "reason": "Security policy is owned at the webex-js-sdk repository root, not per package.",
548
+ "decided_by": "rarajes2@cisco.com",
549
+ "decided_at": "2026-10-05T06:22:10Z"
550
+ },
551
+ {
552
+ "path": "CONTRIBUTING.md",
553
+ "action": "omit",
554
+ "reason": "Contribution guidance is owned at the webex-js-sdk repository root, not per package; README.md links it there.",
555
+ "decided_by": "rarajes2@cisco.com",
556
+ "decided_at": "2026-10-05T06:22:10Z"
557
+ },
558
+ {
559
+ "path": "CHANGELOG.md",
560
+ "action": "omit",
561
+ "reason": "The monorepo generates changelogs centrally through its release tooling; a package-level changelog would diverge from it.",
562
+ "decided_by": "rarajes2@cisco.com",
563
+ "decided_at": "2026-10-05T06:22:10Z"
564
+ },
565
+ {
566
+ "path": "CTO_CHECKLIST.yml",
567
+ "action": "omit",
568
+ "reason": "No deployable service, so the package does not participate in the CTO readiness workflow.",
569
+ "decided_by": "rarajes2@cisco.com",
570
+ "decided_at": "2026-10-05T06:22:10Z"
571
+ },
572
+ {
573
+ "path": "schemas/cto-checklist.schema.json",
574
+ "action": "omit",
575
+ "reason": "No CTO checklist is selected, so its matching schema is not required.",
576
+ "decided_by": "rarajes2@cisco.com",
577
+ "decided_at": "2026-10-05T06:22:10Z"
578
+ }
579
+ ],
580
+ "template_roots": {
581
+ "canonical": ".sdd/templates/repo-standards"
582
+ },
583
+ "repo_skills_root": ".sdd/skills",
584
+ "contract_index_path": "docs/architecture.md"
585
+ },
586
+ "tooling": {
587
+ "sdlc_skills": {
588
+ "install_mode": "symlink",
589
+ "installed_at": "2026-10-05T06:22:10Z",
590
+ "plugins": [
591
+ "repo-annotation@2.0.5"
592
+ ]
593
+ }
594
+ },
595
+ "substrate": {
596
+ "source": "WebexTools/repo-standards",
597
+ "consumed": [
598
+ "lint/format configs (@webex/eslint-config-legacy via .eslintrc.js)",
599
+ "babel and jest presets (@webex/babel-config-legacy, @webex/jest-config-legacy)",
600
+ "build and test tooling (@webex/legacy-tools)",
601
+ "monorepo governance files (root CONTRIBUTING.md, LICENSE, CODEOWNERS)"
602
+ ],
603
+ "compliance_tier": "baseline"
604
+ },
605
+ "section_profiles": {
606
+ "repo": {
607
+ "owns_datastore": false,
608
+ "holds_client_state": true,
609
+ "components_interact": true,
610
+ "domain_data_across_components": true,
611
+ "caches_data": true,
612
+ "observability_convention": true,
613
+ "deploys_to_infra": false,
614
+ "shared_base_libs": true,
615
+ "is_monorepo": false,
616
+ "multi_platform": true,
617
+ "published_package": true,
618
+ "embedded_in_host": true,
619
+ "cross_repo_deps_material": true,
620
+ "security_arch_warranted": true,
621
+ "exposes_commands_or_artifacts": true
622
+ },
623
+ "resolved_by": "claude-code/claude-opus-5 (host metadata; code-grounded from package.json, src/ and the routed README.md)",
624
+ "resolved_at": "2026-10-05T09:06:56Z"
625
+ }
626
+ }