Commit Graph

1066 Commits

Author SHA1 Message Date
master
efc3500f20 feat(timeline): scheduled audit retention purge background host
Sprint SPRINT_20260408_004 AUDIT-004 (retention enforcement).

AuditRetentionPurgeService BackgroundService enumerates tenants that
have any rows in timeline.unified_audit_events, then calls
timeline.purge_expired_audit_events(tenantId, dryRun) per tenant.
The SQL function honours per-classification retention windows and the
compliance_hold flag (legal holds pass through unaffected).

AuditRetentionPurgeOptions bound from the AuditRetentionPurge config
section: Enabled (default true), DryRun (default false), InitialDelay
(default 5 min), Interval (default 6h). Failures on a single tenant
are logged and do not stop the rest of the cycle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:37:25 +03:00
master
ebf1a1cb3d feat(timeline): GDPR data classification + retention + right-to-erasure
Sprint SPRINT_20260408_004 AUDIT-004.

Schema (migration 005_audit_data_classification_retention.sql):
- ALTER timeline.unified_audit_events adds data_classification
  (none|personal|sensitive|restricted, default 'none'), compliance_hold
  (default false, exempts from purge), pii_redacted_at (null until
  right-to-erasure redaction).
- New timeline.audit_retention_policies table holds per-tenant /
  per-classification retention windows; seed row tenant_id='*' = platform
  default (none/personal=365d, sensitive=730d, restricted=2555d ≈ 7y).
- Function resolve_audit_retention_days falls back tenant→platform→365d.
- Function purge_expired_audit_events iterates classes, honours
  compliance_hold, supports dry-run counting.
- Function redact_actor_pii replaces actor_email/actor_ip/actor_user_agent
  (+actor_name for personal/sensitive rows) with '[REDACTED]', preserves
  actor_id so the content_hash chain stays intact.

Code:
- AuditDataClassifier implements the none/personal/sensitive/restricted
  ladder: restricted (signer+attestor key/ceremony ops, cross-module
  key_escrow actions) > sensitive (authority auth-protocol events) >
  personal (actor email/ip/user_agent present). 16/16 unit tests pass.
- PostgresUnifiedAuditEventStore inserts include data_classification,
  defaulting to AuditDataClassifier.Classify() when the payload's
  precomputed value is absent. New RedactActorPiiAsync delegates to the
  SQL function.
- UnifiedAuditEvent record gets an optional DataClassification property
  so services that already classify events can bypass auto-classification.
- DELETE /api/v1/audit/actors/{actorId}/pii endpoint exposes
  right-to-erasure, scoped to the new Timeline.Admin policy backed by
  the timeline:admin scope (StellaOpsScopes.TimelineAdmin).

Remaining AUDIT-004 work: scheduled background purge host, Doctor
AuditReadinessCheck update to verify retention config, UI badges.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:36:08 +03:00
master
2f32c7f0c2 feat(jobengine): dual-write audit entries to Timeline unified sink
Sprint SPRINT_20260408_005 DEPRECATE-001 (JobEngine/ReleaseOrchestrator,
fifth service).

PostgresAuditRepository.AppendAsync now fans out to Timeline via the
optional IAuditEventEmitter after the local transaction commits. The
hash chain (content_hash, previous_entry_hash, sequence_number) stays
in the local audit_entries table as service-level chain-of-custody
evidence; Timeline receives only the summary event for cross-service
correlation, with the content hash surfaced as a detail field.

Same pattern as Authority/Policy/Notify/Scheduler dual-write:
fire-and-forget, optional DI, local write stays authoritative.

Remaining: Attestor dual-write (existing audit is already decorated
with .Audited() on endpoints — verifying the attestor audit log insert
path needs separate review).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:42:39 +03:00
master
7c69058e19 feat(scheduler): dual-write audit events to Timeline unified sink
Sprint SPRINT_20260408_005 DEPRECATE-001 (Scheduler, fourth service).

PostgresSchedulerAuditService.WriteAsync now fans out to Timeline
via the optional IAuditEventEmitter after the local scheduler.audit
row insert. Fire-and-forget, same pattern as Authority/Policy/Notify.

AuditActor is mapped to actor.{id, name, type} with kind -> type,
ActorId -> id, DisplayName -> name. Metadata tuples flatten as
`metadata.{key}` fields in Details. ScheduleId/RunId included.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:40:55 +03:00
master
0acd2ecabb feat(notify): dual-write audit events to Timeline unified sink
Sprint SPRINT_20260408_005 DEPRECATE-001 (Notify, third service).

Same pattern as Authority + Policy dual-write: NotifyAuditRepository
now fans out to Timeline via the optional IAuditEventEmitter.
Fire-and-forget; local write stays authoritative.

Remaining DEPRECATE-001 services: Scheduler (ISchedulerAuditService),
JobEngine/ReleaseOrchestrator (PostgresAuditRepository.AppendAsync),
Attestor (audit log inserts).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:39:14 +03:00
master
a7f3880e9f feat(policy): dual-write audit events to Timeline unified sink
Sprint SPRINT_20260408_005 DEPRECATE-001 (Policy, second service).

PolicyAuditRepository.CreateAsync now fans out to Timeline's unified
audit store via the optional IAuditEventEmitter (injected via
AddAuditEmission in Policy.Engine / Policy.Gateway Program.cs).
Same pattern as Authority dual-write in commit a947c8df6:
- Optional constructor dependency (default null) for DI compatibility
- Fire-and-forget emission wrapped in try/catch
- MapToTimelinePayload builds a UnifiedAuditEvent-compatible payload
  with actor (UserId or "policy-system"), resource (audit.ResourceType,
  audit.ResourceId), severity "info", and details including old/new
  value strings plus the local audit id.

Remaining DEPRECATE-001 services: Notify, Scheduler, JobEngine,
Attestor dual-write on the same pattern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:37:58 +03:00
master
a947c8df6e feat(authority): dual-write audit events to Timeline unified sink
Sprint SPRINT_20260408_005 DEPRECATE-001 (Authority, first service).

AuthorityAuditSink.WriteAsync now fans out to Timeline's unified audit
store via the optional IAuditEventEmitter (injected via AddAuditEmission
in Program.cs). The local authority.audit table write remains the
authoritative path; the Timeline emission is strictly fire-and-forget:

- Optional constructor dependency (default null) keeps existing tests
  that construct the sink without the emitter working unchanged.
- Emission is wrapped in try/catch so any Timeline-side failure (DNS,
  timeout, auth) is logged as a warning and never impacts the local
  write or calling endpoint.
- MapToTimelinePayload builds a UnifiedAuditEvent-compatible payload
  with actor (subject id/name/IP/UA), resource (authority_session
  keyed by correlationId), severity derived from outcome, and event
  details including client, reason, and event type.

Existing AuthorityAuditSinkTests (2/2) still pass — backward compat
verified via direct xUnit run.

Remaining DEPRECATE-001 work: Policy, Notify, Scheduler, JobEngine,
Attestor dual-write wiring on the same pattern. Tracked as follow-ups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:35:47 +03:00
master
6c3ebff9db feat(audit): decorate concelier + excititor write endpoints (wave D)
Sprint SPRINT_20260408_004 AUDIT-002 decoration continues.

Concelier.WebService — FeedMirrorManagementEndpoints (8 endpoints):
- mirror config update         -> concelier.update feed_mirror
- mirror sync trigger          -> concelier.execute feed_mirror_sync
- mirror retention update      -> concelier.update feed_mirror_retention
- snapshot pin/delete          -> concelier.{update,delete} feed_snapshot
- airgap bundle create/delete  -> concelier.{create,delete} airgap_bundle

Concelier.WebService — SourceManagementEndpointExtensions (5 endpoints):
- source enable/disable        -> concelier.update advisory_source
- batch enable/disable         -> concelier.update advisory_source_batch
- per-source sync              -> concelier.execute advisory_source_sync

Excititor.WebService (4 endpoints):
- POST /api/v1/vex/candidates/{id}/approve -> vex.approve vex_candidate
- POST /api/v1/vex/candidates/{id}/reject  -> vex.reject  vex_candidate
- POST /ingest/vex                         -> vex.create  vex_document
- POST /airgap/v1/vex/import               -> vex.create  vex_airgap_bundle

Both services build clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:31:15 +03:00
master
4cbe58fc80 feat(audit): decorate write endpoints in 4 services (AUDIT-002 wave C)
Sprint SPRINT_20260408_004 AUDIT-002, second completion criterion
("at least write endpoints decorated with AuditActionAttribute").

Vertical slice using the existing .Audited(module, action, resourceType)
helper from AuditedRouteGroupExtensions:

- Graph.Api (4 endpoints):
  * POST /api/graphs/builds        -> graph.create graph_build
  * POST /api/graphs/overlays      -> graph.create graph_overlay
  * POST /graphs/{g}/saved-views   -> graph.create graph_saved_view
  * DELETE /graphs/{g}/saved-views/{v} -> graph.delete graph_saved_view

- SbomService (4 endpoints):
  * POST /sbom/upload + /api/v1/sbom/upload -> sbom.create sbom
  * POST /entrypoints              -> sbom.update sbom_entrypoint
  * POST /internal/orchestrator/sources  -> sbom.create orchestrator_source
  * POST /internal/orchestrator/control  -> sbom.update orchestrator_control

- Policy.Gateway ExceptionApproval (4 governance endpoints):
  * POST /exception/request        -> policy.create  exception_approval_request
  * POST /exception/{id}/approve   -> policy.approve ""
  * POST /exception/{id}/reject    -> policy.reject  ""
  * POST /exception/{id}/cancel    -> policy.cancel  ""

- Notifier EscalationEndpoints (9 endpoints):
  * policies CRUD                   -> notifier.{create,update,delete} escalation_policy
  * on-call schedules CRUD          -> notifier.{create,update,delete} oncall_schedule
  * escalation start/escalate/stop  -> notifier.execute incident_escalation

All 4 projects build clean. Events will flow to Timeline
/api/v1/audit/ingest once the services boot and execute these endpoints.

BinaryIndex uses MVC controllers — audit decoration for that style
requires a different wiring approach and is deferred to a follow-up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:26:44 +03:00
master
981f4459a2 feat(audit): wire AddAuditEmission in 5 more services (AUDIT-002 wave B)
Sprint SPRINT_20260408_004_Timeline_unified_audit_sink AUDIT-002.

Second wave wiring — services outside the original 14-priority table that
own production audit-relevant surfaces:

- Router Gateway.WebService (ingress, claim mapping)
- Registry.TokenService (token issuance, plan admin)
- PacksRegistry.WebService (packs lifecycle)
- IssuerDirectory.WebService (issuer/subject identity, PII)
- ExportCenter.WebService (compliance bundle origin)

Same pattern: ProjectReference to StellaOps.Audit.Emission,
`using StellaOps.Audit.Emission;`, and `builder.Services
.AddAuditEmission(builder.Configuration);` placed after auth wiring.

All 5 projects build clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:05:11 +03:00
master
b2b0c905b8 feat(audit): wire AddAuditEmission in 7 services (AUDIT-002 wave A)
Sprint SPRINT_20260408_004_Timeline_unified_audit_sink AUDIT-002.

Wire the unified audit emitter in 7 webservices that were listed in the
AUDIT-002 priority table but missing the call:
- Concelier.WebService (priority 6a)
- Excititor.WebService (priority 6b)
- SbomService (priority 8)
- Graph.Api (priority 12)
- BinaryIndex.WebService (priority 14)
- Policy.Gateway (priority 3b)
- Notifier.WebService (priority 4b)

Each adds:
- ProjectReference to __Libraries/StellaOps.Audit.Emission
- using StellaOps.Audit.Emission;
- builder.Services.AddAuditEmission(builder.Configuration) in Program.cs
  placed after auth wiring, before authorization policies.

AUDIT-002 completion criterion "AddAuditEmission() called in all 14+
service Program.cs files" is now met for the listed priority services.
Endpoint-level AuditActionAttribute decoration is a separate wave.

All 7 projects build clean against the existing Audit.Emission lib.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:00:33 +03:00
master
2e35bf4591 fix(tools,concelier): xunit helper strict-mode + test async disposal
- scripts/test-targeted-xunit.ps1: replace @(x).Count checks with
  [bool] coercion in Assert-FilterShape; StrictMode 'Latest' rejects
  .Count on null even when wrapped in @().
- ConcelierInfrastructureRegistrationTests.AddConcelierPostgresStorage_
  RegistersDurableObservationAndAffectedSymbolServices: wrap provider
  in try/finally with DisposeAsync — ConcelierDataSource is
  IAsyncDisposable only, so sync Dispose at `using` scope end throws.

Follow-up to SPRINT_20260419_027/028.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:57:24 +03:00
master
55ba864798 wip(concelier): tests for observation + affected symbol stores
Follow-up to SPRINT_20260419_027_Concelier_durable_affected_symbol_runtime.

PostgresAdvisoryObservationStoreTests + PostgresAffectedSymbolStoreTests
covering the durable store behaviour.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:48:04 +03:00
master
d6a7788070 wip(concelier): durable advisory observation + affected symbol stores
Follow-up to SPRINT_20260419_027_Concelier_durable_affected_symbol_runtime
(REALPLAN-007-F still DOING).

Postgres-backed IAdvisoryObservationStore + IAffectedSymbolStore
implementations for the durable observation + affected-symbol
persistence path introduced by migration 008.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:47:49 +03:00
master
34e70d9090 wip(concelier): adjust unsupported runtime wiring test after guard removal
Follow-up to SPRINT_20260419_027_Concelier_durable_affected_symbol_runtime.

UnsupportedRuntimeWiringTests updated for the removed non-testing
UnsupportedAffectedSymbol registration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:47:01 +03:00
master
b6064f084c wip(concelier): wire observation pipeline; drop affected-symbol guard
Follow-up to SPRINT_20260419_027_Concelier_durable_affected_symbol_runtime
(REALPLAN-007-F still DOING).

- Program.cs: register AddConcelierObservationPipeline and drop the
  non-testing UnsupportedAffectedSymbolStore/Provider overrides — the
  durable stores will replace them as REALPLAN-007-F lands.
- ConcelierInfrastructureRegistrationTests: contract test asserting
  AddConcelierPostgresStorage registers durable observation lookup/sink
  and affected-symbol store services.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:46:52 +03:00
master
78464b6dbe wip(concelier): advisory observations + affected-symbol migration 008
Sprint SPRINT_20260419_027_Concelier_durable_affected_symbol_runtime
(REALPLAN-007-F still DOING — sprint remains active).

- Migration 008: advisory_observations + affected_symbols tables.
- ConcelierPersistenceExtensions + Postgres ServiceCollectionExtensions
  hooks for future durable observation + affected-symbol stores.
- Register sprint file in implplan.

Sprint _023's `501` fallback (UnsupportedAffectedSymbolServices) stays in
place until the durable stores + ingest wiring land.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:45:44 +03:00
master
ad62ba7f76 feat(signals,reachgraph,airgap,zastava): postgres runtime persistence
Cross-module truthful runtime persistence supporting the sprint_20260415
and sprint_20260416 cutovers. These modules have no single dedicated
sprint owner in the current batch, but they unblock downstream wiring
in Policy (reachability facts), ReachGraph (signals adapter), and the
air-gap controller/time services.

- Signals.Persistence: migration 003 runtime_canonical_tables; Postgres
  repos (callgraph + projection, reachability fact/store, deployment refs,
  graph metrics); DB context factory + service collection extensions.
- Signals: swap in-memory callgraph/reachability repositories for Postgres
  wired via SignalsPersistenceExtensions; durable host tests.
- ReachGraph.WebService: SignalsHttpAdapter + program wiring; host wiring +
  adapter tests.
- AirGap.Controller: service-collection extensions + infrastructure wiring;
  endpoint + startup contract tests.
- AirGap.Time: PostgresTimeAnchorStore + startup service; runtime contract
  + persistence tests.
- AirGap.Persistence: persistence extensions.
- Zastava: csproj cleanup (Observer + Core).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:44:57 +03:00
master
87a5d2ee22 chore(libs): infrastructure postgres host + attestation slicing + testkit
Shared infrastructure supporting the truthful runtime persistence cutover
sprints — no dedicated sprint owner, these libs are consumed by multiple
services.

- Infrastructure.Postgres: MigrationCategory + StartupMigrationHost +
  tests (MigrationExecution, Recording, Flags).
- AdvisoryAI.Attestation: slice AiAttestationService into partial files
  (Create/Read/Verify), align IAiAttestationStore + InMemory store,
  service tests.
- TestKit: ValkeyFixture for tests that need a shared valkey instance.
- Doctor/AdvisoryAI/IEvidenceSchemaRegistry: shared interface.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:44:43 +03:00
master
07cdba01cd feat(web): integration hub audit links + dashboard tips + e2e
Sprint SPRINT_20260415_002_FE_integration_audit_links_and_dashboard_tips.

- integration-hub: integration-detail component + spec with audit links.
- dashboard-v3: component + specs (core/testing + tests/dashboard) with
  getting-started tips.
- audit-log: audit-log-table component + spec.
- policy-governance: client + scope helper.
- deploy-diff: panel + page + service.
- graph: graph-filters component.
- jobengine: scheduler-workers-panel component.
- reachability: reachability-center + witness page components.
- release-investigation: release-investigation-context.
- E2E: audit-consolidation, integrations, policy-orchestrator specs +
  live-auth fixture; live-frontdoor-auth script + playwright outputs.
- Utility scripts: debug-auth, probe-services, scan-pages.
- package.json tweaks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:44:06 +03:00
master
64ea1f0994 feat(concelier): durable mirror bundle import with allowlisted root
Sprints SPRINT_20260418_025_Concelier_durable_mirror_bundle_import_runtime
and SPRINT_20260419_026_Concelier_mirror_import_allowlisted_root.

- MirrorBundleImportRuntimeService: durable PostgreSQL-backed live mirror
  bundle importer replacing the testing-only in-memory path.
- Enforces an allowlisted import root (Mirror.ImportRoot) and rejects
  bundle/trust-root paths that resolve outside it; relative paths resolve
  against the configured root, not the process cwd.

_025 and _026 ship together because _026 extends the same live importer
introduced in _025; splitting leaves an unguarded filesystem reach.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:43:42 +03:00
master
c7109ed214 feat(concelier): postgres feed mirror runtime + management endpoints
Sprint SPRINT_20260417_024_Concelier_truthful_feed_mirror_runtime.

- WebService extensions: feed mirror management endpoints, mirror domain
  management endpoint extensions, mirror endpoint extensions.
- Persisted mirror runtime settings provider.
- StellaOpsMirror connector: Jobs, StellaOpsMirrorConnector,
  StellaOpsMirrorDependencyInjectionRoutine, runtime settings provider.
- Tests: StellaOpsMirrorConnectorTests + mirror-advisory expected fixture.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:43:14 +03:00
master
77b88cbfa3 feat(concelier): unsupported affected-symbol runtime guard
Sprint SPRINT_20260417_023_Concelier_truthful_affected_symbol_runtime.

UnsupportedAffectedSymbolServices shim returning a clear
501/unsupported response until the durable affected-symbol backend ships.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:42:34 +03:00
master
9bcd0fdba3 feat(advisoryai): testing-only runtime fallback contract tests
Sprint SPRINT_20260417_022_AdvisoryAI_truthful_testing_only_runtime_fallback.

AdvisoryAiRuntimeStartupContractTests documenting the testing-only
in-memory fallback and its boundary versus the durable runtime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:42:28 +03:00
master
f2eaf6bb3d feat(doctor): evidence schema registry runtime
Sprint SPRINT_20260417_021_Doctor_truthful_evidence_schema_registry_runtime.

IEvidenceSchemaRegistry contract, service-collection extension,
registration tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:58 +03:00
master
fb3762ef6c feat(integrations): built-in plugin catalog runtime + impact endpoints
Sprint SPRINT_20260417_020_Integrations_truthful_builtin_plugin_runtime.

- IntegrationBuiltInPluginCatalog + IntegrationEndpoints +
  IntegrationService wiring, program updates, csproj.
- Tests: plugin loader, service, impact endpoints.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:48 +03:00
master
70cbfcee72 feat(scheduler): postgres + redis webhook rate limiter runtime
Sprint SPRINT_20260417_019_JobEngine_truthful_webhook_rate_limiter_runtime.

NoOpWebhookRateLimiter + RedisWebhookRateLimiter, service-collection
wiring, WebhookRateLimiterRuntimeTests, SCHED-WEB-16-104-WEBHOOKS doc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:42 +03:00
master
052de213e1 feat(advisoryai): postgres runtime state cutover
Sprint SPRINT_20260417_018_AdvisoryAI_truthful_runtime_state_cutover.

- Migrations 009 ai_runtime_state + 010 advisory_ai_runtime_state_extensions.
- PostgresConversationService + PostgresAdvisoryChatSettingsStore.
- PostgresExplanationStore, PostgresPolicyIntentStore, PostgresRunStore,
  PostgresAiAttestationStore, PostgresAiConsentStore.
- Core + WebService runtime persistence extensions and program wiring.
- Chat integration + durable runtime tests.

Sub-sprint _022 (testing-only runtime fallback) follows.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:34 +03:00
master
a15405431b wip(scheduler): compose storage configuration compatibility
Sprint SPRINT_20260417_002_JobEngine_scheduler_storage_compose_compatibility
(SCHEDULER-COMPAT-001 still DOING — sprint remains active).

Adds scheduler storage configuration adapter layer so the web host
accepts the compose-shaped storage configuration without manual remapping,
plus SchedulerStorageConfigurationTests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:18 +03:00
master
0b7ba36f30 feat(web): advisory/vex onboarding setup wizard
Sprint SPRINT_20260417_001_Platform_setup_advisory_vex_onboarding
(Platform backend landed in commit 9393baf1a).

- Setup wizard feature: components (setup-wizard, step-content,
  step-content.defaults.spec), models, services
  (setup-wizard-api.service, setup-wizard-state.service) + specs.
- Advisory source catalog component + behavior spec.
- Live setup-wizard first-run bootstrap script + playwright auth/state
  output fixtures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:41:08 +03:00
master
fcf9cc1b77 feat(attestor): postgres entry repo + audit sink + bulk shim
Sprint SPRINT_20260416_017_Attestor_truthful_runtime_storage_cutover.

- Attestor.Persistence: migration 002 attestor_runtime_entries_and_watchlist,
  PostgresAttestorEntryRepository + PostgresAttestorAuditSink,
  service-collection extensions.
- Attestor.WebService: composition + endpoints wiring.
- Attestor.Infrastructure: UnsupportedBulkVerificationJobStore shim.
- Tests: AttestorTruthfulRuntimeTests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:40:40 +03:00
master
5c574cd787 feat(exportcenter): truthful web/job-admin/timeline-sink runtime cutover
Sprints SPRINT_20260416_014/015/016_ExportCenter_truthful_*_runtime.

- Infrastructure: PostgresExportArtifactRepository.
- WebService: unsupported-shims for export attestation, audit-bundle job
  handler, exception report generator, incident manager, promotion
  attestation assembler, risk-bundle job handler, simulation exporter,
  timeline notification sink; runtime/verification scaffolding.
- Tests: AuditBundle program HTTP integration + runtime suites.

Consolidated because sprints _014 (web), _015 (job admin), _016
(timeline sink) share repo + Program.cs + runtime wiring; splitting
would produce non-buildable intermediate states.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:40:31 +03:00
master
f6f1bde5f2 feat(issuerdirectory): postgres persistence runtime + sample config
Sprint SPRINT_20260416_013_Authority_issuerdirectory_truthful_persistence_runtime.

IssuerDirectory.WebService Postgres persistence, options,
program wiring, tests. Sample config under etc/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:40:22 +03:00
master
fe3eacbba4 feat(authority): truthful dpop runtime extensions
Sprint SPRINT_20260416_012_Authority_truthful_dpop_runtime.

AuthorityDpopRuntimeExtensions wiring, standard plugin bootstrapper +
options tests, DPoP runtime security tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:40:16 +03:00
master
45ebcb88b9 feat(notifier): security + deadletter runtime
Sprint SPRINT_20260416_011_Notify_truthful_security_deadletter_runtime.

- Migration 004 security_deadletter_runtime_state.
- DeadLetterRuntimeEntity + WebhookSecurityConfigEntity +
  WebhookValidationNonceEntity persistence models.
- PostgresDeadLetterService + PostgresDeadLetterHandler observability.
- PostgresTenantIsolationValidator + PostgresWebhookSecurityService.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:40:06 +03:00
master
43d8398a5d feat(notifier): quiet-hours + maintenance window runtime
Sprint SPRINT_20260416_010_Notify_truthful_quiet_hours_maintenance_runtime.

- Migration 002 quiet_hours_maintenance_runtime_metadata.
- QuietHoursEntity + MaintenanceWindowEntity persistence models.
- PostgresQuietHoursRuntimeServices + QuietHoursRuntimeProjection.
- Notify + Notifier WebService compat shims.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:56 +03:00
master
9148c088da feat(notifier): postgres escalation + on-call schedule compat
Sprint SPRINT_20260416_009_Notify_truthful_escalation_oncall_runtime.

PostgresEscalationRuntimeServices plus Notify + Notifier WebService
compat shims for escalation policy and on-call schedule service.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:47 +03:00
master
b877e13b3c feat(notifier): postgres suppression admin runtime
Sprint SPRINT_20260416_008_Notify_truthful_suppression_admin_runtime.

Postgres-backed suppression runtime services wired through the admin
runtime extension registered in the durable storage bootstrap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:37 +03:00
master
23bef5befc feat(router,gateway): postgres dpop replay + cache store + claim mapper
Sprint SPRINT_20260416_007_Router_truthful_dpop_replay_runtime.

- Gateway.WebService: GatewayDpopReplayRuntimeExtensions, authorization
  middleware + integration + dpop replay runtime tests.
- Messaging.Transport.Postgres: PostgresCacheStore + tests.
- Microservice.AspNetCore: DefaultAuthorizationClaimMapper + tests.
- Router.Common: ClaimRequirement.
- Router.Gateway: authorization middleware, OpenAPI claim security
  mapper + document generator.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:28 +03:00
master
8ed3f869f5 feat(binaryindex,symbols): truthful symbol-source runtime + migrations
Sprint SPRINT_20260416_006_BinaryIndex_symbols_truthful_manifest_runtime.

Symbols.Server: in-memory symbol source read repository with real
endpoints, program wiring, migrations, tests services.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:20 +03:00
master
9efe5cdb64 feat(timeline): truthful ingestion transport + indexer wiring
Sprint SPRINT_20260416_005_Timeline_truthful_ingestion_transport_contract.

Timeline WebService + TimelineIndexer worker program wiring; infrastructure
DI extension with null subscriber fallback; startup registration +
ingestion runtime registration tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:14 +03:00
master
9d569fdeb8 feat(replay): truthful snapshot index runtime
Sprint SPRINT_20260416_004_Replay_truthful_snapshot_index_cutover.

Replay WebService program wiring; runtime startup contract tests,
point-in-time query API integration tests, test environment variable
scope helper.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:09 +03:00
master
32551baf0e feat(graph): truthful postgres runtime + unsupported feature gating
Sprint SPRINT_20260416_003_Graph_graph_api_truthful_runtime_cutover.

Postgres-backed graph repository + runtime repo with
GraphFeatureUnavailableException and GraphRuntimeFallbackServices.
Runtime-state compatibility endpoints, tenant authorization alignment,
integration tests for edge metadata / export / query overlay /
unsupported feature paths.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:39:03 +03:00
master
2b58c9ed3c feat(concelier,excititor): postgres lease + vex attestations + graph overlay
Sprint SPRINT_20260415_007_DOCS_concelier_excititor_real_backend_cutover.

- Concelier.Persistence: migrations 000 (pg_trgm) + 007 (job_leases),
  PostgresLeaseStore + service collection wiring + tests.
- Concelier.Core.Sources: source definitions / registry / sync trigger
  contract.
- Concelier.WebService: Postgres-backed advisory/source services,
  job registration, immediate sync trigger, options post-configure +
  validator, internal setup-source endpoint extensions, plugin unified
  adapter factory, unsupported job/coordinator/orchestrator shims.
- Excititor.WebService: graph options + overlay store wiring.
- Excititor.Persistence: migrations 004 (graph overlays) + 005
  (vex attestations), PostgresVexAttestationStore + tests.

Sub-sprints _023 (affected symbol guard), _024 (feed mirror runtime),
_025 (durable mirror bundle import), _026 (allowlisted root) follow up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:38:44 +03:00
master
462565fdab feat(policy,signer): postgres stores + verdict rekor wiring
Sprint SPRINT_20260415_006_DOCS_policy_findings_signer_real_backend_cutover
(findings portion landed in commit e60d5e0fc).

- Policy.Engine: Postgres stores for airgap state, attestation reports,
  verification policy, console export, policy pack repo, risk scoring job,
  violation events; messaging-backed evaluation + reachability facts cache;
  governance / violation / simulation endpoints; UnsupportedVerdictRekorClient.
- Policy.Persistence: migrations 010 (policy pack runtime state),
  011 (violation fusion results), 012 (runtime canonical state).
- Policy.Gateway: governance + simulation endpoints + rekor/token-cache
  runtime wiring tests.
- Policy.Registry: in-memory store scaffolding + testing harness.
- Signer: Postgres ceremony repo + audit sink, structured logging sink,
  stateless quota service, configured POE introspector, runtime proof /
  wiring / key rotation / observability / negative / contract tests.
- Signer.KeyManagement: migrations 002 ceremony runtime state,
  003 trust anchor runtime state, 004 key audit log shape fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:37:43 +03:00
master
9393baf1ad feat(platform,binaryindex,doctor): runtime persistence cutover
Sprint SPRINT_20260415_005_DOCS_platform_binaryindex_doctor_real_backend_cutover.

- Platform.WebService: AoC/quota compatibility endpoints, platform health
  service, setup wizard contracts/endpoints/service, release migrations
  058 (trust signing demo seed) + 067 (cleanup), context migration tests.
- BinaryIndex.WebService: golden-set controller + storage extensions,
  runtime persistence extensions, durable runtime + storage registration
  tests.
- Doctor: scheduler runtime guard, report storage extensions,
  scheduler + webservice registration tests.

Sub-sprints _006 (symbols truthful manifest) and _021 (doctor evidence
schema registry) land as follow-ups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:37:20 +03:00
master
e60d5e0fce feat(findings,sbomservice,scanner): runtime data plane cutover
Sprint SPRINT_20260415_004_DOCS_runtime_data_plane_real_backend_cutover.

- Findings.Ledger: Postgres-backed endpoints (runtime timeline/traces,
  scoring, vuln-explorer, webhook), unsupported-compat shim, ledger data
  source, vulnerability detail service.
- RiskEngine.WebService: web application factory + runtime wiring tests.
- SbomService: rename InMemory -> ManifestBacked metadata repo, add
  Postgres registry source/ledger/lineage/event/watermark repos +
  migrations 001 initial schema and 002 runtime durable state.
- Scanner: SBOM uploads store + migration 026, scan runtime state +
  migration 027, persisted scan coordinator, Postgres policy repos,
  VEX gate query service + controller, reachability evidence migration 022.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:36:40 +03:00
master
302826aedb feat(scheduler,packsregistry,registry): postgres backend cutover
Sprint SPRINT_20260415_003_DOCS_scheduler_registry_real_backend_cutover.

- Scheduler WebService: Postgres-backed audit service + resolver job service,
  system schedule bootstrap, durable host tests, jwt app factory
- PacksRegistry: persistence extensions + migration 002 runtime pack repo,
  durable runtime + startup contract tests
- Registry.TokenService: Postgres plan rule store + admin endpoints,
  migration 001 initial schema, durable runtime + persistence tests
- Scheduler.Plugin.Doctor: wiring for doctor job plugin
- Sprint _019 (webhook rate limiter) and _002 (compose storage compat)
  land separately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:36:05 +03:00
master
6b89bd5652 feat(notify,notifier): postgres durable runtime base cutover
Sprint SPRINT_20260415_002_DOCS_notify_notifier_real_backend_cutover.

Base durable storage wiring for both Notify and Notifier:
- NotifyDbContext + EF migrations (002 pack_approvals, 003 operator_override)
- Pack approval / operator override / retention / tenant isolation repos
- Notifier worker Postgres repository adapters (audit, channel, delivery,
  inbox, localization, lock, rule, template) + runtime service base
- Durable runtime fixture + integration test scaffolding
- WebService compat shims for pack approval, operator override, throttle

Sub-sprints _008 (suppression), _009 (escalation), _010 (quiet hours),
_011 (security/deadletter) land as follow-ups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:35:30 +03:00
master
5892937e39 feat(workflow): add ArtifactExporter console tool + MSBuild targets
New StellaOps.Workflow.ArtifactExporter project: a post-build console app that
reads the generator's bundled workflow registry from the compiled plugin DLL and
writes canonical JSON (authoritative, fail-build) plus SVG/PNG visual artifacts
(graceful warn) next to each *Workflow.cs source file. Replaces per-csproj
rendering boilerplate with a single targets import.

Key design choices:
- Console app invoked via <Exec>, not an MSBuild ITask DLL — easier to debug,
  no rendering-lib loading into the MSBuild process.
- Links WorkflowRenderGraphCompiler.cs from Engine as a compiled file instead of
  ProjectReference, avoiding EF Core + Oracle transitive deps in the tool.
- Parallel.ForEachAsync across workflows with file-lock + PID-sentinel
  "latest-wins" cross-process coordinator (FileShare.None + FileOptions
  .DeleteOnClose — no thread-affinity issues unlike Mutex).
- Hash-based cache: expected canonical-hash marker injected into
  .definition.json; unchanged workflows skip re-render. First build 167
  workflows in ~143s; no-change rebuild in ~0.1s.
- Atomic write-via-rename on every artifact.

Targets file (StellaOps.Workflow.ArtifactExporter.targets) plugins can import
to get: analyzer wiring + JSON/SVG/PNG export in one <Import>. Configurable via
StellaOpsWorkflowArtifactExport / StellaOpsWorkflowSkipSvg /
StellaOpsWorkflowSkipPng properties. Also surfaces CanonicalTemplates/*.json as
AdditionalFiles so the analyzer's fragment loader can inline runtime-loaded
fragments at compile time.

Verified: builds clean against upstream Abstractions/Contracts/Renderer.ElkSharp/
Renderer.Svg (net10.0, 0 warnings, 0 errors).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 17:42:38 +03:00