Commit Graph

1249 Commits

Author SHA1 Message Date
master
4a8e2758cd refactor(timeline): renumber migrations to sequential 002-004 format
Renames date-prefixed migrations (20260107_002, 20260408_003, 20260409_004)
to plain sequential numbers (002, 003, 004) to match the convention used by
other service migration directories. Adds TimelineCoreMigrationCategoryTests
to verify the unified-audit migration registers under the correct category
for the StartupMigrationHost transaction classifier.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:56:52 +03:00
master
a393b6d6e1 feat(infra-postgres): detect explicit transaction control in migrations
Adds MigrationSqlTransactionClassifier to recognize migration SQL that opens
its own transactions (BEGIN/COMMIT/ROLLBACK) so MigrationRunner can skip
wrapping those files in an outer transaction. StartupMigrationHost now surfaces
a MigrationCategory indicator for runtime-aligned bootstrap. Test harness
extended with an explicit-transaction fixture and execution scenario coverage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:56:27 +03:00
master
337aa58023 fix(scheduler): bind IDoctorTrendRepository via [FromServices] on trend endpoints
Three Doctor trend endpoints (/trends/checks/{checkId}, /trends/categories/{category},
/trends/degrading) were missing the [FromServices] attribute on the
IDoctorTrendRepository? parameter, causing ASP.NET minimal-APIs to attempt model
binding from route/query instead of resolving from DI. Verified fix with HTTP 200
responses against all four trend endpoints via the gateway.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:34:09 +03:00
master
b837119060 refactor(concelier): remove hardcoded feed-mirror management endpoints
Drop FeedMirrorManagementEndpoints.cs (660 lines of seeded mock data)
as part of the no-mocks initiative. Feed mirror state will be served
from real source/read-model queries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:29:16 +03:00
master
39111b35c2 docs: integrations GitLab registry auth + sprint plans
Add GitLab container registry connector docs (WWW-Authenticate Bearer
token exchange, authref config). Add sprint files for container rebuild,
regression retest, and UI no-mocks work.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:59 +03:00
master
36eaf5e798 fix(orchestrator): scripts auto-migration with dedicated options and DI module
Scripts module now owns its PostgreSQL schema lifecycle: ScriptsPostgresOptions,
ServiceCollectionExtensions.AddReleaseOrchestratorScripts(), embedded SQL migration,
and MigrationServiceExtensions fix to register multiple IHostedService migrations
without deduplication. Fresh installs auto-converge the scripts catalog without
depending on Scheduler-owned bootstrap SQL.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:52 +03:00
master
9820b48372 feat(concelier): add snapshot lookup by ID and list by source
GetBySnapshotIdAsync and ListBySourceIdAsync provide the read-model
queries needed to replace seeded feed-mirror responses with real state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:45 +03:00
master
bc569931d4 fix(authority): retry transient bootstrap failures with configurable attempts
StandardPluginBootstrapper now retries up to 15 times (2s delay) so the
admin user and client seeds converge after PostgreSQL becomes reachable.
Exceptions bubble through the retry loop instead of being swallowed per-step.
Tests cover the retry path with a FlakyUserRepository that fails once then
succeeds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:36 +03:00
master
f50a422939 fix(gateway): standalone local route config with full Node/Transport/Routing/OpenApi sections
Mount router-gateway-local.json as appsettings.json (not appsettings.local.json)
so it fully replaces the baked-in config instead of merging. Add Node, Transports,
Routing, and OpenApi sections to make the file self-contained. Test validates all
required top-level sections are present.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:28 +03:00
master
a3fcee5ffa chore: clean up stale worktree tracking files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:28:20 +03:00
master
fcdc4e0291 fix(scheduler): add [FromServices] to Doctor trend endpoint parameters
DoctorTrendEndpoints used IDoctorTrendRepository and TimeProvider as
MapGet handler parameters without [FromServices], causing ASP.NET to
infer them as body parameters — crashing the scheduler on startup with
"Body was inferred but the method does not allow inferred body parameters."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 11:32:38 +03:00
master
d25d0d60b9 fix(ui): JobEngine standard tabs + schedules loading + audit filter bar
JobEngine page:
- Replace custom segmented toggle with StellaPageTabsComponent
- Fix SCHEDULER_API_BASE_URL factory (new URL() always threw on relative paths)
- Fix listSchedules to include disabled schedules
- Add source field mapping for system schedule badge

Audit log page:
- Remove Overview tab, default to All Events
- Replace custom filters with standard app-filter-bar (matching other pages)
- Remove policy-specific column toggles and category chips

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 11:16:17 +03:00
master
d0e67e59fb fix(scripts): setup.ps1/sh comment parsing, network creation, elevation UX
- Strip inline comments from hosts template before hostname extraction
- Create stellaops bridge network if missing (was only creating frontdoor)
- Clear elevation warning with missing count, re-run instructions, clipboard copy
- Both setup.ps1 (Windows) and setup.sh (Linux/macOS) fixed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:45:23 +03:00
master
3a36aefd81 fix: resolve 4 unhealthy services from fresh volume rebuild
- router-gateway: sync 10 missing jobengine routes to local config (prevent array merge bleed-through)
- findings-ledger-web: add VulnExplorer tables to postgres-init bootstrap script
- timeline-web: replace competing migration hosted service with standard AddStartupMigrations
- graph-api: handle null PostgresGraphRepository gracefully, add graph schema to init
- scheduler-web: add failure_signatures table to init bootstrap

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:23:52 +03:00
master
537f4f17fc test(audit): comprehensive tests for emission, PII redaction, hash chain, enrichers
- AuditPiiRedactorTests: 10 tests for recursive redaction + edge cases
- AuditActionFilterTests: 14 tests for capture, enrichment, fallback
- AuditModulesAndActionsTests: 3 tests for constant validation
- PostgresUnifiedAuditEventStoreTests: 8 tests for hash chain integrity
- UnifiedAuditAggregationServiceTests: 6 tests for new query filters
- AuditCleanseJobPluginTests: 7 tests for retention logic + validation
- PluginRegistryTests: 9 tests for plugin discovery
- Authority/Policy enricher tests: 8 tests for GUID resolution
- Total: ~65 new tests across 5 test projects
- Added InternalsVisibleTo for Audit.Emission and Timeline.WebService
- Created AuditCleanseJobPlugin implementation for retention-based cleanup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 13:00:18 +03:00
master
5d245f958f refactor(audit): replace magic strings with AuditModules/AuditActions constants
- Replace 349 .Audited("module", "action") calls with typed constants across 91 files
- Add 21 missing action constants to AuditActions.cs (Policy, Attestor, Evidence, Scanner)
- Compile-time safety for module/action naming across all 15 services

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:40:18 +03:00
master
c698ff40cc feat(audit): resource enrichers + before-state providers for critical services
- Authority: resolve user/client/role/tenant GUIDs to names, capture before-state
- Policy: resolve exception/pack/profile GUIDs, capture governance state
- Release-Orchestrator: resolve release GUIDs to name+version
- Findings: resolve finding GUIDs to CVE+package
- All enrichers fire-and-forget with graceful fallback

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:30:49 +03:00
master
92c2a8591c feat(audit-ui): structured details rendering + auto-diff from beforeState
- New audit-event-details-panel component with HTTP context, request body, before state sections
- Highlight [REDACTED] PII values with warning badge
- Auto-construct diff view from details.beforeState when Diff is absent
- Add release/attestor/doctor/signals/advisory-ai/riskengine module support
- Replace raw JSON dumps with semantic rendering

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:15:50 +03:00
master
786aaa765d feat(scheduler): audit cleanse plugin + JSON Schema config forms + UI enrichment
Scheduler plugins:
- AuditCleanseJobPlugin: purge audit data older than retention (default 365 days)
- ScanJobPlugin: proper JSON Schema for mode/scope/parallelism
- Plugin discovery endpoints: list, schema, defaults
- ISchedulerJobPlugin gains GetDefaultConfig()
- Dynamic plugin-config-form Angular component
- Schedule create dialog with plugin-aware config

Audit UI (Gaps 4+5):
- Structured details panel: HTTP context, request body, before state
- [REDACTED] PII highlighting with warning badges
- Auto-construct diff from details.beforeState
- New module types: release, attestor, doctor, signals, advisory-ai, riskengine

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:13:42 +03:00
master
7f40f8d678 feat(audit-api): fix 7 gaps — module catalog, Diff ingest, filters, chain verify
- Add release/doctor/signals/advisory-ai/riskengine to module catalog (Gap 1)
- Add Diff to UnifiedAuditIngestRequest for before/after state (Gap 2)
- Add resourceName, actorIp, actorEmail query parameters (Gap 3, 8)
- Add GIN index on details_jsonb for future JSONB queries (Gap 6)
- Map chain verification endpoint GET /api/v1/audit/chain/verify (Gap 7)
- Expose content_hash + previous_entry_hash in API response (Gap 9)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 12:09:27 +03:00
master
2a69ad112c feat(audit): enhanced AuditActionFilter with body capture + enrichment hooks
- Capture request body (JSON, up to 64KB, PII-redacted) in Details["requestBody"]
- Capture response resource ID for create operations in Details["responseResourceId"]
- Add IAuditResourceEnricher interface for GUID -> human-readable name resolution
- Add IAuditBeforeStateProvider for before-state snapshots in Details["beforeState"]
- Add AuditPiiRedactor with configurable field patterns (recursive JSON walk)
- AuditActionAttribute gains CaptureBody (bool?) + SensitiveFields (string[]?)
- AuditEmissionOptions gains MaxBodySizeBytes (64KB) + RedactedFieldPatterns
- All enrichment is optional and fire-and-forget (never blocks response)
- Add AuditModules constants (15 modules) and AuditActions constants (~200 actions)
  organized as nested static classes per module for type-safe annotations
- All 17 consuming services verified to compile successfully

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:49:54 +03:00
master
54e7f871a3 feat(audit): annotate Platform + Notify + Scheduler + ReleaseOrchestrator (Batch 2b)
Platform (~40 state-changing endpoints annotated):
- EnvironmentSettingsAdmin: update/delete environment settings
- IdentityProvider: create/update/delete/enable/disable/test/apply
- CryptoProviderAdmin: update/delete crypto preferences
- AdministrationTrustSigning: create/rotate/revoke keys, register/block/unblock issuers,
  register/revoke certificates, configure transparency log
- PlatformEndpoints: quota alerts, onboarding complete/skip, preferences update, dashboard profile create
- SetupEndpoints: create session, execute/skip steps, finalize setup
- ScoreEndpoints: evaluate/verify score
- ScriptEndpoints: create/update/delete scripts
- ReleaseOrchestratorEnvironment: CRUD environments/targets/freeze-windows

Notify (~30 state-changing endpoints annotated):
- NotifyApi (v2): rules CRUD, templates CRUD, incident ack/resolve
- RuleEndpoints (v2): create/update/delete rules
- TemplateEndpoints (v2): create/update/delete templates
- EscalationEndpoints: CRUD policies, schedules, overrides; start/escalate/stop
- QuietHoursEndpoints: create/update/delete calendars
- ThrottleEndpoints: update/delete config
- OperatorOverrideEndpoints: create/revoke overrides

Scheduler (~10 state-changing endpoints annotated):
- ScheduleEndpoints: create/update/delete/pause/resume schedules
- RunEndpoints: create/cancel/retry runs
- GraphJobEndpoints: create build/overlay graph jobs
- PolicyRunEndpoints: create policy run
- Added StellaOps.Audit.Emission project reference + AddAuditEmission() registration
- Fixed pre-existing ScanJobPlugin.cs build error (Success -> Valid)

ReleaseOrchestrator (~25 state-changing endpoints annotated):
- ReleaseEndpoints: create/update/delete/ready/promote/deploy/rollback/clone releases,
  add/update/remove components
- ApprovalEndpoints: approve/reject/batch-approve/batch-reject
- DeploymentEndpoints: create/pause/resume/cancel/rollback/retry deployments
- EvidenceEndpoints: verify evidence
- ScriptsEndpoints: create/update/delete scripts
- ReleaseDashboardEndpoints: approve/reject promotions
- ReleaseControlV2Endpoints: approval decision, rollback run

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:40:02 +03:00
master
d4d75200c5 feat(audit): annotate Authority (~49) + Policy (~162) endpoints (Batch 2a)
- Authority: user/client/role/tenant CRUD, scope management, token ops
- Policy: exceptions, governance, risk profiles, packs, gates, simulations
- Sprint 005 FILTER-005 + FILTER-007 progress

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:38:41 +03:00
master
665bd6db48 feat(audit): annotate Attestor+Findings+Doctor+Signals+AI+RiskEngine (Batch 2c/FILTER-010)
- Attestor: ~25 endpoints (DSSE, keys, ceremonies, watchlist)
- Findings: ~30 endpoints (VEX decisions, fix verifications, ledger events)
- Doctor: ~7 endpoints (runs, diagnostics)
- Signals: ~10 endpoints (callgraph, reachability, evidence)
- AdvisoryAI: ~5 endpoints (decisions, runs)
- RiskEngine: ~3 endpoints (score jobs, simulations)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:31:33 +03:00
master
f3401540d7 refactor(jobengine): delete Core + Infrastructure + Worker + Tests (~65K lines)
- All active services now use their own persistence (release-orchestrator, scheduler, packsregistry)
- Zero remaining references from any active csproj
- Clean solution files (4 projects + 48 build configs removed from StellaOps.sln)
- Update README and AGENTS.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:23:11 +03:00
master
7f65e224ae feat: scheduler web+worker merge + audit Batch 1 (68 endpoints annotated)
Scheduler:
- Merge scheduler-worker into scheduler-web with Worker:Embedded flag
- Default embedded=true (compose), false available for K8s split
- Upgrade to resources-heavy, comment out scheduler-worker container

Audit Batch 1 (first real audit emission):
- Create AuditedRouteGroupExtensions convention helper
- EvidenceLocker: 7 endpoints (store/snapshot/verify/hold/export/verdict)
- Integrations: 6 endpoints (CRUD + test + discover)
- Scanner: 55 endpoints across 25 files
- Sprint 005 FILTER-001/002/003 marked DONE

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:08:40 +03:00
master
7c7525f353 feat(audit): annotate endpoints in EvidenceLocker + Integrations + Scanner (Batch 1)
- Add AuditedRouteGroupExtensions with WithAuditFilter() and Audited() helpers
- EvidenceLocker: 7 endpoints (store, snapshot, verify, hold, store_verdict,
  verify_verdict, export)
- Integrations: 6 endpoints (create, update, delete, test, discover,
  run_code_guard)
- Scanner: ~55 annotations across 25 endpoint files covering sources CRUD,
  scan submission, scan policies, approvals, triage, webhooks, reports,
  reachability, secret detection, offline kit, runtime, and more
- Skipped read-only POSTs per convention (delta compare, counterfactual,
  EPSS batch, slice query, policy diagnostics/preview/runtime/overlay)
- All 3 services build clean with 0 errors/warnings
- Sprint 005: FILTER-001, FILTER-002, FILTER-003 marked DONE

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:08:00 +03:00
master
ddfc154a99 fix: QA preflight fixes — stale routes, missing hosts, policy URL
- Add workflow + release-orchestrator to hosts file
- Fix scheduler policy URL: policy.stella-ops.local → policy-engine.stella-ops.local
- Fix gateway stale routes: doctor-scheduler → scheduler, vulnexplorer → findings
- Remove stale "policy" from RequiredMicroservices (merged into policy-engine)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:57:32 +03:00
master
845541c537 feat(audit): wire AddAuditEmission in 7 more services + update Sprint 005
- Wire audit emission in: Attestor, Findings Ledger, Doctor, Signals,
  AdvisoryAI, RiskEngine, OpsMemory (total: 16 services now emit)
- Sprint 005: add FILTER-010 (80 endpoints in 6 new services)
- Sprint 005: add CAPSULE-001 (decision capsule lifecycle, blocked)
- Sprint 005: add config/settings audit checklist (12 surfaces mapped)
- Total auditable endpoints: 617 across 16 services

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 09:37:46 +03:00
master
8442fcb807 docs(audit): sprint plan for endpoint filters + per-service table deprecation
- Map 532 state-changing endpoints across 9 services for AuditActionFilter
- Plan 5-batch migration: convention helper → complex services → dual-write →
  read migration → drop local tables
- Reclassify Authority auth-protocol and Policy gate-bypass audit as domain evidence
- 24 days active work + 120-day verification pipeline

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:44:04 +03:00
master
b081809178 feat(graph): enable Postgres-backed reads, replace in-memory seed data
- Switch default repository to start empty when Postgres is configured;
  GraphDataLoaderHostedService loads real data from graph.graph_nodes/edges
  on startup and refreshes every 5 minutes
- Keep InMemoryGraphRepository with hardcoded seed as fallback when no DB
- Add Reload() method to InMemoryGraphRepository for hot-swapping data
- Add GetAllNodesAsync/GetAllEdgesAsync to PostgresGraphRepository
- Deprecate hardcoded seed data in InMemoryGraphRepository
- Fix graph-api port mismatch: container listens on 8080 (ASPNETCORE_URLS)
  but compose mapped 80:80; corrected to 80:8080 + healthcheck to 8080

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:39:18 +03:00
master
573d3d2a8d Merge branch 'worktree-agent-a709f7ea'
# Conflicts:
#	src/Findings/StellaOps.Findings.Ledger.WebService/Services/VulnExplorerRepositories.cs
#	src/Findings/StellaOps.Findings.Ledger/migrations/010_vex_fix_audit_tables.sql
2026-04-08 18:29:54 +03:00
master
414049ef82 fix(findings): wire VulnExplorer adapters to Postgres + fix route mismatch
Replace ConcurrentDictionary-based in-memory stores (VexDecisionStore,
FixVerificationStore, AuditBundleStore) with Postgres-backed repositories
that persist VEX decisions, fix verifications, and audit bundles to the
findings schema. The stores auto-detect NpgsqlDataSource availability and
fall back to in-memory mode for tests/offline.

Changes:
- Add migration 010_vex_fix_audit_tables.sql creating vex_decisions,
  fix_verifications, and audit_bundles tables (partitioned by tenant_id)
- Rewrite VexDecisionStore with dual-mode: Postgres when ConnectionStrings__Default
  is configured, ConcurrentDictionary otherwise (backwards-compatible for tests)
- Rewrite FixVerificationStore and AuditBundleStore with same dual-mode pattern
- Wire NpgsqlDataSource in Program.cs from ConnectionStrings__Default
- Add /api/vuln-explorer/findings/{vulnId}/evidence-subgraph route alias to
  match what the Angular UI (EvidenceSubgraphService) actually calls -- the
  gateway forwards this path as-is to the service
- Convert all endpoint handlers to async to use the new Postgres-backed methods
- Add Npgsql PackageReference to VulnExplorer.Api.csproj
- Add VulnExplorerRepositories.cs placeholder in Findings.Ledger.WebService

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:29:09 +03:00
master
c426207f24 feat(crypto): tenant-aware ICryptoProviderRegistry resolution (CP-005)
Mark CP-005 DONE: TenantAwareCryptoProviderRegistry decorator, ITenantCryptoPreferenceProvider
interface, AddTenantAwareCryptoResolution DI extension, PlatformCryptoPreferenceProvider,
14 unit tests (all pass), and sprint tracker update.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:22:40 +03:00
master
e1f5341c82 fix: dead jobengine route path rewriting + legacy endpoint delegation
- Fix PacksRegistry route: rewrite /jobengine/registry/packs → /packs on target
- Fix first-signal route: delegate to real handler instead of 501 stub
- Release-orchestrator persistence extraction progress

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:18:26 +03:00
master
2d83ca08b8 refactor(scheduler): move exception workers from web to worker side
- Remove ExceptionLifecycleWorker + ExpiringNotificationWorker from scheduler-web
- Add both to AddSchedulerWorker() extension (worker-host already calls this)
- Move PostgresExceptionRepository to Worker library
- Web retains only SystemScheduleBootstrap (startup seed)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 18:05:53 +03:00
master
cd075ee08b fix: clean up worktree refs + remaining schema extraction + route fixes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:27:43 +03:00
master
5d3e0d46b2 Merge branch 'worktree-agent-a503735a'
# Conflicts:
#	devops/compose/docker-compose.stella-ops.yml
#	devops/docker/services-matrix.env
#	src/JobEngine/StellaOps.Scheduler.WebService/Bootstrap/SystemScheduleBootstrap.cs
#	src/JobEngine/StellaOps.Scheduler.WebService/Program.cs
#	src/JobEngine/StellaOps.Scheduler.WebService/Schedules/ScheduleEndpoints.cs
#	src/JobEngine/StellaOps.Scheduler.WebService/StellaOps.Scheduler.WebService.csproj
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Models/Schedule.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/IRunProgressReporter.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/ISchedulerJobPlugin.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/ISchedulerPluginRegistry.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/JobConfigValidationResult.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/JobExecutionContext.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/JobPlan.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/JobPlanContext.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/SchedulerPluginRegistry.cs
#	src/JobEngine/StellaOps.Scheduler.__Libraries/StellaOps.Scheduler.Plugin.Abstractions/StellaOps.Scheduler.Plugin.Abstractions.csproj
2026-04-08 16:27:02 +03:00
master
de6f3f0c33 feat(timeline): Postgres-backed unified audit ingest with hash chain (AUDIT-001)
- Create timeline.unified_audit_events table with SHA-256 hash chain
- Create timeline.unified_audit_sequences for per-tenant tracking
- Replace IngestAuditEventStore (in-memory) with PostgresUnifiedAuditEventStore
- Preserve chain integrity via serializable isolation
- Mark AUDIT-001 as DONE in sprint tracker

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:25:31 +03:00
master
908619e739 feat(scheduler): plugin architecture + Doctor health check plugin
- Create ISchedulerJobPlugin abstraction with JobKind routing
- Add SchedulerPluginRegistry for plugin discovery and resolution
- Wrap existing scan logic as ScanJobPlugin (zero behavioral change)
- Extend Schedule model with JobKind (default "scan") and PluginConfig (jsonb)
- Add SQL migrations 007 (job_kind/plugin_config) and 008 (doctor_trends table)
- Implement DoctorJobPlugin replacing standalone doctor-scheduler service
- Add PostgresDoctorTrendRepository for persistent trend storage
- Register Doctor trend endpoints at /api/v1/scheduler/doctor/trends/*
- Seed 3 default Doctor schedules (daily full, hourly quick, weekly compliance)
- Comment out doctor-scheduler container in compose and services-matrix
- Update Doctor architecture docs and AGENTS.md with scheduling migration info

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:24:46 +03:00
master
f5a9f874d0 feat(audit): wire AddAuditEmission into 9 services (AUDIT-002)
- Wire StellaOps.Audit.Emission DI in: Authority, Policy, Release-Orchestrator,
  EvidenceLocker, Notify, Scanner, Scheduler, Integrations, Platform
- Add AuditEmission__TimelineBaseUrl to compose defaults
- Endpoint filter annotation deferred to follow-up pass

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:20:39 +03:00
master
65106afe4c refactor: DB schema fixes + container renames + compose include + audit sprint
- FindingsLedger: change schema from public to findings (V3-01)
- Add 9 migration module plugins: RiskEngine, Replay, ExportCenter, Integrations, Signer, IssuerDirectory, Workflow, PacksRegistry, OpsMemory (V4-01 to V4-09)
- Remove 16 redundant inline CREATE SCHEMA patterns (V4-10)
- Rename export→export-web, excititor→excititor-web for consistency
- Compose stella-ops.yml: thin wrapper using include: directive
- Fix dead /api/v1/jobengine/* gateway routes → release-orchestrator/packsregistry
- Scheduler plugin architecture: ISchedulerJobPlugin + ScanJobPlugin + DoctorJobPlugin
- Create unified audit sink sprint plan
- VulnExplorer integration tests + gap analysis

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 16:10:36 +03:00
master
6592cdcc9b refactor(graph): absorb Cartographer into graph-api + wire Graph Indexer
- Wire Graph Indexer library + Persistence into graph-api (csproj refs + DI)
- Add build/overlay endpoints matching Scheduler HTTP contracts
  (POST/GET /api/graphs/builds, POST/GET /api/graphs/overlays)
- Add PostgresGraphRepository for reading from graph.graph_nodes/edges
- Register SBOM ingest, analytics, change-stream, and inspector pipelines
- Comment out Cartographer container in compose (empty shell, Slot 21)
- Add cartographer.stella-ops.local as backwards-compat alias on graph-api
- Update Scheduler config to target graph.stella-ops.local
- Update services-matrix.env, hosts file, port-registry, module-matrix
- Update component-map, architecture docs, Scanner/Graph READMEs
- Eliminates 1 container (stellaops-cartographer)

All 133 existing tests pass (77 Api + 37 Indexer + 19 Core).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:48:18 +03:00
master
13c4811e32 refactor(scripts): move Scripts API from scheduler to release-orchestrator
- Fix dual-schema violation (scheduler was writing to scheduler + scripts)
- Move ScriptsDataSource, PostgresScriptStore, script endpoints
- Update gateway routes and UI references
- Each service now owns exactly one schema

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:37:28 +03:00
master
87eac86fb9 feat(web): crypto provider picker UI (CP-003/004/005)
- Add crypto provider panel to Platform Settings at /setup/crypto-providers
- Show provider health status with status dots, latency, and last-checked time
- Collapsible start commands with copy-to-clipboard for stopped providers
- Auto-refresh every 30s using interval+switchMap, stopped on destroy
- Provider selection with confirmation dialog via existing ConfirmDialogComponent
- Priority ordering via number input per provider preference
- Active provider banner and per-card active badge
- Disabled "Set as Active" for stopped/unreachable providers with tooltip
- Algorithm scope mapping table for configured preferences
- Backward-compatible redirect from /settings/crypto-providers
- Setup overview card added for Crypto Providers
- Sprint CP-003/CP-004 marked DONE with execution log

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:36:10 +03:00
master
bc9eec511b Merge branch 'backport/serdica-engine-fixes' 2026-04-08 15:29:49 +03:00
master
ff4c721eda feat: port WorkflowStore plugins (Oracle, Mongo, Postgres) from Serdica
Ported 3 database backend plugins with namespace adaptation:
- Oracle: EF Core-based store with AQ signaling wiring (2 files)
- MongoDB: Delegates to DataStore.MongoDB extension method (2 files)
- PostgreSQL: Delegates to DataStore.PostgreSQL extension method (2 files)

Implementation files already exist in __Libraries DataStore projects
(ported in earlier commits). These plugins are thin IDependencyInjectionRoutine
wrappers that enable dynamic plugin loading via the workflow plugin system.

Also fleshed out the stub OracleWorkflowDataStoreExtensions to register
WorkflowDbContext, OracleWorkflowRuntimeStateStore, and
OracleWorkflowHostedJobLockService.

All namespaces converted from Ablera.Serdica to StellaOps.
Plugin interface adapted from IPluginServiceRegistrator to IDependencyInjectionRoutine.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 14:56:02 +03:00
master
0e25344bd7 refactor(jobengine): delete TaskRunner service
- Remove TaskRunner source, tests, libraries (3 directories)
- Remove from compose, services-matrix, nginx, hosts, smoke tests
- Remove CLI commands, UI references, Authority scopes
- Remove docs, OpenAPI spec, QA state files
- Leave task_runner_id DB columns as nullable legacy
- PacksRegistry preserved (independent service)
- Eliminates 2 containers (taskrunner-web + taskrunner-worker)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 14:11:20 +03:00
master
ca35f66830 backport: merge Serdica workflow abstractions and contracts improvements
Backport generic improvements from Serdica workflow engine to StellaOps:

Abstractions:
- Add IWorkflowActorRoleResolver interface and NullWorkflowActorRoleResolver
  default implementation for server-side actor identity resolution
- Add expression-based Call overloads to WorkflowFlowBuilder (6 new methods
  accepting WorkflowExpressionDefinition for payload instead of Func<> factory)
- Fix failure handler compilation: preserve empty handlers (0 steps) as empty
  sequences instead of null, allowing "ignore failure and continue" semantics
- Add explanatory comments to WorkflowRegistrationAbstractions for JSON number
  normalization logic

Contracts:
- Add NextTasks and WorkflowState to StartWorkflowResponse so callers can
  see immediate next tasks after starting a workflow
- Add WorkflowInstanceId, NextTasks, and WorkflowState to
  WorkflowTaskCompleteResponse for richer task completion feedback

Transport: verified Transport.GraphQL, Transport.Http, Transport.Microservice,
and Transport.LegacyRabbit are engine-embedded plugins (no separate directories
to add/remove). ElkSharp library confirmed present at src/__Libraries/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 13:59:09 +03:00
master
00b248f3d8 fix: backport engine fixes from Serdica integration
1. Handle duplicate JSON property names in ToRuntimeValue — GroupBy
   before ToDictionary prevents crash on case-insensitive duplicates
2. Normalize decimal-valued integers in sub-workflow payloads —
   recursive NormalizePayloadNumbers converts 201000256548.0 to long
3. Add WorkflowExecutionActorContext — AsyncLocal propagation of
   actor identity through OnComplete execution chains

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 13:48:27 +03:00