devops folders consolidate
This commit is contained in:
@@ -305,11 +305,33 @@ public interface IFeedConnector {
|
||||
### 5.2 Linkset correlation
|
||||
|
||||
1. **Queue** — observation deltas enqueue correlation jobs keyed by `(tenant, vulnerabilityId, productKey)` candidates derived from identifiers + alias graph.
|
||||
2. **Canonical grouping** — builder resolves aliases using Concelier’s alias store and deterministic heuristics (vendor > distro > cert), deriving normalized product keys (purl preferred) and confidence scores.
|
||||
2. **Canonical grouping** — builder resolves aliases using Concelier's alias store and deterministic heuristics (vendor > distro > cert), deriving normalized product keys (purl preferred) and confidence scores.
|
||||
3. **Linkset materialization** — `advisory_linksets` documents store sorted observation references, alias sets, product keys, range metadata, and conflict payloads. Writes are idempotent; unchanged hashes skip updates.
|
||||
4. **Conflict detection** — builder emits structured conflicts (`severity-mismatch`, `affected-range-divergence`, `reference-clash`, `alias-inconsistency`, `metadata-gap`). Conflicts carry per-observation values for explainability.
|
||||
4. **Conflict detection** — builder emits structured conflicts with typed severities (Hard/Soft/Info). Conflicts carry per-observation values for explainability.
|
||||
5. **Event emission** — `advisory.linkset.updated@1` summarizes deltas (`added`, `removed`, `changed` observation IDs, conflict updates, confidence changes) and includes a canonical hash for replay validation.
|
||||
|
||||
#### Correlation Algorithm (v2)
|
||||
|
||||
The v2 correlation algorithm (see `linkset-correlation-v2.md`) replaces intersection-based scoring with graph-based connectivity and adds new signals:
|
||||
|
||||
| Signal | Weight | Description |
|
||||
|--------|--------|-------------|
|
||||
| Alias connectivity | 0.30 | LCC ratio from bipartite graph (transitive bridging) |
|
||||
| Alias authority | 0.10 | Scope hierarchy (CVE > GHSA > VND > DST) |
|
||||
| Package coverage | 0.20 | Pairwise + IDF-weighted overlap |
|
||||
| Version compatibility | 0.10 | Equivalent/Overlapping/Disjoint classification |
|
||||
| CPE match | 0.10 | Exact or vendor/product overlap |
|
||||
| Patch lineage | 0.10 | Shared commit SHA from fix references |
|
||||
| Reference overlap | 0.05 | Positive-only URL matching |
|
||||
| Freshness | 0.05 | Fetch timestamp spread |
|
||||
|
||||
Conflict penalties are typed:
|
||||
- **Hard** (`distinct-cves`, `disjoint-version-ranges`): -0.30 to -0.40
|
||||
- **Soft** (`affected-range-divergence`, `severity-mismatch`): -0.05 to -0.10
|
||||
- **Info** (`reference-clash` on simple disjoint sets): no penalty
|
||||
|
||||
Configure via `concelier:correlation:version` (v1 or v2) and optional weight overrides.
|
||||
|
||||
### 5.3 Event contract
|
||||
|
||||
| Event | Schema | Notes |
|
||||
@@ -317,7 +339,7 @@ public interface IFeedConnector {
|
||||
| `advisory.observation.updated@1` | `events/advisory.observation.updated@1.json` | Fired on new or superseded observations. Includes `observationId`, source metadata, `linksetSummary` (aliases/purls), supersedes pointer (if any), SHA-256 hash, and `traceId`. |
|
||||
| `advisory.linkset.updated@1` | `events/advisory.linkset.updated@1.json` | Fired when correlation changes. Includes `linksetId`, `key{vulnerabilityId, productKey, confidence}`, observation deltas, conflicts, `updatedAt`, and canonical hash. |
|
||||
|
||||
Events are emitted via NATS (primary) and Valkey Stream (fallback). Consumers acknowledge idempotently using the hash; duplicates are safe. Offline Kit captures both topics during bundle creation for air-gapped replay.
|
||||
Events are emitted via Valkey Streams. Consumers acknowledge idempotently using the hash; duplicates are safe. Offline Kit captures event streams during bundle creation for air-gapped replay.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user