feat(vex): Postgres persistence for Excititor + VexLens + VexHub hardening

Excititor: new migration 003_vex_claim_store.sql and PostgresVexClaimStore
replace the in-memory claim tracking. ExcititorPersistenceExtensions wires
the store; ExcititorMigrationTests updated. Archives S001 demo seed.

VexLens: new migration 002_noise_gating_state.sql with
PostgresGatingStatisticsStore, PostgresSnapshotStore, and
PostgresNoiseGatingJson bring noise-gating state onto disk. New
VexLensRuntimeDatabaseOptions + AuthorityIssuerDirectoryAdapter +
VexHubStatementProvider provide the runtime wiring. WebService tests cover
the persistence, the issuer-directory adapter, and the statement provider.

VexHub: WebService Program, endpoints, middleware, models, and policies
tightened; VexExportCompatibilityTests exercise the Concelier↔VexHub export
contract.

Docs: excititor, vex-hub (architecture + integration guide), and vex-lens
architecture pages updated to match the new persistence and verification
paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-04-15 11:15:31 +03:00
parent ee93c0bac2
commit 291c3d3ad4
47 changed files with 3932 additions and 213 deletions

View File

@@ -59,11 +59,19 @@ Conflicts remain visible through `conflicts` array; Policy Engine can decide sup
All responses include provenance fields (`consensus_digest`, `derived_from`, DSSE signature references) for audit.
## 5) Storage
- `vex_consensus` collection keyed by `(tenant, artifactId, advisoryKey)` with current consensus, metadata, conflict summary, and digests.
- `vex_consensus_history` append-only history to support replay and audit.
- `vex_conflict_queue` for unresolved conflicts requiring manual review.
## 5) Storage
- `vex_consensus` collection keyed by `(tenant, artifactId, advisoryKey)` with current consensus, metadata, conflict summary, and digests.
- `vex_consensus_history` append-only history to support replay and audit.
- `vex_conflict_queue` for unresolved conflicts requiring manual review.
- `vexlens.noise_gate_raw_snapshots`, `vexlens.noise_gate_gated_snapshots`, and `vexlens.noise_gate_statistics` store the live noise-gating raw inputs, persisted gated outputs, and aggregated statistics for the `/api/v1/vexlens/gating/*` surface.
### Noise-gating runtime contract (2026-04-14)
- The owning VexLens web runtime resolves `ISnapshotStore` and `IGatingStatisticsStore` to PostgreSQL-backed implementations, not process-local in-memory stores.
- Startup schema convergence for the noise-gating tables is owned by embedded startup migration `002_noise_gating_state.sql` in `StellaOps.VexLens.Persistence`; fresh local volumes must converge without manual SQL.
- `POST /api/v1/vexlens/gating/snapshots/{snapshotId}/gate` now persists the gated snapshot and statistics as part of the live request path, so later delta/statistics reads reflect durable backend state.
- The Angular production app binds the real VexLens noise-gating HTTP client through `app.config.ts`, so triage surfaces call `/api/v1/vexlens/gating/*` instead of relying on optional providers or mock helpers.
## 6) Recompute strategy