@webex/internal-plugin-device 3.12.0-next.54 → 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.
- package/.repo-context.json +519 -0
- package/.sdd/manifest.json +335 -0
- package/AGENTS.md +181 -0
- package/dist/device.js +1 -1
- package/dist/ipNetworkDetector.js +1 -1
- package/docs/adr/index.md +28 -0
- package/docs/architecture.md +237 -0
- package/docs/getting-started.md +91 -0
- package/docs/index.md +40 -0
- package/docs/specs/README.md +80 -0
- package/package.json +3 -3
- package/schemas/repo-context.schema.json +796 -0
- package/src/docs/README.md +676 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./schemas/repo-context.schema.json",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"repository": {
|
|
5
|
+
"name": "@webex/internal-plugin-device",
|
|
6
|
+
"purpose": "Device registration for the Webex JS SDK: registers, refreshes, and unregisters this client's device with the WDM service and exposes the device-derived state (URLs, feature toggles, organization policy) as the webex.internal.device plugin."
|
|
7
|
+
},
|
|
8
|
+
"commands": {
|
|
9
|
+
"compile": "yarn workspace @webex/internal-plugin-device build:src",
|
|
10
|
+
"build": "yarn workspace @webex/internal-plugin-device build",
|
|
11
|
+
"unit-test": "yarn workspace @webex/internal-plugin-device test:unit",
|
|
12
|
+
"browser-test": "yarn workspace @webex/internal-plugin-device test:browser",
|
|
13
|
+
"lint": "yarn workspace @webex/internal-plugin-device test:style",
|
|
14
|
+
"deploy": "yarn workspace @webex/internal-plugin-device deploy:npm"
|
|
15
|
+
},
|
|
16
|
+
"task_playbooks": [
|
|
17
|
+
{
|
|
18
|
+
"task": "change-device-behavior",
|
|
19
|
+
"reference": "src/docs/README.md",
|
|
20
|
+
"when_to_use": "Changing registration, refresh, unregister, cleanup, feature handling, inactivity logout, the device-url interceptor, or IP network detection.",
|
|
21
|
+
"start_with": [
|
|
22
|
+
"src/docs/README.md",
|
|
23
|
+
"docs/architecture.md",
|
|
24
|
+
"src/device.js"
|
|
25
|
+
],
|
|
26
|
+
"evidence_required": [
|
|
27
|
+
"src/device.js",
|
|
28
|
+
"test/unit/spec/device.js",
|
|
29
|
+
"src/docs/README.md"
|
|
30
|
+
],
|
|
31
|
+
"allowed_edits": [
|
|
32
|
+
"src/**",
|
|
33
|
+
"test/**",
|
|
34
|
+
"src/docs/README.md",
|
|
35
|
+
"docs/architecture.md"
|
|
36
|
+
],
|
|
37
|
+
"validate_with": [
|
|
38
|
+
"yarn workspace @webex/internal-plugin-device test:unit",
|
|
39
|
+
"yarn workspace @webex/internal-plugin-device test:style"
|
|
40
|
+
],
|
|
41
|
+
"fallback": "If a requirement or invariant in the module spec conflicts with the code, stop and report the conflict instead of changing either silently."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"task": "update-sdd-docs",
|
|
45
|
+
"reference": "docs/specs/README.md",
|
|
46
|
+
"when_to_use": "Code changes alter a requirement, invariant, public surface, dependency, or failure mode documented in the module spec.",
|
|
47
|
+
"start_with": [
|
|
48
|
+
"docs/specs/README.md",
|
|
49
|
+
"src/docs/README.md",
|
|
50
|
+
".sdd/manifest.json"
|
|
51
|
+
],
|
|
52
|
+
"evidence_required": [
|
|
53
|
+
"src/device.js",
|
|
54
|
+
"package.json"
|
|
55
|
+
],
|
|
56
|
+
"allowed_edits": [
|
|
57
|
+
"src/docs/README.md",
|
|
58
|
+
"docs/architecture.md",
|
|
59
|
+
"docs/specs/README.md",
|
|
60
|
+
".sdd/manifest.json"
|
|
61
|
+
],
|
|
62
|
+
"validate_with": [
|
|
63
|
+
"Run the Repo Annotation spec-index and manifest checkers through the active installation"
|
|
64
|
+
],
|
|
65
|
+
"fallback": "Leave generated metadata and validation status untouched; validation is run by an independent runtime."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"public_interfaces": [
|
|
69
|
+
{
|
|
70
|
+
"name": "device-plugin-sdk",
|
|
71
|
+
"kind": "package_export",
|
|
72
|
+
"source": "package.json",
|
|
73
|
+
"entrypoints": [
|
|
74
|
+
"import '@webex/internal-plugin-device'",
|
|
75
|
+
"webex.internal.device",
|
|
76
|
+
"webex.config.device"
|
|
77
|
+
],
|
|
78
|
+
"audience": "Webex SDK plugins and first-party Webex clients",
|
|
79
|
+
"notes": "Internal plugin; verify exports in src/index.js and behavior in src/docs/README.md."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "device-registration-events",
|
|
83
|
+
"kind": "package_export",
|
|
84
|
+
"source": "src/device.js",
|
|
85
|
+
"entrypoints": [
|
|
86
|
+
"registration:success",
|
|
87
|
+
"change",
|
|
88
|
+
"change:features",
|
|
89
|
+
"change:developer, change:entitlement, change:user"
|
|
90
|
+
],
|
|
91
|
+
"audience": "Plugins listening on webex.internal.device",
|
|
92
|
+
"notes": "Names declared in src/constants.js; emitted by src/device.js and src/features/features-model.js. Relied on by dependent SDK packages."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "cisco-device-url-header",
|
|
96
|
+
"kind": "package_export",
|
|
97
|
+
"source": "src/interceptors/device-url.js",
|
|
98
|
+
"entrypoints": [
|
|
99
|
+
"DeviceUrlInterceptor"
|
|
100
|
+
],
|
|
101
|
+
"audience": "Webex backend services",
|
|
102
|
+
"notes": "Never attached for idbroker, oauth, or saml; verify with test/unit/spec/interceptors/device-url.js."
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"source_of_truth": [
|
|
106
|
+
{
|
|
107
|
+
"surface": "device behavior",
|
|
108
|
+
"paths": [
|
|
109
|
+
"src/device.js",
|
|
110
|
+
"src/index.js",
|
|
111
|
+
"src/config.js",
|
|
112
|
+
"src/constants.js",
|
|
113
|
+
"src/types.ts",
|
|
114
|
+
"src/metrics.js"
|
|
115
|
+
],
|
|
116
|
+
"generated_artifacts": [
|
|
117
|
+
"dist"
|
|
118
|
+
],
|
|
119
|
+
"refresh_with": [
|
|
120
|
+
"yarn workspace @webex/internal-plugin-device build:src"
|
|
121
|
+
],
|
|
122
|
+
"validate_with": [
|
|
123
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"surface": "feature toggles",
|
|
128
|
+
"paths": [
|
|
129
|
+
"src/features/feature-model.js",
|
|
130
|
+
"src/features/feature-collection.js",
|
|
131
|
+
"src/features/features-model.js"
|
|
132
|
+
],
|
|
133
|
+
"generated_artifacts": [
|
|
134
|
+
"dist"
|
|
135
|
+
],
|
|
136
|
+
"refresh_with": [
|
|
137
|
+
"yarn workspace @webex/internal-plugin-device build:src"
|
|
138
|
+
],
|
|
139
|
+
"validate_with": [
|
|
140
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"surface": "request decoration and network detection",
|
|
145
|
+
"paths": [
|
|
146
|
+
"src/interceptors/device-url.js",
|
|
147
|
+
"src/ipNetworkDetector.ts"
|
|
148
|
+
],
|
|
149
|
+
"generated_artifacts": [
|
|
150
|
+
"dist"
|
|
151
|
+
],
|
|
152
|
+
"refresh_with": [
|
|
153
|
+
"yarn workspace @webex/internal-plugin-device build:src"
|
|
154
|
+
],
|
|
155
|
+
"validate_with": [
|
|
156
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"surface": "SDD documentation",
|
|
161
|
+
"paths": [
|
|
162
|
+
"AGENTS.md",
|
|
163
|
+
"docs",
|
|
164
|
+
"src/docs/README.md",
|
|
165
|
+
".sdd/manifest.json"
|
|
166
|
+
],
|
|
167
|
+
"generated_artifacts": [],
|
|
168
|
+
"refresh_with": [
|
|
169
|
+
"Re-run Repo Annotation through the active installation"
|
|
170
|
+
],
|
|
171
|
+
"validate_with": [
|
|
172
|
+
"Run the Repo Annotation spec-index, manifest, and repository-context checkers through the active installation"
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
"generated_artifacts": [
|
|
177
|
+
{
|
|
178
|
+
"path": "dist",
|
|
179
|
+
"generated_from": "src",
|
|
180
|
+
"refresh_with": "yarn workspace @webex/internal-plugin-device build:src"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"path": ".sdd/templates/repo-standards/template-map.json",
|
|
184
|
+
"generated_from": "WebexTools/repo-standards@d89a7fe59126ae3ad9bac9ca352aa7f12b4c85dc",
|
|
185
|
+
"refresh_with": "Run the setup script of the active Repo Annotation installation against the monorepo root"
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
"validation_matrix": [
|
|
189
|
+
{
|
|
190
|
+
"paths": [
|
|
191
|
+
"src/device.js",
|
|
192
|
+
"src/config.js",
|
|
193
|
+
"src/constants.js",
|
|
194
|
+
"src/features/**"
|
|
195
|
+
],
|
|
196
|
+
"minimum": [
|
|
197
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
198
|
+
],
|
|
199
|
+
"recommended": [
|
|
200
|
+
"yarn workspace @webex/internal-plugin-device test:style",
|
|
201
|
+
"yarn workspace @webex/internal-plugin-device test:browser"
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"paths": [
|
|
206
|
+
"src/interceptors/**",
|
|
207
|
+
"src/ipNetworkDetector.ts"
|
|
208
|
+
],
|
|
209
|
+
"minimum": [
|
|
210
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
211
|
+
],
|
|
212
|
+
"recommended": [
|
|
213
|
+
"yarn workspace @webex/internal-plugin-device test:style"
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"paths": [
|
|
218
|
+
"src/docs/README.md",
|
|
219
|
+
"docs/**",
|
|
220
|
+
"AGENTS.md",
|
|
221
|
+
".sdd/manifest.json"
|
|
222
|
+
],
|
|
223
|
+
"minimum": [
|
|
224
|
+
"Run the Repo Annotation spec-index and manifest checkers through the active installation"
|
|
225
|
+
],
|
|
226
|
+
"recommended": [
|
|
227
|
+
"Independent spec validation on a different runtime"
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
],
|
|
231
|
+
"change_impact": [
|
|
232
|
+
{
|
|
233
|
+
"paths": [
|
|
234
|
+
"src/device.js"
|
|
235
|
+
],
|
|
236
|
+
"affects": [
|
|
237
|
+
"Every SDK plugin that reads webex.internal.device",
|
|
238
|
+
"Mercury WebSocket URL retrieval",
|
|
239
|
+
"Meetings and calling packages"
|
|
240
|
+
],
|
|
241
|
+
"refresh_with": [
|
|
242
|
+
"yarn workspace @webex/internal-plugin-device build:src"
|
|
243
|
+
],
|
|
244
|
+
"validate_with": [
|
|
245
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
246
|
+
],
|
|
247
|
+
"avoid_direct_edits": [
|
|
248
|
+
"dist"
|
|
249
|
+
],
|
|
250
|
+
"notes": "Property names and event names are consumed across the monorepo."
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"paths": [
|
|
254
|
+
"src/constants.js"
|
|
255
|
+
],
|
|
256
|
+
"affects": [
|
|
257
|
+
"Cleanup thresholds exercised by test/unit/spec/device.js",
|
|
258
|
+
"registration:success event consumers"
|
|
259
|
+
],
|
|
260
|
+
"validate_with": [
|
|
261
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
262
|
+
],
|
|
263
|
+
"avoid_direct_edits": [
|
|
264
|
+
"dist"
|
|
265
|
+
],
|
|
266
|
+
"notes": "Constants are imported by both the plugin and its tests."
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"paths": [
|
|
270
|
+
"src/interceptors/device-url.js"
|
|
271
|
+
],
|
|
272
|
+
"affects": [
|
|
273
|
+
"Every outbound request through the shared request pipeline"
|
|
274
|
+
],
|
|
275
|
+
"validate_with": [
|
|
276
|
+
"yarn workspace @webex/internal-plugin-device test:unit"
|
|
277
|
+
],
|
|
278
|
+
"avoid_direct_edits": [
|
|
279
|
+
"dist"
|
|
280
|
+
],
|
|
281
|
+
"notes": "The header excludes idbroker, oauth, and saml."
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
"glossary": [
|
|
285
|
+
{
|
|
286
|
+
"term": "WDM",
|
|
287
|
+
"definition": "Web device manager: the Webex service that stores device registrations.",
|
|
288
|
+
"notes": "Reached through the wdm entry of the service catalog."
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"term": "Device",
|
|
292
|
+
"definition": "This client's registration at WDM plus its local state, exposed as webex.internal.device."
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"term": "Ephemeral device",
|
|
296
|
+
"definition": "A registration created with a TTL and refreshed on a timer instead of being persisted.",
|
|
297
|
+
"notes": "Controlled by config.device.ephemeral."
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"term": "Feature toggle",
|
|
301
|
+
"definition": "A named value from WDM in the developer, entitlement, or user collection, typed on parse."
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
"evidence_rules": [
|
|
305
|
+
{
|
|
306
|
+
"claim_category": "command_name",
|
|
307
|
+
"sources": [
|
|
308
|
+
"package.json"
|
|
309
|
+
],
|
|
310
|
+
"requirement": "Cite only a script defined in package.json; the test script references test:integration, which package.json does not define."
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"claim_category": "behavior_claim",
|
|
314
|
+
"sources": [
|
|
315
|
+
"src/device.js",
|
|
316
|
+
"test/unit/spec/device.js",
|
|
317
|
+
"test/integration/spec/device.js"
|
|
318
|
+
],
|
|
319
|
+
"requirement": "State a behavior only when the source implements it; call it tested only when a test invokes it."
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"claim_category": "import_path",
|
|
323
|
+
"sources": [
|
|
324
|
+
"src/index.js"
|
|
325
|
+
],
|
|
326
|
+
"requirement": "Document an export only if src/index.js exports it."
|
|
327
|
+
}
|
|
328
|
+
],
|
|
329
|
+
"negative_guidance": [
|
|
330
|
+
{
|
|
331
|
+
"rule": "Do not use commit or pull-request history as evidence for why behavior exists.",
|
|
332
|
+
"why": "The package owner declared history is not trusted rationale evidence."
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"rule": "Do not describe the WDM service contract beyond what the code sends and reads.",
|
|
336
|
+
"why": "No machine-readable WDM contract is committed in this repository."
|
|
337
|
+
}
|
|
338
|
+
],
|
|
339
|
+
"confidence_policy": {
|
|
340
|
+
"high": {
|
|
341
|
+
"action": "update",
|
|
342
|
+
"expectation": "Source and a behavioral test both confirm the claim."
|
|
343
|
+
},
|
|
344
|
+
"medium": {
|
|
345
|
+
"action": "narrow-scope",
|
|
346
|
+
"expectation": "Only source confirms the claim; state the missing test as a gap."
|
|
347
|
+
},
|
|
348
|
+
"low": {
|
|
349
|
+
"action": "noop",
|
|
350
|
+
"expectation": "Neither source nor test confirms it; report the gap instead of documenting it."
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
"repository_topology": {
|
|
354
|
+
"main_entrypoints": [
|
|
355
|
+
{
|
|
356
|
+
"name": "plugin registration",
|
|
357
|
+
"path": "src/index.js",
|
|
358
|
+
"purpose": "Registers the device plugin, interceptor, and logout hook and defines the export surface."
|
|
359
|
+
}
|
|
360
|
+
],
|
|
361
|
+
"workspace_packages": [
|
|
362
|
+
{
|
|
363
|
+
"name": "@webex/internal-plugin-device",
|
|
364
|
+
"paths": [
|
|
365
|
+
"."
|
|
366
|
+
],
|
|
367
|
+
"notes": "Single package; its dependencies are other packages of the surrounding Yarn workspace."
|
|
368
|
+
}
|
|
369
|
+
],
|
|
370
|
+
"source_surfaces": [
|
|
371
|
+
{
|
|
372
|
+
"name": "plugin source",
|
|
373
|
+
"paths": [
|
|
374
|
+
"src/*.js",
|
|
375
|
+
"src/*.ts"
|
|
376
|
+
],
|
|
377
|
+
"notes": "Device model, config, constants, metrics names, detector."
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"name": "feature models",
|
|
381
|
+
"paths": [
|
|
382
|
+
"src/features/*.js"
|
|
383
|
+
],
|
|
384
|
+
"notes": "Feature collections and typing."
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"name": "interceptors",
|
|
388
|
+
"paths": [
|
|
389
|
+
"src/interceptors/*.js"
|
|
390
|
+
],
|
|
391
|
+
"notes": "The cisco-device-url interceptor."
|
|
392
|
+
}
|
|
393
|
+
],
|
|
394
|
+
"generated_surfaces": [
|
|
395
|
+
{
|
|
396
|
+
"name": "compiled package",
|
|
397
|
+
"paths": [
|
|
398
|
+
"dist"
|
|
399
|
+
],
|
|
400
|
+
"generated_from": "src",
|
|
401
|
+
"refresh_with": "yarn workspace @webex/internal-plugin-device build:src"
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"name": "repo-standards templates",
|
|
405
|
+
"paths": [
|
|
406
|
+
".sdd/templates/repo-standards"
|
|
407
|
+
],
|
|
408
|
+
"generated_from": "WebexTools/repo-standards@d89a7fe59126ae3ad9bac9ca352aa7f12b4c85dc",
|
|
409
|
+
"refresh_with": "Run the setup script of the active Repo Annotation installation against the monorepo root",
|
|
410
|
+
"notes": "Resolved from the monorepo root .sdd directory; no package-level copy exists."
|
|
411
|
+
}
|
|
412
|
+
],
|
|
413
|
+
"sync_paths": [
|
|
414
|
+
{
|
|
415
|
+
"source": "WebexTools/repo-standards@d89a7fe59126ae3ad9bac9ca352aa7f12b4c85dc",
|
|
416
|
+
"targets": [
|
|
417
|
+
".sdd/templates/repo-standards"
|
|
418
|
+
],
|
|
419
|
+
"mechanism": "Setup script of the active Repo Annotation installation",
|
|
420
|
+
"notes": "Run at the monorepo root."
|
|
421
|
+
}
|
|
422
|
+
],
|
|
423
|
+
"validation_entrypoints": [
|
|
424
|
+
{
|
|
425
|
+
"name": "unit tests",
|
|
426
|
+
"command": "yarn workspace @webex/internal-plugin-device test:unit",
|
|
427
|
+
"scope": "Jest suites under test/unit"
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"name": "lint",
|
|
431
|
+
"command": "yarn workspace @webex/internal-plugin-device test:style",
|
|
432
|
+
"scope": "ESLint over src"
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"name": "browser integration tests",
|
|
436
|
+
"command": "yarn workspace @webex/internal-plugin-device test:browser",
|
|
437
|
+
"scope": "Mocha specs under test/integration through Karma"
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
},
|
|
441
|
+
"folder_readme_contract": {
|
|
442
|
+
"required_sections": [
|
|
443
|
+
"purpose",
|
|
444
|
+
"boundaries",
|
|
445
|
+
"key-files",
|
|
446
|
+
"common-tasks"
|
|
447
|
+
],
|
|
448
|
+
"rules": [
|
|
449
|
+
"Orient first: state what the folder owns before listing files."
|
|
450
|
+
],
|
|
451
|
+
"example_policy": "Examples are allowed only when taken from source or tests in this package.",
|
|
452
|
+
"fallback": "Omit a folder README when the module spec already covers the folder."
|
|
453
|
+
},
|
|
454
|
+
"surface_owners": [
|
|
455
|
+
{
|
|
456
|
+
"surface": "src",
|
|
457
|
+
"owner": "Webex JS SDK maintainers",
|
|
458
|
+
"edit_boundary": "Source and tests; keep the module spec in step with behavior changes."
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"surface": "docs and AGENTS.md",
|
|
462
|
+
"owner": "Webex JS SDK maintainers",
|
|
463
|
+
"edit_boundary": "Generated by Repo Annotation; edit through spec-reconcile and review."
|
|
464
|
+
}
|
|
465
|
+
],
|
|
466
|
+
"do_not_edit": [
|
|
467
|
+
"dist",
|
|
468
|
+
"node_modules"
|
|
469
|
+
],
|
|
470
|
+
"marker_scopes": {
|
|
471
|
+
"sdd-generated-metadata": [
|
|
472
|
+
"AGENTS.md",
|
|
473
|
+
"docs/index.md",
|
|
474
|
+
"docs/architecture.md",
|
|
475
|
+
"docs/getting-started.md",
|
|
476
|
+
"docs/specs/README.md",
|
|
477
|
+
"docs/adr/index.md",
|
|
478
|
+
"src/docs/README.md"
|
|
479
|
+
]
|
|
480
|
+
},
|
|
481
|
+
"fallback_rules": [
|
|
482
|
+
"If a command is not defined in package.json, report it as missing instead of inventing one.",
|
|
483
|
+
"If code and a spec disagree, surface the conflict and do not edit the spec to match unverified behavior."
|
|
484
|
+
],
|
|
485
|
+
"downstream_context_pack": {
|
|
486
|
+
"required_human_surfaces": [
|
|
487
|
+
"docs/index.md",
|
|
488
|
+
"docs/architecture.md",
|
|
489
|
+
"docs/specs/README.md",
|
|
490
|
+
"src/docs/README.md"
|
|
491
|
+
],
|
|
492
|
+
"required_agent_operational_surfaces": [
|
|
493
|
+
"AGENTS.md"
|
|
494
|
+
],
|
|
495
|
+
"required_machine_readable_surface": ".repo-context.json",
|
|
496
|
+
"recommended_machine_readable_sections": [
|
|
497
|
+
"task_playbooks",
|
|
498
|
+
"public_interfaces",
|
|
499
|
+
"change_impact",
|
|
500
|
+
"glossary",
|
|
501
|
+
"evidence_rules",
|
|
502
|
+
"negative_guidance",
|
|
503
|
+
"confidence_policy",
|
|
504
|
+
"repository_topology",
|
|
505
|
+
"folder_readme_contract",
|
|
506
|
+
"regression_feedback_rules"
|
|
507
|
+
]
|
|
508
|
+
},
|
|
509
|
+
"regression_feedback_rules": [
|
|
510
|
+
{
|
|
511
|
+
"trigger": "A change to device.js behavior ships without a matching requirement, invariant, or test update",
|
|
512
|
+
"required_followups": [
|
|
513
|
+
"Update the affected requirement or invariant in src/docs/README.md",
|
|
514
|
+
"Add a unit test in test/unit/spec/device.js for the new behavior"
|
|
515
|
+
],
|
|
516
|
+
"notes": "Requirements without test evidence are listed as gaps in the module spec Verification section."
|
|
517
|
+
}
|
|
518
|
+
]
|
|
519
|
+
}
|