Trust Lattice Operations Runbook
Version: 1.2.0 Last Updated: 2026-05-31 Audience: Operations and Support teams
This runbook is the operator-facing guide for running the Stella Ops Trust Lattice — the VEX claim-scoring framework that turns advisory and VEX evidence into explainable, deterministic verdicts. It covers monitoring, configuration, common operations, and emergency procedures. For symptom-driven diagnosis see the companion Trust Lattice Troubleshooting Guide; for the design contract see the module dossier docs/modules/excititor/trust-lattice.md.
Reconciliation note (2026-05-30, re-verified 2026-05-31): This runbook was reconciled against
src/ground truth. Several command verbs, metric names, and environment variables described in the 1.0 draft were aspirational and are not implemented in the current code. They are flagged inline asNOT IMPLEMENTEDor replaced with the real surface so operators do not paste commands that fail. Trust-vector scoring, claim merging, the policy gates, the signed verdict manifest, and trust calibration all exist in source and are documented accurately below.The 2026-05-31 deep pass corrected several errors the 1.1 reconciliation introduced or missed: (1) the
.sampleconfig templates live underdevops/etc/, not a (non-existent) rootetc/; (2) a top-levelstella verdictcommand does exist (verify/list/push/rationale), and astella gategroup exists for CI/CD gate evaluation — the 1.1 note that implied neither existed was wrong; (3) the calibration audit tables use schemaexcititorwith tablecalibration_adjustments(per001_initial_schema.sql/ExcititorDbContext), not theexcititor_calibrationschema /trust_vector_adjustmentstable named in the YAML sample’sstorage:block; (4) source paths now include the real__Libraries/segment. The authoritative module dossier isdocs/modules/excititor/trust-lattice.md.
1. Overview
The Trust Lattice is a VEX claim scoring framework that produces explainable, deterministic verdicts. This runbook covers operational procedures for monitoring, troubleshooting, and maintaining the system.
The scoring core (trust vectors, scorers, claim-score merge, and calibration) lives in StellaOps.Excititor.Core, which after the module consolidation is housed under src/Concelier/__Libraries/StellaOps.Excititor.Core. Runtime VEX normalization, signature verification, and consensus projection are performed by VexLens (src/VexLens). The policy gates that enforce trust thresholds live in StellaOps.Policy (src/Policy/__Libraries/StellaOps.Policy), and signed verdict manifests are produced and replay-verified by Authority (src/Authority/__Libraries/StellaOps.Authority.Core/Verdicts).
2. System Components
Source of truth verified against
src/on 2026-05-30. “Excititor” is no longer a standalone service directory; its core libraries are consolidated undersrc/Concelier/__Libraries/StellaOps.Excititor.*.
| Component | Module (source location) | Purpose |
|---|---|---|
TrustVector | Excititor core (src/Concelier/__Libraries/StellaOps.Excititor.Core/TrustVector) | 3-component trust scoring — Provenance, Coverage, Replayability (P/C/R) |
ClaimScoreMerger | Excititor core (Lattice/ClaimScoreMerger.cs) and Policy (src/Policy/__Libraries/StellaOps.Policy/TrustLattice/ClaimScoreMerger.cs) | Merge scored claims into a winning status + confidence |
| Policy gates | Policy (src/Policy/__Libraries/StellaOps.Policy/Gates, .../StellaOps.Policy/TrustLattice) | Enforce trust thresholds (see §6.1 for the gate set) |
VerdictManifest | Authority (src/Authority/__Libraries/StellaOps.Authority.Core/Verdicts) | Build, sign, store, and replay-verify deterministic verdicts |
TrustVectorCalibrator / TrustCalibrationService | Excititor core (Calibration/) | Adjust trust vectors over time from empirical feedback |
| VEX normalization & consensus | VexLens (src/VexLens) | Normalize CSAF/CycloneDX/OpenVEX, verify signatures, compute consensus projections |
Scopes (from StellaOpsScopes.cs): read paths use vex:read; VEX provider ingestion/review uses vex.admin; raw VEX ingest uses vex:ingest. Policy-gate authoring and runs use the policy:* family (policy:read, policy:author, policy:run, etc.). There is no dedicated trustlattice:* or calibration:* scope — calibration and gate tuning are gated through vex.admin / policy:*.
3. Monitoring
3.1 Key Metrics
Reconciled 2026-05-30. The
trustlattice_*,policy_gate_failures_total,verdict_manifest_replay_failures, andcalibration_drift_percentmetric names from the 1.0 draft are NOT IMPLEMENTED — nosrc/code emits them. The metrics actually exported today are listed below. Where a draft metric has no real counterpart it is flagged as a roadmap item rather than removed, so the dashboard backlog stays visible.
Emitted today (verified in source):
| Metric (meter) | Source | Description |
|---|---|---|
vexlens.consensus.computed_total, vexlens.consensus.conflicts_total, vexlens.consensus.confidence, vexlens.consensus.duration_seconds (meter StellaOps.VexLens) | src/VexLens/.../Observability/VexLensMetrics.cs | Consensus computations, conflict counts, confidence distribution, latency |
vexlens.trust.weights_computed_total, vexlens.trust.weight_value, vexlens.trust.computation_duration_seconds | VexLens | Trust-weight computation volume, value distribution, latency |
vexlens.signature.verified_total, vexlens.signature.failures_total, vexlens.signature.duration_seconds | VexLens | Signature verification outcomes/latency |
excititor_vex_signature_verification_total, excititor_vex_signature_verification_latency_seconds, excititor_vex_signature_cache_hits_total, excititor_vex_issuer_lookup_total (meter StellaOps.Excititor.Verification) | src/Concelier/__Libraries/StellaOps.Excititor.Core/Verification/VexVerificationMetrics.cs | VEX signature verification + issuer lookups |
analysis.vexgate.results, analysis.vexgate.summary, analysis.vexgate.bypassed, analysis.vexgate.policy.version | Scanner VEX gate | Per-scan VEX gate evaluation results and bypass counts |
Draft metrics NOT IMPLEMENTED (roadmap — do not alert on these yet):
| Draft metric | Status |
|---|---|
trustlattice_score_latency_p95 | NOT IMPLEMENTED — nearest live signal: vexlens.trust.computation_duration_seconds |
trustlattice_merge_conflicts_total | NOT IMPLEMENTED — nearest live signal: vexlens.consensus.conflicts_total |
policy_gate_failures_total | NOT IMPLEMENTED as a named counter — derive from analysis.vexgate.results / gate evaluation logs |
verdict_manifest_replay_failures | NOT IMPLEMENTED — verdict replay runs through VerdictReplayVerifier (Authority) but does not export this counter |
calibration_drift_percent | NOT IMPLEMENTED — calibration adjustments are persisted to the excititor.calibration_adjustments table (verified in 001_initial_schema.sql / ExcititorDbContext), not exported as a gauge |
3.2 Dashboards
The Grafana dashboard UID
trustlatticeand the PromQL queries below reference the NOT IMPLEMENTED draft metrics from §3.1; they will not return data against current builds. Retained as the dashboard backlog. Build live dashboards from the emittedvexlens.*/excititor_vex_*/analysis.vexgate.*families.
- Grafana:
https://<grafana>/d/trustlattice(dashboard not yet provisioned) - Prometheus queries (draft — metrics not yet emitted):
# Average claim score by source class — NOT IMPLEMENTED (no trustlattice_claim_score series) avg(trustlattice_claim_score) by (source_class) # Gate failure rate — NOT IMPLEMENTED (no policy_gate_failures_total series) rate(policy_gate_failures_total[5m]) # Confidence distribution — use the live VexLens series instead: histogram_quantile(0.5, sum(rate(vexlens_consensus_confidence_bucket[5m])) by (le))
3.3 Log Queries
Key log entries (Loki/ELK). The excititor app label corresponds to the StellaOps.Excititor.WebService deployment; consensus events are also emitted by the vexlens deployment:
# Consensus / claim scoring (VexLens log events: ConsensusCompleted, ConflictDetected)
{app="vexlens"} |= "Consensus"
# VEX signature verification
{app="excititor"} |= "verification"
# Gate evaluation (Policy)
{app="policy"} |= "gate"
# Verdict replay verification (Authority — VerdictReplayVerifier)
{app="authority"} |= "replay"
4. Common Operations
Reconciled 2026-05-30. The
stella trustvector,stella verdict,stella gates, andstella calibrationcommand groups from the 1.0 draft do NOT exist in the CLI (src/Cli/StellaOps.Cli). The real, verified verbs are shown below. Trust-vector defaults are configured via file (see §6), not via a CLI mutation command. Calibration runs as a scheduled service epoch, not an ad-hoc CLI invocation.
4.1 Viewing VEX Consensus and Trust Decisions
# List VEX consensus decisions (real command — stella vex consensus list)
stella vex consensus list --vuln-id CVE-2025-12345 --status not_affected
# Show detailed consensus incl. quorum, evidence, rationale, signature status
stella vex consensus show CVE-2025-12345 <product-key>
The draft
stella trustvector list --source-class vendoris NOT IMPLEMENTED. Default trust vectors per source classification are defined indevops/etc/trust-lattice.yaml.sample(§6.1) and in code defaults (DefaultTrustVectors.GetDefault(provider.Kind), consumed byTrustCalibrationService). There is no REST endpoint at/api/v1/trustlattice/vectors.
4.2 Inspecting a Verdict
# Top-level verdict command group (verified in VerdictCommandGroup.cs):
stella verdict verify <reference> [--decision pass|warn|block] [--strict] [--verify-uncertainty]
stella verdict list <reference> # list verdict attestations for an image
stella verdict push <reference> -f <dsse-envelope.json>
stella verdict rationale <finding-id> # 4-line rationale (Evidence/Policy/Attestations/Decision)
# Manage VEX decisions (DSSE-signed, Rekor transparency) — stella decision
stella decision --help
# Deterministic verdict replay (Authority VerdictReplayVerifier surface):
stella replay --help # "Replay scans from run manifests and compare verdicts"
stella evidence replay --help # "Deterministic verdict replay."
stella score replay --help # "Replay a score computation for a scan"
Corrected 2026-05-31. A top-level
stella verdictcommand group does exist (VerdictCommandGroup.cs) with the subcommandsverify,list,push, andrationaleshown above — the earlier 1.1 note that claimed there was no top-levelverdictcommand was wrong. What is genuinely NOT IMPLEMENTED are the specific draft verbsstella verdict show <id>andstella verdict replay <id>(noshowsubcommand; replay lives under thereplay/evidence replay/score replaygroups, not underverdict). Verdict manifests are built and replay-verified inside Authority (src/Authority/__Libraries/StellaOps.Authority.Core/Verdicts,VerdictReplayVerifier); thedecisiongroup manages signed VEX decisions. CLI telemetry uses activity namescli.verdict.list,cli.verdict.verify,cli.verdict.push, andcli.verdict.rationale.
4.3 Viewing Gate Configuration
# Gate *configuration* is file-driven, not a CLI query.
# Inspect the active policy-gates config (deployed copy of the sample):
cat policy-gates.yaml # template: devops/etc/policy-gates.yaml.sample
# A `stella gate` command group DOES exist, but for CI/CD gate *evaluation*,
# not for printing gate config (GateCommandGroup.cs):
stella gate evaluate --help # run release gates in a CI pipeline
stella gate status --help # query gate status
stella gate score --help # score-based gate evaluation
Corrected 2026-05-31. The draft
stella gates list/stella gates showverbs (pluralgates, for reading config) are NOT IMPLEMENTED. There is, however, a realstella gate(singular) command group for CI/CD gate evaluation withevaluate,status, andscoresubcommands (GateCommandGroup.cs) — it does not list or print the gate-config file. Gate definitions, thresholds, and per-environment values live in the deployedpolicy-gates.yaml(template:devops/etc/policy-gates.yaml.sample). See §6.1 for the full gate set.
4.4 Triggering Manual Calibration
The draft
stella calibration run/historyverbs are NOT IMPLEMENTED. Trust calibration is performed byTrustCalibrationServiceon a scheduled epoch (defaultintervalDays: 30,minimumSamples: 100— seedevops/etc/excititor-calibration.yaml.sample). Calibration manifests and adjustments are persisted to theexcititorschema for audit:excititor.calibration_manifests,excititor.calibration_adjustments, andexcititor.source_trust_vectors(verified inStellaOps.Excititor.Persistence/Migrations/001_initial_schema.sqland theExcititorDbContexttable mappings). Caveat: the shipped.samplestorage:block names aexcititor_calibrationschema and atrust_vector_adjustmentstable — those names do not match the actual migration/EF mappings (schemaexcititor, tablecalibration_adjustments); trust the migration, not the sample. There is no ad-hoc CLI trigger; tuning is done by editing the calibration config and restarting the worker, or by togglingcalibration.enabled.
5. Emergency Procedures
Reconciled 2026-05-30. Steps below were rewritten to use real commands and live signals. The
stella vex source status,stella verdict list/diff, andstella calibration freeze/history/rollback/unfreezeverbs are NOT IMPLEMENTED and have been replaced with file/DB/service procedures that work against current builds.
5.1 High Gate Failure Rate
Symptoms:
- Rising gate-rejection volume in
analysis.vexgate.results(the namedpolicy_gate_failures_totalcounter is NOT IMPLEMENTED — use vexgate results and gate evaluation logs) - Many builds failing due to low confidence
Steps:
Check whether a VEX source is stale or unavailable. Inspect VEX consensus for the affected source rather than a nonexistent
vex source statusverb:stella vex consensus list --status under_investigation --limit 20If a source is stale, consider a temporary threshold reduction in the deployed gate config (template:
devops/etc/policy-gates.yaml.sample):# deployed policy-gates.yaml gates: minimumConfidence: thresholds: production: 0.60 # Reduced from 0.75 (sample default)Restart the Policy Engine to apply changes
Monitor and restore the threshold once the source recovers
5.2 Verdict Replay Failures
Symptoms:
- Verdict replay mismatches reported by Authority’s
VerdictReplayVerifier(theverdict_manifest_replay_failurescounter is NOT IMPLEMENTED — detect via Authority replay logs / audit checks) - Audit compliance check failures
Steps:
Re-run a deterministic verdict replay through the supported CLI surface:
stella replay --help # replay scans from run manifests, compare verdicts stella evidence replay --help # deterministic verdict replayCompare original vs replayed inputs.
VerdictReplayVerifiercompares the recordedVerdictManifestinputs against a fresh evaluation; surface the diff through the replay command output (there is nostella verdict diff).Common causes:
- VEX document modified after the verdict was sealed
- Clock drift during evaluation
- Policy configuration changed between seal and replay
For clock drift, verify NTP synchronization:
timedatectl status
5.3 Trust Vector Drift Emergency
Symptoms:
- Large/sudden trust-vector adjustments (the
calibration_drift_percentgauge is NOT IMPLEMENTED — inspect theexcititor.calibration_adjustmentstable and calibration manifests instead) - Sudden confidence changes across many assets
Steps:
Freeze calibration by disabling it in the deployed calibration config and restarting the worker (there is no
stella calibration freezeverb):# deployed excititor-calibration.yaml (template: devops/etc/excititor-calibration.yaml.sample) calibration: enabled: falseInvestigate recent calibration epochs from the audit tables. The actual schema is
excititor(NOTexcititor_calibration) and the adjustments table iscalibration_adjustments(NOTtrust_vector_adjustments); it has no timestamp column, so order adjustments via the manifest epoch:-- excititor schema (per 001_initial_schema.sql) SELECT * FROM excititor.calibration_manifests ORDER BY epoch_number DESC LIMIT 5; SELECT a.* FROM excititor.calibration_adjustments a JOIN excititor.calibration_manifests m ON m.manifest_id = a.manifest_id ORDER BY m.epoch_number DESC LIMIT 50;If false-positive rate increased, rely on the built-in rollback: the calibration config exposes
rollback.enabledwith adegradationThreshold(default 10%) andevaluationWindowDays(default 7). There is no manualstella calibration rollbackverb — recover a prior epoch via PostgreSQL snapshot restore if automatic rollback did not trigger (seedocs/runbooks/migration-recovery.md).Re-enable calibration after investigation by setting
calibration.enabled: trueand restarting the worker.
6. Configuration
6.1 Configuration Files
The repo ships
.sampletemplates underdevops/etc/(verified 2026-05-31 — there is no top-leveletc/directory in the repo root). Operators copy each to the non-.samplepath the service reads. Template directory corrected 2026-05-31.
| File (template) | Deployed as | Purpose |
|---|---|---|
devops/etc/trust-lattice.yaml.sample | trust-lattice.yaml | Default trust weights (P/C/R), per-class default vectors, claim-strength multipliers, freshness decay |
devops/etc/policy-gates.yaml.sample | policy-gates.yaml | Trust-lattice weights + the gate set and thresholds |
devops/etc/excititor-calibration.yaml.sample | excititor-calibration.yaml | Calibration epoch, learning rate, feedback sources, rollback |
Default trust weights (devops/etc/trust-lattice.yaml.sample, matching TrustWeights code defaults):
| Component | Weight key | Default |
|---|---|---|
| Provenance (crypto & process integrity) | provenance / WP | 0.45 |
| Coverage (scope match precision) | coverage / WC | 0.35 |
| Replayability (determinism & pinning) | replayability / WR | 0.20 |
Formula: BaseTrust = (WP × P) + (WC × C) + (WR × R). Freshness decay default half-life is 90 days with a floor of 0.35 (FreshnessCalculator); the devops/etc/policy-gates.yaml.sample exposes freshness.floor: 0.35, while devops/etc/trust-lattice.yaml.sample documents minimumFreshness: 0.5. Conflict penalty default is 0.25 — MergePolicy.ConflictPenalty on the Policy side (src/Policy/__Libraries/StellaOps.Policy/TrustLattice/ClaimScoreMerger.cs) and the conflictPenalty constructor parameter (also defaulting to 0.25) on the Excititor ClaimScoreMerger.
Gate set (devops/etc/policy-gates.yaml.sample; classes under src/Policy/__Libraries/StellaOps.Policy/Gates):
| Gate key | Gate class | Purpose |
|---|---|---|
minimumConfidence | MinimumConfidenceGate | Per-environment confidence floor (prod 0.75 / staging 0.60 / dev 0.40) |
unknownsBudget | UnknownsBudgetGate | Cap unknown count / cumulative uncertainty |
sourceQuota | SourceQuotaGate | Limit single-source influence; require corroboration |
reachabilityRequirement | ReachabilityRequirementGate | Require reachability for chosen statuses/severities |
vexTrust | VexProofGate | Enforce VEX signature/issuer trust thresholds (order 250) |
6.2 Environment Variables
Reconciled 2026-05-30. The 1.0 draft variable names (
TRUSTLATTICE_WEIGHTS_*,GATES_MINIMUM_CONFIDENCE_PROD,CALIBRATION_LEARNING_RATE) are NOT the names used. The only env-var override names documented in the shipped samples are theSTELLAOPS_*names below. Caveat: these appear as commented suggestions in the.samplefiles; a code search did not find a binding that reads them, so treat them as the intended override surface and verify against your build before relying on them. File-based config (§6.1) is the verified configuration path.
| Variable (from samples) | Default | Description |
|---|---|---|
STELLAOPS_TRUST_LATTICE_DEFAULT_WP | 0.45 | Provenance weight |
STELLAOPS_TRUST_LATTICE_DEFAULT_WC | 0.35 | Coverage weight |
STELLAOPS_TRUST_LATTICE_DEFAULT_WR | 0.20 | Replayability weight (was missing from the 1.0 draft) |
STELLAOPS_TRUST_LATTICE_FRESHNESS_HALFLIFE_DAYS | 90 | Freshness half-life (days) |
STELLAOPS_CALIBRATION_LEARNING_RATE | see note | Calibration learning rate |
Learning-rate caveat: the calibration sample sets
learningRate.base: 0.15andmaxAdjustmentPerEpoch: 0.25, whereas theTrustVectorCalibratorcode default isLearningRate = 0.02/MaxAdjustmentPerEpoch = 0.05. The 1.0 draft’s0.02matches the code default, not the shipped sample. Confirm which layer wins in your deployment before tuning.Production
minimumConfidence(0.75) is set in the deployedpolicy-gates.yaml(templatedevops/etc/policy-gates.yaml.sample) undergates.minimumConfidence.thresholds.production, not via aGATES_MINIMUM_CONFIDENCE_PRODenv var (NOT IMPLEMENTED).
7. Maintenance Tasks
7.1 Daily
- [ ] Review gate failure alerts
- [ ] Check verdict replay success rate
- [ ] Monitor trust vector stability
7.2 Weekly
- [ ] Review calibration epoch results
- [ ] Analyze conflict rate trends
- [ ] Update trust vectors for new sources
7.3 Monthly
- [ ] Audit high-drift sources
- [ ] Review and tune gate thresholds
- [ ] Clean up expired verdict manifests
8. Contact & Related Documentation
- On-call: #trustlattice-oncall (Slack)
- Escalation: VEX Guild Lead
- Module dossier (design contract):
docs/modules/excititor/trust-lattice.md - Troubleshooting (symptom-driven): Trust Lattice Troubleshooting Guide
- VEX consensus model: VEX Consensus Guide
Document Version: 1.2.0 (reconciled against src/ on 2026-05-30; deep re-verified 2026-05-31) Sprint: 7100.0003.0002
