VexLens Operations Runbook

VexLens provides VEX consensus computation across multiple issuer sources. This runbook covers deployment, configuration, operations, and troubleshooting.

1. Service scope

VexLens computes deterministic consensus over VEX (Vulnerability Exploitability eXchange) statements from multiple issuers. Operations owns:

Related documentation:

2. Contacts & tooling

AreaOwner(s)Escalation
VexLens serviceVEX Lens Guild#vex-lens-ops, on-call rotation
Issuer DirectoryIssuer Directory Guild#issuer-directory
Policy Engine integrationPolicy Guild#policy-engine
Offline KitOffline Kit Guild#offline-kit

Primary tooling:

3. Configuration

3.1 Options reference

Configure via vexlens.yaml or environment variables with VEXLENS_ prefix:

VexLens:
  Storage:
    Driver: postgres           # "memory" for testing, "postgres" for production
    PostgresConnectionString: "Host=postgres;Database=stellaops_platform;Username=stellaops;Password=..."
    ProjectionRetentionDays: 365
    EventRetentionDays: 90
    CommandTimeoutSeconds: 30

  Trust:
    AuthoritativeWeight: 1.0
    TrustedWeight: 0.8
    KnownWeight: 0.5
    UnknownWeight: 0.3
    UntrustedWeight: 0.1
    SignedMultiplier: 1.2
    FreshnessDecayDays: 30
    MinFreshnessFactor: 0.5
    JustifiedNotAffectedBoost: 1.1
    FixedStatusBoost: 1.05

  Consensus:
    DefaultMode: WeightedVote  # HighestWeight, WeightedVote, Lattice, AuthoritativeFirst
    MinimumWeightThreshold: 0.1
    ConflictThreshold: 0.3
    RequireJustificationForNotAffected: false
    MaxStatementsPerComputation: 100
    EnableConflictDetection: true
    EmitEvents: true

  Normalization:
    EnabledFormats:
      - OpenVEX
      - CSAF
      - CycloneDX
    StrictMode: false
    MaxDocumentSizeBytes: 10485760   # 10 MB
    MaxStatementsPerDocument: 10000

  AirGap:
    SealedMode: false
    BundlePath: /var/lib/stellaops/vex-bundles
    VerifyBundleSignatures: true
    AllowedBundleSources: []
    ExportFormat: jsonl

  Telemetry:
    MetricsEnabled: true
    TracingEnabled: true
    MeterName: StellaOps.VexLens
    ActivitySourceName: StellaOps.VexLens

3.2 Environment variable overrides

VEXLENS_STORAGE__DRIVER=postgres
VEXLENS_STORAGE__POSTGRESCONNECTIONSTRING="Host=localhost;Database=stellaops_platform;Username=stellaops;Password=..."
VEXLENS_CONSENSUS__DEFAULTMODE=WeightedVote
VEXLENS_AIRGAP__SEALEDMODE=true

3.3 Consensus mode selection

ModeUse case
HighestWeightSingle authoritative source preferred
WeightedVoteDemocratic consensus from multiple sources
LatticeFormal lattice join (most conservative)
AuthoritativeFirstShort-circuit on authoritative issuer

4. Monitoring & SLOs

Key metrics (exposed by VexLensMetrics):

MetricSLO / AlertNotes
vexlens.consensus.duration_secondsp95 < 500msPer-computation latency
vexlens.consensus.conflicts_totalMonitor trendConflicts by reason
vexlens.consensus.confidenceavg > 0.7Low confidence indicates issuer gaps
vexlens.normalization.duration_secondsp95 < 200msPer-document normalization
vexlens.normalization.errors_totalAlert on spikeBy format
vexlens.trust.weight_valueDistributionTrust weight distribution
vexlens.projection.query_duration_secondsp95 < 100msProjection lookups

Dashboards must include:

Alerts (Alertmanager):

5. Routine operations

5.1 Daily checklist

5.2 Weekly tasks

5.3 Monthly tasks

6. Offline operations

6.1 Bundle export

# Export consensus projections to offline bundle
stella vex consensus export \
  --format jsonl \
  --output /var/lib/stellaops/vex-bundles/consensus-2025-01.jsonl \
  --manifest /var/lib/stellaops/vex-bundles/manifest.json \
  --sign

# Verify bundle integrity
stella vex consensus verify \
  --bundle /var/lib/stellaops/vex-bundles/consensus-2025-01.jsonl \
  --manifest /var/lib/stellaops/vex-bundles/manifest.json

6.2 Bundle import (air-gapped)

# Enable sealed mode
export VEXLENS_AIRGAP__SEALEDMODE=true
export VEXLENS_AIRGAP__BUNDLEPATH=/var/lib/stellaops/vex-bundles

# Import bundle
stella vex consensus import \
  --bundle /var/lib/stellaops/vex-bundles/consensus-2025-01.jsonl \
  --verify-signatures

# Verify import
stella vex consensus status

6.3 Air-gap verification

  1. Confirm VEXLENS_AIRGAP__SEALEDMODE=true in environment.
  2. Verify no external network calls in service logs.
  3. Check bundle manifest hashes match imported data.
  4. Run determinism check on imported projections.

7. Troubleshooting

7.1 High conflict rates

Symptoms: vexlens.consensus.conflicts_total spiking.

Investigation:

  1. Check conflict breakdown by reason in dashboard.
  2. Identify issuers with conflicting statements.
  3. Review issuer trust tiers and weights.

Resolution:

7.2 Normalization failures

Symptoms: vexlens.normalization.errors_total increasing.

Investigation:

  1. Check error logs for specific format failures.
  2. Identify malformed documents in input stream.
  3. Validate document against format schema.

Resolution:

7.3 Low consensus confidence

Symptoms: Average confidence below 0.5.

Investigation:

  1. Check issuer coverage for affected vulnerabilities.
  2. Review trust weight distribution.
  3. Identify missing or untrusted issuers.

Resolution:

7.4 Projection storage growth

Symptoms: Storage usage increasing beyond capacity.

Investigation:

  1. Check MaxHistoryEntries setting.
  2. Review projection count and history depth.
  3. Identify high-churn vulnerability/product pairs.

Resolution:

8. Recovery procedures

8.1 Storage failover

  1. Stop VexLens service instances.
  2. Switch storage connection to replica.
  3. Verify connectivity with health check.
  4. Restart service instances.
  5. Monitor for consensus recomputation.

8.2 Issuer directory sync

  1. Export current issuer registry backup.
  2. Resync from authoritative issuer directory source.
  3. Verify issuer fingerprints and trust tiers.
  4. Restart VexLens to reload issuer cache.

8.3 Consensus recomputation

  1. Trigger recomputation for affected vulnerability/product pairs.
  2. Monitor recomputation progress in logs.
  3. Verify consensus outcomes match expected state.
  4. Emit status change events if outcomes differ.

9. Evidence locations