@documentation-robotics/cli 0.2.0 → 0.3.0
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/README.md +36 -2
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +171 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +195 -171
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +336 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +45 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +167 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +3 -2
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +117 -14
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +55 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +43 -22
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/mcp.js +19 -4
- package/dist/commands/mcp.js.map +2 -2
- package/dist/commands/relationship.js +207 -26
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/update.js +42 -23
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -11
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +4 -3
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/catalog-migration.js +33 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +153 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +518 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +75 -46
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +68 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +64 -17
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +83 -18
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2236 -7790
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-map.md +13 -0
- package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +26 -2
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +48 -1
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +34 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/tool-registry.js +19 -3
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +184 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +43 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +19 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +6 -5
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +35 -19
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/relationship-tools.js +98 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/shared.js +25 -2
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +718 -1643
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +218 -34
- package/dist/server/server.js.map +2 -2
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +14 -12
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
- package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cbm",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"source_version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"source_version": "0.11.0",
|
|
5
5
|
"analyzer": {
|
|
6
6
|
"name": "cbm",
|
|
7
7
|
"display_name": "codebase-memory-mcp",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"lua",
|
|
39
39
|
"scala"
|
|
40
40
|
],
|
|
41
|
-
"known_minimum_version":
|
|
41
|
+
"known_minimum_version": "0.12.0",
|
|
42
42
|
"project_identification": {
|
|
43
43
|
"strategy": "absolute_path",
|
|
44
44
|
"description": "DR CLI passes the project root as an absolute path via findProjectRoot(). The analyzer uses this path to establish a stable project identity for consistent indexing and caching across sessions."
|
|
@@ -118,6 +118,18 @@
|
|
|
118
118
|
},
|
|
119
119
|
"return_type": {
|
|
120
120
|
"from": "return_type"
|
|
121
|
+
},
|
|
122
|
+
"decorators": {
|
|
123
|
+
"from": "decorators"
|
|
124
|
+
},
|
|
125
|
+
"decorator_tags": {
|
|
126
|
+
"from": "decorator_tags"
|
|
127
|
+
},
|
|
128
|
+
"route_method": {
|
|
129
|
+
"from": "route_method"
|
|
130
|
+
},
|
|
131
|
+
"route_path": {
|
|
132
|
+
"from": "route_path"
|
|
121
133
|
}
|
|
122
134
|
},
|
|
123
135
|
"conditions": {
|
|
@@ -168,6 +180,18 @@
|
|
|
168
180
|
},
|
|
169
181
|
"overrides": {
|
|
170
182
|
"from": "overrides"
|
|
183
|
+
},
|
|
184
|
+
"decorators": {
|
|
185
|
+
"from": "decorators"
|
|
186
|
+
},
|
|
187
|
+
"decorator_tags": {
|
|
188
|
+
"from": "decorator_tags"
|
|
189
|
+
},
|
|
190
|
+
"route_method": {
|
|
191
|
+
"from": "route_method"
|
|
192
|
+
},
|
|
193
|
+
"route_path": {
|
|
194
|
+
"from": "route_path"
|
|
171
195
|
}
|
|
172
196
|
},
|
|
173
197
|
"conditions": {
|
|
@@ -206,6 +230,12 @@
|
|
|
206
230
|
},
|
|
207
231
|
"properties_count": {
|
|
208
232
|
"from": "properties_count"
|
|
233
|
+
},
|
|
234
|
+
"decorators": {
|
|
235
|
+
"from": "decorators"
|
|
236
|
+
},
|
|
237
|
+
"decorator_tags": {
|
|
238
|
+
"from": "decorator_tags"
|
|
209
239
|
}
|
|
210
240
|
}
|
|
211
241
|
},
|
|
@@ -224,163 +254,928 @@
|
|
|
224
254
|
"from": "name"
|
|
225
255
|
}
|
|
226
256
|
}
|
|
257
|
+
},
|
|
258
|
+
"Interface": {
|
|
259
|
+
"cbm_label": "Interface",
|
|
260
|
+
"dr_layer": "application",
|
|
261
|
+
"dr_element_type": "dataobject",
|
|
262
|
+
"confidence": "medium",
|
|
263
|
+
"description": "In-code interface maps to an application data object. Tier-0 rules in extraction-heuristics.json take precedence: a Spring Data repository interface is data-store.accesspattern, an interface in generated client code or a component's props interface is not an element, and any other interface is narrowed to data object, application interface, application event or data-model object schema for the classifier to decide.",
|
|
264
|
+
"source_reference": {
|
|
265
|
+
"provenance": "extracted",
|
|
266
|
+
"file": {
|
|
267
|
+
"from": "file_path"
|
|
268
|
+
},
|
|
269
|
+
"symbol": {
|
|
270
|
+
"from": "name"
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"evidence_fields": {
|
|
274
|
+
"base_classes": {
|
|
275
|
+
"from": "base_classes"
|
|
276
|
+
},
|
|
277
|
+
"decorators": {
|
|
278
|
+
"from": "decorators"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
"Type": {
|
|
283
|
+
"cbm_label": "Type",
|
|
284
|
+
"dr_layer": "application",
|
|
285
|
+
"dr_element_type": "dataobject",
|
|
286
|
+
"confidence": "low",
|
|
287
|
+
"description": "Type alias or object type follows the Interface rules: an application data object unless generated or a component's props type.",
|
|
288
|
+
"source_reference": {
|
|
289
|
+
"provenance": "extracted",
|
|
290
|
+
"file": {
|
|
291
|
+
"from": "file_path"
|
|
292
|
+
},
|
|
293
|
+
"symbol": {
|
|
294
|
+
"from": "name"
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
"evidence_fields": {
|
|
298
|
+
"base_classes": {
|
|
299
|
+
"from": "base_classes"
|
|
300
|
+
},
|
|
301
|
+
"decorators": {
|
|
302
|
+
"from": "decorators"
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"Enum": {
|
|
307
|
+
"cbm_label": "Enum",
|
|
308
|
+
"dr_layer": "application",
|
|
309
|
+
"dr_element_type": "dataobject",
|
|
310
|
+
"confidence": "low",
|
|
311
|
+
"description": "Enumeration of values held in code follows the Interface rules: an application data object.",
|
|
312
|
+
"source_reference": {
|
|
313
|
+
"provenance": "extracted",
|
|
314
|
+
"file": {
|
|
315
|
+
"from": "file_path"
|
|
316
|
+
},
|
|
317
|
+
"symbol": {
|
|
318
|
+
"from": "name"
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"evidence_fields": {
|
|
322
|
+
"base_classes": {
|
|
323
|
+
"from": "base_classes"
|
|
324
|
+
},
|
|
325
|
+
"decorators": {
|
|
326
|
+
"from": "decorators"
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"Struct": {
|
|
331
|
+
"cbm_label": "Struct",
|
|
332
|
+
"dr_layer": "application",
|
|
333
|
+
"dr_element_type": "dataobject",
|
|
334
|
+
"confidence": "low",
|
|
335
|
+
"description": "Plain struct maps to an application data object; one with receiver methods or an impl block behaves like a class (application component), which the classifier decides.",
|
|
336
|
+
"source_reference": {
|
|
337
|
+
"provenance": "extracted",
|
|
338
|
+
"file": {
|
|
339
|
+
"from": "file_path"
|
|
340
|
+
},
|
|
341
|
+
"symbol": {
|
|
342
|
+
"from": "name"
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"evidence_fields": {
|
|
346
|
+
"base_classes": {
|
|
347
|
+
"from": "base_classes"
|
|
348
|
+
},
|
|
349
|
+
"decorators": {
|
|
350
|
+
"from": "decorators"
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"Trait": {
|
|
355
|
+
"cbm_label": "Trait",
|
|
356
|
+
"dr_layer": "application",
|
|
357
|
+
"dr_element_type": "dataobject",
|
|
358
|
+
"confidence": "low",
|
|
359
|
+
"description": "Behavioural contract implemented by types follows the Interface rules.",
|
|
360
|
+
"source_reference": {
|
|
361
|
+
"provenance": "extracted",
|
|
362
|
+
"file": {
|
|
363
|
+
"from": "file_path"
|
|
364
|
+
},
|
|
365
|
+
"symbol": {
|
|
366
|
+
"from": "name"
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"evidence_fields": {
|
|
370
|
+
"base_classes": {
|
|
371
|
+
"from": "base_classes"
|
|
372
|
+
},
|
|
373
|
+
"decorators": {
|
|
374
|
+
"from": "decorators"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
227
377
|
}
|
|
228
378
|
},
|
|
229
379
|
"edges_by_type": {
|
|
230
|
-
"
|
|
231
|
-
"cbm_edge": "
|
|
232
|
-
"dr_relationship": "
|
|
233
|
-
"confidence": "
|
|
234
|
-
"description": "
|
|
380
|
+
"CALLS": {
|
|
381
|
+
"cbm_edge": "CALLS",
|
|
382
|
+
"dr_relationship": "depends-on",
|
|
383
|
+
"confidence": "medium",
|
|
384
|
+
"description": "A function calls another function: the caller depends on the callee",
|
|
235
385
|
"usage": "verification_and_mapping",
|
|
236
|
-
"dr_scope": "
|
|
237
|
-
"direction": "
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
"
|
|
386
|
+
"dr_scope": "intra-layer",
|
|
387
|
+
"direction": "forward",
|
|
388
|
+
"dr_pattern": "application.applicationfunction → application.applicationfunction",
|
|
389
|
+
"implementation_note": "Listed first: it is the call-graph default edge type for dr analyzer callers and callees. Creates a relationship only between functions that both survive classification.",
|
|
390
|
+
"conditions": {
|
|
391
|
+
"predicates": [
|
|
392
|
+
{
|
|
393
|
+
"predicate": "depends-on",
|
|
394
|
+
"invert": false
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"predicate": "uses",
|
|
398
|
+
"invert": false
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"predicate": "accesses",
|
|
402
|
+
"invert": false
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"predicate": "triggers",
|
|
406
|
+
"invert": false
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"predicate": "flows-to",
|
|
410
|
+
"invert": false
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"predicate": "serves",
|
|
414
|
+
"invert": true
|
|
415
|
+
}
|
|
416
|
+
],
|
|
417
|
+
"gate": "both ends kept by Tier-1 significance gating; most functions are not elements on their own"
|
|
418
|
+
}
|
|
241
419
|
},
|
|
242
420
|
"HANDLES": {
|
|
243
421
|
"cbm_edge": "HANDLES",
|
|
244
|
-
"dr_relationship": "
|
|
422
|
+
"dr_relationship": "realizes",
|
|
245
423
|
"confidence": "high",
|
|
246
|
-
"description": "HTTP
|
|
424
|
+
"description": "A function or method handles an HTTP route: the API operation for that route realizes the application function",
|
|
425
|
+
"directionality_transform": "invert",
|
|
247
426
|
"usage": "verification_and_mapping",
|
|
248
427
|
"dr_scope": "cross-layer",
|
|
249
428
|
"direction": "forward",
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
"
|
|
429
|
+
"dr_pattern": "api.operation → application.applicationfunction",
|
|
430
|
+
"implementation_note": "CBM writes the edge handler → Route; the DR relationship runs from the operation to the function it realizes (api.operation.realizes.application.applicationfunction), so the direction is inverted. HANDLES names routes by path while Route nodes are named __route__METHOD__/path.",
|
|
431
|
+
"conditions": {
|
|
432
|
+
"predicates": [
|
|
433
|
+
{
|
|
434
|
+
"predicate": "realizes",
|
|
435
|
+
"invert": true
|
|
436
|
+
}
|
|
437
|
+
]
|
|
438
|
+
}
|
|
253
439
|
},
|
|
254
|
-
"
|
|
255
|
-
"cbm_edge": "
|
|
256
|
-
"dr_relationship":
|
|
257
|
-
"confidence": "
|
|
258
|
-
"description": "
|
|
259
|
-
"usage": "
|
|
440
|
+
"DEFINES_METHOD": {
|
|
441
|
+
"cbm_edge": "DEFINES_METHOD",
|
|
442
|
+
"dr_relationship": "assigned-to",
|
|
443
|
+
"confidence": "high",
|
|
444
|
+
"description": "A class defines a method: the application component is assigned the application function",
|
|
445
|
+
"usage": "verification_and_mapping",
|
|
260
446
|
"dr_scope": "intra-layer",
|
|
261
447
|
"direction": "forward",
|
|
448
|
+
"dr_pattern": "application.applicationcomponent → application.applicationfunction",
|
|
449
|
+
"implementation_note": "Deterministic. A controller class (application interface) defining its route handlers (application functions) creates no relationship here: the catalog has no interface-to-function structural triple, and the operation side comes from HANDLES.",
|
|
262
450
|
"conditions": {
|
|
263
|
-
"
|
|
451
|
+
"predicates": [
|
|
452
|
+
{
|
|
453
|
+
"predicate": "assigned-to",
|
|
454
|
+
"invert": false
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"predicate": "composes",
|
|
458
|
+
"invert": false
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"predicate": "aggregates",
|
|
462
|
+
"invert": false
|
|
463
|
+
}
|
|
464
|
+
],
|
|
465
|
+
"from_types": ["application.*"],
|
|
466
|
+
"to_types": ["application.*"],
|
|
467
|
+
"gate": "both ends kept by Tier-1 significance gating; most functions are not elements on their own"
|
|
264
468
|
}
|
|
265
469
|
},
|
|
266
470
|
"IMPORTS": {
|
|
267
471
|
"cbm_edge": "IMPORTS",
|
|
268
|
-
"dr_relationship":
|
|
472
|
+
"dr_relationship": "uses",
|
|
269
473
|
"confidence": "high",
|
|
270
|
-
"description": "Module
|
|
271
|
-
"usage": "
|
|
474
|
+
"description": "Module or file import dependency: one application component uses another",
|
|
475
|
+
"usage": "verification_and_mapping",
|
|
272
476
|
"dr_scope": "intra-layer",
|
|
273
477
|
"direction": "forward",
|
|
478
|
+
"dr_pattern": "application.applicationcomponent → application.applicationcomponent",
|
|
479
|
+
"implementation_note": "Only between application-layer elements (component to component, or a component or function to the data object a module defines); imports of external packages, and of anything else, stay traversal input (datastore detection reads them).",
|
|
274
480
|
"conditions": {
|
|
275
|
-
"
|
|
481
|
+
"predicates": [
|
|
482
|
+
{
|
|
483
|
+
"predicate": "uses",
|
|
484
|
+
"invert": false
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"predicate": "depends-on",
|
|
488
|
+
"invert": false
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"predicate": "accesses",
|
|
492
|
+
"invert": false
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"predicate": "references",
|
|
496
|
+
"invert": false
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"predicate": "composes",
|
|
500
|
+
"invert": false
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"predicate": "aggregates",
|
|
504
|
+
"invert": false
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"predicate": "serves",
|
|
508
|
+
"invert": true
|
|
509
|
+
}
|
|
510
|
+
],
|
|
511
|
+
"from_types": ["application.*"],
|
|
512
|
+
"to_types": ["application.*"]
|
|
513
|
+
}
|
|
514
|
+
},
|
|
515
|
+
"CALL_REFERENCE": {
|
|
516
|
+
"cbm_edge": "CALL_REFERENCE",
|
|
517
|
+
"dr_relationship": "depends-on",
|
|
518
|
+
"confidence": "medium",
|
|
519
|
+
"description": "A callable is used as a value (handler or callback registration): the registering function depends on it",
|
|
520
|
+
"usage": "verification_and_mapping",
|
|
521
|
+
"dr_scope": "intra-layer",
|
|
522
|
+
"direction": "forward",
|
|
523
|
+
"dr_pattern": "application.applicationfunction → application.applicationfunction",
|
|
524
|
+
"implementation_note": "Same treatment as CALLS.",
|
|
525
|
+
"conditions": {
|
|
526
|
+
"predicates": [
|
|
527
|
+
{
|
|
528
|
+
"predicate": "depends-on",
|
|
529
|
+
"invert": false
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
"predicate": "uses",
|
|
533
|
+
"invert": false
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"predicate": "triggers",
|
|
537
|
+
"invert": false
|
|
538
|
+
}
|
|
539
|
+
],
|
|
540
|
+
"gate": "both ends kept by Tier-1 significance gating; most functions are not elements on their own"
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
"DATA_FLOWS": {
|
|
544
|
+
"cbm_edge": "DATA_FLOWS",
|
|
545
|
+
"dr_relationship": "flows-to",
|
|
546
|
+
"confidence": "medium",
|
|
547
|
+
"description": "An argument flows into a parameter: data flows from the calling function to the called one",
|
|
548
|
+
"usage": "verification_and_mapping",
|
|
549
|
+
"dr_scope": "intra-layer",
|
|
550
|
+
"direction": "forward",
|
|
551
|
+
"dr_pattern": "application.applicationfunction → application.applicationfunction",
|
|
552
|
+
"implementation_note": "Documented by CBM, not observed in the eval corpora.",
|
|
553
|
+
"conditions": {
|
|
554
|
+
"predicates": [
|
|
555
|
+
{
|
|
556
|
+
"predicate": "flows-to",
|
|
557
|
+
"invert": false
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"predicate": "depends-on",
|
|
561
|
+
"invert": false
|
|
562
|
+
}
|
|
563
|
+
],
|
|
564
|
+
"gate": "both ends kept by Tier-1 significance gating; most functions are not elements on their own"
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
"USAGE": {
|
|
568
|
+
"cbm_edge": "USAGE",
|
|
569
|
+
"dr_relationship": "accesses",
|
|
570
|
+
"confidence": "low",
|
|
571
|
+
"description": "A function or component uses a data structure without calling it: it accesses the data object",
|
|
572
|
+
"usage": "verification_and_mapping",
|
|
573
|
+
"dr_scope": "intra-layer",
|
|
574
|
+
"direction": "forward",
|
|
575
|
+
"dr_pattern": "application.applicationfunction → application.dataobject",
|
|
576
|
+
"implementation_note": "The largest-reach edge (387 gold cards). Map only when the target was accepted as a data object (an Interface, Type, Enum or data class); usage of variables and anything else is traversal only. CBM rates USAGE as identifier use without a proven target, so confidence is low. A function or component using a data-model object schema (an entity class) accesses it, as it accesses a data object.",
|
|
577
|
+
"conditions": {
|
|
578
|
+
"predicates": [
|
|
579
|
+
{
|
|
580
|
+
"predicate": "accesses",
|
|
581
|
+
"invert": false
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
"predicate": "uses",
|
|
585
|
+
"invert": false
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"predicate": "references",
|
|
589
|
+
"invert": false
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"predicate": "depends-on",
|
|
593
|
+
"invert": false
|
|
594
|
+
}
|
|
595
|
+
],
|
|
596
|
+
"to_types": [
|
|
597
|
+
"application.dataobject",
|
|
598
|
+
"data-model.objectschema",
|
|
599
|
+
"api.schema"
|
|
600
|
+
]
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"WRITES": {
|
|
604
|
+
"cbm_edge": "WRITES",
|
|
605
|
+
"dr_relationship": "accesses",
|
|
606
|
+
"confidence": "medium",
|
|
607
|
+
"description": "A function or component mutates a data structure's state: it accesses the data object",
|
|
608
|
+
"usage": "verification_and_mapping",
|
|
609
|
+
"dr_scope": "intra-layer",
|
|
610
|
+
"direction": "forward",
|
|
611
|
+
"dr_pattern": "application.applicationfunction → application.dataobject",
|
|
612
|
+
"implementation_note": "Same targets as USAGE; writing is access, so the provider reading (serves) does not apply.",
|
|
613
|
+
"conditions": {
|
|
614
|
+
"predicates": [
|
|
615
|
+
{
|
|
616
|
+
"predicate": "accesses",
|
|
617
|
+
"invert": false
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"predicate": "uses",
|
|
621
|
+
"invert": false
|
|
622
|
+
}
|
|
623
|
+
],
|
|
624
|
+
"to_types": [
|
|
625
|
+
"application.dataobject",
|
|
626
|
+
"data-model.objectschema",
|
|
627
|
+
"api.schema"
|
|
628
|
+
]
|
|
629
|
+
}
|
|
630
|
+
},
|
|
631
|
+
"IMPLEMENTS": {
|
|
632
|
+
"cbm_edge": "IMPLEMENTS",
|
|
633
|
+
"dr_relationship": "provides",
|
|
634
|
+
"confidence": "high",
|
|
635
|
+
"description": "A class implements an interface that was classified as an application interface: the component provides that interface",
|
|
636
|
+
"usage": "verification_and_mapping",
|
|
637
|
+
"dr_scope": "intra-layer",
|
|
638
|
+
"direction": "forward",
|
|
639
|
+
"dr_pattern": "application.applicationcomponent → application.applicationinterface",
|
|
640
|
+
"implementation_note": "Only when the implemented interface was accepted as application.applicationinterface. Implementing a data-object interface creates no relationship (the catalog has no component-to-dataobject structural triple, by design).",
|
|
641
|
+
"conditions": {
|
|
642
|
+
"predicates": [
|
|
643
|
+
{
|
|
644
|
+
"predicate": "provides",
|
|
645
|
+
"invert": false
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"predicate": "realizes",
|
|
649
|
+
"invert": false
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
"predicate": "specializes",
|
|
653
|
+
"invert": false
|
|
654
|
+
}
|
|
655
|
+
],
|
|
656
|
+
"to_types": ["application.applicationinterface"]
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
"TESTS": {
|
|
660
|
+
"cbm_edge": "TESTS",
|
|
661
|
+
"dr_relationship": "tests",
|
|
662
|
+
"confidence": "high",
|
|
663
|
+
"description": "A test function exercises a symbol: the test case sketch tests that function, interface, service or operation",
|
|
664
|
+
"usage": "verification_and_mapping",
|
|
665
|
+
"dr_scope": "cross-layer",
|
|
666
|
+
"direction": "forward",
|
|
667
|
+
"dr_pattern": "testing.testcasesketch → application.applicationfunction",
|
|
668
|
+
"implementation_note": "From a test case (a test function Tier 0 classified as testing.testcasesketch) to the production symbol it exercises, when that symbol is an accepted element; calls into builtins, helpers and unclassified symbols create nothing.",
|
|
669
|
+
"conditions": {
|
|
670
|
+
"predicates": [
|
|
671
|
+
{
|
|
672
|
+
"predicate": "tests",
|
|
673
|
+
"invert": false
|
|
674
|
+
}
|
|
675
|
+
],
|
|
676
|
+
"from_types": ["testing.testcasesketch"]
|
|
677
|
+
}
|
|
678
|
+
},
|
|
679
|
+
"TESTS_FILE": {
|
|
680
|
+
"cbm_edge": "TESTS_FILE",
|
|
681
|
+
"dr_relationship": "covers",
|
|
682
|
+
"confidence": "high",
|
|
683
|
+
"description": "A test file covers a source file: the coverage target covers the component",
|
|
684
|
+
"usage": "verification_and_mapping",
|
|
685
|
+
"dr_scope": "cross-layer",
|
|
686
|
+
"direction": "forward",
|
|
687
|
+
"dr_pattern": "testing.testcoveragetarget → application.applicationcomponent",
|
|
688
|
+
"implementation_note": "File-level counterpart of TESTS; same test pass.",
|
|
689
|
+
"conditions": {
|
|
690
|
+
"predicates": [
|
|
691
|
+
{
|
|
692
|
+
"predicate": "covers",
|
|
693
|
+
"invert": false
|
|
694
|
+
}
|
|
695
|
+
]
|
|
696
|
+
}
|
|
697
|
+
},
|
|
698
|
+
"ASYNC_CALLS": {
|
|
699
|
+
"cbm_edge": "ASYNC_CALLS",
|
|
700
|
+
"dr_relationship": "triggers",
|
|
701
|
+
"confidence": "medium",
|
|
702
|
+
"description": "A function publishes to a queue or topic: it raises the application event the queue carries",
|
|
703
|
+
"usage": "verification_and_mapping",
|
|
704
|
+
"dr_scope": "intra-layer",
|
|
705
|
+
"direction": "forward",
|
|
706
|
+
"dr_pattern": "application.applicationfunction → application.applicationevent",
|
|
707
|
+
"implementation_note": "The queue or topic Route (__route__sqs__..., __route__kafka__...) is modelled as an application event, which the publishing function triggers (application.applicationfunction.triggers.application.applicationevent, in the catalog since the application-layer rules of 2026-11-05). depends-on stays as the fallback for other source types.",
|
|
708
|
+
"conditions": {
|
|
709
|
+
"predicates": [
|
|
710
|
+
{
|
|
711
|
+
"predicate": "triggers",
|
|
712
|
+
"invert": false
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"predicate": "depends-on",
|
|
716
|
+
"invert": false
|
|
717
|
+
}
|
|
718
|
+
]
|
|
719
|
+
}
|
|
720
|
+
},
|
|
721
|
+
"LISTENS_ON": {
|
|
722
|
+
"cbm_edge": "LISTENS_ON",
|
|
723
|
+
"dr_relationship": "triggers",
|
|
724
|
+
"confidence": "medium",
|
|
725
|
+
"description": "A function listens on a channel: the application event triggers the handler function",
|
|
726
|
+
"usage": "verification_and_mapping",
|
|
727
|
+
"dr_scope": "intra-layer",
|
|
728
|
+
"direction": "forward",
|
|
729
|
+
"dr_pattern": "application.applicationevent → application.applicationfunction",
|
|
730
|
+
"implementation_note": "Function-level listeners: CBM writes listener → Channel, so the relationship runs the other way (application event triggers application function). The interface-level reading waits on catalog addition 4.",
|
|
731
|
+
"conditions": {
|
|
732
|
+
"predicates": [
|
|
733
|
+
{
|
|
734
|
+
"predicate": "triggers",
|
|
735
|
+
"invert": true
|
|
736
|
+
}
|
|
737
|
+
]
|
|
738
|
+
},
|
|
739
|
+
"directionality_transform": "invert"
|
|
740
|
+
},
|
|
741
|
+
"SPAWNS": {
|
|
742
|
+
"cbm_edge": "SPAWNS",
|
|
743
|
+
"dr_relationship": "serves",
|
|
744
|
+
"confidence": "medium",
|
|
745
|
+
"description": "Code starts an external program: the system software serves the calling component",
|
|
746
|
+
"directionality_transform": "invert",
|
|
747
|
+
"usage": "verification_and_mapping",
|
|
748
|
+
"dr_scope": "cross-layer",
|
|
749
|
+
"direction": "caller_to_callee",
|
|
750
|
+
"dr_pattern": "technology.systemsoftware → application.applicationcomponent",
|
|
751
|
+
"implementation_note": "Inverted: CBM writes caller → Process, the catalog has technology.systemsoftware.serves.application.applicationcomponent. Observed on CBM 0.12.1 (61 / 3 / 2 on dr-cli / fastapi / petclinic: git, node, bun, gh, claude and other programs the code or its scripts launch); creates a relationship only once Process maps to technology.systemsoftware (inventory step 9), since Process is in unmapped_labels.",
|
|
752
|
+
"conditions": {
|
|
753
|
+
"predicates": [
|
|
754
|
+
{
|
|
755
|
+
"predicate": "serves",
|
|
756
|
+
"invert": true
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
"predicate": "uses",
|
|
760
|
+
"invert": false
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
"predicate": "depends-on",
|
|
764
|
+
"invert": false
|
|
765
|
+
}
|
|
766
|
+
]
|
|
276
767
|
}
|
|
277
768
|
},
|
|
278
769
|
"DEPENDS_ON": {
|
|
279
770
|
"cbm_edge": "DEPENDS_ON",
|
|
280
|
-
"dr_relationship":
|
|
771
|
+
"dr_relationship": "depends-on",
|
|
281
772
|
"confidence": "medium",
|
|
282
|
-
"description": "
|
|
283
|
-
"usage": "
|
|
773
|
+
"description": "Infrastructure dependency between artifacts (charts, packages, base images) or system software",
|
|
774
|
+
"usage": "verification_and_mapping",
|
|
284
775
|
"dr_scope": "intra-layer",
|
|
285
776
|
"direction": "forward",
|
|
777
|
+
"dr_pattern": "technology.artifact → technology.artifact",
|
|
778
|
+
"implementation_note": "Infrastructure only: Helm chart dependencies, go.mod / requirements.txt to a Package, a Dockerfile to its base Images and an Image to its Dockerfile, compose depends_on and links (CBM 0.12.1; observed 0 / 12 / 1). Creates a relationship only between infrastructure elements, which wait on inventory step 9; compose depends_on between services also waits on catalog addition 9 (technology.node depends-on technology.node).",
|
|
286
779
|
"conditions": {
|
|
287
|
-
"
|
|
780
|
+
"predicates": [
|
|
781
|
+
{
|
|
782
|
+
"predicate": "depends-on",
|
|
783
|
+
"invert": false
|
|
784
|
+
}
|
|
785
|
+
]
|
|
288
786
|
}
|
|
289
787
|
},
|
|
788
|
+
"INFRA_MAPS": {
|
|
789
|
+
"cbm_edge": "INFRA_MAPS",
|
|
790
|
+
"dr_relationship": "realizes",
|
|
791
|
+
"confidence": "high",
|
|
792
|
+
"description": "A Kubernetes Service selects workloads: each workload node realizes the technology service",
|
|
793
|
+
"directionality_transform": "invert",
|
|
794
|
+
"usage": "verification_and_mapping",
|
|
795
|
+
"dr_scope": "intra-layer",
|
|
796
|
+
"direction": "forward",
|
|
797
|
+
"dr_pattern": "technology.node → technology.technologyservice",
|
|
798
|
+
"implementation_note": "Inverted: CBM writes Service → workload. Observed on CBM 0.12.1 (petclinic 2: k8s Service to Deployment). Creates a relationship once Resource maps by kind (inventory step 9).",
|
|
799
|
+
"conditions": {
|
|
800
|
+
"predicates": [
|
|
801
|
+
{
|
|
802
|
+
"predicate": "realizes",
|
|
803
|
+
"invert": true
|
|
804
|
+
}
|
|
805
|
+
]
|
|
806
|
+
}
|
|
807
|
+
},
|
|
808
|
+
"DEPLOYS": {
|
|
809
|
+
"cbm_edge": "DEPLOYS",
|
|
810
|
+
"dr_relationship": "composes",
|
|
811
|
+
"confidence": "medium",
|
|
812
|
+
"description": "Manifests, charts or Terraform are deployed onto a cluster: the node composes the artifact",
|
|
813
|
+
"directionality_transform": "invert",
|
|
814
|
+
"usage": "verification_and_mapping",
|
|
815
|
+
"dr_scope": "intra-layer",
|
|
816
|
+
"direction": "forward",
|
|
817
|
+
"dr_pattern": "technology.node → technology.artifact",
|
|
818
|
+
"implementation_note": "Inverted: CBM writes artifact → cluster. Observed on CBM 0.12.1 (petclinic 2). Creates a relationship once Resource and Image map (inventory step 9).",
|
|
819
|
+
"conditions": {
|
|
820
|
+
"predicates": [
|
|
821
|
+
{
|
|
822
|
+
"predicate": "composes",
|
|
823
|
+
"invert": true
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"predicate": "assigned-to",
|
|
827
|
+
"invert": false
|
|
828
|
+
}
|
|
829
|
+
]
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
"HTTP_CALLS": {
|
|
833
|
+
"cbm_edge": "HTTP_CALLS",
|
|
834
|
+
"dr_relationship": "tests",
|
|
835
|
+
"confidence": "medium",
|
|
836
|
+
"description": "Outbound HTTP call to an API route. From a test case it is the test exercising that operation",
|
|
837
|
+
"usage": "verification_and_mapping",
|
|
838
|
+
"dr_scope": "cross-layer",
|
|
839
|
+
"direction": "caller_to_callee",
|
|
840
|
+
"confidence_from_property": "confidence",
|
|
841
|
+
"implementation_note": "Creates a relationship only from a test case (a symbol Tier 0 classified as testing.testcasesketch) to an operation: on CBM 0.12.1 almost every observed caller is test code (53 of 55 on fastapi, 81 of 86 on dr-cli). A production caller (application code consuming an operation) still creates none: that triple waits on catalog addition 7 (docs/analyzers/CBM_MAPPING_INVENTORY.md), queued in Context Studio.",
|
|
842
|
+
"dr_pattern": "testing.testcasesketch → api.operation",
|
|
843
|
+
"conditions": {
|
|
844
|
+
"from_types": ["testing.testcasesketch"],
|
|
845
|
+
"to_types": ["api.operation"],
|
|
846
|
+
"predicates": [
|
|
847
|
+
{
|
|
848
|
+
"predicate": "tests",
|
|
849
|
+
"invert": false
|
|
850
|
+
}
|
|
851
|
+
]
|
|
852
|
+
}
|
|
853
|
+
},
|
|
854
|
+
"GRPC_CALLS": {
|
|
855
|
+
"cbm_edge": "GRPC_CALLS",
|
|
856
|
+
"dr_relationship": null,
|
|
857
|
+
"confidence": "high",
|
|
858
|
+
"description": "Outbound gRPC call",
|
|
859
|
+
"usage": "traversal_only",
|
|
860
|
+
"dr_scope": "cross-layer",
|
|
861
|
+
"direction": "caller_to_callee",
|
|
862
|
+
"implementation_note": "Same as HTTP_CALLS; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 7); map once accepted."
|
|
863
|
+
},
|
|
864
|
+
"GRAPHQL_CALLS": {
|
|
865
|
+
"cbm_edge": "GRAPHQL_CALLS",
|
|
866
|
+
"dr_relationship": null,
|
|
867
|
+
"confidence": "high",
|
|
868
|
+
"description": "Outbound GraphQL call",
|
|
869
|
+
"usage": "traversal_only",
|
|
870
|
+
"dr_scope": "cross-layer",
|
|
871
|
+
"direction": "caller_to_callee",
|
|
872
|
+
"implementation_note": "Same as HTTP_CALLS; in the binary and UI only. proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 7); map once accepted."
|
|
873
|
+
},
|
|
874
|
+
"TRPC_CALLS": {
|
|
875
|
+
"cbm_edge": "TRPC_CALLS",
|
|
876
|
+
"dr_relationship": null,
|
|
877
|
+
"confidence": "high",
|
|
878
|
+
"description": "Outbound tRPC call",
|
|
879
|
+
"usage": "traversal_only",
|
|
880
|
+
"dr_scope": "cross-layer",
|
|
881
|
+
"direction": "caller_to_callee",
|
|
882
|
+
"implementation_note": "Same as HTTP_CALLS; in the binary and UI only. proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 7); map once accepted."
|
|
883
|
+
},
|
|
290
884
|
"INHERITS": {
|
|
291
885
|
"cbm_edge": "INHERITS",
|
|
292
886
|
"dr_relationship": null,
|
|
293
887
|
"confidence": "high",
|
|
294
|
-
"description": "Class inheritance
|
|
888
|
+
"description": "Class or interface inheritance",
|
|
295
889
|
"usage": "traversal_only",
|
|
296
890
|
"dr_scope": "intra-layer",
|
|
297
891
|
"direction": "forward",
|
|
892
|
+
"implementation_note": "specializes between components and between data objects; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 1); map once accepted.",
|
|
298
893
|
"conditions": {
|
|
299
894
|
"usage_detail": "intra-layer structural"
|
|
300
895
|
}
|
|
301
896
|
},
|
|
302
|
-
"
|
|
303
|
-
"cbm_edge": "
|
|
897
|
+
"EXTENDS": {
|
|
898
|
+
"cbm_edge": "EXTENDS",
|
|
304
899
|
"dr_relationship": null,
|
|
305
900
|
"confidence": "high",
|
|
306
|
-
"description": "
|
|
901
|
+
"description": "Class or interface extension",
|
|
307
902
|
"usage": "traversal_only",
|
|
308
903
|
"dr_scope": "intra-layer",
|
|
309
904
|
"direction": "forward",
|
|
310
905
|
"conditions": {
|
|
311
906
|
"usage_detail": "intra-layer structural"
|
|
312
|
-
}
|
|
907
|
+
},
|
|
908
|
+
"implementation_note": "In the CBM binary only (0.10.2 and 0.12.1), not in its documented vocabulary or any observed graph; kept for forward compatibility. INHERITS is the edge CBM emits for class extension."
|
|
313
909
|
},
|
|
314
|
-
"
|
|
315
|
-
"cbm_edge": "
|
|
910
|
+
"OVERRIDE": {
|
|
911
|
+
"cbm_edge": "OVERRIDE",
|
|
316
912
|
"dr_relationship": null,
|
|
317
913
|
"confidence": "medium",
|
|
318
|
-
"description": "
|
|
914
|
+
"description": "Method override",
|
|
319
915
|
"usage": "traversal_only",
|
|
320
916
|
"dr_scope": "intra-layer",
|
|
321
917
|
"direction": "forward",
|
|
918
|
+
"implementation_note": "specializes between functions; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 2); map once accepted. Also Kustomize patches in infrastructure.",
|
|
322
919
|
"conditions": {
|
|
323
|
-
"usage_detail": "intra-layer
|
|
920
|
+
"usage_detail": "intra-layer structural"
|
|
324
921
|
}
|
|
325
922
|
},
|
|
326
|
-
"
|
|
327
|
-
"cbm_edge": "
|
|
923
|
+
"EMITS": {
|
|
924
|
+
"cbm_edge": "EMITS",
|
|
925
|
+
"dr_relationship": null,
|
|
926
|
+
"confidence": "medium",
|
|
927
|
+
"description": "A function emits on a channel",
|
|
928
|
+
"usage": "traversal_only",
|
|
929
|
+
"dr_scope": "intra-layer",
|
|
930
|
+
"direction": "forward",
|
|
931
|
+
"implementation_note": "triggers an application event from a function or component; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 3); map once accepted."
|
|
932
|
+
},
|
|
933
|
+
"RAISES": {
|
|
934
|
+
"cbm_edge": "RAISES",
|
|
935
|
+
"dr_relationship": null,
|
|
936
|
+
"confidence": "low",
|
|
937
|
+
"description": "A function raises an exception class",
|
|
938
|
+
"usage": "traversal_only",
|
|
939
|
+
"dr_scope": "intra-layer",
|
|
940
|
+
"direction": "forward",
|
|
941
|
+
"implementation_note": "Evidence for error-handling concerns; triggers an application event when the exception is a domain event, proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 3); map once accepted."
|
|
942
|
+
},
|
|
943
|
+
"THROWS": {
|
|
944
|
+
"cbm_edge": "THROWS",
|
|
945
|
+
"dr_relationship": null,
|
|
946
|
+
"confidence": "low",
|
|
947
|
+
"description": "A method throws an exception class",
|
|
948
|
+
"usage": "traversal_only",
|
|
949
|
+
"dr_scope": "intra-layer",
|
|
950
|
+
"direction": "forward",
|
|
951
|
+
"implementation_note": "Same as RAISES: evidence for error-handling concerns; the triggers reading waits on catalog addition 3."
|
|
952
|
+
},
|
|
953
|
+
"CONTAINS_FOLDER": {
|
|
954
|
+
"cbm_edge": "CONTAINS_FOLDER",
|
|
955
|
+
"dr_relationship": null,
|
|
956
|
+
"confidence": "high",
|
|
957
|
+
"description": "Folder contains folder",
|
|
958
|
+
"usage": "traversal_only",
|
|
959
|
+
"dr_scope": "intra-layer",
|
|
960
|
+
"direction": "forward",
|
|
961
|
+
"implementation_note": "composes between directory-level components; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 5); map once accepted."
|
|
962
|
+
},
|
|
963
|
+
"CONNECTS_TO": {
|
|
964
|
+
"cbm_edge": "CONNECTS_TO",
|
|
328
965
|
"dr_relationship": null,
|
|
329
966
|
"confidence": "medium",
|
|
330
|
-
"description": "
|
|
967
|
+
"description": "A workload addresses a Service",
|
|
968
|
+
"usage": "traversal_only",
|
|
969
|
+
"dr_scope": "intra-layer",
|
|
970
|
+
"direction": "forward",
|
|
971
|
+
"implementation_note": "depends-on from a node to a technology service; proposed to Context Studio's review queue as a catalog addition (docs/analyzers/CBM_MAPPING_INVENTORY.md, addition 9); map once accepted."
|
|
972
|
+
},
|
|
973
|
+
"DEFINES": {
|
|
974
|
+
"cbm_edge": "DEFINES",
|
|
975
|
+
"dr_relationship": null,
|
|
976
|
+
"confidence": "high",
|
|
977
|
+
"description": "A file defines a symbol",
|
|
331
978
|
"usage": "traversal_only",
|
|
332
979
|
"dr_scope": "intra-layer",
|
|
333
980
|
"direction": "forward",
|
|
981
|
+
"implementation_note": "Provenance: supplies source_reference.file for every element mapped from a symbol. Not a relationship between elements.",
|
|
334
982
|
"conditions": {
|
|
335
|
-
"usage_detail": "
|
|
983
|
+
"usage_detail": "provenance"
|
|
336
984
|
}
|
|
337
985
|
},
|
|
338
|
-
"
|
|
339
|
-
"cbm_edge": "
|
|
986
|
+
"DECORATES": {
|
|
987
|
+
"cbm_edge": "DECORATES",
|
|
340
988
|
"dr_relationship": null,
|
|
341
989
|
"confidence": "high",
|
|
342
|
-
"description": "
|
|
990
|
+
"description": "A decorator applies to a symbol",
|
|
343
991
|
"usage": "traversal_only",
|
|
344
992
|
"dr_scope": "intra-layer",
|
|
345
993
|
"direction": "forward",
|
|
994
|
+
"implementation_note": "Evidence: decorator names feed the Tier-0 rules (extraction-heuristics.json) and the card. Decorator is not an element.",
|
|
346
995
|
"conditions": {
|
|
347
|
-
"usage_detail": "
|
|
996
|
+
"usage_detail": "evidence"
|
|
348
997
|
}
|
|
349
998
|
},
|
|
350
|
-
"
|
|
351
|
-
"cbm_edge": "
|
|
999
|
+
"CONFIGURES": {
|
|
1000
|
+
"cbm_edge": "CONFIGURES",
|
|
352
1001
|
"dr_relationship": null,
|
|
353
1002
|
"confidence": "medium",
|
|
354
|
-
"description": "
|
|
1003
|
+
"description": "A symbol reads a config key, or a config key names a symbol",
|
|
355
1004
|
"usage": "traversal_only",
|
|
356
1005
|
"dr_scope": "intra-layer",
|
|
357
1006
|
"direction": "forward",
|
|
1007
|
+
"implementation_note": "Evidence for security and APM concerns (EnvVar is not an element).",
|
|
358
1008
|
"conditions": {
|
|
359
|
-
"usage_detail": "
|
|
1009
|
+
"usage_detail": "evidence"
|
|
360
1010
|
}
|
|
361
1011
|
},
|
|
362
|
-
"
|
|
363
|
-
"cbm_edge": "
|
|
1012
|
+
"CONTAINS_FILE": {
|
|
1013
|
+
"cbm_edge": "CONTAINS_FILE",
|
|
1014
|
+
"dr_relationship": null,
|
|
1015
|
+
"confidence": "high",
|
|
1016
|
+
"description": "Folder contains file",
|
|
1017
|
+
"usage": "traversal_only",
|
|
1018
|
+
"dr_scope": "intra-layer",
|
|
1019
|
+
"direction": "forward",
|
|
1020
|
+
"implementation_note": "Traversal only: the directory structure behind placement facts.",
|
|
1021
|
+
"conditions": {
|
|
1022
|
+
"usage_detail": "provenance"
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
"SEMANTICALLY_RELATED": {
|
|
1026
|
+
"cbm_edge": "SEMANTICALLY_RELATED",
|
|
364
1027
|
"dr_relationship": null,
|
|
365
1028
|
"confidence": "low",
|
|
366
|
-
"description": "
|
|
1029
|
+
"description": "Vocabulary-mismatch similarity (score >= 0.80)",
|
|
367
1030
|
"usage": "traversal_only",
|
|
368
1031
|
"dr_scope": "intra-layer",
|
|
369
1032
|
"direction": "forward",
|
|
1033
|
+
"implementation_note": "No DR counterpart; for Tier-0 clustering and duplicate detection.",
|
|
370
1034
|
"conditions": {
|
|
371
|
-
"usage_detail": "
|
|
1035
|
+
"usage_detail": "similarity"
|
|
372
1036
|
}
|
|
373
1037
|
},
|
|
374
|
-
"
|
|
375
|
-
"cbm_edge": "
|
|
1038
|
+
"SIMILAR_TO": {
|
|
1039
|
+
"cbm_edge": "SIMILAR_TO",
|
|
1040
|
+
"dr_relationship": null,
|
|
1041
|
+
"confidence": "low",
|
|
1042
|
+
"description": "MinHash near-clone",
|
|
1043
|
+
"usage": "traversal_only",
|
|
1044
|
+
"dr_scope": "intra-layer",
|
|
1045
|
+
"direction": "forward",
|
|
1046
|
+
"implementation_note": "No DR counterpart; for duplicate detection.",
|
|
1047
|
+
"conditions": {
|
|
1048
|
+
"usage_detail": "similarity"
|
|
1049
|
+
}
|
|
1050
|
+
},
|
|
1051
|
+
"FILE_CHANGES_WITH": {
|
|
1052
|
+
"cbm_edge": "FILE_CHANGES_WITH",
|
|
1053
|
+
"dr_relationship": null,
|
|
1054
|
+
"confidence": "low",
|
|
1055
|
+
"description": "Files that change together in history",
|
|
1056
|
+
"usage": "traversal_only",
|
|
1057
|
+
"dr_scope": "intra-layer",
|
|
1058
|
+
"direction": "forward",
|
|
1059
|
+
"implementation_note": "No DR counterpart; evidence for component boundaries.",
|
|
1060
|
+
"conditions": {
|
|
1061
|
+
"usage_detail": "history"
|
|
1062
|
+
}
|
|
1063
|
+
},
|
|
1064
|
+
"HAS_BRANCH": {
|
|
1065
|
+
"cbm_edge": "HAS_BRANCH",
|
|
1066
|
+
"dr_relationship": null,
|
|
1067
|
+
"confidence": "high",
|
|
1068
|
+
"description": "Git branch metadata",
|
|
1069
|
+
"usage": "traversal_only",
|
|
1070
|
+
"dr_scope": "intra-layer",
|
|
1071
|
+
"direction": "forward",
|
|
1072
|
+
"implementation_note": "Provenance for source_reference; not a relationship.",
|
|
1073
|
+
"conditions": {
|
|
1074
|
+
"usage_detail": "provenance"
|
|
1075
|
+
}
|
|
1076
|
+
},
|
|
1077
|
+
"REFERENCES_FILE": {
|
|
1078
|
+
"cbm_edge": "REFERENCES_FILE",
|
|
376
1079
|
"dr_relationship": null,
|
|
377
1080
|
"confidence": "medium",
|
|
378
|
-
"description": "
|
|
1081
|
+
"description": "Documentation references a file",
|
|
1082
|
+
"usage": "traversal_only",
|
|
1083
|
+
"dr_scope": "intra-layer",
|
|
1084
|
+
"direction": "forward",
|
|
1085
|
+
"implementation_note": "Evidence for descriptions and for Tier 2's upper-layer inference.",
|
|
1086
|
+
"conditions": {
|
|
1087
|
+
"usage_detail": "documentation"
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
"MENTIONS": {
|
|
1091
|
+
"cbm_edge": "MENTIONS",
|
|
1092
|
+
"dr_relationship": null,
|
|
1093
|
+
"confidence": "low",
|
|
1094
|
+
"description": "Documentation mentions a symbol",
|
|
379
1095
|
"usage": "traversal_only",
|
|
380
1096
|
"dr_scope": "intra-layer",
|
|
381
1097
|
"direction": "forward",
|
|
1098
|
+
"implementation_note": "Evidence for descriptions and for Tier 2's upper-layer inference.",
|
|
1099
|
+
"conditions": {
|
|
1100
|
+
"usage_detail": "documentation"
|
|
1101
|
+
}
|
|
1102
|
+
},
|
|
1103
|
+
"CROSS_HTTP_CALLS": {
|
|
1104
|
+
"cbm_edge": "CROSS_HTTP_CALLS",
|
|
1105
|
+
"dr_relationship": null,
|
|
1106
|
+
"confidence": "high",
|
|
1107
|
+
"description": "Cross-repository call or channel",
|
|
1108
|
+
"usage": "traversal_only",
|
|
1109
|
+
"dr_scope": "cross-layer",
|
|
1110
|
+
"direction": "caller_to_callee",
|
|
1111
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
1112
|
+
"conditions": {
|
|
1113
|
+
"usage_detail": "cross-model reference"
|
|
1114
|
+
}
|
|
1115
|
+
},
|
|
1116
|
+
"CROSS_GRPC_CALLS": {
|
|
1117
|
+
"cbm_edge": "CROSS_GRPC_CALLS",
|
|
1118
|
+
"dr_relationship": null,
|
|
1119
|
+
"confidence": "high",
|
|
1120
|
+
"description": "Cross-repository call or channel",
|
|
1121
|
+
"usage": "traversal_only",
|
|
1122
|
+
"dr_scope": "cross-layer",
|
|
1123
|
+
"direction": "caller_to_callee",
|
|
1124
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
382
1125
|
"conditions": {
|
|
383
|
-
"usage_detail": "
|
|
1126
|
+
"usage_detail": "cross-model reference"
|
|
1127
|
+
}
|
|
1128
|
+
},
|
|
1129
|
+
"CROSS_GRAPHQL_CALLS": {
|
|
1130
|
+
"cbm_edge": "CROSS_GRAPHQL_CALLS",
|
|
1131
|
+
"dr_relationship": null,
|
|
1132
|
+
"confidence": "high",
|
|
1133
|
+
"description": "Cross-repository call or channel",
|
|
1134
|
+
"usage": "traversal_only",
|
|
1135
|
+
"dr_scope": "cross-layer",
|
|
1136
|
+
"direction": "caller_to_callee",
|
|
1137
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
1138
|
+
"conditions": {
|
|
1139
|
+
"usage_detail": "cross-model reference"
|
|
1140
|
+
}
|
|
1141
|
+
},
|
|
1142
|
+
"CROSS_TRPC_CALLS": {
|
|
1143
|
+
"cbm_edge": "CROSS_TRPC_CALLS",
|
|
1144
|
+
"dr_relationship": null,
|
|
1145
|
+
"confidence": "high",
|
|
1146
|
+
"description": "Cross-repository call or channel",
|
|
1147
|
+
"usage": "traversal_only",
|
|
1148
|
+
"dr_scope": "cross-layer",
|
|
1149
|
+
"direction": "caller_to_callee",
|
|
1150
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
1151
|
+
"conditions": {
|
|
1152
|
+
"usage_detail": "cross-model reference"
|
|
1153
|
+
}
|
|
1154
|
+
},
|
|
1155
|
+
"CROSS_ASYNC_CALLS": {
|
|
1156
|
+
"cbm_edge": "CROSS_ASYNC_CALLS",
|
|
1157
|
+
"dr_relationship": null,
|
|
1158
|
+
"confidence": "high",
|
|
1159
|
+
"description": "Cross-repository call or channel",
|
|
1160
|
+
"usage": "traversal_only",
|
|
1161
|
+
"dr_scope": "cross-layer",
|
|
1162
|
+
"direction": "caller_to_callee",
|
|
1163
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
1164
|
+
"conditions": {
|
|
1165
|
+
"usage_detail": "cross-model reference"
|
|
1166
|
+
}
|
|
1167
|
+
},
|
|
1168
|
+
"CROSS_CHANNEL": {
|
|
1169
|
+
"cbm_edge": "CROSS_CHANNEL",
|
|
1170
|
+
"dr_relationship": null,
|
|
1171
|
+
"confidence": "high",
|
|
1172
|
+
"description": "Cross-repository call or channel",
|
|
1173
|
+
"usage": "traversal_only",
|
|
1174
|
+
"dr_scope": "cross-layer",
|
|
1175
|
+
"direction": "caller_to_callee",
|
|
1176
|
+
"implementation_note": "These are DR's qualified cross-model references (@model/layer.type.name in a references field), not relationships inside one model; mapped when federated extraction is built.",
|
|
1177
|
+
"conditions": {
|
|
1178
|
+
"usage_detail": "cross-model reference"
|
|
384
1179
|
}
|
|
385
1180
|
}
|
|
386
1181
|
},
|
|
@@ -517,10 +1312,10 @@
|
|
|
517
1312
|
"name": "datastore_detection",
|
|
518
1313
|
"description": "Patterns and conventions that identify datastore-related elements (tables, schemas, migrations)",
|
|
519
1314
|
"applies_to": [
|
|
520
|
-
"data-store.
|
|
521
|
-
"data-store.
|
|
522
|
-
"data-model.
|
|
523
|
-
"data-model.
|
|
1315
|
+
"data-store.collection",
|
|
1316
|
+
"data-store.field",
|
|
1317
|
+
"data-model.objectschema",
|
|
1318
|
+
"data-model.schemaproperty"
|
|
524
1319
|
],
|
|
525
1320
|
"parameters": {
|
|
526
1321
|
"patterns": [
|
|
@@ -541,8 +1336,331 @@
|
|
|
541
1336
|
"model"
|
|
542
1337
|
]
|
|
543
1338
|
},
|
|
544
|
-
"rule": "If element resides in datastore-related directories or files, or follows datastore naming conventions, identify as data-store or data-model
|
|
1339
|
+
"rule": "If element resides in datastore-related directories or files, or follows datastore naming conventions, identify it as a data-store collection or field, or a data-model object schema or schema property",
|
|
545
1340
|
"confidence_adjustment": 0.25
|
|
1341
|
+
},
|
|
1342
|
+
{
|
|
1343
|
+
"name": "tier0_generated_code",
|
|
1344
|
+
"description": "Symbols in generated client code are not elements",
|
|
1345
|
+
"rule": "An interface, type, enum or function in a generated file (*.gen.ts, client/core/) is generator output, not a modelled element; the published API it was generated from is",
|
|
1346
|
+
"parameters": {
|
|
1347
|
+
"tier0": {
|
|
1348
|
+
"labels": ["Interface", "Type", "Enum", "Function"],
|
|
1349
|
+
"when": {
|
|
1350
|
+
"file": "(\\.gen\\.[cm]?[jt]sx?$|(^|/)client/core/)"
|
|
1351
|
+
},
|
|
1352
|
+
"decide": "none",
|
|
1353
|
+
"confidence": "high"
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
},
|
|
1357
|
+
{
|
|
1358
|
+
"name": "tier0_test_case_annotation",
|
|
1359
|
+
"description": "A test-case annotation marks a test case",
|
|
1360
|
+
"applies_to": ["testing.testcasesketch"],
|
|
1361
|
+
"rule": "A method or function annotated as a test (JUnit @Test, @ParameterizedTest, @RepeatedTest, @TestFactory, @TestTemplate; a pytest mark) is one implemented test case, which the testing layer models as a test case sketch linked to it through source",
|
|
1362
|
+
"parameters": {
|
|
1363
|
+
"tier0": {
|
|
1364
|
+
"labels": ["Method", "Function"],
|
|
1365
|
+
"when": {
|
|
1366
|
+
"decorator": "^(Test|ParameterizedTest|RepeatedTest|TestFactory|TestTemplate|pytest\\.mark\\..+)$"
|
|
1367
|
+
},
|
|
1368
|
+
"decide": "testing.testcasesketch",
|
|
1369
|
+
"confidence": "high"
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
},
|
|
1373
|
+
{
|
|
1374
|
+
"name": "tier0_test_support_annotation",
|
|
1375
|
+
"description": "Test setup, fixtures and test configuration are not elements",
|
|
1376
|
+
"rule": "Setup and teardown methods (@BeforeEach, @AfterEach, @BeforeAll, @AfterAll), pytest fixtures and test-context annotations on classes (@SpringBootTest, @WebMvcTest, @DataJpaTest, @ExtendWith, @TestConfiguration) support test cases; the testing layer has no element for them",
|
|
1377
|
+
"parameters": {
|
|
1378
|
+
"tier0": {
|
|
1379
|
+
"labels": ["Class", "Method", "Function"],
|
|
1380
|
+
"when": {
|
|
1381
|
+
"decorator": "^(BeforeEach|AfterEach|BeforeAll|AfterAll|pytest\\.fixture|SpringBootTest|WebMvcTest|DataJpaTest|ExtendWith|TestConfiguration)$"
|
|
1382
|
+
},
|
|
1383
|
+
"decide": "none",
|
|
1384
|
+
"confidence": "high"
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
},
|
|
1388
|
+
{
|
|
1389
|
+
"name": "tier0_test_case_name",
|
|
1390
|
+
"description": "A test-named function in a test file is a test case",
|
|
1391
|
+
"applies_to": ["testing.testcasesketch"],
|
|
1392
|
+
"rule": "A function or method in a Python, Go, Java or Kotlin test file whose name follows that runner's convention (pytest and unittest test_*, JUnit 3 testX, Go TestX) is one implemented test case. JavaScript and TypeScript are left out: their cases are anonymous it() and test() callbacks, and a named testX method there is a helper.",
|
|
1393
|
+
"parameters": {
|
|
1394
|
+
"tier0": {
|
|
1395
|
+
"labels": ["Function", "Method"],
|
|
1396
|
+
"when": {
|
|
1397
|
+
"file": "^(?=.*\\.(py|go|java|kt)$)(?=.*((^|/)(tests?|__tests__|__fixtures__|fixtures?)/|(^|/)test_[^/]*\\.py$|(^|/)conftest\\.py$|_test\\.(go|py)$|\\.(test|spec)\\.[cm]?[jt]sx?$|Tests?\\.(java|kt)$))",
|
|
1398
|
+
"name": "^(test_|test[A-Z0-9]|Test[A-Z0-9_])"
|
|
1399
|
+
},
|
|
1400
|
+
"decide": "testing.testcasesketch",
|
|
1401
|
+
"confidence": "medium"
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
"name": "tier0_test_file",
|
|
1407
|
+
"description": "Other symbols in test files are test support, not elements",
|
|
1408
|
+
"rule": "A helper, fixture, setup method or test class in a test file (tests/ and fixtures/ directories, test_*.py, conftest.py, *_test.go, *.test.ts, *.spec.ts, *Tests.java) supports the test cases. The testing layer has no element for it, and the production code under test belongs to the layer it implements. Test cases themselves are caught by the two rules before this one; anonymous it() and test() callbacks never become cards.",
|
|
1409
|
+
"parameters": {
|
|
1410
|
+
"tier0": {
|
|
1411
|
+
"labels": ["Function", "Method", "Class"],
|
|
1412
|
+
"when": {
|
|
1413
|
+
"file": "((^|/)(tests?|__tests__|__fixtures__|fixtures?)/|(^|/)test_[^/]*\\.py$|(^|/)conftest\\.py$|_test\\.(go|py)$|\\.(test|spec)\\.[cm]?[jt]sx?$|Tests?\\.(java|kt)$)"
|
|
1414
|
+
},
|
|
1415
|
+
"decide": "none",
|
|
1416
|
+
"confidence": "medium"
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
},
|
|
1420
|
+
{
|
|
1421
|
+
"name": "tier0_component_props",
|
|
1422
|
+
"description": "A component's props type belongs to the component",
|
|
1423
|
+
"rule": "An interface or type named ...Props in a .tsx or .jsx file declares a UI component's inputs and is part of that component, not an element of its own",
|
|
1424
|
+
"parameters": {
|
|
1425
|
+
"tier0": {
|
|
1426
|
+
"labels": ["Interface", "Type"],
|
|
1427
|
+
"when": {
|
|
1428
|
+
"name": "Props$",
|
|
1429
|
+
"file": "\\.(tsx|jsx)$"
|
|
1430
|
+
},
|
|
1431
|
+
"decide": "none",
|
|
1432
|
+
"confidence": "high"
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
},
|
|
1436
|
+
{
|
|
1437
|
+
"name": "tier0_spring_data_repository",
|
|
1438
|
+
"description": "Repository interfaces are data-store access patterns",
|
|
1439
|
+
"applies_to": ["data-store.accesspattern"],
|
|
1440
|
+
"rule": "An interface or class extending a Spring Data style repository (JpaRepository, CrudRepository, Repository) declares how the store is queried",
|
|
1441
|
+
"parameters": {
|
|
1442
|
+
"tier0": {
|
|
1443
|
+
"labels": ["Interface", "Class"],
|
|
1444
|
+
"when": {
|
|
1445
|
+
"declaration": "\\bextends\\s+[\\w.]*Repository\\b"
|
|
1446
|
+
},
|
|
1447
|
+
"decide": "data-store.accesspattern",
|
|
1448
|
+
"confidence": "high"
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
},
|
|
1452
|
+
{
|
|
1453
|
+
"name": "tier0_repository_query",
|
|
1454
|
+
"description": "Query annotations mark data-store access patterns",
|
|
1455
|
+
"applies_to": ["data-store.accesspattern"],
|
|
1456
|
+
"rule": "A method annotated @Query or @Modifying is a declared store query",
|
|
1457
|
+
"parameters": {
|
|
1458
|
+
"tier0": {
|
|
1459
|
+
"labels": ["Method"],
|
|
1460
|
+
"when": {
|
|
1461
|
+
"decorator": "^(Query|Modifying)$"
|
|
1462
|
+
},
|
|
1463
|
+
"decide": "data-store.accesspattern",
|
|
1464
|
+
"confidence": "high"
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
},
|
|
1468
|
+
{
|
|
1469
|
+
"name": "tier0_route_handler",
|
|
1470
|
+
"description": "Route-mapping decorators mark the application function that implements an API operation",
|
|
1471
|
+
"applies_to": ["application.applicationfunction"],
|
|
1472
|
+
"rule": "A method or function decorated with a route mapping (@GetMapping, @RequestMapping, router.get, items_router.post, app.get, NestJS @Get, JAX-RS @GET, ...) is the application function that implements the route's API operation. The operation itself is the CBM Route node, and HANDLES links them as api.operation realizes application.applicationfunction.",
|
|
1473
|
+
"parameters": {
|
|
1474
|
+
"tier0": {
|
|
1475
|
+
"labels": ["Method", "Function"],
|
|
1476
|
+
"when": {
|
|
1477
|
+
"decorator": "^((Get|Post|Put|Patch|Delete|Request)Mapping|\\w*(router|app|api|bp|blueprint)\\.(get|post|put|patch|delete|head|options|route|api_route)|(Get|Post|Put|Patch|Delete|All|Head|Options)|(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS))$"
|
|
1478
|
+
},
|
|
1479
|
+
"decide": "application.applicationfunction",
|
|
1480
|
+
"confidence": "high"
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
},
|
|
1484
|
+
{
|
|
1485
|
+
"name": "tier0_controller",
|
|
1486
|
+
"description": "Controller annotations mark application interfaces",
|
|
1487
|
+
"applies_to": ["application.applicationinterface"],
|
|
1488
|
+
"rule": "A class annotated @Controller or @RestController is the application interface its routes are served through",
|
|
1489
|
+
"parameters": {
|
|
1490
|
+
"tier0": {
|
|
1491
|
+
"labels": ["Class"],
|
|
1492
|
+
"when": {
|
|
1493
|
+
"decorator": "^(Rest)?Controller$"
|
|
1494
|
+
},
|
|
1495
|
+
"decide": "application.applicationinterface",
|
|
1496
|
+
"confidence": "high"
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
"name": "tier0_persistent_entity",
|
|
1502
|
+
"description": "Persistence annotations mark data-model object schemas",
|
|
1503
|
+
"applies_to": ["data-model.objectschema"],
|
|
1504
|
+
"rule": "A class annotated @Entity, @Table, @MappedSuperclass, @Embeddable or @Document defines the shape of persisted data. Its table is a data-store collection the card builder derives (data-model.objectschema maps-to data-store.collection).",
|
|
1505
|
+
"parameters": {
|
|
1506
|
+
"tier0": {
|
|
1507
|
+
"labels": ["Class"],
|
|
1508
|
+
"when": {
|
|
1509
|
+
"decorator": "^(Entity|Table|MappedSuperclass|Embeddable|Document)$"
|
|
1510
|
+
},
|
|
1511
|
+
"decide": "data-model.objectschema",
|
|
1512
|
+
"confidence": "high"
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
},
|
|
1516
|
+
{
|
|
1517
|
+
"name": "tier0_sqlmodel_table",
|
|
1518
|
+
"description": "SQLModel table classes are object schemas mapped to a table",
|
|
1519
|
+
"applies_to": ["data-model.objectschema"],
|
|
1520
|
+
"rule": "A SQLModel class declared with table=True defines the shape of persisted data, like a JPA @Entity: it is a data-model object schema. Its table is a data-store collection that the card builder derives (data-model.objectschema maps-to data-store.collection), not the class itself.",
|
|
1521
|
+
"parameters": {
|
|
1522
|
+
"tier0": {
|
|
1523
|
+
"labels": ["Class"],
|
|
1524
|
+
"when": {
|
|
1525
|
+
"declaration": "\\btable\\s*=\\s*True\\b"
|
|
1526
|
+
},
|
|
1527
|
+
"decide": "data-model.objectschema",
|
|
1528
|
+
"confidence": "high"
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
},
|
|
1532
|
+
{
|
|
1533
|
+
"name": "tier0_sqlmodel_schema",
|
|
1534
|
+
"description": "SQLModel classes without a table are object schemas",
|
|
1535
|
+
"applies_to": ["data-model.objectschema"],
|
|
1536
|
+
"rule": "A class deriving directly from SQLModel without table=True defines a data shape (request, response or base schema)",
|
|
1537
|
+
"parameters": {
|
|
1538
|
+
"tier0": {
|
|
1539
|
+
"labels": ["Class"],
|
|
1540
|
+
"when": {
|
|
1541
|
+
"declaration": "\\(\\s*SQLModel\\s*\\)"
|
|
1542
|
+
},
|
|
1543
|
+
"decide": "data-model.objectschema",
|
|
1544
|
+
"confidence": "medium"
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
},
|
|
1548
|
+
{
|
|
1549
|
+
"name": "tier0_accessor",
|
|
1550
|
+
"description": "Accessor and binder annotations are implementation details",
|
|
1551
|
+
"rule": "A property accessor, serialization accessor or web-data binder hook is below element granularity",
|
|
1552
|
+
"parameters": {
|
|
1553
|
+
"tier0": {
|
|
1554
|
+
"labels": ["Method"],
|
|
1555
|
+
"when": {
|
|
1556
|
+
"decorator": "^(property|computed_field|XmlElement|XmlAttribute|JsonProperty|InitBinder)$"
|
|
1557
|
+
},
|
|
1558
|
+
"decide": "none",
|
|
1559
|
+
"confidence": "high"
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
"name": "tier0_spring_component",
|
|
1565
|
+
"description": "Spring component stereotypes mark application components",
|
|
1566
|
+
"applies_to": ["application.applicationcomponent"],
|
|
1567
|
+
"rule": "A class annotated @Component or @SpringBootApplication is a deployable application component",
|
|
1568
|
+
"parameters": {
|
|
1569
|
+
"tier0": {
|
|
1570
|
+
"labels": ["Class"],
|
|
1571
|
+
"when": {
|
|
1572
|
+
"decorator": "^(Component|SpringBootApplication)$"
|
|
1573
|
+
},
|
|
1574
|
+
"decide": "application.applicationcomponent",
|
|
1575
|
+
"confidence": "medium"
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
},
|
|
1579
|
+
{
|
|
1580
|
+
"name": "tier0_spring_service",
|
|
1581
|
+
"description": "Spring service stereotype narrows to service or component",
|
|
1582
|
+
"applies_to": [
|
|
1583
|
+
"application.applicationservice",
|
|
1584
|
+
"application.applicationcomponent"
|
|
1585
|
+
],
|
|
1586
|
+
"rule": "A class annotated @Service exposes application behaviour; it is the service or the component providing it",
|
|
1587
|
+
"parameters": {
|
|
1588
|
+
"tier0": {
|
|
1589
|
+
"labels": ["Class"],
|
|
1590
|
+
"when": {
|
|
1591
|
+
"decorator": "^Service$"
|
|
1592
|
+
},
|
|
1593
|
+
"narrow": [
|
|
1594
|
+
"application.applicationservice",
|
|
1595
|
+
"application.applicationcomponent"
|
|
1596
|
+
],
|
|
1597
|
+
"confidence": "medium"
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
"name": "tier0_ui_library",
|
|
1603
|
+
"description": "Shared UI library directories hold library components",
|
|
1604
|
+
"applies_to": ["ux.librarycomponent", "ux.actioncomponent"],
|
|
1605
|
+
"rule": "A component in a shared UI library directory (components/ui, packages/*/ui, design-system) is a reusable library component or a single action trigger, not a placed view",
|
|
1606
|
+
"parameters": {
|
|
1607
|
+
"tier0": {
|
|
1608
|
+
"labels": ["Function", "Module", "Class"],
|
|
1609
|
+
"when": {
|
|
1610
|
+
"file": "(^|/)(components/ui|packages/[^/]+/ui|design-system|ui-kit)/[^/]+\\.(tsx|jsx|vue|svelte)$"
|
|
1611
|
+
},
|
|
1612
|
+
"narrow": ["ux.librarycomponent", "ux.actioncomponent"],
|
|
1613
|
+
"confidence": "medium"
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
},
|
|
1617
|
+
{
|
|
1618
|
+
"name": "tier0_file_route",
|
|
1619
|
+
"description": "File-based route modules are views or routes",
|
|
1620
|
+
"applies_to": [
|
|
1621
|
+
"ux.view",
|
|
1622
|
+
"ux.subview",
|
|
1623
|
+
"navigation.route",
|
|
1624
|
+
"navigation.navigationgraph"
|
|
1625
|
+
],
|
|
1626
|
+
"rule": "A module in a file-based routing directory (routes/ or pages/, or a Next.js app/ page, layout or route file) is reached by navigation: a view, a subview placed in a layout, or the route itself",
|
|
1627
|
+
"parameters": {
|
|
1628
|
+
"tier0": {
|
|
1629
|
+
"labels": ["Function", "Module", "Class"],
|
|
1630
|
+
"when": {
|
|
1631
|
+
"file": "((^|/)(src/)?(routes|pages)/.+|(^|/)app/(.+/)?(page|layout|route|template|loading|error|not-found|default))\\.(tsx|jsx|vue|svelte)$"
|
|
1632
|
+
},
|
|
1633
|
+
"narrow": [
|
|
1634
|
+
"ux.view",
|
|
1635
|
+
"ux.subview",
|
|
1636
|
+
"navigation.route",
|
|
1637
|
+
"navigation.navigationgraph"
|
|
1638
|
+
],
|
|
1639
|
+
"confidence": "medium"
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
},
|
|
1643
|
+
{
|
|
1644
|
+
"name": "tier0_interface_default",
|
|
1645
|
+
"description": "Other interfaces are application data objects or contracts",
|
|
1646
|
+
"applies_to": [
|
|
1647
|
+
"application.dataobject",
|
|
1648
|
+
"application.applicationinterface",
|
|
1649
|
+
"application.applicationevent"
|
|
1650
|
+
],
|
|
1651
|
+
"rule": "Any interface, type alias, enum or trait no earlier rule decided is an in-code data structure or contract: an application data object, application interface or application event (published schemas are data-model, but an in-code interface is not a published schema; design charter, 2026-10-25 relabelling); the classifier chooses, or says none",
|
|
1652
|
+
"parameters": {
|
|
1653
|
+
"tier0": {
|
|
1654
|
+
"labels": ["Interface", "Type", "Enum", "Trait"],
|
|
1655
|
+
"when": {},
|
|
1656
|
+
"narrow": [
|
|
1657
|
+
"application.dataobject",
|
|
1658
|
+
"application.applicationinterface",
|
|
1659
|
+
"application.applicationevent"
|
|
1660
|
+
],
|
|
1661
|
+
"confidence": "medium"
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
546
1664
|
}
|
|
547
1665
|
],
|
|
548
1666
|
"inference_rules": [
|
|
@@ -589,7 +1707,7 @@
|
|
|
589
1707
|
"metadata": {
|
|
590
1708
|
"version": "1.0",
|
|
591
1709
|
"created_at": "2026-04-17T00:00:00Z",
|
|
592
|
-
"updated_at": "2026-
|
|
1710
|
+
"updated_at": "2026-10-29T00:00:00Z"
|
|
593
1711
|
}
|
|
594
1712
|
}
|
|
595
1713
|
}
|