Test Trait Taxonomy

Audience: contributors tagging tests and maintainers wiring CI lane selection.

This is the authoritative catalog of Stella Ops test traits. It makes Category the primary CI selection key; Lane remains compatibility metadata during migration and must not be the source of truth for new routing. For how CI consumes these traits, see ci-lane-filters.md; for where suites and fixtures live, see TEST_PROJECT_AND_FIXTURE_STRUCTURE.md.

Canonical Categories

Canonical values are defined in src/__Libraries/StellaOps.TestKit/TestCategories.cs and mirrored in TEST_MANIFEST.schema.json. The canonical set is exactly the 43 public const string values in TestCategories.cs, because validate-test-traits.py extracts every public const string NAME = "VALUE"; declaration in that file. Thirty-three of those are top-level TestCategories constants; the remaining ten (Advisories, Api, Auth, Compliance, Crypto, Evidence, Integrations, Persistence, RiskPolicy, Scanning) are declared inside the nested TestCategories.BlastRadius class but are matched by the same regex, so they are accepted both as Category values and as BlastRadius values.

Allowed Category values (43 total):

CategoryPrimary use
UnitFast in-memory component tests.
AdvisoriesAdvisory ingestion, normalization, and decision tests.
ApiHTTP API and OpenAPI surface checks.
AuthAuthentication, authorization, token, and tenant-boundary checks.
ComplianceRegulatory and compliance-pack behavior checks.
CryptoCryptographic provider, key, signature, and verification checks.
EvidenceEvidence locker, provenance, and attestation artifact checks.
IntegrationsExternal connector, adapter, and plugin integration checks.
PersistenceRepository, storage, and database access checks.
RiskPolicyRisk and policy decision logic checks.
ScanningScanner, analyzer, SBOM, and artifact ingestion checks.
PropertyFsCheck/generative invariant tests.
SnapshotSnapshot or golden-master regression tests.
IntegrationDatabase, Testcontainers, WebApplicationFactory, or service integration tests.
ContractAPI, schema, or compatibility contract tests.
SecurityCryptographic, vulnerability, or security assertion tests.
PerformanceLoad, latency, throughput, or SLO checks.
LiveTests requiring live external services; disabled by default in PR CI.
ArchitectureDependency, layering, naming, and forbidden-reference checks.
GoldenCorpus-based expected-output regression tests.
BenchmarkBenchmarkDotNet or benchmark harness runs.
AirGapOffline and air-gap behavior checks.
E2EFull workflow, browser, API, or service-boundary tests.
ChaosFault injection and recovery tests.
DeterminismReproducibility, stable ordering, and idempotency tests.
ResilienceRetry, timeout, circuit-breaker, and degraded-mode tests.
ObservabilityOpenTelemetry spans, metrics, structured logging, and diagnostics contracts.
StorageConcurrencyStorage locking and concurrent access tests.
StorageIdempotencyStorage duplicate/retry idempotency tests.
QueryDeterminismStable query ordering and repeated-query consistency tests.
StorageMigrationSchema migration and versioning tests.
SchemaEvolutionBackward/forward compatibility across schema versions.
ConfigDiffBehavioral delta tests for configuration changes.
HLCHybrid logical clock and distributed ordering tests.
FederationMulti-site synchronization or cross-region replication tests.
LatencyNetwork latency and cross-region timing tests.
ImmutabilityArtifact integrity, build reproducibility, and digest verification tests.
ParityCompetitor comparison or parity validation tests.
PostIncidentProduction-incident-derived regression tests.
EvidenceChainRequirement-to-test-to-artifact traceability tests.
LongevitySustained-run stability tests.
InteropCross-version or N-1/N+1 interoperability tests.
EnvironmentSkewVaried infrastructure/profile skew tests.

Current manifest usage:

CategorySuite countCI posture
Unit384PR/main candidate when targeted and static traits are present.
Integration152Targeted PR/main or nightly depending infra and stability.
AirGap25Nightly/manual unless explicitly lightweight and targeted.
Benchmark25Weekly/manual, not PR blocking.
E2E7Nightly/manual first; live E2E is never PR blocking.
Chaos4Nightly/manual only.

The manifest currently exercises only 6 of the 43 canonical categories across its 597 suites; the remaining values are reserved for suites that have not yet been classified into the manifest.

validate-test-traits.py fails if TEST_MANIFEST.yml uses a category not present in TestCategories.cs.

Trait Migration Rules

Current triage:

TriageCount
Trait-missing .NET suites146
P0 rows8
P1 rows78
P2 rows60

Secondary Traits

Use secondary traits for intent and diagnostics, not primary CI routing:

TraitPurpose
IntentWhy the behavior exists, using TestIntents (src/__Libraries/StellaOps.TestKit/Traits/TestIntents.cs).
BlastRadiusOperational surface affected by failure, using TestCategories.BlastRadius.
LaneTemporary compatibility metadata during migration.

Intent values (TestIntents): Regulatory, Safety, Performance, Competitive, Operational.

BlastRadius values (TestCategories.BlastRadius): Auth, Scanning, Evidence, Compliance, Advisories, RiskPolicy, Crypto, Integrations, Persistence, Api.

Skip Triage

Static skips are allowed only when they are visible and owned.

Current skip triage:

TriageCount
Skip-audit suites10
Total static skipped tests represented by those suites34

Commands

python .gitea/scripts/test/refresh-test-triage.py
python .gitea/scripts/test/validate-test-traits.py \
  --out TestResults/test-trait-validation/summary.json