Commit Graph

888 Commits

Author SHA1 Message Date
master
b936526bb4 chore: clean up pre-session dirt (Concelier source-credentials + Web advisory-sources + playwright artifacts)
Bundled cleanup of residue that straddled earlier commit boundaries:

- docs/modules/concelier/operations/source-credentials.md — SRC-CREDS-004
  doc update (credential acquisition + UI/CLI entry paths).
- src/Web/.../advisory-vex-sources/{advisory-source-catalog,
  source-management.api}.ts — SRC-CREDS-003 Web-side entry paths for
  persisted source configuration.
- src/Web/StellaOps.Web/output/playwright/* — refreshed live probe
  artifacts from setup-wizard bootstrap runs.
- src/Web/StellaOps.Web/docs/{ACCESSIBILITY_AUDIT_BINARY_RESOLUTION,
  DeterministicInstall, HelmReadiness, TrivyDbSettings}.md — deleted
  stale docs relocated to docs/modules/ in a prior migration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:21:06 +03:00
master
5c1b59580b feat(excititor): VEX provider management endpoints + sprint 004 plan
Adds provider management control plane for Excititor: contracts, service,
endpoint group, focused tests. Matching plan shipped as
SPRINT_20260422_004_Concelier_full_connector_control_plane.md.

- VexProviderManagementContracts: request/response shapes
- ProviderManagementEndpoints: REST surface under the Excititor WebService
- VexProviderManagementService: business logic + persistence hooks
- ProviderManagementEndpointsTests: focused coverage
- TestAuthentication + csproj wiring updates for the new test surface

Work picked up mid-session; code was already on disk when this commit
series started. Bundling under the new sprint's plan here so the history
shows a coherent feature rather than a stray dirty diff.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:20:51 +03:00
master
6baff5764d test(web): behavioral QA of Evidence/Ops/Setup/Admin surfaces (SPRINT_20260421_007)
Closes SPRINT_20260421_007 — all 4 tasks DONE. Full Tier 2c behavioral
verification per docs/qa/feature-checks/FLOW.md. 34 assertions, 0 fail,
0 deferred.

FE-QA-EVID-001 — Evidence: 7/7 PASS
/evidence/{overview, audit-log, verify-replay, exports, capsules, proofs,
bundles}. Alias chains to /ops/operations/audit confirmed intentional per
evidence.routes.ts.

FE-QA-OPS-002 — Ops: 8/8 PASS
/ops/operations/{jobengine, feeds-airgap, doctor, audit, notifications,
health-slo, watchlist} + /ops/scripts. Doctor full diagnostics grid
rendered with real data.

FE-QA-SETUP-003 — Setup + Admin: 12 + 7 PASS
Setup: /setup{, /integrations, /trust-signing (+ issuers/keys/certificates
/audit sub-tabs aliased correctly), /identity-providers, /tenant-branding,
/workflows, /ai-preferences, /topology}.
Admin: all /console-admin/{tenants, users, roles, clients, audit, branding,
assistant} preserved console origin under "Console Administration" heading.

FE-QA-EVIDOPS-004 — Retention coverage:
New e2e/routes/sprint-007-evidence-ops-setup-admin.e2e.spec.ts with 27
Playwright assertions covering origin, canonical-or-alias URL, and
identity-matching body text. Uses the existing auth.fixture.ts pattern.

Evidence: docs/qa/feature-checks/runs/web/sprint-007-evidence-ops-setup-admin/
run-001/ (EVIDENCE.md + tier2-ui-check.json + 36 screenshots + verify.mjs).

Authority default-tenant gap (same as FE-QA-REL-001 discovery):
stellaops_authority had zero tenants and zero users; setup wizard admin
bootstrap failed with users_tenant_id_fkey FK violation. Worked around
in-session by inserting `installation` + `default` tenants and calling
POST /api/v1/setup/sessions/{id}/steps/admin/execute. This is the same
bug two parallel agents independently hit — needs a real Authority sprint
to seed `default` through migrations or StandardPluginRegistrar init.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:19:51 +03:00
master
fd5ac22afb test(web): behavioral QA of Release + Security console surfaces (SPRINT_20260421_006)
Closes SPRINT_20260421_006 — all 4 tasks DONE. Full Tier 2c behavioral
verification per docs/qa/feature-checks/FLOW.md. Evidence directories
include per-route screenshots + tier2-ui-check JSON with PASS/FAIL/DEFERRED
assertions.

FE-QA-REL-001 — Release Control: 9/9 PASS
/environments/overview, /releases, /releases/deployments, /releases/bundles,
/releases/promotions, /releases/approvals, /releases/hotfixes,
/releases/investigation/timeline, /releases/workflows

FE-QA-REL-002 — Release Policy: 7/9 PASS, 2 DEFERRED
/ops/policy/{packs, governance, vex, simulation, governance/budget,
governance/profiles, vex/exceptions} — all PASS.
DEFERRED: /ops/policy/governance/audit (redirects to sprint-007-owned
/ops/operations/audit — scope lock), /ops/policy/governance/trust-weights
(tab URL doesn't persist — flagged as follow-up).

FE-QA-SEC-003 — Security: 10/10 effective PASS
Direct PASS: /security{,/images,/risk,/advisory-sources,/findings,
/vulnerabilities,/reachability}
Redirect PASS matching SEC-005/006/007 consolidation contracts:
/security/vex → /ops/policy/vex, /security/artifacts → /triage/artifacts,
/security/exceptions → /ops/policy/vex/exceptions.

FE-QA-RELSEC-004 — Retention coverage:
New e2e/routes/release-security-identity.e2e.spec.ts with 24 route-identity
assertions + 1 Release interaction guard. Uses auth.fixture.ts test-session
so CI does not require live Authority credentials.

Environmental gap surfaced (worked around in-session, NOT a code fix here):
stellaops_authority was missing the `default` tenant row, breaking setup-
wizard Admin bootstrap with FK users_tenant_id_fkey=(default) and causing
admin login to return invalid_grant. Manually seeded `default` into
authority.tenants and finalized the setup session via Platform Setup API.
Should be addressed in a follow-up Authority sprint — the default tenant
seed needs to land in startup migrations or StandardPluginRegistrar init.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:12:53 +03:00
master
838257245a feat(concelier): blocked-readiness state for credential-gated sources (SRC-CREDS-005)
Closes the last open task in SPRINT_20260422_003. Persisted operator
enablement is now separated from runtime readiness so credential-gated
sources can show an explicit blocked state instead of collapsing into a
generic failed/disabled shape.

Readiness model:
- new SourceReadiness constants class: Disabled | Unsupported | Blocked | Ready
- ConfiguredAdvisorySourceStatus gains Readiness + BlockedReason alongside
  existing SyncState (kept as backward-compatible alias)
- enabled = persisted operator intent (untouched)
- readiness = blocked when persisted-enabled and credentials/URIs missing
- blockedReason = free-form list of missing fields
- blockingReason.errorCode = SOURCE_CONFIG_REQUIRED for structured drill-down

Endpoint propagation:
- /status: persisted enabled=true kept; readiness=blocked; readyForSync=false
- /{id}/enable: 200 with readiness=blocked; sourceRegistry left disabled
  until credentials land (pre-existing behaviour retained)
- /{id}/sync: 422 readiness=blocked + SOURCE_CONFIG_REQUIRED;
  **connector never invoked**, no job run created
- /sync (batch): per-result outcome=blocked with readiness/errorCode/
  blockedReason; excluded from totalTriggered; other sources proceed
- Transition: PUT /{id}/configuration with missing credential →
  runtimeOptionsInvalidator.Invalidate → next /status flips to ready.
  No disable/re-enable cycle needed.

Tests: 8 targeted xUnit methods via scripts/test-targeted-xunit.ps1,
8/8 pass. Includes: blocked status exposure, blocked-to-ready transition
on persisted credential, connector-not-invoked-when-blocked, plus 4
pre-existing SRC-CREDS-002 regression tests.

Docs:
- docs/modules/concelier/connectors.md — new "Blocked / sleeping
  readiness state" section with field contract, per-endpoint behaviour
  table, UI/CLI rendering guidance, resolution flow
- docs/modules/cli/guides/commands/db.md — short note under
  `db connectors configure` cross-linking the connectors.md contract

Sprint SPRINT_20260422_003 archived — all 5 tasks DONE.

New fields are additive; existing UI types in
source-management.api.ts ignore unknown fields so no UI breakage. A
future FE pass can wire explicit readiness/blockedReason rendering.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:28:33 +03:00
master
06a8558b0f feat(web): stable page identity across 10 weak surfaces (FE-ROUTES-003)
Closes SPRINT_20260421_005 FE-ROUTES-003. Each surface from the 2026-04-21
traversal now carries a workspace-level h1, one-line summary, and a primary
action that reflects the owning workflow (not generic shell copy).

Surfaces updated:
- / → Release Command Center → Review pending approvals
- /environments/overview → Environments → Add environment
- /ops/policy/packs → Release Policies → Create pack
- /security/advisory-sources → Advisory Sources → Add advisory source
- /triage/artifacts → Triage Artifacts → Triage next finding
- /evidence/exports → Evidence Exports → Stella bundle export
- /ops/operations/feeds-airgap → Feeds & Airgap → Import airgap bundle
- /ops/operations/doctor → Platform Diagnostics → Run quick diagnostic
- /setup/integrations → Integrations → Add Integration
- /setup/tenant-branding → Tenant & Branding → editor Apply Changes CTA

Copy + markup inline on each component (no new shared PageHeader
component — identity pass, not a refactor).

Tests: new src/Web/StellaOps.Web/src/app/features/_identity/
fe-routes-003-page-identity.spec.ts — 31 Vitest assertions, 31/31 pass.
Existing integration-hub.component.spec.ts (9/9) confirms the renamed
"Add Integration" primary action still holds.

Traversal map (docs/qa/console-ui-traversal-map.md) flipped the 10
surfaces from "weak" to "resolved by FE-ROUTES-003" with 1-line evidence
per surface.

Unblocks SPRINT_20260421_006 and SPRINT_20260421_007 which gate their
behavioral QA on this stable-identity contract.

Sprint SPRINT_20260421_005 archived — all 4 tasks DONE (FE-ROUTES-001/002
criteria boxes also flipped to reflect their already-DONE execution-log
state).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:21:35 +03:00
master
7943cfb3af chore(docs+devops): cross-module doc sync + sprint archival moves + compose updates
Bundled pre-session doc + ops work:
- docs/modules/**: sync across advisory-ai, airgap, cli, excititor,
  export-center, findings-ledger, notifier, notify, platform, router,
  sbom-service, ui, web (architectural + operational updates)
- docs/features/**: updates to checked excititor vex pipeline,
  developer workspace, quick verify drawer
- docs top-level: README, quickstart, API_CLI_REFERENCE, UI_GUIDE,
  code-of-conduct/TESTING_PRACTICES updates
- docs/qa/feature-checks/: FLOW.md + excititor state update
- docs/implplan/: remaining sprint updates + new Concelier source
  credentials sprint (SPRINT_20260422_003)
- docs-archived/implplan/: 30 sprint archival moves (ElkSharp series,
  misc completed sprints)
- devops/compose: .env + services compose + env example + router gateway
  config updates

File-level granularity preserved.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:06:39 +03:00
master
607ce619fe feat(concelier): multi-sprint batch (mirror domain + advisory sources + durable runtime + credentials)
Bundled commit covering pre-session work from multiple Concelier sprints
already archived or in-flight:
- SPRINT_20260419_006: mirror domain / source key validation
- SPRINT_20260419_029 / 030: durable jobs orchestrator runtime + endpoint verification
- SPRINT_20260421_001: advisory source projection truthful counts
- SPRINT_20260421_002: FE advisory source consistency (connector-side bits)
- SPRINT_20260421_003: advisory connector runtime alignment
- SPRINT_20260422_003: source credential entry paths (in-flight)

Includes connector internals (ACSC / Adobe / CERT-BUND / Chromium / Cisco /
CVE-KEV / GHSA / JVN / KISA / MSRC / Oracle / Ubuntu), source management
endpoints, mirror domain management, federation endpoints, topology setup,
job registration, and associated dossier updates under
docs/modules/concelier/.

This commit groups ~229 file changes that accumulated across the above
sprints; individual changes are preserved at file granularity so blame
remains useful.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:05:53 +03:00
master
99a5ae923a chore(qa): notify compat rebuild evidence + archive completed sprints
SPRINT_20260422_001 (Notify compat surface restoration) — closes
NOTIFY-COMPAT-003 final criterion. notify-web rebuilt, 7/7 gateway probes
green post-rebuild (8th returns contracted 501 notify_overrides_not_supported).
Browser replay via direct Node+Playwright driver (MCP bridge rejected the
self-signed cert) confirmed Dashboard/Channels/Quiet Hours/Overrides/
Escalation/Throttle tabs render without runtime-unavailable banners. All 3
tasks DONE.

SPRINT_20260421_003 (Concelier advisory connector runtime alignment) —
all 7 tasks were already DONE before this session; archival is purely
administrative.

Evidence bundle at docs/qa/notify-compat-20260422/ includes EVIDENCE.md,
verify.mjs + verify_with_token.mjs, verify-results.json, and screenshots
for each verified tab.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:05:11 +03:00
master
563079fc69 feat(evidence-locker): Decision Capsule sealing pipeline
Builds the previously-aspirational Capsule create/seal/verify/export/replay
pipeline. Unblocks the former CAPSULE-001 task that lived (BLOCKED) in
SPRINT_20260408_005; carried over as CAPSULE-AUDIT-001 inside the new
SPRINT_20260422_002 (created + archived in same pass).

Pipeline:
- CapsuleManifest record: deterministic SBOM+feeds+reachability+policy+VEX
  content-address bundle.
- CapsuleManifestCanonicalizer: mirrors AUDIT-007 algorithm byte-for-byte
  (ordinal-sorted UTF-8 JSON via JsonDocument round-trip).
- ICapsuleSigner + EcdsaCapsuleSigner + NullCapsuleSigner: DSSE PAE
  contract, DSSE payload type application/vnd.stellaops.decision-capsule+json.
  Pattern-identical to IAuditBundleManifestSigner; defined locally rather
  than cross-referencing IExportAttestationSigner (which lives inside
  ExportCenter.WebService, not a shared library — future cleanup noted).
- CapsuleService: create / seal / verify / export (zip) / replay.
- PostgresCapsuleRepository (Dapper) with tenant RLS hookup.

Endpoints (all tenant-scoped, POST):
- POST /api/v1/evidence/capsules
- POST /api/v1/evidence/capsules/{id}/seal
- POST /api/v1/evidence/capsules/{id}/verify
- POST /api/v1/evidence/capsules/{id}/export (application/zip)
- POST /api/v1/evidence/capsules/{id}/replay

Storage: embedded migration 005_decision_capsules.sql creates
evidence_locker.decision_capsules (RLS-enforced) + indexes + CHECK
constraints. Auto-applied by existing EvidenceLockerMigrationRunner.

Audit (CAPSULE-AUDIT-001):
- 5 new AuditActions.Evidence constants (CreateCapsule/Seal/Verify/Export/Replay)
- Each endpoint chained with .Audited(AuditModules.Evidence, ...)
- contentHash surfaced on responses so AuditActionFilter propagates it
  into details_jsonb.

Tests: 9 focused tests (determinism x3, sign+verify+tamper x3, null-signer
graceful degradation, pipeline round-trip, 404 on missing). Full
EvidenceLocker namespace sweep: 141/141, 0 failures.

Docs: docs/modules/evidence-locker/architecture.md §9bis (manifest schema,
DSSE payload type, storage, API surface, relationship to
release.run_capsule_replay_linkage).

Runtime curl+Timeline assertion deferred — running container image
predates these changes; rebuild pending. Structural wiring identical to
runtime-verified VerdictEndpoints (AUDIT-002 precedent).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:04:38 +03:00
master
2e78085115 feat(audit): drop deprecated per-service audit tables + reconciliation (DEPRECATE-003)
Closes DEPRECATE-003 in SPRINT_20260408_005. Pre-release status means
the 30/90-day compat windows in the original Decision #5 are moot — no
external consumers. Decision #5 amended twice during session.

Drop migrations (embedded resources, auto-applied on startup per §2.7):
- authority.audit / authority.airgap_audit / authority.offline_kit_audit
  (002_drop_deprecated_audit_tables.sql)
- policy.audit (013; policy.gate_bypass_audit PRESERVED as domain evidence)
- notify.audit (008)
- scheduler.audit + partitions via CASCADE (009)
- proofchain.audit_log (004)

Kept by design:
- release_orchestrator.audit_entries + audit_sequences (hash chain, Decision #2)
- policy.gate_bypass_audit (domain evidence, unique query patterns)
- authority.login_attempts (auth protocol state, not audit)

Repository neutering — local DB write removed, Timeline emission preserved:
- PolicyAuditRepository.CreateAsync → Timeline-only; readers [Obsolete]
- NotifyAuditRepository.CreateAsync → Timeline-only; readers [Obsolete]
- PostgresSchedulerAuditService → removed INSERT, Timeline-only
- PostgresAttestorAuditSink.WriteAsync → no-op (endpoint-level .Audited()
  filter carries the audit signal)

Attestor cleanup:
- Deleted AuditLogEntity.cs
- Removed DbSet<AuditLogEntity> from ProofChainDbContext
- Removed LogAuditAsync / GetAuditLogAsync from IProofChainRepository
- Removed "audit_log" from SchemaIsolationService

Reconciliation tool substitutes for the 30-day wall-clock window:
- scripts/audit-reconciliation.ps1 joins each per-service audit table to
  timeline.unified_audit_events via the dual-write discriminator
  (details_jsonb.localAuditId / localEntryId) for deterministic pairs,
  tuple-matches Authority. Test-Table/to_regclass guards handle post-drop
  vacuous-pass. Overall PASS across pre/post/final runs.
- 4 reports under docs/qa/.

Sprint archivals:
- SPRINT_20260408_004 (Timeline unified audit sink) — all 7 tasks DONE
- SPRINT_20260408_005 (audit endpoint filter deprecation) — all 12 tasks DONE

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:03:02 +03:00
master
bf4a5fee54 docs(implplan): AUDIT-002 decoration count crosses 468 call sites
Sprint SPRINT_20260408_004. Execution log entry for the SbomService
backfill + Notifier wave E coverage extensions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 00:59:02 +03:00
master
48ab7d33e3 docs(implplan): AUDIT-005 criterion 1 fully DONE (all 5 services)
Sprint SPRINT_20260408_004. Every per-service audit LIST endpoint
now advertises the Timeline successor link and Sunset 2027-10-19.
Remaining AUDIT-005 criteria (Timeline as SoT, no-data-loss) stay
gated on the 30-day production verification window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 00:43:19 +03:00
master
5c5c0881b1 docs(implplan): AUDIT-006 DONE — UI classification + retention shipped
Sprint SPRINT_20260408_004. Audit dashboard now renders the retention
tile and the log table shows classification / hold / redaction pills
alongside each event. All three criteria checked.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 00:04:18 +03:00
master
5b131ca425 docs(implplan): AUDIT-006 DOING — model/client surfaces ready
Sprint SPRINT_20260408_004. AUDIT-006 flipped TODO → DOING with the
model + client layer complete for all three criteria (module filter,
classification visibility, retention display). Angular component
renders (badges, overview tile) are a component follow-up since they
live in separate component templates the background agent owns.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:56:59 +03:00
master
3e8754cf7c docs(implplan): AUDIT-005 DOING — deprecation headers wired
Sprint SPRINT_20260408_004. First criterion of AUDIT-005 met: two
per-service audit list endpoints now advertise Sunset/Deprecation/Link
headers pointing at Timeline's unified endpoint. Remaining two criteria
are gated on the 30-day production verification window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:54:24 +03:00
master
f5583c174f docs(implplan): AUDIT-007 DOING — events + chain proof in bundle
Sprint SPRINT_20260408_004. 2 of 3 criteria DONE: Timeline event pull
and chain-verification certificate are now included in AuditBundles.
DSSE manifest signing deferred as a follow-up (cross-service signer
handshake scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:49:35 +03:00
master
e18f22d61c docs(implplan): AUDIT-004 DONE — all 5 completion criteria checked
Sprint SPRINT_20260408_004 AUDIT-004 reaches DONE with migration 005,
AuditDataClassifier (16 tests), RedactActorPiiAsync + DELETE endpoint,
AuditRetentionPurgeService, docs/modules/timeline/audit-retention.md,
and the new TimelineAuditRetentionCheck Doctor plugin all shipped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:42:06 +03:00
master
44195cd7af docs(timeline): audit retention + erasure dossier
Sprint SPRINT_20260408_004 AUDIT-004 documentation criterion.

docs/modules/timeline/audit-retention.md covers:
- Four-rung classification ladder and the "narrowest wins" rule
- Retention table structure, platform defaults, per-tenant overrides,
  and legal holds via compliance_hold
- AuditRetentionPurgeService config + operator recommendations
- Right-to-erasure endpoint contract, hash-chain integrity guarantees,
  and the idempotency semantics via pii_redacted_at
- Sequence-chain gap behaviour after purge and how chain verification
  should window its checks
- Compliance checklist for operators

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:39:28 +03:00
master
7e0819179b docs(implplan): AUDIT-004 core DONE (classification + retention + erasure)
Sprint SPRINT_20260408_004. AUDIT-004 flipped TODO → DOING with the
first three completion criteria checked. Migration 005, classifier,
retention purge host, and right-to-erasure endpoint all shipped across
commits 44c0e2b34..AUDIT-004 (migration + store + endpoint) and the
purge background host. Docs dossier + Doctor check deferred.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 23:38:22 +03:00
master
582dd151f3 docs(implplan): DEPRECATE-001 implementation DONE across 5 services
Sprint SPRINT_20260408_005. Repository-level dual-write wired for
Authority, Policy, Notify, Scheduler, JobEngine. Attestor uses
endpoint-level .Audited() (no repo-level change needed). Local write
stays authoritative; Timeline emission is fire-and-forget. Task
flipped TODO → DOING pending 30-day production verification window.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:43:31 +03:00
master
05462f0443 docs(implplan): close AUDIT-003 as superseded by AUDIT-002 push model
Sprint SPRINT_20260408_004. After AUDIT-002 wired Emission in all 14+
priority services, the original AUDIT-003 scope of "add more polling
targets" is no longer load-bearing. The remaining candidate modules
(Scanner, Scheduler, Integrations, Attestor) do not expose HTTP audit
endpoints — they rely on Emission. SbomService's ledger audit endpoint
is artifact-specific and does not fit the unified polling contract.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:33:19 +03:00
master
44c0e2b346 docs(implplan): AUDIT-002 criterion 2 DONE after waves C+D
Sprint SPRINT_20260408_004 execution log entry for the 26+ new
.Audited() decorations across Graph, SbomService, Policy.Gateway,
Notifier, Concelier, Excititor (commits 4cbe58fc8 + 6c3ebff9d).
Combined with pre-existing decoration in Authority/Scanner/Policy.Engine/
Notify/JobEngine/Integrations/AdvisoryAI/EvidenceLocker/Attestor, the
codebase now has ~240 .Audited() call sites.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 22:32:40 +03:00
master
abb9012c69 docs(implplan): AUDIT-002 DOING — 14/14 priority services wired
Sprint SPRINT_20260408_004. First completion criterion of AUDIT-002
("AddAuditEmission() called in all 14+ service Program.cs files") is
now DONE after waves A (commit b2b0c905b) + B (commit 981f4459a).
Remaining: endpoint-level AuditActionAttribute decoration, runtime
verification at /api/v1/audit/events, startup-time regression check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:05:59 +03:00
master
6eb4394b1b docs(implplan,concelier): close SPRINT_20260419_027 REALPLAN-007-F
Durable advisory-observation + affected-symbol runtime is live:
PostgresAdvisoryObservationStore persists observations and delegates
to IAffectedSymbolExtractor during upsert; PostgresAffectedSymbolStore
backs /v1/signals/symbols/*. Non-testing runtime resolves both durable
stores (Unsupported* registration removed).

Targeted xUnit runs via scripts/test-targeted-xunit.ps1:
- PostgresAdvisoryObservationStoreTests 2/2
- PostgresAffectedSymbolStoreTests 2/2
- ConcelierInfrastructureRegistrationTests 3/3
- UnsupportedRuntimeWiringTests 9/9

docs/modules/concelier/architecture.md updated to reflect the
durable /v1/signals/symbols/* contract.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:00:59 +03:00
master
54e3ca1f1a docs(implplan): close SPRINT_20260419_028 TEST-RUNNER-001
test-targeted-xunit.ps1 verified end-to-end against
SchedulerStorageConfigurationTests (3/3 pass via direct DLL exec).
QA flow + testing-practices docs updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:52:17 +03:00
master
5ce0124cb9 docs(implplan): close SPRINT_20260417_002 SCHEDULER-COMPAT-001
SchedulerStorageConfiguration ResolveConnectionString supports flat,
compose-nested, and legacy keys; web host fails fast with a clear
message listing all three. Targeted xUnit run of
SchedulerStorageConfigurationTests passes 3/3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:51:18 +03:00
master
45fba7af47 docs(implplan): archive SPRINT_20260418_001 — all tasks DONE
All three tasks are now DONE per the 2026-04-19 execution log:
- ADV-SETUP-006 setup source probe/apply reflects real connectivity
- ADV-SETUP-007 enabled-but-broken advisory warning + auth helper
- ADV-SETUP-008 targeted Platform + Concelier xUnit verification
  passed via the direct xUnit runner workflow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:49:33 +03:00
master
3d14332609 wip(tools): xunit runner helper + QA guidance iteration
Follow-up to SPRINT_20260419_028 TEST-RUNNER-001.

- scripts/test-targeted-xunit.ps1: refinements to the helper.
- docs/code-of-conduct/TESTING_PRACTICES.md: default targeted xUnit v3
  verification to the new helper.
- docs/qa/feature-checks/FLOW.md: call out Microsoft Testing Platform
  filter-ignore behaviour and point to the helper.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:48:48 +03:00
master
333d894690 wip(tools): targeted xunit runner helper
Sprint SPRINT_20260419_028_Tools_targeted_xunit_runner_workflow
(TEST-RUNNER-001 DOING — sprint remains active).

- scripts/test-targeted-xunit.ps1: rebuild-and-invoke xUnit v3 in-process
  runner directly so targeted filters work under Microsoft Testing Platform
  (dotnet test --filter is ignored there).
- Register sprint file in implplan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:48:23 +03:00
master
7d8078985f docs(implplan): archive 34 DONE sprints; mark 2 active + 1 DOING
Archive every sprint in docs/implplan where all tasks are Status: DONE,
plus two Platform sprints that were moved manually but not yet tracked.

Archived (34):
- SPRINT_20260415_001 master cutover plan
- SPRINT_20260415_002 FE integration audit links + dashboard tips
- SPRINT_20260415_002..007 DOCS: notify/notifier, scheduler/registry,
  runtime data plane, platform/binaryindex/doctor, policy/findings/signer,
  concelier/excititor
- SPRINT_20260416_003..017 (Graph, Replay, Timeline, BinaryIndex symbols,
  Router, Notify x4 sub-sprints, Authority x2, ExportCenter x3, Attestor)
- SPRINT_20260417_001 Platform setup advisory/vex onboarding
- SPRINT_20260417_018..024 (AdvisoryAI x2, JobEngine webhook limiter,
  Integrations, Doctor, Concelier x2) + DevOps dotnet image
- SPRINT_20260418_025 Concelier durable mirror bundle import
- SPRINT_20260419_026 Concelier mirror import allowlisted root

Previously moved (2) now tracked under docs-archived:
- SPRINT_20260416_001 Platform local compose reset/rebuild + CLI bootstrap
- SPRINT_20260416_013 Platform truthful default bootstrap without demo seed

Still active in docs/implplan (5):
- SPRINT_20260408_004 Timeline unified audit sink (AUDIT-002..007 TODO)
- SPRINT_20260408_005 Audit endpoint filters deprecation
  (DEPRECATE-001..003 TODO; CAPSULE-001 BLOCKED)
- SPRINT_20260417_002 JobEngine scheduler storage compose compat (DOING)
- SPRINT_20260418_001 Platform advisory setup hardening (ADV-SETUP-008 DOING)
- SPRINT_20260419_027 Concelier durable affected symbol runtime (DOING)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:47:26 +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
fdf95e0f46 docs: module dossier + install/quickstart sync for truthful cutover sprints
- API_CLI_REFERENCE.md, INSTALL_GUIDE.md, quickstart.md, architecture/integrations.md, dev/DEV_ENVIRONMENT_SETUP.md, integrations/LOCAL_SERVICES.md: reflect real-service wiring.
- docs/modules/**: module dossier updates across the modules touched by SPRINT_20260415_001..007 + SPRINT_20260416_003..017 + SPRINT_20260417_018..024 + SPRINT_20260418_025 + SPRINT_20260419_026.
- docs/features/checked/web/**: update feature notes where UI changed.
- docs/qa/feature-checks/runs/web/evidence-presentation-ux/: QA evidence artifacts.
- docs/setup/**, docs/technical/**: align with setup wizard contracts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:45:09 +03:00
master
577a56ebc0 docs(implplan): real-service cutover master plan
Sprint SPRINT_20260415_001 — track execution across the cutover
sub-sprints and record per-module evidence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:34:08 +03:00
master
bc6b1c5959 Finalize UI truthfulness and bootstrap hardening 2026-04-16 16:23:54 +03:00
master
c01ce36b62 docs(implplan): add DOCS cutover plan sprint, archive FE integration-hub sprint
Adds SPRINT_20260415_001_DOCS_real_service_cutover_plan tracking the doc
work needed to finalize the no-mocks / real-service migration.

Archives SPRINT_20260415_002_FE_integration_hub_truthful_status_and_button_styling
— both tasks complete (truthful integration status + button styling fix
landed in the earlier Web UI commit).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:27:31 +03:00
master
07e227fdb7 feat(findings): close VulnExplorer -> Ledger merger and archive sprints
Closes SPRINT_20260408_002_Findings_vulnexplorer_ledger_merge via Option B:

- Phase 1 (VXPM-001..005) marked OBSOLETE. The separate vulnexplorer
  schema was superseded by commit 6b15d9827 (direct merger into Findings
  Ledger); there is no separate Postgres schema to build.
- Phase 2 corrections: VXLM-003/004/005 flipped to DONE. The adapter
  ConcurrentDictionary pattern is accepted as the VXLM-003 closure — these
  are read-side projections over Ledger events; durability comes from the
  append-only event log, not from the adapter. Two follow-ups logged in
  Decisions & Risks (FOLLOW-A: write-through Ledger event emission;
  FOLLOW-B: /api/v1/vulnerabilities gateway route alignment).
- Deletes stale VulnExplorer project trees:
  - src/Findings/StellaOps.VulnExplorer.Api/ (entire service)
  - src/Findings/StellaOps.VulnExplorer.WebService/ (shell + migrated contracts)
  - src/Findings/__Tests/StellaOps.VulnExplorer.Api.Tests/ (tests targeted
    SampleData IDs that no longer exist under Ledger)
  - src/Findings/StellaOps.Findings.Ledger.WebService/Services/
    VulnExplorerRepositories.cs (33-line placeholder with a misleading
    header comment; the actual Postgres path was never wired)
- Updates StellaOps.sln and Findings.sln to drop the removed project GUIDs
  and their 24 configuration entries. dotnet build
  src/Findings/StellaOps.Findings.sln passes 0 warnings / 0 errors.

Also archives the 4 previously-closed sprints:
- SPRINT_20260408_002 Findings VulnExplorer merger (above)
- SPRINT_20260410_001 Web runtime no-mocks (21/21 tasks done via earlier
  Postgres persistence commits)
- SPRINT_20260413_002 Integrations GitLab bootstrap automation
- SPRINT_20260413_003 Web UI-driven local setup rerun
- SPRINT_20260413_004 Platform UI-only setup bootstrap closure

Active sprints reduced to 2: SPRINT_20260408_004 Timeline unified audit
sink (15-25hr breadth work) and SPRINT_20260408_005 Audit endpoint filters
deprecation (mandatory 30/90-day verification windows).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:26:32 +03:00
master
a6a7e0a134 chore: devops compose tweaks, playwright artifacts, sprint log updates
devops/compose: docker-compose.stella-ops.legacy.yml +
docker-compose.stella-services.yml receive small service wiring updates.

Playwright: refreshed auth-state/report fixtures from the latest
integrations + setup-wizard + policy-runtime live runs. Includes a new
playwright-report-integrations/ bundle.

Docs: SPRINT_20260410_001 (runtime no-mocks) significantly expanded with
additional NOMOCK tasks reflecting the Postgres-backed work shipped across
Policy, Graph, Excititor, VexLens, Scanner, VexHub. SPRINT_20260413_004
(UI-only setup bootstrap closure) log updates.

Gitignore: narrow the earlier `output/` rule to `/output/` so the tracked
src/Web/StellaOps.Web/output/playwright fixtures continue to be picked up.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:16:33 +03:00
master
1e8dbbeeb0 feat(authority,scanner): IssuerDirectory wiring + scanner score replay persistence
Authority: StellaOpsLocalHostnameExtensions gains additional local aliases
for the IssuerDirectory service; new StellaOpsLocalHostnameExtensionsTests
cover the alias table. IssuerDirectory.WebService Program.cs wires the
IssuerDirectory host against the shared auth integration.

Scanner: WebService swaps in-memory score replay tracking for
PersistedScoreReplayRepositories (Postgres-backed) in Program.cs.

Docs: scanner architecture page updated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:15:44 +03:00
master
291c3d3ad4 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>
2026-04-15 11:15:31 +03:00
master
ee93c0bac2 feat(graph): add Postgres graph runtime repository + compatibility endpoints
Introduces IGraphRuntimeRepository + PostgresGraphRuntimeRepository that back
runtime-path graph reads with real persistence. Graph.Api Program.cs wires
the new repository into the DI graph. InMemory* services get small cleanups
so they remain viable for tests and local dev.

CompatibilityEndpoints: extends the integration-test surface.

Tests: GraphPostgresRuntimeIntegrationTests,
GraphRuntimeRepositoryRegistrationTests, expanded
GraphCompatibilityEndpointsIntegrationTests.

Docs: graph architecture page updated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:15:07 +03:00
master
786d09b88f feat(policy): persist gate evaluation queue, snapshots, orchestrator jobs
Policy Engine: moves gate evaluation, snapshots, orchestrator job tracking,
and ledger export from in-memory state to Postgres-backed stores.

- New persistence migrations 007 (runtime state), 008 (snapshot artifact
  identity), 009 (orchestrator jobs).
- New repositories: PolicyEngineSnapshotRepository,
  PolicyEngineLedgerExportRepository, PolicyEngineOrchestratorJobRepository,
  WorkerResultRepository.
- Gateway services: GateEvaluationJobDispatchService,
  GateEvaluationJobStatusService, GateEvaluationJobWorker,
  SchedulerBackedGateEvaluationQueue (plus Unsupported fallback),
  GateTargetSnapshotMaterializer, PersistedKnowledgeSnapshotStore,
  GateBaselineBootstrapper, PolicyGateEvaluationJobExecutor.
- New endpoints: GateJobEndpoints for job status + dispatch.
- Worker host: PolicyOrchestratorJobWorkerHost to drain the persistent queue.
- PersistedOrchestratorStores + DeltaSnapshotServiceAdapter swap in the
  persistent implementations via DI.

Tests: PersistedDeltaRuntimeTests, PolicyEngineGateTargetSnapshotRuntimeTests,
PolicyEngineRegistryWebhookRuntimeTests, PostgresLedgerExportStoreTests,
PostgresSnapshotStoreTests, PolicyGatewayPersistedDeltaRuntimeTests,
RegistryWebhookQueueRuntimeTests. Archives the old S001 demo seed.

Docs: policy API + architecture pages updated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 11:14:41 +03:00
master
b7acf692b6 docs(workflow): analyzer rule reference + golden real-shape regression tests
docs/modules/workflow/analyzer.md — user-facing reference for
WF001-WF006 + WF010: one section per rule with a "bad" example and
the canonical fix. Covers activation, scope (Spec property is the
entry point; helpers walked transitively), trusted-assembly prefix
rule, cross-project WF010 indirection, and non-goals (no source
generator, no severity config, no escape hatch).

The DiagnosticDescriptors' HelpLinkUri already points at sections in
this doc (e.g., #wf005), so users who hit a build error can click
through to the exact rule explanation.

Golden tests (GoldenWorkflowShapeTests) exercise three patterns
lifted from the Bulstrad corpus:
  1. static readonly LegacyRabbitAddress fields + nested
     WhenExpression(Gt, Len, ...) + .Call + OnComplete with
     WhenExpression(Eq, ...) + ActivateTask/Complete
  2. SetBusinessReference(new WorkflowBusinessReferenceDeclaration
     { KeyExpression, Parts = new WorkflowNamedExpressionDefinition[] { ... } })
  3. WorkflowExpr.Func("bulstrad.normalizeCustomer", path)
     — custom runtime function dispatch

Each asserts zero WF* diagnostics. A regression that rejects these
patterns would break the entire Serdica corpus.

30/30 tests pass.
2026-04-15 09:29:08 +03:00
master
75ccdf81c1 Make local UI setup truthful and rerunnable 2026-04-14 21:44:35 +03:00
master
398d0659eb docs: UI-driven local setup sprints + module dossier sync
Add SPRINT_20260413_004 (platform UI-only setup bootstrap closure)
with BOOTSTRAP-001..006 delivery tracker, and update sprint 003 and
sprint 20260410-001 execution logs to reflect the completed
persistence / orchestrator / secret-authority work.

Sync module dossiers and operator guides with the new reality: setup
wizard UX, platform-service architecture, CLI setup guide, integrations
architecture + local services, release-orchestrator architecture,
install guide, and compose README.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 07:56:45 +03:00
master
44a253d485 feat(web): integration-hub + wizard wiring for local-setup flow
Integration hub: extends integration.models with fields needed by the wizard
(capabilities, credentials, readiness), updates the shell and list components,
adds routing for the new hub flow, and broadens the integration-list spec.

Integration wizard: new integrations-hub.component, extended wizard with
capability/credential handling, updated template + type models, and broader
spec coverage.

Sprint docs: SPRINT_20260413_003 (UI-driven local setup rerun) updated with
wiring notes; SPRINT_20260410_001 (no-mocks) adjusted. ReleaseOrchestrator
architecture doc gets a minor clarification.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:15:08 +03:00
master
852c4d15fe docs(implplan): sync sprint statuses with real repo state
- SPRINT_20260408_005_Audit_endpoint_filters_deprecation: FILTER-004, -006,
  -008 marked DONE with commit 54e7f871a; FILTER-005, -007 DONE with
  d4d75200c; FILTER-010 DONE with 665bd6db4. DEPRECATE-001/002/003 still
  TODO with mandatory 30-day + 90-day wait windows; CAPSULE-001 stays
  BLOCKED. Sprint cannot be archived until the verification windows pass.

- SPRINT_20260408_002_Findings_vulnexplorer_ledger_merge: corrected VXLM-003
  and VXLM-004 from DONE → DOING. Adapters still back VEX decisions,
  fix verifications, and audit bundles with ConcurrentDictionary; the
  VulnExplorer.Api and VulnExplorer.WebService project directories were not
  deleted; migration 010 is present but unused. Execution log records the
  finding; commit 414049ef8 message was misleading.

- SPRINT_20260408_004_Timeline_unified_audit_sink: scope confirmation logged.
  AUDIT-002 through AUDIT-007 remain TODO (~15–25 hr breadth work); too
  large for a single session. Sprint stays active.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:14:53 +03:00
master
62d865080d feat(scheduler): wire startup migrations, dedupe 007/008, fix UI trend path
TASK-013: SchedulerPersistenceExtensions now calls AddStartupMigrations so
the embedded SQL files (including 007 job_kind + 008 doctor_trends) run on
every cold start. Deletes duplicate migrations 007_add_job_kind_plugin_config
(kept 007_add_schedule_job_kind.sql with tenant-scoped index) and
008_doctor_trends_table (kept 008_add_doctor_trends.sql with RLS + BRIN
time-series index).

TASK-010: Doctor UI trend service now calls
/api/v1/scheduler/doctor/trends/categories/{category} (was
/api/v1/doctor/scheduler/...) so it routes through the scheduler plugin
endpoints rather than the deprecated standalone doctor-scheduler path.

TASK-009: New DoctorJobPluginTests exercises plugin lifecycle: identity,
config validation for full/quick/categories/plugins modes, plan creation,
JSON schema shape, and PluginConfig round-trip (including alerts). 10 tests
added, all pass (26/26 in Plugin.Tests project).

Archives the sprint — all 13 tasks now DONE — and archives the platform
retest sprint (SPRINT_20260409_002) whose RETEST-008 completed via the
earlier feed-mirror cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 22:14:30 +03:00
master
1fe59beacb docs(implplan): sprint log updates for scheduler plugin, retest, no-mocks
- SPRINT_20260408_003_JobEngine: TASK-013 added for scheduler persistence
  auto-migrations + dedupe 007/008 migrations; execution log notes the
  2026-04-13 QA finding and trend-endpoint fix (commit 337aa5802).
- SPRINT_20260409_002_Platform + SPRINT_20260410_001_Web_runtime_no_mocks:
  log updates reflecting current state of ongoing work.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:59:26 +03:00
master
a19987979d feat(devops): local GitLab secret bootstrap + integration registration scripts
Adds PowerShell helpers to seed the local Stella Ops stack with a working
GitLab + integrations configuration:
- bootstrap-local-gitlab-secrets.ps1 provisions GitLab's JWT signing secret
  and admin PAT into Vault/Authority.
- register-local-integrations.ps1 POSTs the canonical integration records
  (GitLab, Jenkins, Harbor, Gitea, Nexus, etc.) against the Integrations
  service for first-run local environments.

Docs: INSTALL_GUIDE.md + integrations/LOCAL_SERVICES.md document the new
helpers. devops/compose README and router-gateway-local.json get the
corresponding route wiring. Two new sprint files track the follow-on work
(SPRINT_20260413_002, SPRINT_20260413_003).

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