Add Authority Advisory AI and API Lifecycle Configuration
- Introduced AuthorityAdvisoryAiOptions and related classes for managing advisory AI configurations, including remote inference options and tenant-specific settings. - Added AuthorityApiLifecycleOptions to control API lifecycle settings, including legacy OAuth endpoint configurations. - Implemented validation and normalization methods for both advisory AI and API lifecycle options to ensure proper configuration. - Created AuthorityNotificationsOptions and its related classes for managing notification settings, including ack tokens, webhooks, and escalation options. - Developed IssuerDirectoryClient and related models for interacting with the issuer directory service, including caching mechanisms and HTTP client configurations. - Added support for dependency injection through ServiceCollectionExtensions for the Issuer Directory Client. - Updated project file to include necessary package references for the new Issuer Directory Client library.
This commit is contained in:
		@@ -17,13 +17,13 @@ completely isolated network:
 | 
			
		||||
| **Provenance** | Cosign signature, SPDX 2.3 SBOM, in‑toto SLSA attestation |
 | 
			
		||||
| **Attested manifest** | `offline-manifest.json` + detached JWS covering bundle metadata, signed during export. |
 | 
			
		||||
| **Delta patches** | Daily diff bundles keep size \< 350 MB |
 | 
			
		||||
| **Scanner plug-ins** | OS analyzers plus the Node.js, Go, .NET, and Python language analyzers packaged under `plugins/scanner/analyzers/**` with manifests so Workers load deterministically offline. |
 | 
			
		||||
| **Scanner plug-ins** | OS analyzers plus the Node.js, Go, .NET, Python, and Rust language analyzers packaged under `plugins/scanner/analyzers/**` with manifests so Workers load deterministically offline. |
 | 
			
		||||
| **Debug store** | `.debug` artefacts laid out under `debug/.build-id/<aa>/<rest>.debug` with `debug/debug-manifest.json` mapping build-ids to originating images for symbol retrieval. |
 | 
			
		||||
| **Telemetry collector bundle** | `telemetry/telemetry-offline-bundle.tar.gz` plus `.sha256`, containing OTLP collector config, Helm/Compose overlays, and operator instructions. |
 | 
			
		||||
 | 
			
		||||
**RU BDU note:** ship the official Russian Trusted Root/Sub CA bundle (`certificates/russian_trusted_bundle.pem`) inside the kit so `concelier:httpClients:source.bdu:trustedRootPaths` can resolve it when the service runs in an air‑gapped network. Drop the most recent `vulxml.zip` alongside the kit if operators need a cold-start cache.
 | 
			
		||||
 | 
			
		||||
**Language analyzers:** the kit now carries the restart-only Node.js, Go, .NET, and Python analyzer plug-ins (`plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Node/`, `...Lang.Go/`, `...Lang.DotNet/`, `...Lang.Python/`). Drop the directories alongside Worker binaries so the unified plug-in catalog can load them without outbound fetches; Rust remains on the Wave 4 roadmap.
 | 
			
		||||
**Language analyzers:** the kit now carries the restart-only Node.js, Go, .NET, Python, and Rust plug-ins (`plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Node/`, `...Lang.Go/`, `...Lang.DotNet/`, `...Lang.Python/`, `...Lang.Rust/`). Drop the directories alongside Worker binaries so the unified plug-in catalog can load them without outbound fetches.
 | 
			
		||||
 | 
			
		||||
*Scanner core:* C# 12 on **.NET {{ dotnet }}**.  
 | 
			
		||||
*Imports are idempotent and atomic — no service downtime.*
 | 
			
		||||
@@ -162,13 +162,31 @@ Example excerpt (2025-10-23 kit) showing the Go and .NET analyzer plug-in payloa
 | 
			
		||||
  "size": 31896,
 | 
			
		||||
  "capturedAt": "2025-10-26T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
{
 | 
			
		||||
  "name": "plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Python/manifest.json",
 | 
			
		||||
  "sha256": "668ad9a1a35485628677b639db4d996d1e25f62021680a81a22482483800e557",
 | 
			
		||||
  "size": 648,
 | 
			
		||||
  "capturedAt": "2025-10-26T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
{
 | 
			
		||||
  "name": "plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Python/manifest.json",
 | 
			
		||||
  "sha256": "668ad9a1a35485628677b639db4d996d1e25f62021680a81a22482483800e557",
 | 
			
		||||
  "size": 648,
 | 
			
		||||
  "capturedAt": "2025-10-26T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
{
 | 
			
		||||
  "name": "plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Rust/StellaOps.Scanner.Analyzers.Lang.Rust.dll",
 | 
			
		||||
  "sha256": "d90ba8b6ace7d98db563b1dec178d57ac09df474e1342fa1daa38bd55e17b185",
 | 
			
		||||
  "size": 54784,
 | 
			
		||||
  "capturedAt": "2025-11-01T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
{
 | 
			
		||||
  "name": "plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Rust/StellaOps.Scanner.Analyzers.Lang.Rust.pdb",
 | 
			
		||||
  "sha256": "6fac88640a4980d2bb8f7ea2dd2f3d0a521b90fd30ae3a84981575d5f76fa3df",
 | 
			
		||||
  "size": 36636,
 | 
			
		||||
  "capturedAt": "2025-11-01T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
{
 | 
			
		||||
  "name": "plugins/scanner/analyzers/lang/StellaOps.Scanner.Analyzers.Lang.Rust/manifest.json",
 | 
			
		||||
  "sha256": "1ec47d1a2103ad5eff23e903532cb76b1ed7ded85d301c1a6631ff21aa966ed4",
 | 
			
		||||
  "size": 658,
 | 
			
		||||
  "capturedAt": "2025-11-01T00:00:00Z"
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
@@ -214,11 +232,15 @@ The Offline Kit carries the same helper scripts under `scripts/`:
 | 
			
		||||
### Authority scope sanity check
 | 
			
		||||
 | 
			
		||||
Offline installs rely on the bundled `etc/authority.yaml.sample`. Before promoting the kit, confirm the sample clients keep the Aggregation-Only guardrails:
 | 
			
		||||
 | 
			
		||||
- `aoc-verifier` requests `aoc:verify`, `advisory:read`, and `vex:read`.
 | 
			
		||||
- `signals-uploader` requests `signals:write`, `signals:read`, and `aoc:verify`.
 | 
			
		||||
 | 
			
		||||
Authority now rejects tokens that request `advisory:read`, `vex:read`, or any `signals:*` scope without `aoc:verify`; the sample has been updated to match. If you maintain tenant-specific overlays, mirror the same pairing so air-gapped automation fails deterministically with `invalid_scope` when misconfigured.
 | 
			
		||||
 | 
			
		||||
- `aoc-verifier` requests `aoc:verify`, `advisory:read`, and `vex:read`.
 | 
			
		||||
- `signals-uploader` requests `signals:write`, `signals:read`, and `aoc:verify`.
 | 
			
		||||
- `airgap-operator` requests `airgap:status:read`, `airgap:import`, and `airgap:seal`.
 | 
			
		||||
- `task-runner` requests `packs.run` and `packs.read` for execution flows.
 | 
			
		||||
- `pack-approver` requests `packs.approve` (plus `packs.read`) for automation that resumes runs after approvals.
 | 
			
		||||
- `packs-registry` requests `packs.write` and `packs.read` for publishing bundles.
 | 
			
		||||
 | 
			
		||||
Authority now rejects tokens that request `advisory:read`, `vex:read`, or any `signals:*` scope without `aoc:verify`; the sample has been updated to match. Air-gap scopes (`airgap:*`) also require an explicit tenant assignment—match the updated roles (`airgap-viewer`, `airgap-operator`, `airgap-admin`) so automation fails closed when misconfigured.
 | 
			
		||||
 | 
			
		||||
**Quick smoke test:** before import, verify the tarball carries the Go analyzer plug-in:
 | 
			
		||||
 | 
			
		||||
@@ -228,7 +250,7 @@ tar -tzf stella-ops-offline-kit-<DATE>.tgz 'plugins/scanner/analyzers/lang/Stell
 | 
			
		||||
 | 
			
		||||
The manifest lookup above and this `tar` listing should both surface the Go analyzer DLL, PDB, and manifest entries before the kit is promoted.
 | 
			
		||||
 | 
			
		||||
> **Release guardrail.** The automated release pipeline now publishes the Python plug-in from source and executes `dotnet run --project src/Tools/LanguageAnalyzerSmoke --configuration Release -- --repo-root <checkout>` to validate manifest integrity and cold/warm determinism within the < 30 s / < 5 s budgets (differences versus repository goldens are logged for triage). Run `ops/offline-kit/run-python-analyzer-smoke.sh` locally before shipping a refreshed kit if you rebuild artefacts outside CI or when preparing the air-gap bundle.
 | 
			
		||||
> **Release guardrail.** The automated release pipeline now publishes the Python and Rust plug-ins from source and executes `dotnet run --project src/Tools/LanguageAnalyzerSmoke --configuration Release -- --repo-root <checkout> --analyzer <id>` to validate manifest integrity and cold/warm determinism within the < 30 s / < 5 s budgets (differences versus repository goldens are logged for triage). Run `ops/offline-kit/run-python-analyzer-smoke.sh` and `ops/offline-kit/run-rust-analyzer-smoke.sh` locally before shipping a refreshed kit if you rebuild artefacts outside CI or when preparing the air-gap bundle.
 | 
			
		||||
 | 
			
		||||
### Debug store mirror
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user