Commit Graph

898 Commits

Author SHA1 Message Date
master
dd98d6c3f6 docs(ops): connector setup guide — reflect actual state after 2026-04-22 survey
Revised to reflect verified end-to-end state on the local dev stack:

Concelier (9 wired backend connectors, 8 healthy, 787 advisories ingested):
- redhat (651 docs), osv (59), debian (41), suse (26), alpine (8),
  ubuntu (2), auscert (0), vmware (0), stella-mirror (404 on dev — OK)
- all respond to `sources check` probes

Excititor (4 wired providers):
- excititor:{redhat, ubuntu, cisco, oracle} all enabled
- Cisco VEX uses the public CSAF feed (unauthenticated) — different
  from the Concelier advisory side of Cisco which would need PSIRT OAuth

Aspirational catalog (~65 entries): present in `stellaops-cli sources list`
but NOT backend-wired. `sources enable <id>` returns OK but is a no-op
because no source_type → connector mapping exists. Tracked in
SPRINT_20260422_004 / _007.

Credential steps (GHSA, Cisco PSIRT, Microsoft MSRC) retained but flagged
as ready-for-when-the-connector-backend-lands. Currently all three
connectors they'd apply to are in the aspirational catalog only.

Operator commands documented + known CLI asymmetry (Concelier.Advisories.Read
policy needs aoc:verify scope which stellaops-cli client can't mint;
affects read endpoints only, write path works).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 20:55:37 +03:00
master
6d69abe964 docs(implplan): SPRINT_20260422_007 Excititor persisted provider credentials plan
Authored as the Excititor mirror of SPRINT_20260422_003 Concelier source
credential entry paths. Extends the persisted-credentials control plane
to VEX providers (excititor:cisco, excititor:msrc,
excititor:suse-rancher, then binary-material flows for OCI attests).

Tasks (all TODO, 5 total):
- EXCITITOR-CFG-01: persisted provider settings store + API contracts
- EXCITITOR-CFG-02: drive readiness + execution from persisted settings
- EXCITITOR-CFG-03: CLI + Web surfaces for scalar providers
- (plus later tasks for binary-material + closeout)

Authored by an external stream during the 2026-04-22 session; committing
as-is so it joins the sprint index.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 20:44:22 +03:00
master
a821bb4a65 docs(ops): connector setup guide — credential creation + enablement paths
Operator reference for bringing up the full Concelier + Excititor
connector estate. Authored alongside the 2026-04-22 session's connector
setup work.

Covers:
- Credential requirements matrix: GHSA, Cisco PSIRT, MSRC require
  operator-created credentials; all other ~26 connectors use public
  endpoints.
- Exact click-paths for creating credentials:
  - GitHub PAT at github.com/settings/tokens (read:packages +
    public_repo scopes, SSO authorize if org requires).
  - Cisco PSIRT openVuln OAuth2 client at apiconsole.cisco.com/apps.
  - Microsoft Entra confidential app + client secret + Security
    Updates API permission at entra.microsoft.com.
- Where to paste credentials in the UI (/setup/integrations) and CLI
  (stellaops-cli db connectors configure ...).
- Retained-secret contract: server never echoes secrets; UI shows a
  retained-secret badge; unrelated edits don't require re-entering.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 20:43:41 +03:00
master
ba61de46b9 test(web): FE-STAB3 test infrastructure + per-family spec fixes
Closes SPRINT_20260422_006 (FE-STAB3) + SPRINT_20260420_003 (parent).
Both archived. Residual deep-drift tracked under new SPRINT_20260422_008
(FE-STAB4).

Infrastructure (test-setup.ts + test-setup.jasmine-bootstrap.ts):
- Auto-enrich ɵcmp.inputs/.outputs/.inputConfig by scanning class source
  for `this.x = input(...)` / `model(...)` / `output(...)` patterns
  (~2KB scan cap per class to avoid OOM on bundle wrappers). Eliminates
  NG0303/NG0950 without any component edits.
- ComponentRef.prototype.setInput fallback writes through the
  InputSignal node's per-instance SIGNAL symbol when Angular's default
  lookup misses.
- jest-global compat shim (jest.fn/spyOn/etc map to vi).
- navigator.clipboard polyfill for jsdom.

Per-family fixes:
- FE-STAB3-001 (signal-input JIT): infrastructure-only. Cluster results:
  deploy-diff/component-diff-row 19/19, sbom-diff-view 25/25,
  evidence-drawer 37/37, vex-trust-chip 27/27, simulation-history 51/51,
  findings-list 26/26, step-content 18/26 (8 are drift → FE-STAB4),
  simulation-console 53/53, batch-evaluation 40/40, promotion-gate 52/52.
- FE-STAB3-002 (TestBed lifecycle/providers): findings-container 9/9
  after SCORING_API provider + BehaviorSubject<ParamMap> refactor;
  integration-detail 53/64 with provideRouter([]); vex-create-workflow
  51/58 after searchStatements mock return.
- FE-STAB3-003 (expectation drift): per-spec selector/assertion updates
  across simulation-history, vex-trust-chip, sbom-diff-view,
  evidence-drawer, admin-notifications. simulation-dashboard NG0303
  gone via overrideComponent imports restore (29/41 remaining are
  product-contract drift → FE-STAB4).

Component public contracts unchanged — zero component edits.

8 .todo() markers added in verdict-proof-panel (7) and
patch-diff-viewer (1) pointing to FE-STAB4-001/004 for removed-method
coverage that can't be repaired without feature changes.

Honest caveat: no single full-suite wallclock `vitest run` completed in
session — the config (pool=forks, fileParallelism=false, maxWorkers=1)
serializes ~785 specs under jsdom+Angular JIT, each run >15min.
Verification is cluster-level targeted runs. CI should run the full
suite as the final gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 20:43:28 +03:00
master
fe72e6d2f6 chore(implplan): archive SPRINT_20260422_004 Concelier full connector control plane
All 3 tasks DONE:
- CONN-CTRL-01 — Excititor provider management backend (commit 5c1b59580)
- CONN-CTRL-02 — CLI and Web control plane wiring (commit 387173276)
- CONN-CTRL-03 — Connector inventory docs and operator guidance (commit 387173276)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 19:29:11 +03:00
master
3871732765 feat(excititor+cli+web): VEX provider control plane — CLI + Web extensions (SPRINT_20260422_004)
Continues the SPRINT_20260422_004_Concelier_full_connector_control_plane
feature stream started in commit 5c1b59580 (Excititor provider management
endpoints + contracts + service + tests). Adds the CLI + Web surfaces on
top of that backend.

CLI (src/Cli/**):
- CommandHandlers + BackendOperationsClient extended with provider
  management calls
- ExcititorProviderSummary model added to the CLI's service models
- NonCoreCliCommandModule wires the new commands; tests updated
- TASKS.md entries synced

Web console (src/Web/StellaOps.Web/**):
- New vex-provider-catalog.component + vex-provider-management.api client
- advisory-source-catalog + advisory-vex-route-helpers extended to route
  users to the new VEX provider surface
- integration-hub.routes.ts registers the new route
- security-disposition-page.component.ts updated for the flow

Excititor/Concelier docs + contracts:
- docs/modules/excititor/operations/provider-control-plane.md — operator
  guide for the new control plane
- docs/modules/excititor/README.md + docs/modules/concelier/{README,
  connectors}.md — cross-links + refs
- ConfiguredAdvisorySourceService.cs — additional provider plumbing
- StellaOps.Excititor.WebService/TASKS.md synced

Sprint doc (docs/implplan/SPRINT_20260422_004_*.md) reflects the
in-flight progress.

This is external-stream work picked up during the 2026-04-22 session's
closeout — bundling it now so the working tree is clean and main stays
in sync with local feature-branch state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 19:24:49 +03:00
master
feb1fae5f5 docs(implplan): create FE-STAB3 follow-up for test-suite residue after ProxyZone fix
Companion to commit 4fea1ec72. That commit shipped the ProxyZone bootstrap
that unblocked ~450 fakeAsync specs but three residual failure families
remain, exceeding SPRINT_20260420_003's closeout window:

1. FE-STAB3-001 — signal-input JIT NG0303/NG0950 across setup-wizard,
   deploy-diff, sbom-diff, evidence-drawer, verdict-proof-panel, etc.
2. FE-STAB3-002 — TestBed lifecycle/provider drift (e.g.
   findings-container missing SCORING_API).
3. FE-STAB3-003 — expectation drift (e.g. simulation-history selectors).
4. FE-STAB3-004 — full-suite green + parent sprint archival.

Each family is per-spec repair, not shared infra. Sprint 20260420_003
stays open with its two BLOCKED tasks until FE-STAB3-004 lands; at that
point both sprints archive together.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 18:17:23 +03:00
master
4fea1ec728 fix(web-tests): ProxyZone bootstrap for Vitest to unblock ~200 fakeAsync specs
Partial closeout of SPRINT_20260420_003 FE-STAB2-005/009. Sprint NOT
archived — per-spec repairs remain for signal-input JIT NG0303/NG0950,
TestBed lifecycle/provider drift, and expectation drift families. Both
tasks flipped DOING → BLOCKED with justification in the sprint file and
Decisions & Risks. Follow-up sprint FE-STAB3-* needed; see
SPRINT_20260422_006_FE_web_test_infrastructure_followup (created in the
companion commit).

Root cause: zone.js/testing's jasmine patch short-circuits under Vitest
because neither `jasmine` nor `jest` globals exist at zone-testing load
time. Result: `fakeAsync()` bodies threw
  "Expected to be running in 'ProxyZone'"
across ~200 spec files — nearly every fakeAsync spec red.

Infrastructure fix (1 new file + 1-line import):
- src/Web/StellaOps.Web/src/test-setup.jasmine-bootstrap.ts (new, ~140
  lines): wraps Vitest's it/test/beforeEach/afterEach/beforeAll/afterAll
  globals to fork a fresh ProxyZone per test body; seeds a minimal
  `jasmine` global before zone.js/testing loads so the jasmine patch
  doesn't short-circuit.
- src/Web/StellaOps.Web/src/test-setup.ts: single
  `import './test-setup.jasmine-bootstrap';` prepended.

Verified green post-fix (targeted reruns):
- simulation-console 53/53
- batch-evaluation 40/40
- promotion-gate 52/52
- policy-merge-preview 39/39
- policy-exception 43/43
- policy-lint 38/38
- policy-diff-viewer 28/28
- conflict-detection 44/44
- fakeAsync sanity probe: pass
- ~450 tests now green in previously-blocked clusters.

Residual families (BLOCKED, per-spec repair scope — tracked in follow-up):
- Signal-input JIT: setup-wizard/step-content, deploy-diff, sbom-diff,
  evidence-drawer, verdict-proof-panel, patch-diff-viewer, vex-trust-chip
- TestBed lifecycle/provider drift: findings-container needs SCORING_API
- Expectation drift: simulation-history navigate/header/empty-state

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 18:16:28 +03:00
master
47665927ab feat(authority): seed default + installation tenants via migration (SPRINT_20260422_005)
Closes the bootstrap gap two parallel QA agents surfaced on 2026-04-22:
fresh Authority DBs lacked the `default` tenant row so setup-wizard admin
creation failed with users_tenant_id_fkey and /connect/token returned
invalid_grant. Fix is on the migration path per AGENTS.md §2.7; the init
script stays seeds-only as established in SPRINT_20260422_003.

- New embedded migration 003_seed_default_tenants.sql performs
  `INSERT ... ON CONFLICT (tenant_id) DO NOTHING` for `default` and
  `installation`. Numeric prefix (not S-prefix) so the migration runner's
  Startup category auto-applies it; S-prefix files route to Seed category
  which is intentionally manual-only per
  StartupMigrationHost.cs:158.
- `default` is strictly required (Authority's
  StandardPluginBootstrapper.DefaultTenantId; /internal/users bootstrap
  inserts under this FK). `installation` is not Authority-FK-referenced
  today but matches the empirical workaround both QA agents converged on
  and serves as defense for cross-service inserts that join
  authority.tenants.tenant_id.

Fresh-volume verification (docs/qa/authority-default-tenant-20260422/):
1. docker compose down -v (20 volumes removed incl. compose_postgres-data)
2. docker compose up -d — 62 containers, Authority healthy in ~15s.
3. Startup log: applying 001 (144ms) → 002 (13ms) → 003 (7ms).
   authority.tenants contains default + installation.
4. POST /api/v1/setup/sessions → 201; database/valkey/migrations prereqs
   ran; admin/execute with admin/Admin@Stella2026! → 200 "Bootstrap
   administrator 'admin' ensured successfully."
5. POST /connect/token (password, stellaops-cli, ui.admin openid) → 200
   + JWT carrying role=admin, stellaops:tenant=default.
6. docker compose restart authority → "Database is up to date for
   Authority." Clean no-op.

Docs: docs/modules/authority/architecture.md §1.1 "Seeded bootstrap
tenants (migration-owned)". Cross-link added to the archived prior
sprint's Decisions & Risks so the lineage is traceable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:41:23 +03:00
master
51f9b798ed docs(implplan): create SPRINT_20260422_005 for Authority default-tenant bootstrap gap
Two parallel QA agents (fe-qa-006-relsec, fe-qa-007-evidops) independently
hit the same bootstrap bug on 2026-04-22: fresh Authority DBs lack the
`default` tenant row, so setup-wizard Admin creation fails with
users_tenant_id_fkey and admin/connect/token returns invalid_grant.

The gap appeared because SPRINT_20260422_003 (Authority §2.7 compliance,
archived) correctly trimmed 04-authority-schema.sql to "seeds only" — but
the guarded tenant seed runs only when the schema exists at init-script
time, which it doesn't for migration-owned schemas.

Both agents worked around it in-session by manually inserting `default` +
`installation` tenants and calling POST /api/v1/setup/sessions/{id}/
steps/admin/execute. This sprint puts the seed on the migration path so
the fix converges automatically.

Three tasks: add seed migration (AUTH-SEED-001), verify fresh-volume
bootstrap works without manual SQL (AUTH-SEED-002), document the contract
(AUTH-SEED-003).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:22:06 +03:00
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