Test Project and CI Inventory

Snapshot date: 2026-05-22 UTC

This report inventories the current automated test surface for consolidation planning. It is based only on repository-local files: project files, package manifests, test runner configs, existing testing docs, and active Gitea workflows under .gitea/workflows/.

The per-project appendix is generated as:

The scenario-level appendix for browser E2E and Scanner SCM corpus coverage is:

The deeper consolidation inventory is:

Inventory Method

Sources reviewed:

CSV columns:

ColumnMeaning
roleRunnable test project, support library, fixture input, or non-.NET runner.
moduleTop-level src/<module> owner, top-level tests/<area>, or docs/root classification.
pathRepository-relative project, package, or corpus path.
runnerRunner family (dotnet, npm/vitest, npm/playwright, go test, etc.).
test_typeDerived type from project/config naming and package references.
infraRequired runtime resources inferred from packages/configs.
seed_dataNearby fixture, snapshot, golden, seed, or content resources.
ciDirect workflow mapping plus generic sweep/fanout mapping where applicable.
ci_triggersTrigger notes for mapped workflows.
ci_whereWorkflow file/job or matched workflow lines.

Current Counts

RoleCountNotes
runnable-dotnet-test590.NET/xUnit or MTP test projects and runnable cross-cutting packs.
dotnet-test-support48TestKit, fixture libraries, shared test infrastructure, benchmark/support projects.
fixture-input19.NET fixture projects used as analyzer/corpus inputs, not test runners.
sample-template-test3Runnable docs sample/template tests.
frontend-runner1src/Web/StellaOps.Web Vitest and Playwright runner.
playwright-live-runner1src/__Tests/playwright operator-trust live-stack runner.
go-test-module2Real Go modules covered by go-tests.yml.
tooling-test-runner1Root package scripts for docs/API/SDK smoke checks.
fixture-corpus1Scanner analyzer corpus under src/__Tests/e2e/scanner-analyzer-corpus/fixtures.
qa-fixture-corpus1QA feature-check fixtures under docs/qa/feature-checks/fixtures.
Total CSV rows667Full row-level appendix in the CSV.

Runnable .NET test projects by module are listed in the CSV. High-volume owners are Concelier (87), Scanner (79), shared __Libraries (78), __Tests cross-cutting packs (44), BinaryIndex (33), Attestor (28), ReleaseOrchestrator (27), and Notify (23).

Production E2E Scenario Inventory

The project-level CSV intentionally records runners and projects, not every browser spec or generated SCM scenario. For consolidation, the second appendix adds that scenario-level view:

Scenario roleCountRuntime / CI notes
production-playwright-spec16src/__Tests/playwright operator-baseline/operator-trust specs; live-stack runner through STELLA_BASE_URL; no direct active workflow currently found.
web-playwright-spec131src/Web/StellaOps.Web/tests/e2e/** and src/Web/StellaOps.Web/e2e/**; split across source-served, docker/live-stack, integration, air-gap, and live-search configs.
scanner-scm-corpus-seed216Committed Scanner SCM seed fixtures under src/__Tests/e2e/scanner-analyzer-corpus/fixtures/<language>/<scenario>/.
scanner-scm-generated-corpus-summary1Summary row for the ignored/generated seed-42 comprehensive audit corpus.
Total scenario rows364Full row-level appendix in test-e2e-scenario-inventory.csv.

The Scanner SCM corpus is the surface that matches “set up SCM with repositories and check vulnerable-library call paths.” It is not Playwright. It is driven by StellaOps.E2E.SyntheticRepos, devops/scripts/e2e/provision-corpus.ps1, and StellaOps.E2E.AnalyzerCoverage, with CI in .gitea/workflows/e2e-analyzer-coverage.yml.

Current committed Scanner SCM seed counts:

LanguageSeed scenariosCall-path scenarios
bun127
ccpp1510
dart127
deno127
dotnet1812
elixir149
go1510
java1510
node1813
php1611
python1914
ruby1611
rust2216
swift127
Total216144

The generated comprehensive audit corpus is intentionally ignored, but the documented seed-42 profile materializes 2,585 git repositories, 1,821 distinct coverage cases, 392 source scenarios, 870 call-path reachability repositories, and 319 secret-tagged repositories.

CI Integration Map

SurfaceCI locationTrigger stateRunner / jobWhat it runs
Generic .NET sweep.gitea/workflows/dotnet-nightly-sweep.ymlworkflow_dispatch only; schedule currently disabled in commentsapparmor-host, job sweep, report-only.gitea/scripts/test/run-test-category.sh --no-trait-filter --report-only; starts shared Postgres; supports scope/shard inputs.
.NET PR fanout.gitea/workflows/dotnet-pr-tests.ymlworkflow_dispatch only; PR trigger currently disabled in commentsubuntu-latest non-infra and apparmor-host infra jobs, report-onlydetect-affected-modules.sh maps changed files to src/<Module>; run-test-category.sh --by-path src/<Module>/*.
FE unit/spec drift.gitea/workflows/fe-web-tests.ymlpull_request path-filteredubuntu-latest, job drift-gateRuns npx vitest run --config vitest.codex.config.ts on HEAD and base; fails only for new failing spec files.
FE default Playwright.gitea/workflows/fe-e2e-tests.ymlworkflow_dispatch onlyapparmor-host, report-onlyRuns default src/Web/StellaOps.Web/playwright.config.ts against source-served npm run serve:test.
Air-gap federation.gitea/workflows/airgap-federation-e2e.ymlpull_request, nightly schedule, manualPR: ubuntu-latest; live: apparmor-hostTier 0 .NET in-process tests, Tier 1 notification Playwright specs, Tier 2 live Docker e2e.
Go modules.gitea/workflows/go-tests.ymlpull_request, push, daily schedule, manualubuntu-latest, report-onlygo test ./... -v -count=1 for JobEngine worker SDK and generated Attestor Go types.
OpenAPI conformance.gitea/workflows/openapi-conformance.ymlpull_request, nightly schedule, manualubuntu-latestDedicated src/__Tests/architecture/StellaOps.OpenApi.Conformance.Tests project. Excluded from generic .NET sweep.
Architecture conformance.gitea/workflows/test-architecture.ymlpull_request, push main, manualconfigured Linux runnerDedicated architecture contracts pack.
E2E analyzer coverage.gitea/workflows/e2e-analyzer-coverage.ymlnightly schedule, manual, PR smokeubuntu-latestBuilds and runs StellaOps.E2E.AnalyzerCoverage; full Gitea stack path on scheduled/manual gitea target.
E2E notify coverage.gitea/workflows/e2e-notify-coverage.ymlnightly schedule, manual, PR smokePR ubuntu-latest; full run apparmor-hostBuilds Notify coverage harness and connector tests; full run uses Mailpit and echo receiver compose.
Chaos router.gitea/workflows/chaos-router.ymlschedule, PR paths, manualapparmor-hostBuilds and runs src/__Tests/chaos/StellaOps.Chaos.Router.Tests.
Workflow renderer.gitea/workflows/workflow-renderer.ymlPR paths, schedule/manual for explicit testsubuntu-latestFast and explicit StellaOps.Workflow.Renderer.Tests lanes.
Workflow Oracle/Redis.gitea/workflows/workflow-oracle-tests.ymlPR paths, manualubuntu-latestOracle and Redis integration pack with service images.
Plugin sandboxplugin *-sandbox and *-confinement workflowsLinux paths on PR/push/manual; Windows manual-onlyLinux apparmor or Windows runnersFiltered StellaOps.Plugin.Sandbox.Tests categories/classes for overlay, AppArmor, filesystem, OS confinement.
Runtime instrumentation agents.gitea/workflows/runtime-instrumentation-host-agents.ymlPR/push/manualubuntu-latestAgent core/Linux/Tetragon test slices.
OpenAPI truthfulness and docs parity.gitea/workflows/openapi-truthfulness.yml, .gitea/workflows/docs-cli-parity.ymlpath-filtered PR/push/manualubuntu-latestScripted docs/API/CLI conformance checks, not general test projects.

Generic .NET Sweep Eligibility

run-test-category.sh does not discover every runnable .NET project. Its active discovery pattern is limited to:

It searches under src/, excludes *Testing.csproj and StellaOps.TestKit.csproj, and explicitly excludes the OpenAPI conformance project because that project has its own workflow.

Inventory impact:

ClassificationCount
Runnable .NET projects detected590
Eligible for generic .NET Test Sweep567
Eligible for intended .NET PR Tests module fanout461
Runnable .NET projects without direct active CI mapping20

The uncovered runnable projects are mostly cross-cutting packs named without a *.Tests.csproj suffix:

The module-owned src/AirGap/__Tests/StellaOps.AirGapFederation.IntegrationTests project has a dedicated workflow and is not part of the generic sweep.

Seed Data and Fixtures

Seed data is spread across several conventions:

The CSV records nearby seed-data hints per row, but this is a structural inventory, not a semantic fixture manifest. Consolidation should add a first class fixture manifest if fixture ownership, refresh policy, and offline determinism need to become enforceable.

Consolidation Findings

  1. The generic .NET sweep is close to the current runnable .NET surface but not complete. It misses runnable projects that do not follow the discovery suffix pattern. The stale top-level tests/Telemetry duplicate has been consolidated into the module-owned Telemetry core tests.
  2. The .NET PR fanout is currently not automatic. The workflow is workflow_dispatch only, and all jobs are report-only.
  3. Cross-cutting src/__Tests/**, src/__Libraries/**, and src/__Analyzers/** changes are treated as broad changes by detect-affected-modules.sh; the PR lane intentionally skips fanout and relies on the sweep.
  4. Test filtering is inconsistent. The sweep uses --no-trait-filter because the trait taxonomy is incomplete and xUnit v3/MTP projects may ignore VSTest --filter.
  5. Frontend coverage is split: Vitest drift is the active PR gate, while default Playwright is manual report-only and live/docker Playwright configs are handled by specialized workflows or scripts.
  6. Go CI is intentionally narrow and correct: only the two real Go modules are tested; Go modules inside analyzer/benchmark fixture corpuses are seed data.
  7. Several support libraries own important fixture/Testcontainers behavior but are not test projects by themselves. They should stay in the inventory, but gating should happen through their consuming test projects.
  1. Create a versioned test manifest from this CSV and make CI discovery consume it instead of re-deriving project lists from filename patterns.
  2. Decide whether cross-cutting src/__Tests/Integration/** and src/__Tests/e2e/** projects should be renamed to *.Tests.csproj or explicitly included in run-test-category.sh.
  3. Add an ownership field for fixture corpuses: owning module, refresh command, offline status, expected determinism hash/snapshot policy, and CI consumers.
  4. Split CI state into explicit blocking, report-only, and manual-only fields. The current workflow names can imply stronger coverage than the triggers actually provide.
  5. Keep dedicated workflows for live, browser, Docker, hardware, and OS-confinement tests, but register them in the same manifest so consolidation work can see one inventory.