From 0137856fdb88b64721e639e48a33e1b89af318b5 Mon Sep 17 00:00:00 2001 From: master Date: Sat, 18 Oct 2025 20:04:15 +0300 Subject: [PATCH] Rename Feedser to Concelier --- ... => _deprecated-concelier-ci.yml.disabled} | 0 ... _deprecated-concelier-tests.yml.disabled} | 0 AGENTS.md | 10 +- README.md | 20 +- SPRINTS.md | 198 +++++++++--------- TODOS.md | 2 +- docs/07_HIGH_LEVEL_ARCHITECTURE.md | 12 +- docs/09_API_CLI_REFERENCE.md | 20 +- ...TART.md => 10_CONCELIER_CLI_QUICKSTART.md} | 68 +++--- docs/11_AUTHORITY.md | 10 +- docs/13_SECURITY_POLICY.md | 2 +- docs/14_GLOSSARY_OF_TERMS.md | 4 +- docs/17_SECURITY_HARDENING_GUIDE.md | 10 +- docs/19_TEST_SUITE_OVERVIEW.md | 12 +- docs/21_INSTALL_GUIDE.md | 52 ++--- docs/24_OFFLINE_KIT.md | 4 +- docs/40_ARCHITECTURE_OVERVIEW.md | 6 +- docs/AGENTS.md | 2 +- docs/ARCHITECTURE_AUTHORITY.md | 8 +- docs/ARCHITECTURE_CLI.md | 16 +- ...E_FEEDSER.md => ARCHITECTURE_CONCELIER.md} | 58 ++--- docs/ARCHITECTURE_DEVOPS.md | 26 +-- docs/ARCHITECTURE_EXCITITOR.md | 6 +- docs/ARCHITECTURE_SCANNER.md | 4 +- docs/ARCHITECTURE_UI.md | 14 +- docs/EXCITITOR_SCORRING.md | 8 +- docs/README.md | 14 +- docs/TASKS.md | 8 +- .../authority/authority-rate-limit-flow.svg | 2 +- ... concelier-connector-research-20251011.md} | 10 +- .../31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md | 2 +- docs/dev/32_AUTH_CLIENT_GUIDE.md | 10 +- docs/dev/fixtures.md | 22 +- docs/dev/kisa_connector_notes.md | 4 +- docs/dev/merge_semver_playbook.md | 8 +- docs/dev/mongo_indices.md | 6 +- docs/dev/normalized_versions_rollout.md | 34 +-- ...tions.md => concelier-apple-operations.md} | 28 +-- ...d => concelier-authority-audit-runbook.md} | 74 +++---- ...ations.md => concelier-cccs-operations.md} | 22 +- ...ns.md => concelier-certbund-operations.md} | 16 +- ...tions.md => concelier-cisco-operations.md} | 30 +-- ...on.md => concelier-conflict-resolution.md} | 76 +++---- ... concelier-cve-kev-grafana-dashboard.json} | 4 +- ...ons.md => concelier-cve-kev-operations.md} | 46 ++-- ...ations.md => concelier-ghsa-operations.md} | 28 +-- ...ons.md => concelier-icscisa-operations.md} | 40 ++-- ...ations.md => concelier-kisa-operations.md} | 18 +- ...ations.md => concelier-msrc-operations.md} | 14 +- ...tions.md => concelier-nkcki-operations.md} | 12 +- ...rations.md => concelier-osv-operations.md} | 4 +- docs/ops/migrations/SEMVER_STYLE.md | 14 +- docs/security/authority-threat-model.md | 4 +- docs/security/revocation-bundle-example.json | 6 +- docs/security/revocation-bundle.md | 4 +- ...dser.yaml.sample => concelier.yaml.sample} | 30 +-- scripts/update-apple-fixtures.ps1 | 4 +- scripts/update-apple-fixtures.sh | 4 +- scripts/update-model-goldens.ps1 | 2 +- scripts/update-model-goldens.sh | 2 +- seed-data/cert-bund/README.md | 2 +- src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md | 6 +- src/Directory.Build.props | 16 +- src/Directory.Build.targets | 14 +- .../StellaOpsPrincipalBuilderTests.cs | 18 +- .../StellaOpsProblemResultFactoryTests.cs | 4 +- .../StellaOpsScopes.cs | 12 +- .../StellaOpsAuthClientOptionsTests.cs | 6 +- .../StellaOpsTokenClientTests.cs | 6 +- .../ServiceCollectionExtensionsTests.cs | 8 +- .../StellaOpsResourceServerOptionsTests.cs | 14 +- ...StellaOpsScopeAuthorizationHandlerTests.cs | 8 +- .../README.NuGet.md | 2 +- .../ClientCredentialsAndTokenHandlersTests.cs | 6 +- .../TokenPersistenceIntegrationTests.cs | 2 +- .../AuthorityRateLimiterIntegrationTests.cs | 4 +- .../StellaOps.Authority.sln | 12 +- src/StellaOps.Authority/TASKS.md | 2 +- .../Commands/CommandHandlersTests.cs | 12 +- .../Configuration/CliBootstrapperTests.cs | 6 +- .../Services/BackendOperationsClientTests.cs | 36 ++-- src/StellaOps.Cli/AGENTS.md | 6 +- src/StellaOps.Cli/Commands/CommandFactory.cs | 4 +- .../Configuration/AuthorityTokenUtilities.cs | 2 +- .../Configuration/CliBootstrapper.cs | 2 +- .../Configuration/StellaOpsCliOptions.cs | 2 +- src/StellaOps.Cli/Program.cs | 2 +- src/StellaOps.Cli/TASKS.md | 2 +- .../CanonicalMergerTests.cs | 4 +- .../JobCoordinatorTests.cs | 4 +- .../JobPluginRegistrationExtensionsTests.cs | 6 +- .../JobSchedulerBuilderTests.cs | 4 +- .../PluginRoutineFixtures.cs | 4 +- .../StellaOps.Concelier.Core.Tests.csproj} | 2 +- .../AGENTS.md | 4 +- .../CanonicalMergeResult.cs | 4 +- .../CanonicalMerger.cs | 4 +- .../Jobs/IJob.cs | 2 +- .../Jobs/IJobCoordinator.cs | 2 +- .../Jobs/IJobStore.cs | 2 +- .../Jobs/ILeaseStore.cs | 2 +- .../Jobs/JobCoordinator.cs | 2 +- .../Jobs/JobDefinition.cs | 2 +- .../Jobs/JobDiagnostics.cs | 24 +-- .../Jobs/JobExecutionContext.cs | 2 +- .../Jobs/JobLease.cs | 2 +- .../Jobs/JobPluginRegistrationExtensions.cs | 2 +- .../Jobs/JobRunCompletion.cs | 2 +- .../Jobs/JobRunCreateRequest.cs | 2 +- .../Jobs/JobRunSnapshot.cs | 2 +- .../Jobs/JobRunStatus.cs | 2 +- .../Jobs/JobSchedulerBuilder.cs | 2 +- .../Jobs/JobSchedulerHostedService.cs | 2 +- .../Jobs/JobSchedulerOptions.cs | 2 +- .../Jobs/JobTriggerResult.cs | 2 +- .../Jobs/ServiceCollectionExtensions.cs | 2 +- .../StellaOps.Concelier.Core.csproj} | 2 +- .../TASKS.md | 0 .../JsonExportSnapshotBuilderTests.cs | 10 +- ...ExporterDependencyInjectionRoutineTests.cs | 12 +- .../JsonExporterParitySmokeTests.cs | 8 +- .../JsonFeedExporterTests.cs | 12 +- ...laOps.Concelier.Exporter.Json.Tests.csproj | 13 ++ .../VulnListJsonExportPathResolverTests.cs | 6 +- .../AGENTS.md | 4 +- .../ExportDigestCalculator.cs | 2 +- .../ExporterVersion.cs | 2 +- .../IJsonExportPathResolver.cs | 4 +- .../JsonExportFile.cs | 2 +- .../JsonExportJob.cs | 4 +- .../JsonExportManifestWriter.cs | 2 +- .../JsonExportOptions.cs | 2 +- .../JsonExportResult.cs | 2 +- .../JsonExportSnapshotBuilder.cs | 4 +- .../JsonExporterDependencyInjectionRoutine.cs | 8 +- .../JsonExporterPlugin.cs | 4 +- .../JsonFeedExporter.cs | 6 +- .../StellaOps.Concelier.Exporter.Json.csproj} | 6 +- .../TASKS.md | 2 +- .../VulnListJsonExportPathResolver.cs | 6 +- ...ps.Concelier.Exporter.TrivyDb.Tests.csproj | 13 ++ .../TrivyDbExportPlannerTests.cs | 10 +- .../TrivyDbFeedExporterTests.cs | 14 +- .../TrivyDbOciWriterTests.cs | 4 +- .../TrivyDbPackageBuilderTests.cs | 4 +- .../AGENTS.md | 6 +- .../ITrivyDbBuilder.cs | 4 +- .../ITrivyDbOrasPusher.cs | 2 +- .../OciDescriptor.cs | 2 +- .../OciIndex.cs | 2 +- .../OciManifest.cs | 2 +- ...ellaOps.Concelier.Exporter.TrivyDb.csproj} | 6 +- .../TASKS.md | 2 +- .../TrivyConfigDocument.cs | 2 +- .../TrivyDbBlob.cs | 2 +- .../TrivyDbBoltBuilder.cs | 4 +- .../TrivyDbBuilderResult.cs | 2 +- .../TrivyDbExportJob.cs | 4 +- .../TrivyDbExportMode.cs | 2 +- .../TrivyDbExportOptions.cs | 6 +- .../TrivyDbExportOverrides.cs | 2 +- .../TrivyDbExportPlan.cs | 4 +- .../TrivyDbExportPlanner.cs | 6 +- ...ivyDbExporterDependencyInjectionRoutine.cs | 12 +- .../TrivyDbExporterPlugin.cs | 4 +- .../TrivyDbFeedExporter.cs | 10 +- .../TrivyDbMediaTypes.cs | 2 +- .../TrivyDbOciWriteResult.cs | 2 +- .../TrivyDbOciWriter.cs | 2 +- .../TrivyDbOrasPusher.cs | 2 +- .../TrivyDbPackage.cs | 2 +- .../TrivyDbPackageBuilder.cs | 2 +- .../TrivyDbPackageRequest.cs | 2 +- .../AdvisoryIdentityResolverTests.cs | 6 +- .../AdvisoryMergeServiceTests.cs | 14 +- .../AdvisoryPrecedenceMergerTests.cs | 28 +-- .../AffectedPackagePrecedenceResolverTests.cs | 6 +- .../AliasGraphResolverTests.cs | 10 +- .../CanonicalHashCalculatorTests.cs | 6 +- .../DebianEvrComparerTests.cs | 6 +- .../MergeEventWriterTests.cs | 8 +- .../MergePrecedenceIntegrationTests.cs | 12 +- .../MetricCollector.cs | 2 +- .../NevraComparerTests.cs | 6 +- .../SemanticVersionRangeResolverTests.cs | 4 +- .../StellaOps.Concelier.Merge.Tests.csproj | 13 ++ .../TestLogger.cs | 2 +- .../AGENTS.md | 8 +- .../Class1.cs | 0 .../Comparers/DebianEvr.cs | 4 +- .../Comparers/Nevra.cs | 4 +- .../Comparers/SemanticVersionRangeResolver.cs | 2 +- .../Identity/AdvisoryIdentityCluster.cs | 4 +- .../Identity/AdvisoryIdentityResolver.cs | 4 +- .../Identity/AliasIdentity.cs | 2 +- .../Jobs/MergeJobKinds.cs | 2 +- .../Jobs/MergeReconcileJob.cs | 6 +- .../MergeServiceCollectionExtensions.cs | 14 +- .../Options/AdvisoryPrecedenceDefaults.cs | 2 +- .../Options/AdvisoryPrecedenceOptions.cs | 2 +- .../Options/AdvisoryPrecedenceTable.cs | 2 +- .../RANGE_PRIMITIVES_COORDINATION.md | 8 +- .../Services/AdvisoryMergeService.cs | 16 +- .../Services/AdvisoryPrecedenceMerger.cs | 20 +- .../AffectedPackagePrecedenceResolver.cs | 6 +- .../Services/AliasGraphResolver.cs | 4 +- .../Services/CanonicalHashCalculator.cs | 4 +- .../Services/MergeEventWriter.cs | 6 +- .../StellaOps.Concelier.Merge.csproj | 18 ++ .../TASKS.md | 4 +- .../AdvisoryProvenanceTests.cs | 4 +- .../AdvisoryTests.cs | 4 +- .../AffectedPackageStatusTests.cs | 4 +- .../AffectedVersionRangeExtensionsTests.cs | 4 +- .../AliasSchemeRegistryTests.cs | 4 +- .../CanonicalExampleFactory.cs | 4 +- .../CanonicalExamplesTests.cs | 4 +- .../CanonicalJsonSerializerTests.cs | 4 +- .../EvrPrimitiveExtensionsTests.cs | 4 +- .../Fixtures/ghsa-semver.json | 0 .../Fixtures/kev-flag.json | 0 .../Fixtures/nvd-basic.json | 0 .../Fixtures/psirt-overlay.json | 0 .../NevraPrimitiveExtensionsTests.cs | 4 +- .../NormalizedVersionRuleTests.cs | 4 +- .../OsvGhsaParityDiagnosticsTests.cs | 8 +- .../OsvGhsaParityInspectorTests.cs | 4 +- .../ProvenanceDiagnosticsTests.cs | 16 +- .../RangePrimitivesTests.cs | 4 +- .../SemVerPrimitiveTests.cs | 4 +- .../SerializationDeterminismTests.cs | 4 +- .../SeverityNormalizationTests.cs | 4 +- .../StellaOps.Concelier.Models.Tests.csproj} | 2 +- .../AGENTS.md | 4 +- .../Advisory.cs | 2 +- .../AdvisoryCredit.cs | 2 +- .../AdvisoryProvenance.cs | 2 +- .../AdvisoryReference.cs | 2 +- .../AdvisoryWeakness.cs | 2 +- .../AffectedPackage.cs | 2 +- .../AffectedPackageStatus.cs | 2 +- .../AffectedPackageStatusCatalog.cs | 2 +- .../AffectedVersionRange.cs | 2 +- .../AffectedVersionRangeExtensions.cs | 2 +- .../AliasSchemeRegistry.cs | 2 +- .../AliasSchemes.cs | 2 +- .../BACKWARD_COMPATIBILITY.md | 4 +- .../CANONICAL_RECORDS.md | 4 +- .../CanonicalJsonSerializer.cs | 2 +- .../CvssMetric.cs | 2 +- .../EvrPrimitiveExtensions.cs | 2 +- .../NevraPrimitiveExtensions.cs | 2 +- .../NormalizedVersionRule.cs | 2 +- .../OsvGhsaParityDiagnostics.cs | 8 +- .../OsvGhsaParityInspector.cs | 2 +- .../PROVENANCE_GUIDELINES.md | 4 +- .../ProvenanceFieldMasks.cs | 2 +- .../ProvenanceInspector.cs | 8 +- .../RangePrimitives.cs | 2 +- .../SemVerPrimitiveExtensions.cs | 2 +- .../SeverityNormalization.cs | 2 +- .../SnapshotSerializer.cs | 2 +- .../StellaOps.Concelier.Models.csproj} | 0 .../TASKS.md | 0 .../Validation.cs | 2 +- .../CpeNormalizerTests.cs | 4 +- .../CvssMetricNormalizerTests.cs | 6 +- .../DebianEvrParserTests.cs | 4 +- .../DescriptionNormalizerTests.cs | 4 +- .../NevraParserTests.cs | 4 +- .../PackageUrlNormalizerTests.cs | 4 +- .../SemVerRangeRuleBuilderTests.cs | 6 +- ...aOps.Concelier.Normalization.Tests.csproj} | 4 +- .../AssemblyInfo.cs | 4 +- .../Cvss/CvssMetricNormalizer.cs | 4 +- .../Distro/DebianEvr.cs | 2 +- .../Distro/Nevra.cs | 2 +- .../Identifiers/Cpe23.cs | 2 +- .../Identifiers/IdentifierNormalizer.cs | 2 +- .../Identifiers/PackageUrl.cs | 2 +- .../SemVer/SemVerRangeRuleBuilder.cs | 4 +- .../StellaOps.Concelier.Normalization.csproj} | 2 +- .../TASKS.md | 0 .../Text/DescriptionNormalizer.cs | 2 +- .../Acsc/AcscConnectorFetchTests.cs | 18 +- .../Acsc/AcscConnectorParseTests.cs | 24 +-- .../Acsc/AcscHttpClientConfigurationTests.cs | 8 +- .../acsc-advisories-multi.snapshot.json | 0 .../Fixtures/acsc-advisories.snapshot.json | 0 ...ellaOps.Concelier.Source.Acsc.Tests.csproj | 19 ++ .../AGENTS.md | 8 +- .../AcscConnector.cs | 20 +- .../AcscConnectorPlugin.cs | 2 +- .../AcscDependencyInjectionRoutine.cs | 8 +- .../AcscServiceCollectionExtensions.cs | 8 +- .../Configuration/AcscFeedOptions.cs | 2 +- .../Configuration/AcscOptions.cs | 4 +- .../Internal/AcscCursor.cs | 2 +- .../Internal/AcscDiagnostics.cs | 4 +- .../Internal/AcscDocumentMetadata.cs | 4 +- .../Internal/AcscDto.cs | 2 +- .../Internal/AcscFeedParser.cs | 4 +- .../Internal/AcscMapper.cs | 8 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 2 +- .../README.md | 14 +- .../StellaOps.Concelier.Source.Acsc.csproj | 18 ++ .../TASKS.md | 4 +- .../CccsConnectorTests.cs | 20 +- .../Fixtures/cccs-feed-en.json | 0 .../Fixtures/cccs-raw-advisory-fr.json | 0 .../Fixtures/cccs-raw-advisory.json | 0 .../Fixtures/cccs-taxonomy-en.json | 0 .../Internal/CccsHtmlParserTests.cs | 6 +- .../Internal/CccsMapperTests.cs | 10 +- ...llaOps.Concelier.Source.Cccs.Tests.csproj} | 4 +- .../AGENTS.md | 8 +- .../CccsConnector.cs | 18 +- .../CccsConnectorPlugin.cs | 2 +- .../CccsDependencyInjectionRoutine.cs | 8 +- .../CccsServiceCollectionExtensions.cs | 12 +- .../Configuration/CccsOptions.cs | 4 +- .../Internal/CccsAdvisoryDto.cs | 2 +- .../Internal/CccsCursor.cs | 2 +- .../Internal/CccsDiagnostics.cs | 4 +- .../Internal/CccsFeedClient.cs | 6 +- .../Internal/CccsFeedModels.cs | 2 +- .../Internal/CccsHtmlParser.cs | 4 +- .../Internal/CccsMapper.cs | 6 +- .../Internal/CccsRawAdvisoryDocument.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../StellaOps.Concelier.Source.Cccs.csproj | 16 ++ .../TASKS.md | 6 +- .../CertBundConnectorTests.cs | 22 +- .../Fixtures/certbund-detail.json | 0 .../Fixtures/certbund-feed.xml | 0 ...ps.Concelier.Source.CertBund.Tests.csproj} | 4 +- .../AGENTS.md | 8 +- .../CertBundConnector.cs | 20 +- .../CertBundConnectorPlugin.cs | 2 +- .../CertBundDependencyInjectionRoutine.cs | 8 +- .../CertBundServiceCollectionExtensions.cs | 12 +- .../Configuration/CertBundOptions.cs | 4 +- .../Internal/CertBundAdvisoryDto.cs | 2 +- .../Internal/CertBundCursor.cs | 2 +- .../Internal/CertBundDetailParser.cs | 4 +- .../Internal/CertBundDetailResponse.cs | 2 +- .../Internal/CertBundDiagnostics.cs | 4 +- .../Internal/CertBundDocumentMetadata.cs | 2 +- .../Internal/CertBundFeedClient.cs | 4 +- .../Internal/CertBundFeedItem.cs | 2 +- .../Internal/CertBundMapper.cs | 6 +- .../Jobs.cs | 4 +- .../README.md | 4 +- ...tellaOps.Concelier.Source.CertBund.csproj} | 4 +- .../TASKS.md | 6 +- .../CertCc/CertCcConnectorFetchTests.cs | 22 +- .../CertCc/CertCcConnectorSnapshotTests.cs | 24 +-- .../CertCc/CertCcConnectorTests.cs | 22 +- .../Fixtures/certcc-advisories.snapshot.json | 0 .../Fixtures/certcc-documents.snapshot.json | 0 .../Fixtures/certcc-requests.snapshot.json | 0 .../Fixtures/certcc-state.snapshot.json | 0 .../Fixtures/summary-2025-09.json | 0 .../Fixtures/summary-2025-10.json | 0 .../Fixtures/summary-2025-11.json | 0 .../Fixtures/summary-2025.json | 0 .../Fixtures/vendor-statuses-294418.json | 0 .../Fixtures/vendors-294418.json | 0 .../Fixtures/vu-257161.json | 0 .../Fixtures/vu-294418-vendors.json | 0 .../Fixtures/vu-294418-vuls.json | 0 .../Fixtures/vu-294418.json | 0 .../Fixtures/vulnerabilities-294418.json | 0 .../Internal/CertCcMapperTests.cs | 10 +- .../Internal/CertCcSummaryParserTests.cs | 4 +- .../Internal/CertCcSummaryPlannerTests.cs | 8 +- .../CertCcVendorStatementParserTests.cs | 4 +- ...aOps.Concelier.Source.CertCc.Tests.csproj} | 4 +- .../AGENTS.md | 8 +- .../CertCcConnector.cs | 20 +- .../CertCcConnectorPlugin.cs | 2 +- .../CertCcDependencyInjectionRoutine.cs | 8 +- .../CertCcServiceCollectionExtensions.cs | 10 +- .../Configuration/CertCcOptions.cs | 4 +- .../FEEDCONN-CERTCC-02-009_PLAN.md | 16 +- .../FEEDCONN-CERTCC-02-012_HANDOFF.md | 20 ++ .../Internal/CertCcCursor.cs | 4 +- .../Internal/CertCcDiagnostics.cs | 6 +- .../Internal/CertCcMapper.cs | 8 +- .../Internal/CertCcNoteDto.cs | 2 +- .../Internal/CertCcNoteParser.cs | 6 +- .../Internal/CertCcSummaryParser.cs | 2 +- .../Internal/CertCcSummaryPlan.cs | 4 +- .../Internal/CertCcSummaryPlanner.cs | 6 +- .../Internal/CertCcVendorStatementParser.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../README.md | 6 +- .../StellaOps.Concelier.Source.CertCc.csproj} | 6 +- .../TASKS.md | 0 .../CertFr/CertFrConnectorTests.cs | 24 +-- .../Fixtures/certfr-advisories.snapshot.json | 0 .../Fixtures/certfr-detail-AV-2024-001.html | 0 .../Fixtures/certfr-detail-AV-2024-002.html | 0 .../CertFr/Fixtures/certfr-feed.xml | 0 ...laOps.Concelier.Source.CertFr.Tests.csproj | 16 ++ .../AGENTS.md | 6 +- .../CertFrConnector.cs | 18 +- .../CertFrConnectorPlugin.cs | 2 +- .../CertFrDependencyInjectionRoutine.cs | 8 +- .../CertFrServiceCollectionExtensions.cs | 10 +- .../Configuration/CertFrOptions.cs | 2 +- .../Internal/CertFrCursor.cs | 2 +- .../Internal/CertFrDocumentMetadata.cs | 4 +- .../Internal/CertFrDto.cs | 2 +- .../Internal/CertFrFeedClient.cs | 4 +- .../Internal/CertFrFeedItem.cs | 2 +- .../Internal/CertFrMapper.cs | 4 +- .../Internal/CertFrParser.cs | 2 +- .../Jobs.cs | 4 +- .../StellaOps.Concelier.Source.CertFr.csproj | 13 ++ .../TASKS.md | 0 .../CertIn/CertInConnectorTests.cs | 28 +-- .../CertIn/Fixtures/alerts-page1.json | 0 .../Fixtures/detail-CIAD-2024-0005.html | 0 .../CertIn/Fixtures/expected-advisory.json | 0 ...laOps.Concelier.Source.CertIn.Tests.csproj | 16 ++ .../AGENTS.md | 6 +- .../CertInConnector.cs | 20 +- .../CertInConnectorPlugin.cs | 2 +- .../CertInDependencyInjectionRoutine.cs | 8 +- .../CertInServiceCollectionExtensions.cs | 10 +- .../Configuration/CertInOptions.cs | 2 +- .../Internal/CertInAdvisoryDto.cs | 2 +- .../Internal/CertInClient.cs | 4 +- .../Internal/CertInCursor.cs | 2 +- .../Internal/CertInDetailParser.cs | 2 +- .../Internal/CertInListingItem.cs | 2 +- .../Jobs.cs | 4 +- .../StellaOps.Concelier.Source.CertIn.csproj | 16 ++ .../TASKS.md | 0 .../Common/CannedHttpMessageHandlerTests.cs | 4 +- .../Common/HtmlContentSanitizerTests.cs | 4 +- .../Common/PackageCoordinateHelperTests.cs | 4 +- .../Common/PdfTextExtractorTests.cs | 4 +- .../Common/SourceFetchServiceTests.cs | 4 +- .../Common/SourceHttpClientBuilderTests.cs | 34 +-- .../Common/TimeWindowCursorPlannerTests.cs | 4 +- .../Common/UrlNormalizerTests.cs | 4 +- .../Json/JsonSchemaValidatorTests.cs | 4 +- ...aOps.Concelier.Source.Common.Tests.csproj} | 2 +- .../Xml/XmlSchemaValidatorTests.cs | 12 +- .../AGENTS.md | 6 +- .../Cursors/PaginationPlanner.cs | 2 +- .../Cursors/TimeWindowCursorOptions.cs | 2 +- .../Cursors/TimeWindowCursorPlanner.cs | 2 +- .../Cursors/TimeWindowCursorState.cs | 2 +- .../DocumentStatuses.cs | 2 +- .../Fetch/CryptoJitterSource.cs | 2 +- .../Fetch/IJitterSource.cs | 2 +- .../Fetch/RawDocumentStorage.cs | 2 +- .../Fetch/SourceFetchContentResult.cs | 2 +- .../Fetch/SourceFetchRequest.cs | 2 +- .../Fetch/SourceFetchResult.cs | 4 +- .../Fetch/SourceFetchService.cs | 10 +- .../Fetch/SourceRetryPolicy.cs | 2 +- .../Html/HtmlContentSanitizer.cs | 4 +- .../Http/AllowlistedHttpMessageHandler.cs | 2 +- .../Http/ServiceCollectionExtensions.cs | 4 +- .../SourceHttpClientConfigurationBinder.cs | 12 +- .../Http/SourceHttpClientOptions.cs | 4 +- .../Json/IJsonSchemaValidator.cs | 2 +- .../Json/JsonSchemaValidationError.cs | 2 +- .../Json/JsonSchemaValidationException.cs | 2 +- .../Json/JsonSchemaValidator.cs | 2 +- .../Packages/PackageCoordinateHelper.cs | 4 +- .../Pdf/PdfTextExtractor.cs | 2 +- .../Properties/AssemblyInfo.cs | 3 + .../StellaOps.Concelier.Source.Common.csproj} | 4 +- .../TASKS.md | 2 +- .../Telemetry/SourceDiagnostics.cs | 24 +-- .../Testing/CannedHttpMessageHandler.cs | 2 +- .../Url/UrlNormalizer.cs | 2 +- .../Xml/IXmlSchemaValidator.cs | 2 +- .../Xml/XmlSchemaValidationError.cs | 2 +- .../Xml/XmlSchemaValidationException.cs | 2 +- .../Xml/XmlSchemaValidator.cs | 2 +- .../Cve/CveConnectorTests.cs | 22 +- .../Fixtures/cve-CVE-2024-0001.json | 0 .../Fixtures/cve-list.json | 0 .../Fixtures/expected-CVE-2024-0001.json | 0 ...tellaOps.Concelier.Source.Cve.Tests.csproj | 17 ++ .../AGENTS.md | 6 +- .../Configuration/CveOptions.cs | 2 +- .../CveConnector.cs | 22 +- .../CveConnectorPlugin.cs | 2 +- .../CveDependencyInjectionRoutine.cs | 8 +- .../CveServiceCollectionExtensions.cs | 10 +- .../Internal/CveCursor.cs | 2 +- .../Internal/CveDiagnostics.cs | 4 +- .../Internal/CveListParser.cs | 2 +- .../Internal/CveMapper.cs | 8 +- .../Internal/CveRecordDto.cs | 2 +- .../Internal/CveRecordParser.cs | 4 +- .../Jobs.cs | 4 +- .../StellaOps.Concelier.Source.Cve.csproj} | 4 +- .../TASKS.md | 8 +- .../DebianConnectorTests.cs | 22 +- .../DebianMapperTests.cs | 10 +- .../Fixtures/debian-detail-dsa-2024-123.html | 0 .../Fixtures/debian-detail-dsa-2024-124.html | 0 .../Distro/Debian/Fixtures/debian-list.txt | 0 ...oncelier.Source.Distro.Debian.Tests.csproj | 13 ++ .../AssemblyInfo.cs | 3 + .../Configuration/DebianOptions.cs | 6 +- .../DebianConnector.cs | 20 +- .../DebianConnectorPlugin.cs | 2 +- .../DebianDependencyInjectionRoutine.cs | 8 +- .../DebianServiceCollectionExtensions.cs | 6 +- .../Internal/DebianAdvisoryDto.cs | 2 +- .../Internal/DebianCursor.cs | 2 +- .../Internal/DebianDetailMetadata.cs | 2 +- .../Internal/DebianFetchCacheEntry.cs | 6 +- .../Internal/DebianHtmlParser.cs | 2 +- .../Internal/DebianListEntry.cs | 2 +- .../Internal/DebianListParser.cs | 2 +- .../Internal/DebianMapper.cs | 10 +- .../Jobs.cs | 4 +- ...aOps.Concelier.Source.Distro.Debian.csproj | 17 ++ .../RedHat/Fixtures/csaf-rhsa-2025-0001.json | 0 .../RedHat/Fixtures/csaf-rhsa-2025-0002.json | 0 .../RedHat/Fixtures/csaf-rhsa-2025-0003.json | 0 .../Fixtures/rhsa-2025-0001.snapshot.json | 0 .../Fixtures/rhsa-2025-0002.snapshot.json | 0 .../Fixtures/rhsa-2025-0003.snapshot.json | 0 .../RedHat/Fixtures/summary-page1-repeat.json | 0 .../RedHat/Fixtures/summary-page1.json | 0 .../RedHat/Fixtures/summary-page2.json | 0 .../RedHat/Fixtures/summary-page3.json | 0 .../RedHat/RedHatConnectorHarnessTests.cs | 16 +- .../RedHat/RedHatConnectorTests.cs | 36 ++-- ...oncelier.Source.Distro.RedHat.Tests.csproj | 18 ++ .../AGENTS.md | 6 +- .../CONFLICT_RESOLVER_NOTES.md | 6 +- .../Configuration/RedHatOptions.cs | 4 +- .../Internal/Models/RedHatCsafModels.cs | 2 +- .../Internal/RedHatCursor.cs | 2 +- .../Internal/RedHatMapper.cs | 18 +- .../Internal/RedHatSummaryItem.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../RedHatConnector.cs | 20 +- .../RedHatConnectorPlugin.cs | 2 +- .../RedHatDependencyInjectionRoutine.cs | 8 +- .../RedHatServiceCollectionExtensions.cs | 6 +- ...aOps.Concelier.Source.Distro.RedHat.csproj | 15 ++ .../TASKS.md | 0 .../Distro/Suse/Fixtures/suse-changes.csv | 0 .../Suse/Fixtures/suse-su-2025_0001-1.json | 0 .../Suse/Fixtures/suse-su-2025_0002-1.json | 0 ....Concelier.Source.Distro.Suse.Tests.csproj | 18 ++ .../SuseConnectorTests.cs | 24 +-- .../SuseCsafParserTests.cs | 4 +- .../SuseMapperTests.cs | 12 +- .../AssemblyInfo.cs | 3 + .../Configuration/SuseOptions.cs | 6 +- .../Internal/SuseAdvisoryDto.cs | 2 +- .../Internal/SuseChangeRecord.cs | 2 +- .../Internal/SuseChangesParser.cs | 2 +- .../Internal/SuseCsafParser.cs | 4 +- .../Internal/SuseCursor.cs | 2 +- .../Internal/SuseFetchCacheEntry.cs | 6 +- .../Internal/SuseMapper.cs | 8 +- .../Jobs.cs | 4 +- ...llaOps.Concelier.Source.Distro.Suse.csproj | 17 ++ .../SuseConnector.cs | 20 +- .../SuseConnectorPlugin.cs | 2 +- .../SuseDependencyInjectionRoutine.cs | 8 +- .../SuseServiceCollectionExtensions.cs | 6 +- .../Fixtures/ubuntu-notices-page0.json | 0 .../Fixtures/ubuntu-notices-page1.json | 0 ...oncelier.Source.Distro.Ubuntu.Tests.csproj | 18 ++ .../UbuntuConnectorTests.cs | 20 +- .../Configuration/UbuntuOptions.cs | 6 +- .../Internal/UbuntuCursor.cs | 2 +- .../Internal/UbuntuFetchCacheEntry.cs | 6 +- .../Internal/UbuntuMapper.cs | 8 +- .../Internal/UbuntuNoticeDto.cs | 2 +- .../Internal/UbuntuNoticeParser.cs | 2 +- .../Jobs.cs | 4 +- ...aOps.Concelier.Source.Distro.Ubuntu.csproj | 17 ++ .../TASKS.md | 0 .../UbuntuConnector.cs | 20 +- .../UbuntuConnectorPlugin.cs | 2 +- .../UbuntuDependencyInjectionRoutine.cs | 8 +- .../UbuntuServiceCollectionExtensions.cs | 6 +- .../Fixtures/conflict-ghsa.canonical.json | 0 .../Fixtures/credit-parity.ghsa.json | 0 .../Fixtures/credit-parity.nvd.json | 0 .../Fixtures/credit-parity.osv.json | 0 .../expected-GHSA-xxxx-yyyy-zzzz.json | 0 .../Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json | 0 .../Fixtures/ghsa-list.json | 0 .../Ghsa/GhsaConflictFixtureTests.cs | 8 +- .../Ghsa/GhsaConnectorTests.cs | 16 +- .../Ghsa/GhsaCreditParityRegressionTests.cs | 4 +- .../GhsaDependencyInjectionRoutineTests.cs | 18 +- .../Ghsa/GhsaDiagnosticsTests.cs | 4 +- .../Ghsa/GhsaMapperTests.cs | 6 +- .../Ghsa/GhsaRateLimitParserTests.cs | 4 +- ...ellaOps.Concelier.Source.Ghsa.Tests.csproj | 17 ++ .../AGENTS.md | 6 +- .../Configuration/GhsaOptions.cs | 2 +- .../GhsaConnector.cs | 20 +- .../GhsaConnectorPlugin.cs | 2 +- .../GhsaDependencyInjectionRoutine.cs | 8 +- .../GhsaServiceCollectionExtensions.cs | 10 +- .../Internal/GhsaCursor.cs | 2 +- .../Internal/GhsaDiagnostics.cs | 4 +- .../Internal/GhsaListParser.cs | 2 +- .../Internal/GhsaMapper.cs | 10 +- .../Internal/GhsaRateLimitParser.cs | 2 +- .../Internal/GhsaRateLimitSnapshot.cs | 2 +- .../Internal/GhsaRecordDto.cs | 2 +- .../Internal/GhsaRecordParser.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 2 +- .../StellaOps.Concelier.Source.Ghsa.csproj | 17 ++ .../TASKS.md | 8 +- .../IcsCisa/Fixtures/icsa-25-123-01.html | 0 .../IcsCisa/Fixtures/icsma-25-045-01.html | 0 .../IcsCisa/Fixtures/sample-feed.xml | 0 .../IcsCisa/IcsCisaConnectorMappingTests.cs | 8 +- .../IcsCisa/IcsCisaFeedParserTests.cs | 4 +- .../IcsCisaConnectorTests.cs | 16 +- ...Ops.Concelier.Source.Ics.Cisa.Tests.csproj | 16 ++ .../AGENTS.md | 6 +- .../Configuration/IcsCisaOptions.cs | 2 +- .../HANDOVER.md | 6 +- .../IcsCisaConnector.cs | 22 +- .../IcsCisaConnectorPlugin.cs | 2 +- .../IcsCisaDependencyInjectionRoutine.cs | 8 +- .../IcsCisaServiceCollectionExtensions.cs | 10 +- .../Internal/IcsCisaAdvisoryDto.cs | 2 +- .../Internal/IcsCisaAttachmentDto.cs | 2 +- .../Internal/IcsCisaCursor.cs | 2 +- .../Internal/IcsCisaDiagnostics.cs | 8 +- .../Internal/IcsCisaFeedDto.cs | 2 +- .../Internal/IcsCisaFeedParser.cs | 4 +- .../Jobs.cs | 4 +- ...tellaOps.Concelier.Source.Ics.Cisa.csproj} | 10 +- .../TASKS.md | 6 +- .../Fixtures/detail-acme-controller-2024.html | 0 .../Kaspersky/Fixtures/expected-advisory.json | 0 .../Kaspersky/Fixtures/feed-page1.xml | 0 .../Kaspersky/KasperskyConnectorTests.cs | 26 +-- ...oncelier.Source.Ics.Kaspersky.Tests.csproj | 16 ++ .../AGENTS.md | 6 +- .../Configuration/KasperskyOptions.cs | 2 +- .../Internal/KasperskyAdvisoryDto.cs | 2 +- .../Internal/KasperskyAdvisoryParser.cs | 2 +- .../Internal/KasperskyCursor.cs | 2 +- .../Internal/KasperskyFeedClient.cs | 4 +- .../Internal/KasperskyFeedItem.cs | 2 +- .../Jobs.cs | 4 +- .../KasperskyConnector.cs | 20 +- .../KasperskyConnectorPlugin.cs | 2 +- .../KasperskyDependencyInjectionRoutine.cs | 8 +- .../KasperskyServiceCollectionExtensions.cs | 10 +- ...aOps.Concelier.Source.Ics.Kaspersky.csproj | 16 ++ .../TASKS.md | 0 .../Jvn/Fixtures/expected-advisory.json | 0 .../Jvn/Fixtures/jvnrss-window1.xml | 0 .../Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml | 0 .../Jvn/JvnConnectorTests.cs | 28 +-- ...tellaOps.Concelier.Source.Jvn.Tests.csproj | 16 ++ .../AGENTS.md | 6 +- .../Configuration/JvnOptions.cs | 2 +- .../Internal/JvnAdvisoryMapper.cs | 18 +- .../Internal/JvnConstants.cs | 2 +- .../Internal/JvnCursor.cs | 2 +- .../Internal/JvnDetailDto.cs | 2 +- .../Internal/JvnDetailParser.cs | 2 +- .../Internal/JvnOverviewItem.cs | 2 +- .../Internal/JvnOverviewPage.cs | 2 +- .../Internal/JvnSchemaProvider.cs | 4 +- .../Internal/JvnSchemaValidationException.cs | 2 +- .../Internal/MyJvnClient.cs | 4 +- .../Jobs.cs | 4 +- .../JvnConnector.cs | 22 +- .../JvnConnectorPlugin.cs | 2 +- .../JvnDependencyInjectionRoutine.cs | 8 +- .../JvnServiceCollectionExtensions.cs | 10 +- .../Schemas/data_marking.xsd | 0 .../Schemas/jvnrss_3.2.xsd | 0 .../Schemas/mod_sec_3.0.xsd | 0 .../Schemas/status_3.3.xsd | 0 .../Schemas/tlp_marking.xsd | 0 .../Schemas/vuldef_3.2.xsd | 0 .../Schemas/xml.xsd | 0 .../StellaOps.Concelier.Source.Jvn.csproj | 15 ++ .../TASKS.md | 0 .../Kev/Fixtures/kev-advisories.snapshot.json | 0 .../Kev/Fixtures/kev-catalog.json | 0 .../Kev/KevConnectorTests.cs | 22 +- .../Kev/KevMapperTests.cs | 8 +- ...tellaOps.Concelier.Source.Kev.Tests.csproj | 19 ++ .../AGENTS.md | 6 +- .../Configuration/KevOptions.cs | 2 +- .../Internal/KevCatalogDto.cs | 2 +- .../Internal/KevCursor.cs | 2 +- .../Internal/KevDiagnostics.cs | 4 +- .../Internal/KevMapper.cs | 4 +- .../Internal/KevSchemaProvider.cs | 4 +- .../Jobs.cs | 4 +- .../KevConnector.cs | 22 +- .../KevConnectorPlugin.cs | 2 +- .../KevDependencyInjectionRoutine.cs | 8 +- .../KevServiceCollectionExtensions.cs | 10 +- .../Schemas/kev-catalog.schema.json | 0 .../StellaOps.Concelier.Source.Kev.csproj} | 8 +- .../TASKS.md | 6 +- .../Fixtures/kisa-detail.json | 0 .../Fixtures/kisa-feed.xml | 0 .../KisaConnectorTests.cs | 22 +- ...llaOps.Concelier.Source.Kisa.Tests.csproj} | 8 +- .../AGENTS.md | 8 +- .../Configuration/KisaOptions.cs | 4 +- .../Internal/KisaCursor.cs | 2 +- .../Internal/KisaDetailParser.cs | 4 +- .../Internal/KisaDetailResponse.cs | 2 +- .../Internal/KisaDiagnostics.cs | 4 +- .../Internal/KisaDocumentMetadata.cs | 2 +- .../Internal/KisaFeedClient.cs | 4 +- .../Internal/KisaFeedItem.cs | 2 +- .../Internal/KisaMapper.cs | 6 +- .../Jobs.cs | 4 +- .../KisaConnector.cs | 18 +- .../KisaConnectorPlugin.cs | 2 +- .../KisaDependencyInjectionRoutine.cs | 8 +- .../KisaServiceCollectionExtensions.cs | 12 +- .../StellaOps.Concelier.Source.Kisa.csproj | 17 ++ .../TASKS.md | 4 +- .../Nvd/Fixtures/conflict-nvd.canonical.json | 0 .../Nvd/Fixtures/credit-parity.ghsa.json | 0 .../Nvd/Fixtures/credit-parity.nvd.json | 0 .../Nvd/Fixtures/credit-parity.osv.json | 0 .../Nvd/Fixtures/nvd-invalid-schema.json | 0 .../Nvd/Fixtures/nvd-multipage-1.json | 0 .../Nvd/Fixtures/nvd-multipage-2.json | 0 .../Nvd/Fixtures/nvd-multipage-3.json | 0 .../Nvd/Fixtures/nvd-window-1.json | 0 .../Nvd/Fixtures/nvd-window-2.json | 0 .../Nvd/Fixtures/nvd-window-update.json | 0 .../Nvd/NvdConflictFixtureTests.cs | 8 +- .../Nvd/NvdConnectorHarnessTests.cs | 18 +- .../Nvd/NvdConnectorTests.cs | 30 +-- .../Nvd/NvdMergeExportParityTests.cs | 8 +- ...tellaOps.Concelier.Source.Nvd.Tests.csproj | 18 ++ .../AGENTS.md | 8 +- .../Configuration/NvdOptions.cs | 2 +- .../Internal/NvdCursor.cs | 4 +- .../Internal/NvdDiagnostics.cs | 4 +- .../Internal/NvdMapper.cs | 12 +- .../Internal/NvdSchemaProvider.cs | 4 +- .../NvdConnector.cs | 26 +-- .../NvdConnectorPlugin.cs | 2 +- .../NvdServiceCollectionExtensions.cs | 10 +- .../Properties/AssemblyInfo.cs | 2 +- .../Schemas/nvd-vulnerability.schema.json | 0 .../StellaOps.Concelier.Source.Nvd.csproj | 17 ++ .../TASKS.md | 2 +- .../Fixtures/conflict-osv.canonical.json | 0 .../Fixtures/osv-ghsa.ghsa.json | 0 .../Fixtures/osv-ghsa.osv.json | 0 .../Fixtures/osv-ghsa.raw-ghsa.json | 0 .../Fixtures/osv-ghsa.raw-osv.json | 0 .../Fixtures/osv-npm.snapshot.json | 0 .../Fixtures/osv-pypi.snapshot.json | 0 .../Osv/OsvConflictFixtureTests.cs | 10 +- .../Osv/OsvGhsaParityRegressionTests.cs | 20 +- .../Osv/OsvMapperTests.cs | 16 +- .../Osv/OsvSnapshotTests.cs | 14 +- ...tellaOps.Concelier.Source.Osv.Tests.csproj | 18 ++ .../AGENTS.md | 6 +- .../Configuration/OsvOptions.cs | 2 +- .../Internal/OsvCursor.cs | 2 +- .../Internal/OsvDiagnostics.cs | 4 +- .../Internal/OsvMapper.cs | 16 +- .../Internal/OsvVulnerabilityDto.cs | 2 +- .../Jobs.cs | 4 +- .../OsvConnector.cs | 20 +- .../OsvConnectorPlugin.cs | 2 +- .../OsvDependencyInjectionRoutine.cs | 8 +- .../OsvServiceCollectionExtensions.cs | 10 +- .../Properties/AssemblyInfo.cs | 0 .../StellaOps.Concelier.Source.Osv.csproj | 23 ++ .../TASKS.md | 6 +- .../Fixtures/export-sample.xml | 0 .../Fixtures/ru-bdu-advisories.snapshot.json | 0 .../Fixtures/ru-bdu-documents.snapshot.json | 0 .../Fixtures/ru-bdu-dtos.snapshot.json | 0 .../Fixtures/ru-bdu-requests.snapshot.json | 2 +- .../Fixtures/ru-bdu-state.snapshot.json | 0 .../RuBduConnectorSnapshotTests.cs | 22 +- .../RuBduMapperTests.cs | 10 +- .../RuBduXmlParserTests.cs | 4 +- ...laOps.Concelier.Source.Ru.Bdu.Tests.csproj | 13 ++ .../AGENTS.md | 6 +- .../Configuration/RuBduOptions.cs | 4 +- .../Internal/RuBduCursor.cs | 2 +- .../Internal/RuBduDiagnostics.cs | 6 +- .../Internal/RuBduMapper.cs | 8 +- .../Internal/RuBduVulnerabilityDto.cs | 2 +- .../Internal/RuBduXmlParser.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../README.md | 10 +- .../RuBduConnector.cs | 20 +- .../RuBduConnectorPlugin.cs | 2 +- .../RuBduDependencyInjectionRoutine.cs | 8 +- .../RuBduServiceCollectionExtensions.cs | 8 +- .../StellaOps.Concelier.Source.Ru.Bdu.csproj | 18 ++ .../TASKS.md | 6 +- .../Fixtures/bulletin-legacy.json.zip | Bin .../Fixtures/bulletin-sample.json.zip | Bin .../Fixtures/listing-page2.html | 0 .../Fixtures/listing.html | 0 .../Fixtures/nkcki-advisories.snapshot.json | 0 .../RuNkckiConnectorTests.cs | 24 +-- .../RuNkckiJsonParserTests.cs | 4 +- .../RuNkckiMapperTests.cs | 10 +- ...Ops.Concelier.Source.Ru.Nkcki.Tests.csproj | 13 ++ .../AGENTS.md | 8 +- .../Configuration/RuNkckiOptions.cs | 4 +- .../Internal/RuNkckiCursor.cs | 2 +- .../Internal/RuNkckiDiagnostics.cs | 4 +- .../Internal/RuNkckiJsonParser.cs | 2 +- .../Internal/RuNkckiMapper.cs | 10 +- .../Internal/RuNkckiVulnerabilityDto.cs | 2 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../RuNkckiConnector.cs | 18 +- .../RuNkckiConnectorPlugin.cs | 2 +- .../RuNkckiDependencyInjectionRoutine.cs | 8 +- .../RuNkckiServiceCollectionExtensions.cs | 8 +- ...StellaOps.Concelier.Source.Ru.Nkcki.csproj | 22 ++ .../TASKS.md | 8 +- .../Adobe/AdobeConnectorFetchTests.cs | 26 +-- .../Fixtures/adobe-advisories.snapshot.json | 0 .../Fixtures/adobe-detail-apsb25-85.html | 0 .../Fixtures/adobe-detail-apsb25-87.html | 0 .../Adobe/Fixtures/adobe-index.html | 0 ....Concelier.Source.Vndr.Adobe.Tests.csproj} | 8 +- .../AGENTS.md | 6 +- .../AdobeConnector.cs | 26 +-- .../AdobeConnectorPlugin.cs | 2 +- .../AdobeDiagnostics.cs | 4 +- .../AdobeServiceCollectionExtensions.cs | 8 +- .../Configuration/AdobeOptions.cs | 2 +- .../Internal/AdobeBulletinDto.cs | 2 +- .../Internal/AdobeCursor.cs | 2 +- .../Internal/AdobeDetailParser.cs | 2 +- .../Internal/AdobeDocumentMetadata.cs | 4 +- .../Internal/AdobeIndexEntry.cs | 2 +- .../Internal/AdobeIndexParser.cs | 2 +- .../Internal/AdobeSchemaProvider.cs | 4 +- .../Schemas/adobe-bulletin.schema.json | 0 ...llaOps.Concelier.Source.Vndr.Adobe.csproj} | 6 +- .../TASKS.md | 0 .../Apple/AppleConnectorTests.cs | 24 +-- .../Apple/AppleFixtureManager.cs | 6 +- .../Apple/AppleLiveRegressionTests.cs | 6 +- .../Apple/Fixtures/106355.expected.json | 0 .../Apple/Fixtures/106355.html | 0 .../Apple/Fixtures/125326.expected.json | 0 .../Apple/Fixtures/125326.html | 0 .../Apple/Fixtures/125328.expected.json | 0 .../Apple/Fixtures/125328.html | 0 .../Apple/Fixtures/HT214108.expected.json | 0 .../Apple/Fixtures/HT215500.expected.json | 0 .../Apple/Fixtures/ht214108.html | 0 .../Apple/Fixtures/ht215500.html | 0 .../Apple/Fixtures/index.json | 0 ...s.Concelier.Source.Vndr.Apple.Tests.csproj | 18 ++ .../AGENTS.md | 6 +- .../AppleConnector.cs | 18 +- .../AppleDependencyInjectionRoutine.cs | 6 +- .../AppleOptions.cs | 4 +- .../AppleServiceCollectionExtensions.cs | 8 +- .../Internal/AppleCursor.cs | 2 +- .../Internal/AppleDetailDto.cs | 2 +- .../Internal/AppleDetailParser.cs | 2 +- .../Internal/AppleDiagnostics.cs | 4 +- .../Internal/AppleIndexEntry.cs | 2 +- .../Internal/AppleMapper.cs | 14 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../README.md | 4 +- ...ellaOps.Concelier.Source.Vndr.Apple.csproj | 18 ++ .../TASKS.md | 2 +- .../VndrAppleConnectorPlugin.cs | 2 +- .../Chromium/ChromiumConnectorTests.cs | 28 +-- .../Chromium/ChromiumMapperTests.cs | 6 +- .../Fixtures/chromium-advisory.snapshot.json | 0 .../Chromium/Fixtures/chromium-detail.html | 0 .../Chromium/Fixtures/chromium-feed.xml | 0 ...ncelier.Source.Vndr.Chromium.Tests.csproj} | 8 +- .../AGENTS.md | 6 +- .../ChromiumConnector.cs | 26 +-- .../ChromiumConnectorPlugin.cs | 2 +- .../ChromiumDiagnostics.cs | 4 +- .../ChromiumServiceCollectionExtensions.cs | 10 +- .../Configuration/ChromiumOptions.cs | 2 +- .../Internal/ChromiumCursor.cs | 2 +- .../Internal/ChromiumDocumentMetadata.cs | 4 +- .../Internal/ChromiumDto.cs | 2 +- .../Internal/ChromiumFeedEntry.cs | 2 +- .../Internal/ChromiumFeedLoader.cs | 4 +- .../Internal/ChromiumMapper.cs | 6 +- .../Internal/ChromiumParser.cs | 2 +- .../Internal/ChromiumSchemaProvider.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + .../Schemas/chromium-post.schema.json | 0 ...Ops.Concelier.Source.Vndr.Chromium.csproj} | 8 +- .../TASKS.md | 0 .../CiscoDtoFactoryTests.cs | 4 +- .../CiscoMapperTests.cs | 14 +- ....Concelier.Source.Vndr.Cisco.Tests.csproj} | 6 +- .../AGENTS.md | 6 +- .../CiscoConnector.cs | 18 +- .../CiscoDependencyInjectionRoutine.cs | 6 +- .../CiscoServiceCollectionExtensions.cs | 14 +- .../Configuration/CiscoOptions.cs | 6 +- .../Internal/CiscoAccessTokenProvider.cs | 4 +- .../Internal/CiscoAdvisoryDto.cs | 2 +- .../Internal/CiscoCsafClient.cs | 6 +- .../Internal/CiscoCsafData.cs | 2 +- .../Internal/CiscoCsafParser.cs | 2 +- .../Internal/CiscoCursor.cs | 2 +- .../Internal/CiscoDiagnostics.cs | 4 +- .../Internal/CiscoDtoFactory.cs | 4 +- .../Internal/CiscoMapper.cs | 10 +- .../Internal/CiscoOAuthMessageHandler.cs | 2 +- .../Internal/CiscoOpenVulnClient.cs | 6 +- .../Internal/CiscoRawAdvisory.cs | 2 +- .../Jobs.cs | 4 +- ...ellaOps.Concelier.Source.Vndr.Cisco.csproj | 16 ++ .../TASKS.md | 8 +- .../VndrCiscoConnectorPlugin.cs | 2 +- .../Fixtures/msrc-detail.json | 0 .../Fixtures/msrc-summary.json | 0 .../MsrcConnectorTests.cs | 24 +-- ...s.Concelier.Source.Vndr.Msrc.Tests.csproj} | 8 +- .../AGENTS.md | 4 +- .../Configuration/MsrcOptions.cs | 6 +- .../Internal/MsrcAdvisoryDto.cs | 2 +- .../Internal/MsrcApiClient.cs | 4 +- .../Internal/MsrcCursor.cs | 2 +- .../Internal/MsrcDetailDto.cs | 2 +- .../Internal/MsrcDetailParser.cs | 2 +- .../Internal/MsrcDiagnostics.cs | 4 +- .../Internal/MsrcDocumentMetadata.cs | 2 +- .../Internal/MsrcMapper.cs | 6 +- .../Internal/MsrcSummaryResponse.cs | 2 +- .../Internal/MsrcTokenProvider.cs | 4 +- .../Jobs.cs | 4 +- .../MsrcConnector.cs | 20 +- .../MsrcConnectorPlugin.cs | 2 +- .../MsrcDependencyInjectionRoutine.cs | 8 +- .../MsrcServiceCollectionExtensions.cs | 8 +- .../README.md | 2 +- ...ellaOps.Concelier.Source.Vndr.Msrc.csproj} | 4 +- .../TASKS.md | 8 +- .../Fixtures/oracle-advisories.snapshot.json | 0 .../oracle-calendar-cpuapr2024-single.html | 0 .../Fixtures/oracle-calendar-cpuapr2024.html | 0 .../Fixtures/oracle-detail-cpuapr2024-01.html | 0 .../Fixtures/oracle-detail-cpuapr2024-02.html | 0 .../Fixtures/oracle-detail-invalid.html | 0 .../Oracle/OracleConnectorTests.cs | 26 +-- ....Concelier.Source.Vndr.Oracle.Tests.csproj | 17 ++ .../AGENTS.md | 6 +- .../Configuration/OracleOptions.cs | 2 +- .../Internal/OracleAffectedEntry.cs | 2 +- .../Internal/OracleCalendarFetcher.cs | 4 +- .../Internal/OracleCursor.cs | 4 +- .../Internal/OracleDocumentMetadata.cs | 4 +- .../Internal/OracleDto.cs | 2 +- .../Internal/OracleDtoValidator.cs | 2 +- .../Internal/OracleMapper.cs | 12 +- .../Internal/OracleParser.cs | 2 +- .../Internal/OraclePatchDocument.cs | 2 +- .../Jobs.cs | 4 +- .../OracleConnector.cs | 20 +- .../OracleDependencyInjectionRoutine.cs | 8 +- .../OracleServiceCollectionExtensions.cs | 10 +- .../Properties/AssemblyInfo.cs | 3 + ...llaOps.Concelier.Source.Vndr.Oracle.csproj | 17 ++ .../TASKS.md | 0 .../VndrOracleConnectorPlugin.cs | 2 +- ....Concelier.Source.Vndr.Vmware.Tests.csproj | 18 ++ .../Fixtures/vmware-advisories.snapshot.json | 0 .../vmware-detail-vmsa-2024-0001.json | 0 .../vmware-detail-vmsa-2024-0002.json | 0 .../vmware-detail-vmsa-2024-0003.json | 0 .../Vmware/Fixtures/vmware-index-initial.json | 0 .../Vmware/Fixtures/vmware-index-second.json | 0 .../Vmware/VmwareConnectorTests.cs | 26 +-- .../Vmware/VmwareMapperTests.cs | 14 +- .../AGENTS.md | 6 +- .../Configuration/VmwareOptions.cs | 2 +- .../Internal/VmwareCursor.cs | 2 +- .../Internal/VmwareDetailDto.cs | 2 +- .../Internal/VmwareFetchCacheEntry.cs | 4 +- .../Internal/VmwareIndexItem.cs | 2 +- .../Internal/VmwareMapper.cs | 14 +- .../Jobs.cs | 4 +- .../Properties/AssemblyInfo.cs | 3 + ...llaOps.Concelier.Source.Vndr.Vmware.csproj | 23 ++ .../TASKS.md | 0 .../VmwareConnector.cs | 22 +- .../VmwareConnectorPlugin.cs | 2 +- .../VmwareDependencyInjectionRoutine.cs | 8 +- .../VmwareDiagnostics.cs | 4 +- .../VmwareServiceCollectionExtensions.cs | 8 +- .../AdvisoryStorePerformanceTests.cs | 14 +- .../AdvisoryStoreTests.cs | 8 +- .../AliasStoreTests.cs | 6 +- .../DocumentStoreTests.cs | 4 +- .../DtoStoreTests.cs | 4 +- .../ExportStateManagerTests.cs | 4 +- .../ExportStateStoreTests.cs | 4 +- .../MergeEventStoreTests.cs | 4 +- .../Migrations/MongoMigrationRunnerTests.cs | 16 +- .../MongoBootstrapperTests.cs | 10 +- .../MongoJobStoreTests.cs | 6 +- .../MongoSourceStateRepositoryTests.cs | 4 +- .../RawDocumentRetentionServiceTests.cs | 8 +- ...laOps.Concelier.Storage.Mongo.Tests.csproj | 12 ++ .../AGENTS.md | 6 +- .../Advisories/AdvisoryDocument.cs | 2 +- .../Advisories/AdvisoryStore.cs | 6 +- .../Advisories/IAdvisoryStore.cs | 4 +- .../Advisories/NormalizedVersionDocument.cs | 2 +- .../NormalizedVersionDocumentFactory.cs | 4 +- .../Aliases/AliasDocument.cs | 2 +- .../Aliases/AliasStore.cs | 2 +- .../Aliases/AliasStoreConstants.cs | 2 +- .../Aliases/AliasStoreMetrics.cs | 6 +- .../Aliases/IAliasStore.cs | 2 +- .../ChangeHistory/ChangeHistoryDocument.cs | 2 +- .../ChangeHistoryDocumentExtensions.cs | 2 +- .../ChangeHistory/ChangeHistoryFieldChange.cs | 2 +- .../ChangeHistory/ChangeHistoryRecord.cs | 2 +- .../ChangeHistory/IChangeHistoryStore.cs | 2 +- .../ChangeHistory/MongoChangeHistoryStore.cs | 2 +- .../Documents/DocumentDocument.cs | 2 +- .../Documents/DocumentRecord.cs | 2 +- .../Documents/DocumentStore.cs | 2 +- .../Documents/IDocumentStore.cs | 2 +- .../Dtos/DtoDocument.cs | 2 +- .../Dtos/DtoRecord.cs | 2 +- .../Dtos/DtoStore.cs | 2 +- .../Dtos/IDtoStore.cs | 2 +- .../Exporting/ExportStateDocument.cs | 2 +- .../Exporting/ExportStateManager.cs | 2 +- .../Exporting/ExportStateRecord.cs | 2 +- .../Exporting/ExportStateStore.cs | 2 +- .../Exporting/IExportStateStore.cs | 2 +- .../ISourceStateRepository.cs | 2 +- .../JobLeaseDocument.cs | 4 +- .../JobRunDocument.cs | 4 +- .../JpFlags/IJpFlagStore.cs | 2 +- .../JpFlags/JpFlagDocument.cs | 2 +- .../JpFlags/JpFlagRecord.cs | 2 +- .../JpFlags/JpFlagStore.cs | 2 +- .../MIGRATIONS.md | 10 +- .../MergeEvents/IMergeEventStore.cs | 2 +- .../MergeEvents/MergeEventDocument.cs | 2 +- .../MergeEvents/MergeEventRecord.cs | 2 +- .../MergeEvents/MergeEventStore.cs | 2 +- .../MergeEvents/MergeFieldDecision.cs | 2 +- .../EnsureDocumentExpiryIndexesMigration.cs | 2 +- .../EnsureGridFsExpiryIndexesMigration.cs | 2 +- .../Migrations/IMongoMigration.cs | 2 +- .../Migrations/MongoMigrationDocument.cs | 2 +- .../Migrations/MongoMigrationRunner.cs | 2 +- .../SemVerStyleBackfillMigration.cs | 6 +- .../MongoBootstrapper.cs | 4 +- .../MongoJobStore.cs | 4 +- .../MongoLeaseStore.cs | 4 +- .../MongoSourceStateRepository.cs | 2 +- .../MongoStorageDefaults.cs | 4 +- .../MongoStorageOptions.cs | 2 +- .../Properties/AssemblyInfo.cs | 3 + .../PsirtFlags/IPsirtFlagStore.cs | 2 +- .../PsirtFlags/PsirtFlagDocument.cs | 2 +- .../PsirtFlags/PsirtFlagRecord.cs | 2 +- .../PsirtFlags/PsirtFlagStore.cs | 2 +- .../RawDocumentRetentionService.cs | 6 +- .../ServiceCollectionExtensions.cs | 24 +-- .../SourceStateDocument.cs | 2 +- .../SourceStateRecord.cs | 2 +- .../SourceStateRepositoryExtensions.cs | 2 +- .../StellaOps.Concelier.Storage.Mongo.csproj} | 4 +- .../TASKS.md | 2 +- .../ConnectorTestHarness.cs | 12 +- .../MongoIntegrationFixture.cs | 4 +- .../StellaOps.Concelier.Testing.csproj} | 4 +- .../AssemblyInfo.cs | 0 .../MongoFixtureCollection.cs | 2 +- .../ConcelierOptionsPostConfigureTests.cs} | 22 +- .../PluginLoaderTests.cs | 2 +- ...tellaOps.Concelier.WebService.Tests.csproj | 13 ++ .../WebServiceEndpointsTests.cs | 162 +++++++------- .../AGENTS.md | 12 +- .../Diagnostics/HealthContracts.cs | 2 +- .../Diagnostics/JobMetrics.cs | 4 +- .../Diagnostics/ProblemTypes.cs | 2 +- .../Diagnostics/ServiceStatus.cs | 2 +- .../Extensions/ConfigurationExtensions.cs | 4 +- .../Extensions/JobRegistrationExtensions.cs | 98 +++++++++ .../Extensions/TelemetryExtensions.cs | 32 +-- .../Filters/JobAuthorizationAuditFilter.cs | 10 +- .../Jobs/JobDefinitionResponse.cs | 4 +- .../Jobs/JobRunResponse.cs | 4 +- .../Jobs/JobTriggerRequest.cs | 2 +- .../Options/ConcelierOptions.cs} | 4 +- .../Options/ConcelierOptionsPostConfigure.cs} | 10 +- .../Options/ConcelierOptionsValidator.cs} | 18 +- .../Program.cs | 98 ++++----- .../Properties/launchSettings.json | 2 +- .../StellaOps.Concelier.WebService.csproj} | 12 +- .../TASKS.md | 18 +- ...ps.Feedser.sln => StellaOps.Concelier.sln} | 122 +++++------ ...laOps.Excititor.Storage.Mongo.Tests.csproj | 2 +- ...ellaOps.Feedser.Exporter.Json.Tests.csproj | 13 -- ...aOps.Feedser.Exporter.TrivyDb.Tests.csproj | 13 -- .../StellaOps.Feedser.Merge.Tests.csproj | 13 -- .../StellaOps.Feedser.Merge.csproj | 18 -- ...StellaOps.Feedser.Source.Acsc.Tests.csproj | 19 -- .../StellaOps.Feedser.Source.Acsc.csproj | 18 -- .../Properties/AssemblyInfo.cs | 3 - .../StellaOps.Feedser.Source.Cccs.csproj | 16 -- .../FEEDCONN-CERTCC-02-012_HANDOFF.md | 20 -- .../Properties/AssemblyInfo.cs | 3 - ...ellaOps.Feedser.Source.CertFr.Tests.csproj | 16 -- .../StellaOps.Feedser.Source.CertFr.csproj | 13 -- ...ellaOps.Feedser.Source.CertIn.Tests.csproj | 16 -- .../StellaOps.Feedser.Source.CertIn.csproj | 16 -- .../Properties/AssemblyInfo.cs | 3 - .../StellaOps.Feedser.Source.Cve.Tests.csproj | 17 -- ....Feedser.Source.Distro.Debian.Tests.csproj | 13 -- .../AssemblyInfo.cs | 3 - ...llaOps.Feedser.Source.Distro.Debian.csproj | 17 -- ....Feedser.Source.Distro.RedHat.Tests.csproj | 18 -- .../Properties/AssemblyInfo.cs | 3 - ...llaOps.Feedser.Source.Distro.RedHat.csproj | 15 -- ...ps.Feedser.Source.Distro.Suse.Tests.csproj | 18 -- .../AssemblyInfo.cs | 3 - ...tellaOps.Feedser.Source.Distro.Suse.csproj | 17 -- ....Feedser.Source.Distro.Ubuntu.Tests.csproj | 18 -- ...llaOps.Feedser.Source.Distro.Ubuntu.csproj | 17 -- ...StellaOps.Feedser.Source.Ghsa.Tests.csproj | 17 -- .../StellaOps.Feedser.Source.Ghsa.csproj | 17 -- ...laOps.Feedser.Source.Ics.Cisa.Tests.csproj | 16 -- ....Feedser.Source.Ics.Kaspersky.Tests.csproj | 16 -- ...llaOps.Feedser.Source.Ics.Kaspersky.csproj | 16 -- .../StellaOps.Feedser.Source.Jvn.Tests.csproj | 16 -- .../StellaOps.Feedser.Source.Jvn.csproj | 15 -- .../StellaOps.Feedser.Source.Kev.Tests.csproj | 19 -- .../StellaOps.Feedser.Source.Kisa.csproj | 17 -- .../StellaOps.Feedser.Source.Nvd.Tests.csproj | 18 -- .../StellaOps.Feedser.Source.Nvd.csproj | 17 -- .../StellaOps.Feedser.Source.Osv.Tests.csproj | 18 -- .../StellaOps.Feedser.Source.Osv.csproj | 23 -- ...ellaOps.Feedser.Source.Ru.Bdu.Tests.csproj | 13 -- .../Properties/AssemblyInfo.cs | 3 - .../StellaOps.Feedser.Source.Ru.Bdu.csproj | 18 -- ...laOps.Feedser.Source.Ru.Nkcki.Tests.csproj | 13 -- .../Properties/AssemblyInfo.cs | 3 - .../StellaOps.Feedser.Source.Ru.Nkcki.csproj | 22 -- ...Ops.Feedser.Source.Vndr.Apple.Tests.csproj | 18 -- .../Properties/AssemblyInfo.cs | 3 - ...StellaOps.Feedser.Source.Vndr.Apple.csproj | 18 -- .../Properties/AssemblyInfo.cs | 3 - ...StellaOps.Feedser.Source.Vndr.Cisco.csproj | 16 -- ...ps.Feedser.Source.Vndr.Oracle.Tests.csproj | 17 -- .../Properties/AssemblyInfo.cs | 3 - ...tellaOps.Feedser.Source.Vndr.Oracle.csproj | 17 -- ...ps.Feedser.Source.Vndr.Vmware.Tests.csproj | 18 -- .../Properties/AssemblyInfo.cs | 3 - ...tellaOps.Feedser.Source.Vndr.Vmware.csproj | 23 -- ...ellaOps.Feedser.Storage.Mongo.Tests.csproj | 12 -- .../Properties/AssemblyInfo.cs | 3 - .../StellaOps.Feedser.WebService.Tests.csproj | 13 -- .../Extensions/JobRegistrationExtensions.cs | 98 --------- src/StellaOps.Plugin/PluginContracts.cs | 2 +- src/StellaOps.Web/AGENTS.md | 4 +- src/StellaOps.sln | 130 ++++++------ tools/FixtureUpdater/FixtureUpdater.csproj | 14 +- tools/FixtureUpdater/Program.cs | 24 +-- tools/SourceStateSeeder/Program.cs | 8 +- .../SourceStateSeeder.csproj | 4 +- tools/certbund_offline_snapshot.py | 8 +- 1208 files changed, 4370 insertions(+), 4370 deletions(-) rename .gitea/workflows/{_deprecated-feedser-ci.yml.disabled => _deprecated-concelier-ci.yml.disabled} (100%) rename .gitea/workflows/{_deprecated-feedser-tests.yml.disabled => _deprecated-concelier-tests.yml.disabled} (100%) rename docs/{10_FEEDSER_CLI_QUICKSTART.md => 10_CONCELIER_CLI_QUICKSTART.md} (83%) rename docs/{ARCHITECTURE_FEEDSER.md => ARCHITECTURE_CONCELIER.md} (86%) rename docs/{feedser-connector-research-20251011.md => concelier-connector-research-20251011.md} (80%) rename docs/ops/{feedser-apple-operations.md => concelier-apple-operations.md} (70%) rename docs/ops/{feedser-authority-audit-runbook.md => concelier-authority-audit-runbook.md} (58%) rename docs/ops/{feedser-cccs-operations.md => concelier-cccs-operations.md} (85%) rename docs/ops/{feedser-certbund-operations.md => concelier-certbund-operations.md} (89%) rename docs/ops/{feedser-cisco-operations.md => concelier-cisco-operations.md} (73%) rename docs/ops/{feedser-conflict-resolution.md => concelier-conflict-resolution.md} (52%) rename docs/ops/{feedser-cve-kev-grafana-dashboard.json => concelier-cve-kev-grafana-dashboard.json} (97%) rename docs/ops/{feedser-cve-kev-operations.md => concelier-cve-kev-operations.md} (76%) rename docs/ops/{feedser-ghsa-operations.md => concelier-ghsa-operations.md} (87%) rename docs/ops/{feedser-icscisa-operations.md => concelier-icscisa-operations.md} (77%) rename docs/ops/{feedser-kisa-operations.md => concelier-kisa-operations.md} (84%) rename docs/ops/{feedser-msrc-operations.md => concelier-msrc-operations.md} (84%) rename docs/ops/{feedser-nkcki-operations.md => concelier-nkcki-operations.md} (84%) rename docs/ops/{feedser-osv-operations.md => concelier-osv-operations.md} (94%) rename etc/{feedser.yaml.sample => concelier.yaml.sample} (77%) rename src/{StellaOps.Feedser.Core.Tests => StellaOps.Concelier.Core.Tests}/CanonicalMergerTests.cs (99%) rename src/{StellaOps.Feedser.Core.Tests => StellaOps.Concelier.Core.Tests}/JobCoordinatorTests.cs (97%) rename src/{StellaOps.Feedser.Core.Tests => StellaOps.Concelier.Core.Tests}/JobPluginRegistrationExtensionsTests.cs (90%) rename src/{StellaOps.Feedser.Core.Tests => StellaOps.Concelier.Core.Tests}/JobSchedulerBuilderTests.cs (94%) rename src/{StellaOps.Feedser.Core.Tests => StellaOps.Concelier.Core.Tests}/PluginRoutineFixtures.cs (90%) rename src/{StellaOps.Feedser.Core.Tests/StellaOps.Feedser.Core.Tests.csproj => StellaOps.Concelier.Core.Tests/StellaOps.Concelier.Core.Tests.csproj} (69%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/AGENTS.md (93%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/CanonicalMergeResult.cs (89%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/CanonicalMerger.cs (99%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/IJob.cs (71%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/IJobCoordinator.cs (93%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/IJobStore.cs (93%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/ILeaseStore.cs (89%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobCoordinator.cs (97%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobDefinition.cs (80%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobDiagnostics.cs (85%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobExecutionContext.cs (93%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobLease.cs (78%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobPluginRegistrationExtensions.cs (95%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobRunCompletion.cs (71%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobRunCreateRequest.cs (82%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobRunSnapshot.cs (90%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobRunStatus.cs (65%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobSchedulerBuilder.cs (93%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobSchedulerHostedService.cs (96%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobSchedulerOptions.cs (88%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/JobTriggerResult.cs (94%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/Jobs/ServiceCollectionExtensions.cs (93%) rename src/{StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj => StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj} (86%) rename src/{StellaOps.Feedser.Core => StellaOps.Concelier.Core}/TASKS.md (100%) rename src/{StellaOps.Feedser.Exporter.Json.Tests => StellaOps.Concelier.Exporter.Json.Tests}/JsonExportSnapshotBuilderTests.cs (93%) rename src/{StellaOps.Feedser.Exporter.Json.Tests => StellaOps.Concelier.Exporter.Json.Tests}/JsonExporterDependencyInjectionRoutineTests.cs (89%) rename src/{StellaOps.Feedser.Exporter.Json.Tests => StellaOps.Concelier.Exporter.Json.Tests}/JsonExporterParitySmokeTests.cs (93%) rename src/{StellaOps.Feedser.Exporter.Json.Tests => StellaOps.Concelier.Exporter.Json.Tests}/JsonFeedExporterTests.cs (95%) create mode 100644 src/StellaOps.Concelier.Exporter.Json.Tests/StellaOps.Concelier.Exporter.Json.Tests.csproj rename src/{StellaOps.Feedser.Exporter.Json.Tests => StellaOps.Concelier.Exporter.Json.Tests}/VulnListJsonExportPathResolverTests.cs (95%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/AGENTS.md (91%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/ExportDigestCalculator.cs (94%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/ExporterVersion.cs (91%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/IJsonExportPathResolver.cs (75%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportFile.cs (92%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportJob.cs (90%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportManifestWriter.cs (95%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportOptions.cs (93%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportResult.cs (93%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExportSnapshotBuilder.cs (96%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExporterDependencyInjectionRoutine.cs (87%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonExporterPlugin.cs (83%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/JsonFeedExporter.cs (95%) rename src/{StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj => StellaOps.Concelier.Exporter.Json/StellaOps.Concelier.Exporter.Json.csproj} (71%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/TASKS.md (91%) rename src/{StellaOps.Feedser.Exporter.Json => StellaOps.Concelier.Exporter.Json}/VulnListJsonExportPathResolver.cs (96%) create mode 100644 src/StellaOps.Concelier.Exporter.TrivyDb.Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj rename src/{StellaOps.Feedser.Exporter.TrivyDb.Tests => StellaOps.Concelier.Exporter.TrivyDb.Tests}/TrivyDbExportPlannerTests.cs (92%) rename src/{StellaOps.Feedser.Exporter.TrivyDb.Tests => StellaOps.Concelier.Exporter.TrivyDb.Tests}/TrivyDbFeedExporterTests.cs (99%) rename src/{StellaOps.Feedser.Exporter.TrivyDb.Tests => StellaOps.Concelier.Exporter.TrivyDb.Tests}/TrivyDbOciWriterTests.cs (98%) rename src/{StellaOps.Feedser.Exporter.TrivyDb.Tests => StellaOps.Concelier.Exporter.TrivyDb.Tests}/TrivyDbPackageBuilderTests.cs (96%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/AGENTS.md (89%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/ITrivyDbBuilder.cs (76%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/ITrivyDbOrasPusher.cs (81%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/OciDescriptor.cs (89%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/OciIndex.cs (84%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/OciManifest.cs (88%) rename src/{StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj => StellaOps.Concelier.Exporter.TrivyDb/StellaOps.Concelier.Exporter.TrivyDb.csproj} (72%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TASKS.md (93%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyConfigDocument.cs (90%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbBlob.cs (97%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbBoltBuilder.cs (99%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbBuilderResult.cs (81%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportJob.cs (97%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportMode.cs (57%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportOptions.cs (91%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportOverrides.cs (96%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportPlan.cs (77%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExportPlanner.cs (96%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExporterDependencyInjectionRoutine.cs (88%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbExporterPlugin.cs (85%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbFeedExporter.cs (96%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbMediaTypes.cs (88%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbOciWriteResult.cs (78%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbOciWriter.cs (99%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbOrasPusher.cs (99%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbPackage.cs (82%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbPackageBuilder.cs (98%) rename src/{StellaOps.Feedser.Exporter.TrivyDb => StellaOps.Concelier.Exporter.TrivyDb}/TrivyDbPackageRequest.cs (83%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/AdvisoryIdentityResolverTests.cs (96%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/AdvisoryMergeServiceTests.cs (96%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/AdvisoryPrecedenceMergerTests.cs (96%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/AffectedPackagePrecedenceResolverTests.cs (94%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/AliasGraphResolverTests.cs (93%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/CanonicalHashCalculatorTests.cs (93%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/DebianEvrComparerTests.cs (90%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/MergeEventWriterTests.cs (93%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/MergePrecedenceIntegrationTests.cs (94%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/MetricCollector.cs (93%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/NevraComparerTests.cs (93%) rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/SemanticVersionRangeResolverTests.cs (93%) create mode 100644 src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj rename src/{StellaOps.Feedser.Merge.Tests => StellaOps.Concelier.Merge.Tests}/TestLogger.cs (94%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/AGENTS.md (82%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Class1.cs (100%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Comparers/DebianEvr.cs (94%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Comparers/Nevra.cs (94%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Comparers/SemanticVersionRangeResolver.cs (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Identity/AdvisoryIdentityCluster.cs (96%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Identity/AdvisoryIdentityResolver.cs (99%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Identity/AliasIdentity.cs (92%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Jobs/MergeJobKinds.cs (66%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Jobs/MergeReconcileJob.cs (90%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/MergeServiceCollectionExtensions.cs (76%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Options/AdvisoryPrecedenceDefaults.cs (94%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Options/AdvisoryPrecedenceOptions.cs (88%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Options/AdvisoryPrecedenceTable.cs (91%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/RANGE_PRIMITIVES_COORDINATION.md (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/AdvisoryMergeService.cs (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/AdvisoryPrecedenceMerger.cs (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/AffectedPackagePrecedenceResolver.cs (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/AliasGraphResolver.cs (95%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/CanonicalHashCalculator.cs (85%) rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/Services/MergeEventWriter.cs (93%) create mode 100644 src/StellaOps.Concelier.Merge/StellaOps.Concelier.Merge.csproj rename src/{StellaOps.Feedser.Merge => StellaOps.Concelier.Merge}/TASKS.md (90%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/AdvisoryProvenanceTests.cs (95%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/AdvisoryTests.cs (97%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/AffectedPackageStatusTests.cs (97%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/AffectedVersionRangeExtensionsTests.cs (96%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/AliasSchemeRegistryTests.cs (93%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/CanonicalExampleFactory.cs (96%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/CanonicalExamplesTests.cs (93%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/CanonicalJsonSerializerTests.cs (96%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/EvrPrimitiveExtensionsTests.cs (94%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/Fixtures/ghsa-semver.json (100%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/Fixtures/kev-flag.json (100%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/Fixtures/nvd-basic.json (100%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/Fixtures/psirt-overlay.json (100%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/NevraPrimitiveExtensionsTests.cs (95%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/NormalizedVersionRuleTests.cs (97%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/OsvGhsaParityDiagnosticsTests.cs (94%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/OsvGhsaParityInspectorTests.cs (98%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/ProvenanceDiagnosticsTests.cs (90%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/RangePrimitivesTests.cs (93%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/SemVerPrimitiveTests.cs (98%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/SerializationDeterminismTests.cs (96%) rename src/{StellaOps.Feedser.Models.Tests => StellaOps.Concelier.Models.Tests}/SeverityNormalizationTests.cs (92%) rename src/{StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj => StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj} (79%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AGENTS.md (92%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/Advisory.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AdvisoryCredit.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AdvisoryProvenance.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AdvisoryReference.cs (93%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AdvisoryWeakness.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AffectedPackage.cs (97%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AffectedPackageStatus.cs (94%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AffectedPackageStatusCatalog.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AffectedVersionRange.cs (96%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AffectedVersionRangeExtensions.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AliasSchemeRegistry.cs (97%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/AliasSchemes.cs (93%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/BACKWARD_COMPATIBILITY.md (92%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/CANONICAL_RECORDS.md (97%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/CanonicalJsonSerializer.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/CvssMetric.cs (94%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/EvrPrimitiveExtensions.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/NevraPrimitiveExtensions.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/NormalizedVersionRule.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/OsvGhsaParityDiagnostics.cs (91%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/OsvGhsaParityInspector.cs (99%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/PROVENANCE_GUIDELINES.md (84%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/ProvenanceFieldMasks.cs (94%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/ProvenanceInspector.cs (96%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/RangePrimitives.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/SemVerPrimitiveExtensions.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/SeverityNormalization.cs (98%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/SnapshotSerializer.cs (93%) rename src/{StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj => StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj} (100%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/TASKS.md (100%) rename src/{StellaOps.Feedser.Models => StellaOps.Concelier.Models}/Validation.cs (94%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/CpeNormalizerTests.cs (92%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/CvssMetricNormalizerTests.cs (90%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/DebianEvrParserTests.cs (84%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/DescriptionNormalizerTests.cs (88%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/NevraParserTests.cs (91%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/PackageUrlNormalizerTests.cs (89%) rename src/{StellaOps.Feedser.Normalization.Tests => StellaOps.Concelier.Normalization.Tests}/SemVerRangeRuleBuilderTests.cs (98%) rename src/{StellaOps.Feedser.Normalization.Tests/StellaOps.Feedser.Normalization.Tests.csproj => StellaOps.Concelier.Normalization.Tests/StellaOps.Concelier.Normalization.Tests.csproj} (51%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/AssemblyInfo.cs (59%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Cvss/CvssMetricNormalizer.cs (96%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Distro/DebianEvr.cs (95%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Distro/Nevra.cs (95%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Identifiers/Cpe23.cs (96%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Identifiers/IdentifierNormalizer.cs (90%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Identifiers/PackageUrl.cs (95%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/SemVer/SemVerRangeRuleBuilder.cs (99%) rename src/{StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj => StellaOps.Concelier.Normalization/StellaOps.Concelier.Normalization.csproj} (81%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/TASKS.md (100%) rename src/{StellaOps.Feedser.Normalization => StellaOps.Concelier.Normalization}/Text/DescriptionNormalizer.cs (95%) rename src/{StellaOps.Feedser.Source.Acsc.Tests => StellaOps.Concelier.Source.Acsc.Tests}/Acsc/AcscConnectorFetchTests.cs (95%) rename src/{StellaOps.Feedser.Source.Acsc.Tests => StellaOps.Concelier.Source.Acsc.Tests}/Acsc/AcscConnectorParseTests.cs (96%) rename src/{StellaOps.Feedser.Source.Acsc.Tests => StellaOps.Concelier.Source.Acsc.Tests}/Acsc/AcscHttpClientConfigurationTests.cs (86%) rename src/{StellaOps.Feedser.Source.Acsc.Tests => StellaOps.Concelier.Source.Acsc.Tests}/Acsc/Fixtures/acsc-advisories-multi.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Acsc.Tests => StellaOps.Concelier.Source.Acsc.Tests}/Acsc/Fixtures/acsc-advisories.snapshot.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/AGENTS.md (84%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/AcscConnector.cs (98%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/AcscConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/AcscDependencyInjectionRoutine.cs (89%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/AcscServiceCollectionExtensions.cs (91%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Configuration/AcscFeedOptions.cs (96%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Configuration/AcscOptions.cs (97%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscDiagnostics.cs (96%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscDocumentMetadata.cs (86%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscDto.cs (97%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscFeedParser.cs (99%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Internal/AcscMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/Jobs.cs (95%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Acsc}/Properties/AssemblyInfo.cs (55%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/README.md (83%) create mode 100644 src/StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Acsc}/TASKS.md (81%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/CccsConnectorTests.cs (93%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Fixtures/cccs-feed-en.json (100%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Fixtures/cccs-raw-advisory-fr.json (100%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Fixtures/cccs-raw-advisory.json (100%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Fixtures/cccs-taxonomy-en.json (100%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Internal/CccsHtmlParserTests.cs (95%) rename src/{StellaOps.Feedser.Source.Cccs.Tests => StellaOps.Concelier.Source.Cccs.Tests}/Internal/CccsMapperTests.cs (86%) rename src/{StellaOps.Feedser.Source.CertCc.Tests/StellaOps.Feedser.Source.CertCc.Tests.csproj => StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj} (68%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/AGENTS.md (84%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/CccsConnector.cs (98%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/CccsConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/CccsDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/CccsServiceCollectionExtensions.cs (83%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Configuration/CccsOptions.cs (97%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsAdvisoryDto.cs (96%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsDiagnostics.cs (94%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsFeedClient.cs (97%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsFeedModels.cs (98%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsHtmlParser.cs (99%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsMapper.cs (97%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Internal/CccsRawAdvisoryDocument.cs (96%) rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/Jobs.cs (87%) create mode 100644 src/StellaOps.Concelier.Source.Cccs/Properties/AssemblyInfo.cs create mode 100644 src/StellaOps.Concelier.Source.Cccs/StellaOps.Concelier.Source.Cccs.csproj rename src/{StellaOps.Feedser.Source.Cccs => StellaOps.Concelier.Source.Cccs}/TASKS.md (83%) rename src/{StellaOps.Feedser.Source.CertBund.Tests => StellaOps.Concelier.Source.CertBund.Tests}/CertBundConnectorTests.cs (93%) rename src/{StellaOps.Feedser.Source.CertBund.Tests => StellaOps.Concelier.Source.CertBund.Tests}/Fixtures/certbund-detail.json (100%) rename src/{StellaOps.Feedser.Source.CertBund.Tests => StellaOps.Concelier.Source.CertBund.Tests}/Fixtures/certbund-feed.xml (100%) rename src/{StellaOps.Feedser.Source.CertBund.Tests/StellaOps.Feedser.Source.CertBund.Tests.csproj => StellaOps.Concelier.Source.CertBund.Tests/StellaOps.Concelier.Source.CertBund.Tests.csproj} (72%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/AGENTS.md (80%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/CertBundConnector.cs (97%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/CertBundConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/CertBundDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/CertBundServiceCollectionExtensions.cs (84%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Configuration/CertBundOptions.cs (96%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundAdvisoryDto.cs (97%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundCursor.cs (98%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundDetailParser.cs (96%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundDetailResponse.cs (96%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundDiagnostics.cs (98%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundDocumentMetadata.cs (93%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundFeedClient.cs (97%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundFeedItem.cs (77%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Internal/CertBundMapper.cs (97%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/Jobs.cs (87%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/README.md (94%) rename src/{StellaOps.Feedser.Source.CertBund/StellaOps.Feedser.Source.CertBund.csproj => StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj} (58%) rename src/{StellaOps.Feedser.Source.CertBund => StellaOps.Concelier.Source.CertBund}/TASKS.md (80%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/CertCc/CertCcConnectorFetchTests.cs (94%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/CertCc/CertCcConnectorSnapshotTests.cs (96%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/CertCc/CertCcConnectorTests.cs (97%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/certcc-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/certcc-documents.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/certcc-requests.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/certcc-state.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/summary-2025-09.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/summary-2025-10.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/summary-2025-11.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/summary-2025.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vendor-statuses-294418.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vendors-294418.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vu-257161.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vu-294418-vendors.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vu-294418-vuls.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vu-294418.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Fixtures/vulnerabilities-294418.json (100%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Internal/CertCcMapperTests.cs (94%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Internal/CertCcSummaryParserTests.cs (93%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Internal/CertCcSummaryPlannerTests.cs (93%) rename src/{StellaOps.Feedser.Source.CertCc.Tests => StellaOps.Concelier.Source.CertCc.Tests}/Internal/CertCcVendorStatementParserTests.cs (89%) rename src/{StellaOps.Feedser.Source.Cccs.Tests/StellaOps.Feedser.Source.Cccs.Tests.csproj => StellaOps.Concelier.Source.CertCc.Tests/StellaOps.Concelier.Source.CertCc.Tests.csproj} (67%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/AGENTS.md (84%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/CertCcConnector.cs (98%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/CertCcConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/CertCcDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/CertCcServiceCollectionExtensions.cs (82%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Configuration/CertCcOptions.cs (96%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/FEEDCONN-CERTCC-02-009_PLAN.md (74%) create mode 100644 src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcCursor.cs (98%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcDiagnostics.cs (98%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcMapper.cs (99%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcNoteDto.cs (97%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcNoteParser.cs (99%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcSummaryParser.cs (98%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcSummaryPlan.cs (78%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcSummaryPlanner.cs (95%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Internal/CertCcVendorStatementParser.cs (99%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/Jobs.cs (87%) create mode 100644 src/StellaOps.Concelier.Source.CertCc/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/README.md (90%) rename src/{StellaOps.Feedser.Source.CertCc/StellaOps.Feedser.Source.CertCc.csproj => StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj} (53%) rename src/{StellaOps.Feedser.Source.CertCc => StellaOps.Concelier.Source.CertCc}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.CertFr.Tests => StellaOps.Concelier.Source.CertFr.Tests}/CertFr/CertFrConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.CertFr.Tests => StellaOps.Concelier.Source.CertFr.Tests}/CertFr/Fixtures/certfr-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.CertFr.Tests => StellaOps.Concelier.Source.CertFr.Tests}/CertFr/Fixtures/certfr-detail-AV-2024-001.html (100%) rename src/{StellaOps.Feedser.Source.CertFr.Tests => StellaOps.Concelier.Source.CertFr.Tests}/CertFr/Fixtures/certfr-detail-AV-2024-002.html (100%) rename src/{StellaOps.Feedser.Source.CertFr.Tests => StellaOps.Concelier.Source.CertFr.Tests}/CertFr/Fixtures/certfr-feed.xml (100%) create mode 100644 src/StellaOps.Concelier.Source.CertFr.Tests/StellaOps.Concelier.Source.CertFr.Tests.csproj rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/AGENTS.md (81%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/CertFrConnector.cs (94%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/CertFrConnectorPlugin.cs (89%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/CertFrDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/CertFrServiceCollectionExtensions.cs (79%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Configuration/CertFrOptions.cs (92%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrCursor.cs (95%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrDocumentMetadata.cs (93%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrDto.cs (89%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrFeedClient.cs (94%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrFeedItem.cs (72%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrMapper.cs (96%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Internal/CertFrParser.cs (95%) rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/Jobs.cs (92%) create mode 100644 src/StellaOps.Concelier.Source.CertFr/StellaOps.Concelier.Source.CertFr.csproj rename src/{StellaOps.Feedser.Source.CertFr => StellaOps.Concelier.Source.CertFr}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.CertIn.Tests => StellaOps.Concelier.Source.CertIn.Tests}/CertIn/CertInConnectorTests.cs (93%) rename src/{StellaOps.Feedser.Source.CertIn.Tests => StellaOps.Concelier.Source.CertIn.Tests}/CertIn/Fixtures/alerts-page1.json (100%) rename src/{StellaOps.Feedser.Source.CertIn.Tests => StellaOps.Concelier.Source.CertIn.Tests}/CertIn/Fixtures/detail-CIAD-2024-0005.html (100%) rename src/{StellaOps.Feedser.Source.CertIn.Tests => StellaOps.Concelier.Source.CertIn.Tests}/CertIn/Fixtures/expected-advisory.json (100%) create mode 100644 src/StellaOps.Concelier.Source.CertIn.Tests/StellaOps.Concelier.Source.CertIn.Tests.csproj rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/AGENTS.md (83%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/CertInConnector.cs (95%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/CertInConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/CertInDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/CertInServiceCollectionExtensions.cs (79%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Configuration/CertInOptions.cs (94%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Internal/CertInAdvisoryDto.cs (83%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Internal/CertInClient.cs (94%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Internal/CertInCursor.cs (95%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Internal/CertInDetailParser.cs (96%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Internal/CertInListingItem.cs (72%) rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/Jobs.cs (92%) create mode 100644 src/StellaOps.Concelier.Source.CertIn/StellaOps.Concelier.Source.CertIn.csproj rename src/{StellaOps.Feedser.Source.CertIn => StellaOps.Concelier.Source.CertIn}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/CannedHttpMessageHandlerTests.cs (91%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/HtmlContentSanitizerTests.cs (93%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/PackageCoordinateHelperTests.cs (90%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/PdfTextExtractorTests.cs (91%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/SourceFetchServiceTests.cs (89%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/SourceHttpClientBuilderTests.cs (89%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/TimeWindowCursorPlannerTests.cs (93%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Common/UrlNormalizerTests.cs (84%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Json/JsonSchemaValidatorTests.cs (91%) rename src/{StellaOps.Feedser.Source.Common.Tests/StellaOps.Feedser.Source.Common.Tests.csproj => StellaOps.Concelier.Source.Common.Tests/StellaOps.Concelier.Source.Common.Tests.csproj} (65%) rename src/{StellaOps.Feedser.Source.Common.Tests => StellaOps.Concelier.Source.Common.Tests}/Xml/XmlSchemaValidatorTests.cs (71%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/AGENTS.md (83%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Cursors/PaginationPlanner.cs (91%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Cursors/TimeWindowCursorOptions.cs (92%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Cursors/TimeWindowCursorPlanner.cs (92%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Cursors/TimeWindowCursorState.cs (94%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/DocumentStatuses.cs (91%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/CryptoJitterSource.cs (93%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/IJitterSource.cs (76%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/RawDocumentStorage.cs (94%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/SourceFetchContentResult.cs (96%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/SourceFetchRequest.cs (89%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/SourceFetchResult.cs (87%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/SourceFetchService.cs (96%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Fetch/SourceRetryPolicy.cs (98%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Html/HtmlContentSanitizer.cs (95%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Http/AllowlistedHttpMessageHandler.cs (93%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Http/ServiceCollectionExtensions.cs (98%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Http/SourceHttpClientConfigurationBinder.cs (95%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Http/SourceHttpClientOptions.cs (97%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Json/IJsonSchemaValidator.cs (74%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Json/JsonSchemaValidationError.cs (71%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Json/JsonSchemaValidationException.cs (88%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Json/JsonSchemaValidator.cs (95%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Packages/PackageCoordinateHelper.cs (96%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Pdf/PdfTextExtractor.cs (97%) create mode 100644 src/StellaOps.Concelier.Source.Common/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj => StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj} (77%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/TASKS.md (92%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Telemetry/SourceDiagnostics.cs (79%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Testing/CannedHttpMessageHandler.cs (96%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Url/UrlNormalizer.cs (94%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Xml/IXmlSchemaValidator.cs (75%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Xml/XmlSchemaValidationError.cs (61%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Xml/XmlSchemaValidationException.cs (88%) rename src/{StellaOps.Feedser.Source.Common => StellaOps.Concelier.Source.Common}/Xml/XmlSchemaValidator.cs (94%) rename src/{StellaOps.Feedser.Source.Cve.Tests => StellaOps.Concelier.Source.Cve.Tests}/Cve/CveConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.Cve.Tests => StellaOps.Concelier.Source.Cve.Tests}/Fixtures/cve-CVE-2024-0001.json (100%) rename src/{StellaOps.Feedser.Source.Cve.Tests => StellaOps.Concelier.Source.Cve.Tests}/Fixtures/cve-list.json (100%) rename src/{StellaOps.Feedser.Source.Cve.Tests => StellaOps.Concelier.Source.Cve.Tests}/Fixtures/expected-CVE-2024-0001.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/AGENTS.md (88%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Configuration/CveOptions.cs (98%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/CveConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/CveConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/CveDependencyInjectionRoutine.cs (88%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/CveServiceCollectionExtensions.cs (85%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveDiagnostics.cs (96%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveListParser.cs (99%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveRecordDto.cs (98%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Internal/CveRecordParser.cs (99%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/Jobs.cs (94%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc/StellaOps.Feedser.Source.Vndr.Msrc.csproj => StellaOps.Concelier.Source.Cve/StellaOps.Concelier.Source.Cve.csproj} (58%) rename src/{StellaOps.Feedser.Source.Cve => StellaOps.Concelier.Source.Cve}/TASKS.md (80%) rename src/{StellaOps.Feedser.Source.Distro.Debian.Tests => StellaOps.Concelier.Source.Distro.Debian.Tests}/DebianConnectorTests.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Debian.Tests => StellaOps.Concelier.Source.Distro.Debian.Tests}/DebianMapperTests.cs (92%) rename src/{StellaOps.Feedser.Source.Distro.Debian.Tests => StellaOps.Concelier.Source.Distro.Debian.Tests}/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-123.html (100%) rename src/{StellaOps.Feedser.Source.Distro.Debian.Tests => StellaOps.Concelier.Source.Distro.Debian.Tests}/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-124.html (100%) rename src/{StellaOps.Feedser.Source.Distro.Debian.Tests => StellaOps.Concelier.Source.Distro.Debian.Tests}/Source/Distro/Debian/Fixtures/debian-list.txt (100%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Debian.Tests/StellaOps.Concelier.Source.Distro.Debian.Tests.csproj create mode 100644 src/StellaOps.Concelier.Source.Distro.Debian/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Configuration/DebianOptions.cs (90%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/DebianConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/DebianConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/DebianDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/DebianServiceCollectionExtensions.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianAdvisoryDto.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianDetailMetadata.cs (77%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianFetchCacheEntry.cs (85%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianHtmlParser.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianListEntry.cs (75%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianListParser.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Internal/DebianMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Debian => StellaOps.Concelier.Source.Distro.Debian}/Jobs.cs (91%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Debian/StellaOps.Concelier.Source.Distro.Debian.csproj rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/csaf-rhsa-2025-0001.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/csaf-rhsa-2025-0002.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/csaf-rhsa-2025-0003.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/rhsa-2025-0001.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/rhsa-2025-0002.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/rhsa-2025-0003.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/summary-page1-repeat.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/summary-page1.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/summary-page2.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/Fixtures/summary-page3.json (100%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/RedHatConnectorHarnessTests.cs (91%) rename src/{StellaOps.Feedser.Source.Distro.RedHat.Tests => StellaOps.Concelier.Source.Distro.RedHat.Tests}/RedHat/RedHatConnectorTests.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Distro.RedHat.Tests/StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/AGENTS.md (81%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/CONFLICT_RESOLVER_NOTES.md (84%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Configuration/RedHatOptions.cs (93%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Internal/Models/RedHatCsafModels.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Internal/RedHatCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Internal/RedHatMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Internal/RedHatSummaryItem.cs (93%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/Jobs.cs (91%) create mode 100644 src/StellaOps.Concelier.Source.Distro.RedHat/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/RedHatConnector.cs (94%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/RedHatConnectorPlugin.cs (87%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/RedHatDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/RedHatServiceCollectionExtensions.cs (85%) create mode 100644 src/StellaOps.Concelier.Source.Distro.RedHat/StellaOps.Concelier.Source.Distro.RedHat.csproj rename src/{StellaOps.Feedser.Source.Distro.RedHat => StellaOps.Concelier.Source.Distro.RedHat}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/Source/Distro/Suse/Fixtures/suse-changes.csv (100%) rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/Source/Distro/Suse/Fixtures/suse-su-2025_0001-1.json (100%) rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/Source/Distro/Suse/Fixtures/suse-su-2025_0002-1.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Suse.Tests/StellaOps.Concelier.Source.Distro.Suse.Tests.csproj rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/SuseConnectorTests.cs (90%) rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/SuseCsafParserTests.cs (91%) rename src/{StellaOps.Feedser.Source.Distro.Suse.Tests => StellaOps.Concelier.Source.Distro.Suse.Tests}/SuseMapperTests.cs (88%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Suse/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Configuration/SuseOptions.cs (90%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseAdvisoryDto.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseChangeRecord.cs (61%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseChangesParser.cs (93%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseCsafParser.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseFetchCacheEntry.cs (85%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Internal/SuseMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/Jobs.cs (91%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Suse/StellaOps.Concelier.Source.Distro.Suse.csproj rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/SuseConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/SuseConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/SuseDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Distro.Suse => StellaOps.Concelier.Source.Distro.Suse}/SuseServiceCollectionExtensions.cs (87%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu.Tests => StellaOps.Concelier.Source.Distro.Ubuntu.Tests}/Fixtures/ubuntu-notices-page0.json (100%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu.Tests => StellaOps.Concelier.Source.Distro.Ubuntu.Tests}/Fixtures/ubuntu-notices-page1.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/StellaOps.Concelier.Source.Distro.Ubuntu.Tests.csproj rename src/{StellaOps.Feedser.Source.Distro.Ubuntu.Tests => StellaOps.Concelier.Source.Distro.Ubuntu.Tests}/UbuntuConnectorTests.cs (91%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Configuration/UbuntuOptions.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Internal/UbuntuCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Internal/UbuntuFetchCacheEntry.cs (85%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Internal/UbuntuMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Internal/UbuntuNoticeDto.cs (86%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Internal/UbuntuNoticeParser.cs (96%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/Jobs.cs (91%) create mode 100644 src/StellaOps.Concelier.Source.Distro.Ubuntu/StellaOps.Concelier.Source.Distro.Ubuntu.csproj rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/UbuntuConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/UbuntuConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/UbuntuDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Distro.Ubuntu => StellaOps.Concelier.Source.Distro.Ubuntu}/UbuntuServiceCollectionExtensions.cs (87%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/conflict-ghsa.canonical.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/credit-parity.ghsa.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/credit-parity.nvd.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/credit-parity.osv.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/expected-GHSA-xxxx-yyyy-zzzz.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Fixtures/ghsa-list.json (100%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaConflictFixtureTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaConnectorTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaCreditParityRegressionTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaDependencyInjectionRoutineTests.cs (84%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaDiagnosticsTests.cs (88%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaMapperTests.cs (92%) rename src/{StellaOps.Feedser.Source.Ghsa.Tests => StellaOps.Concelier.Source.Ghsa.Tests}/Ghsa/GhsaRateLimitParserTests.cs (95%) create mode 100644 src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/AGENTS.md (89%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Configuration/GhsaOptions.cs (97%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/GhsaConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/GhsaConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/GhsaDependencyInjectionRoutine.cs (89%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/GhsaServiceCollectionExtensions.cs (83%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaDiagnostics.cs (98%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaListParser.cs (98%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaRateLimitParser.cs (98%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaRateLimitSnapshot.cs (90%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaRecordDto.cs (97%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Internal/GhsaRecordParser.cs (99%) rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/Jobs.cs (94%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Ghsa}/Properties/AssemblyInfo.cs (55%) create mode 100644 src/StellaOps.Concelier.Source.Ghsa/StellaOps.Concelier.Source.Ghsa.csproj rename src/{StellaOps.Feedser.Source.Ghsa => StellaOps.Concelier.Source.Ghsa}/TASKS.md (91%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisa/Fixtures/icsa-25-123-01.html (100%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisa/Fixtures/icsma-25-045-01.html (100%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisa/Fixtures/sample-feed.xml (100%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisa/IcsCisaConnectorMappingTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisa/IcsCisaFeedParserTests.cs (93%) rename src/{StellaOps.Feedser.Source.Ics.Cisa.Tests => StellaOps.Concelier.Source.Ics.Cisa.Tests}/IcsCisaConnectorTests.cs (95%) create mode 100644 src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/AGENTS.md (87%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Configuration/IcsCisaOptions.cs (98%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/HANDOVER.md (73%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/IcsCisaConnector.cs (98%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/IcsCisaConnectorPlugin.cs (91%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/IcsCisaDependencyInjectionRoutine.cs (88%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/IcsCisaServiceCollectionExtensions.cs (88%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaAdvisoryDto.cs (96%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaAttachmentDto.cs (80%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaDiagnostics.cs (94%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaFeedDto.cs (88%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Internal/IcsCisaFeedParser.cs (99%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/Jobs.cs (94%) rename src/{StellaOps.Feedser.Source.Ics.Cisa/StellaOps.Feedser.Source.Ics.Cisa.csproj => StellaOps.Concelier.Source.Ics.Cisa/StellaOps.Concelier.Source.Ics.Cisa.csproj} (53%) rename src/{StellaOps.Feedser.Source.Ics.Cisa => StellaOps.Concelier.Source.Ics.Cisa}/TASKS.md (86%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky.Tests => StellaOps.Concelier.Source.Ics.Kaspersky.Tests}/Kaspersky/Fixtures/detail-acme-controller-2024.html (100%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky.Tests => StellaOps.Concelier.Source.Ics.Kaspersky.Tests}/Kaspersky/Fixtures/expected-advisory.json (100%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky.Tests => StellaOps.Concelier.Source.Ics.Kaspersky.Tests}/Kaspersky/Fixtures/feed-page1.xml (100%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky.Tests => StellaOps.Concelier.Source.Ics.Kaspersky.Tests}/Kaspersky/KasperskyConnectorTests.cs (93%) create mode 100644 src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/AGENTS.md (82%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Configuration/KasperskyOptions.cs (92%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Internal/KasperskyAdvisoryDto.cs (80%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Internal/KasperskyAdvisoryParser.cs (96%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Internal/KasperskyCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Internal/KasperskyFeedClient.cs (95%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Internal/KasperskyFeedItem.cs (66%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/Jobs.cs (91%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/KasperskyConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/KasperskyConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/KasperskyDependencyInjectionRoutine.cs (84%) rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/KasperskyServiceCollectionExtensions.cs (78%) create mode 100644 src/StellaOps.Concelier.Source.Ics.Kaspersky/StellaOps.Concelier.Source.Ics.Kaspersky.csproj rename src/{StellaOps.Feedser.Source.Ics.Kaspersky => StellaOps.Concelier.Source.Ics.Kaspersky}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Jvn.Tests => StellaOps.Concelier.Source.Jvn.Tests}/Jvn/Fixtures/expected-advisory.json (100%) rename src/{StellaOps.Feedser.Source.Jvn.Tests => StellaOps.Concelier.Source.Jvn.Tests}/Jvn/Fixtures/jvnrss-window1.xml (100%) rename src/{StellaOps.Feedser.Source.Jvn.Tests => StellaOps.Concelier.Source.Jvn.Tests}/Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml (100%) rename src/{StellaOps.Feedser.Source.Jvn.Tests => StellaOps.Concelier.Source.Jvn.Tests}/Jvn/JvnConnectorTests.cs (92%) create mode 100644 src/StellaOps.Concelier.Source.Jvn.Tests/StellaOps.Concelier.Source.Jvn.Tests.csproj rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/AGENTS.md (82%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Configuration/JvnOptions.cs (95%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnAdvisoryMapper.cs (94%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnConstants.cs (84%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnCursor.cs (95%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnDetailDto.cs (93%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnDetailParser.cs (96%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnOverviewItem.cs (75%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnOverviewPage.cs (72%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnSchemaProvider.cs (95%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/JvnSchemaValidationException.cs (82%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Internal/MyJvnClient.cs (96%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Jobs.cs (92%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/JvnConnector.cs (94%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/JvnConnectorPlugin.cs (89%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/JvnDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/JvnServiceCollectionExtensions.cs (79%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/data_marking.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/jvnrss_3.2.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/mod_sec_3.0.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/status_3.3.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/tlp_marking.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/vuldef_3.2.xsd (100%) rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/Schemas/xml.xsd (100%) create mode 100644 src/StellaOps.Concelier.Source.Jvn/StellaOps.Concelier.Source.Jvn.csproj rename src/{StellaOps.Feedser.Source.Jvn => StellaOps.Concelier.Source.Jvn}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Kev.Tests => StellaOps.Concelier.Source.Kev.Tests}/Kev/Fixtures/kev-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Kev.Tests => StellaOps.Concelier.Source.Kev.Tests}/Kev/Fixtures/kev-catalog.json (100%) rename src/{StellaOps.Feedser.Source.Kev.Tests => StellaOps.Concelier.Source.Kev.Tests}/Kev/KevConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.Kev.Tests => StellaOps.Concelier.Source.Kev.Tests}/Kev/KevMapperTests.cs (95%) create mode 100644 src/StellaOps.Concelier.Source.Kev.Tests/StellaOps.Concelier.Source.Kev.Tests.csproj rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/AGENTS.md (90%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Configuration/KevOptions.cs (94%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Internal/KevCatalogDto.cs (96%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Internal/KevCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Internal/KevDiagnostics.cs (97%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Internal/KevMapper.cs (99%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Internal/KevSchemaProvider.cs (83%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Jobs.cs (94%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/KevConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/KevConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/KevDependencyInjectionRoutine.cs (88%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/KevServiceCollectionExtensions.cs (82%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/Schemas/kev-catalog.schema.json (100%) rename src/{StellaOps.Feedser.Source.Kev/StellaOps.Feedser.Source.Kev.csproj => StellaOps.Concelier.Source.Kev/StellaOps.Concelier.Source.Kev.csproj} (57%) rename src/{StellaOps.Feedser.Source.Kev => StellaOps.Concelier.Source.Kev}/TASKS.md (86%) rename src/{StellaOps.Feedser.Source.Kisa.Tests => StellaOps.Concelier.Source.Kisa.Tests}/Fixtures/kisa-detail.json (100%) rename src/{StellaOps.Feedser.Source.Kisa.Tests => StellaOps.Concelier.Source.Kisa.Tests}/Fixtures/kisa-feed.xml (100%) rename src/{StellaOps.Feedser.Source.Kisa.Tests => StellaOps.Concelier.Source.Kisa.Tests}/KisaConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj => StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj} (56%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/AGENTS.md (84%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Configuration/KisaOptions.cs (96%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaDetailParser.cs (97%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaDetailResponse.cs (96%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaDiagnostics.cs (98%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaDocumentMetadata.cs (93%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaFeedClient.cs (97%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaFeedItem.cs (78%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Internal/KisaMapper.cs (97%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/Jobs.cs (87%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/KisaConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/KisaConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/KisaDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/KisaServiceCollectionExtensions.cs (84%) create mode 100644 src/StellaOps.Concelier.Source.Kisa/StellaOps.Concelier.Source.Kisa.csproj rename src/{StellaOps.Feedser.Source.Kisa => StellaOps.Concelier.Source.Kisa}/TASKS.md (86%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/conflict-nvd.canonical.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/credit-parity.ghsa.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/credit-parity.nvd.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/credit-parity.osv.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-invalid-schema.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-multipage-1.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-multipage-2.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-multipage-3.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-window-1.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-window-2.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/Fixtures/nvd-window-update.json (100%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/NvdConflictFixtureTests.cs (95%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/NvdConnectorHarnessTests.cs (90%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/NvdConnectorTests.cs (95%) rename src/{StellaOps.Feedser.Source.Nvd.Tests => StellaOps.Concelier.Source.Nvd.Tests}/Nvd/NvdMergeExportParityTests.cs (96%) create mode 100644 src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/AGENTS.md (73%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Configuration/NvdOptions.cs (94%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Internal/NvdCursor.cs (92%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Internal/NvdDiagnostics.cs (93%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Internal/NvdMapper.cs (97%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Internal/NvdSchemaProvider.cs (80%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/NvdConnector.cs (94%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/NvdConnectorPlugin.cs (89%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/NvdServiceCollectionExtensions.cs (79%) rename src/{StellaOps.Feedser.Source.Acsc => StellaOps.Concelier.Source.Nvd}/Properties/AssemblyInfo.cs (55%) rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/Schemas/nvd-vulnerability.schema.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Nvd/StellaOps.Concelier.Source.Nvd.csproj rename src/{StellaOps.Feedser.Source.Nvd => StellaOps.Concelier.Source.Nvd}/TASKS.md (94%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/conflict-osv.canonical.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-ghsa.ghsa.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-ghsa.osv.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-ghsa.raw-ghsa.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-ghsa.raw-osv.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-npm.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Fixtures/osv-pypi.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Osv/OsvConflictFixtureTests.cs (95%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Osv/OsvGhsaParityRegressionTests.cs (97%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Osv/OsvMapperTests.cs (95%) rename src/{StellaOps.Feedser.Source.Osv.Tests => StellaOps.Concelier.Source.Osv.Tests}/Osv/OsvSnapshotTests.cs (92%) create mode 100644 src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/AGENTS.md (76%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Configuration/OsvOptions.cs (95%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Internal/OsvCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Internal/OsvDiagnostics.cs (90%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Internal/OsvMapper.cs (97%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Internal/OsvVulnerabilityDto.cs (95%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Jobs.cs (92%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/OsvConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/OsvConnectorPlugin.cs (89%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/OsvDependencyInjectionRoutine.cs (87%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/OsvServiceCollectionExtensions.cs (82%) rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/Properties/AssemblyInfo.cs (100%) create mode 100644 src/StellaOps.Concelier.Source.Osv/StellaOps.Concelier.Source.Osv.csproj rename src/{StellaOps.Feedser.Source.Osv => StellaOps.Concelier.Source.Osv}/TASKS.md (90%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/export-sample.xml (100%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/ru-bdu-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/ru-bdu-documents.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/ru-bdu-dtos.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/ru-bdu-requests.snapshot.json (77%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/Fixtures/ru-bdu-state.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/RuBduConnectorSnapshotTests.cs (96%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/RuBduMapperTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ru.Bdu.Tests => StellaOps.Concelier.Source.Ru.Bdu.Tests}/RuBduXmlParserTests.cs (97%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Bdu.Tests/StellaOps.Concelier.Source.Ru.Bdu.Tests.csproj rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/AGENTS.md (88%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Configuration/RuBduOptions.cs (95%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Internal/RuBduCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Internal/RuBduDiagnostics.cs (97%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Internal/RuBduMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Internal/RuBduVulnerabilityDto.cs (96%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Internal/RuBduXmlParser.cs (99%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/Jobs.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Bdu/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/README.md (81%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/RuBduConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/RuBduConnectorPlugin.cs (91%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/RuBduDependencyInjectionRoutine.cs (88%) rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/RuBduServiceCollectionExtensions.cs (89%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Bdu/StellaOps.Concelier.Source.Ru.Bdu.csproj rename src/{StellaOps.Feedser.Source.Ru.Bdu => StellaOps.Concelier.Source.Ru.Bdu}/TASKS.md (84%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/Fixtures/bulletin-legacy.json.zip (100%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/Fixtures/bulletin-sample.json.zip (100%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/Fixtures/listing-page2.html (100%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/Fixtures/listing.html (100%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/Fixtures/nkcki-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/RuNkckiConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/RuNkckiJsonParserTests.cs (95%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki.Tests => StellaOps.Concelier.Source.Ru.Nkcki.Tests}/RuNkckiMapperTests.cs (93%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/AGENTS.md (83%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Configuration/RuNkckiOptions.cs (96%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Internal/RuNkckiCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Internal/RuNkckiDiagnostics.cs (97%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Internal/RuNkckiJsonParser.cs (99%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Internal/RuNkckiMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Internal/RuNkckiVulnerabilityDto.cs (95%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/Jobs.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Nkcki/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/RuNkckiConnector.cs (98%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/RuNkckiConnectorPlugin.cs (91%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/RuNkckiDependencyInjectionRoutine.cs (87%) rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/RuNkckiServiceCollectionExtensions.cs (89%) create mode 100644 src/StellaOps.Concelier.Source.Ru.Nkcki/StellaOps.Concelier.Source.Ru.Nkcki.csproj rename src/{StellaOps.Feedser.Source.Ru.Nkcki => StellaOps.Concelier.Source.Ru.Nkcki}/TASKS.md (88%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests => StellaOps.Concelier.Source.Vndr.Adobe.Tests}/Adobe/AdobeConnectorFetchTests.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests => StellaOps.Concelier.Source.Vndr.Adobe.Tests}/Adobe/Fixtures/adobe-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests => StellaOps.Concelier.Source.Vndr.Adobe.Tests}/Adobe/Fixtures/adobe-detail-apsb25-85.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests => StellaOps.Concelier.Source.Vndr.Adobe.Tests}/Adobe/Fixtures/adobe-detail-apsb25-87.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests => StellaOps.Concelier.Source.Vndr.Adobe.Tests}/Adobe/Fixtures/adobe-index.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe.Tests/StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj => StellaOps.Concelier.Source.Vndr.Adobe.Tests/StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj} (53%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/AGENTS.md (81%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/AdobeConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/AdobeConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/AdobeDiagnostics.cs (90%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/AdobeServiceCollectionExtensions.cs (83%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Configuration/AdobeOptions.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeBulletinDto.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeCursor.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeDetailParser.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeDocumentMetadata.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeIndexEntry.cs (68%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeIndexParser.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Internal/AdobeSchemaProvider.cs (79%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/Schemas/adobe-bulletin.schema.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe/StellaOps.Feedser.Source.Vndr.Adobe.csproj => StellaOps.Concelier.Source.Vndr.Adobe/StellaOps.Concelier.Source.Vndr.Adobe.csproj} (59%) rename src/{StellaOps.Feedser.Source.Vndr.Adobe => StellaOps.Concelier.Source.Vndr.Adobe}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/AppleConnectorTests.cs (94%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/AppleFixtureManager.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/AppleLiveRegressionTests.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/106355.expected.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/106355.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/125326.expected.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/125326.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/125328.expected.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/125328.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/HT214108.expected.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/HT215500.expected.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/ht214108.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/ht215500.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Apple.Tests => StellaOps.Concelier.Source.Vndr.Apple.Tests}/Apple/Fixtures/index.json (100%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/AGENTS.md (87%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/AppleConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/AppleDependencyInjectionRoutine.cs (90%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/AppleOptions.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/AppleServiceCollectionExtensions.cs (86%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleDetailDto.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleDetailParser.cs (99%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleDiagnostics.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleIndexEntry.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Internal/AppleMapper.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/Jobs.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Apple/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/README.md (90%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Apple/StellaOps.Concelier.Source.Vndr.Apple.csproj rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/TASKS.md (92%) rename src/{StellaOps.Feedser.Source.Vndr.Apple => StellaOps.Concelier.Source.Vndr.Apple}/VndrAppleConnectorPlugin.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests => StellaOps.Concelier.Source.Vndr.Chromium.Tests}/Chromium/ChromiumConnectorTests.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests => StellaOps.Concelier.Source.Vndr.Chromium.Tests}/Chromium/ChromiumMapperTests.cs (87%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests => StellaOps.Concelier.Source.Vndr.Chromium.Tests}/Chromium/Fixtures/chromium-advisory.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests => StellaOps.Concelier.Source.Vndr.Chromium.Tests}/Chromium/Fixtures/chromium-detail.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests => StellaOps.Concelier.Source.Vndr.Chromium.Tests}/Chromium/Fixtures/chromium-feed.xml (100%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium.Tests/StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj => StellaOps.Concelier.Source.Vndr.Chromium.Tests/StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj} (51%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/AGENTS.md (81%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/ChromiumConnector.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/ChromiumConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/ChromiumDiagnostics.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/ChromiumServiceCollectionExtensions.cs (79%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Configuration/ChromiumOptions.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumDocumentMetadata.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumDto.cs (94%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumFeedEntry.cs (89%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumFeedLoader.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumParser.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Internal/ChromiumSchemaProvider.cs (78%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Chromium/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/Schemas/chromium-post.schema.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium/StellaOps.Feedser.Source.Vndr.Chromium.csproj => StellaOps.Concelier.Source.Vndr.Chromium/StellaOps.Concelier.Source.Vndr.Chromium.csproj} (62%) rename src/{StellaOps.Feedser.Source.Vndr.Chromium => StellaOps.Concelier.Source.Vndr.Chromium}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco.Tests => StellaOps.Concelier.Source.Vndr.Cisco.Tests}/CiscoDtoFactoryTests.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco.Tests => StellaOps.Concelier.Source.Vndr.Cisco.Tests}/CiscoMapperTests.cs (90%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco.Tests/StellaOps.Feedser.Source.Vndr.Cisco.Tests.csproj => StellaOps.Concelier.Source.Vndr.Cisco.Tests/StellaOps.Concelier.Source.Vndr.Cisco.Tests.csproj} (50%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/AGENTS.md (85%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/CiscoConnector.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/CiscoDependencyInjectionRoutine.cs (90%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/CiscoServiceCollectionExtensions.cs (88%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Configuration/CiscoOptions.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoAccessTokenProvider.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoAdvisoryDto.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoCsafClient.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoCsafData.cs (83%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoCsafParser.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoDiagnostics.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoDtoFactory.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoMapper.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoOAuthMessageHandler.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoOpenVulnClient.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Internal/CiscoRawAdvisory.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/Jobs.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Cisco/StellaOps.Concelier.Source.Vndr.Cisco.csproj rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/TASKS.md (80%) rename src/{StellaOps.Feedser.Source.Vndr.Cisco => StellaOps.Concelier.Source.Vndr.Cisco}/VndrCiscoConnectorPlugin.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc.Tests => StellaOps.Concelier.Source.Vndr.Msrc.Tests}/Fixtures/msrc-detail.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc.Tests => StellaOps.Concelier.Source.Vndr.Msrc.Tests}/Fixtures/msrc-summary.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc.Tests => StellaOps.Concelier.Source.Vndr.Msrc.Tests}/MsrcConnectorTests.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc.Tests/StellaOps.Feedser.Source.Vndr.Msrc.Tests.csproj => StellaOps.Concelier.Source.Vndr.Msrc.Tests/StellaOps.Concelier.Source.Vndr.Msrc.Tests.csproj} (51%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/AGENTS.md (88%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Configuration/MsrcOptions.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcAdvisoryDto.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcApiClient.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcCursor.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcDetailDto.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcDetailParser.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcDiagnostics.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcDocumentMetadata.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcMapper.cs (98%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcSummaryResponse.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Internal/MsrcTokenProvider.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/Jobs.cs (86%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/MsrcConnector.cs (97%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/MsrcConnectorPlugin.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/MsrcDependencyInjectionRoutine.cs (85%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/MsrcServiceCollectionExtensions.cs (90%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/README.md (96%) rename src/{StellaOps.Feedser.Source.Cve/StellaOps.Feedser.Source.Cve.csproj => StellaOps.Concelier.Source.Vndr.Msrc/StellaOps.Concelier.Source.Vndr.Msrc.csproj} (58%) rename src/{StellaOps.Feedser.Source.Vndr.Msrc => StellaOps.Concelier.Source.Vndr.Msrc}/TASKS.md (79%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-calendar-cpuapr2024-single.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-calendar-cpuapr2024.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-detail-cpuapr2024-01.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-detail-cpuapr2024-02.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/Fixtures/oracle-detail-invalid.html (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle.Tests => StellaOps.Concelier.Source.Vndr.Oracle.Tests}/Oracle/OracleConnectorTests.cs (94%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/AGENTS.md (80%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Configuration/OracleOptions.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleAffectedEntry.cs (85%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleCalendarFetcher.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleCursor.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleDocumentMetadata.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleDto.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleDtoValidator.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleMapper.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OracleParser.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Internal/OraclePatchDocument.cs (79%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/Jobs.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/OracleConnector.cs (94%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/OracleDependencyInjectionRoutine.cs (84%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/OracleServiceCollectionExtensions.cs (80%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Oracle/Properties/AssemblyInfo.cs create mode 100644 src/StellaOps.Concelier.Source.Vndr.Oracle/StellaOps.Concelier.Source.Vndr.Oracle.csproj rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Vndr.Oracle => StellaOps.Concelier.Source.Vndr.Oracle}/VndrOracleConnectorPlugin.cs (88%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-advisories.snapshot.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-detail-vmsa-2024-0001.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-detail-vmsa-2024-0002.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-detail-vmsa-2024-0003.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-index-initial.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/Fixtures/vmware-index-second.json (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/VmwareConnectorTests.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware.Tests => StellaOps.Concelier.Source.Vndr.Vmware.Tests}/Vmware/VmwareMapperTests.cs (87%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/AGENTS.md (80%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Configuration/VmwareOptions.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Internal/VmwareCursor.cs (96%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Internal/VmwareDetailDto.cs (92%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Internal/VmwareFetchCacheEntry.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Internal/VmwareIndexItem.cs (82%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Internal/VmwareMapper.cs (93%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/Jobs.cs (91%) create mode 100644 src/StellaOps.Concelier.Source.Vndr.Vmware/Properties/AssemblyInfo.cs create mode 100644 src/StellaOps.Concelier.Source.Vndr.Vmware/StellaOps.Concelier.Source.Vndr.Vmware.csproj rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/TASKS.md (100%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/VmwareConnector.cs (95%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/VmwareConnectorPlugin.cs (88%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/VmwareDependencyInjectionRoutine.cs (86%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/VmwareDiagnostics.cs (91%) rename src/{StellaOps.Feedser.Source.Vndr.Vmware => StellaOps.Concelier.Source.Vndr.Vmware}/VmwareServiceCollectionExtensions.cs (84%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/AdvisoryStorePerformanceTests.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/AdvisoryStoreTests.cs (97%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/AliasStoreTests.cs (91%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/DocumentStoreTests.cs (91%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/DtoStoreTests.cs (89%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/ExportStateManagerTests.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/ExportStateStoreTests.cs (90%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/MergeEventStoreTests.cs (88%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/Migrations/MongoMigrationRunnerTests.cs (92%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/MongoBootstrapperTests.cs (91%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/MongoJobStoreTests.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/MongoSourceStateRepositoryTests.cs (93%) rename src/{StellaOps.Feedser.Storage.Mongo.Tests => StellaOps.Concelier.Storage.Mongo.Tests}/RawDocumentRetentionServiceTests.cs (92%) create mode 100644 src/StellaOps.Concelier.Storage.Mongo.Tests/StellaOps.Concelier.Storage.Mongo.Tests.csproj rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/AGENTS.md (90%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Advisories/AdvisoryDocument.cs (90%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Advisories/AdvisoryStore.cs (98%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Advisories/IAdvisoryStore.cs (78%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Advisories/NormalizedVersionDocument.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Advisories/NormalizedVersionDocumentFactory.cs (97%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Aliases/AliasDocument.cs (91%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Aliases/AliasStore.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Aliases/AliasStoreConstants.cs (71%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Aliases/AliasStoreMetrics.cs (76%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Aliases/IAliasStore.cs (92%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/ChangeHistoryDocument.cs (91%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/ChangeHistoryDocumentExtensions.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/ChangeHistoryFieldChange.cs (87%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/ChangeHistoryRecord.cs (93%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/IChangeHistoryStore.cs (83%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ChangeHistory/MongoChangeHistoryStore.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Documents/DocumentDocument.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Documents/DocumentRecord.cs (87%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Documents/DocumentStore.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Documents/IDocumentStore.cs (86%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Dtos/DtoDocument.cs (93%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Dtos/DtoRecord.cs (76%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Dtos/DtoStore.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Dtos/IDtoStore.cs (85%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Exporting/ExportStateDocument.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Exporting/ExportStateManager.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Exporting/ExportStateRecord.cs (85%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Exporting/ExportStateStore.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Exporting/IExportStateStore.cs (78%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ISourceStateRepository.cs (90%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JobLeaseDocument.cs (89%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JobRunDocument.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JpFlags/IJpFlagStore.cs (80%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JpFlags/JpFlagDocument.cs (93%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JpFlags/JpFlagRecord.cs (85%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/JpFlags/JpFlagStore.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MIGRATIONS.md (71%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MergeEvents/IMergeEventStore.cs (79%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MergeEvents/MergeEventDocument.cs (97%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MergeEvents/MergeEventRecord.cs (80%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MergeEvents/MergeEventStore.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MergeEvents/MergeFieldDecision.cs (77%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/EnsureDocumentExpiryIndexesMigration.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/EnsureGridFsExpiryIndexesMigration.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/IMongoMigration.cs (87%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/MongoMigrationDocument.cs (83%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/MongoMigrationRunner.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/Migrations/SemVerStyleBackfillMigration.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoBootstrapper.cs (97%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoJobStore.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoLeaseStore.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoSourceStateRepository.cs (96%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoStorageDefaults.cs (88%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/MongoStorageOptions.cs (96%) create mode 100644 src/StellaOps.Concelier.Storage.Mongo/Properties/AssemblyInfo.cs rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/PsirtFlags/IPsirtFlagStore.cs (80%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/PsirtFlags/PsirtFlagDocument.cs (93%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/PsirtFlags/PsirtFlagRecord.cs (84%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/PsirtFlags/PsirtFlagStore.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/RawDocumentRetentionService.cs (94%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/ServiceCollectionExtensions.cs (83%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/SourceStateDocument.cs (95%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/SourceStateRecord.cs (84%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/SourceStateRepositoryExtensions.cs (89%) rename src/{StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj => StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj} (75%) rename src/{StellaOps.Feedser.Storage.Mongo => StellaOps.Concelier.Storage.Mongo}/TASKS.md (91%) rename src/{StellaOps.Feedser.Testing => StellaOps.Concelier.Testing}/ConnectorTestHarness.cs (92%) rename src/{StellaOps.Feedser.Testing => StellaOps.Concelier.Testing}/MongoIntegrationFixture.cs (94%) rename src/{StellaOps.Feedser.Testing/StellaOps.Feedser.Testing.csproj => StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj} (72%) rename src/{StellaOps.Feedser.Tests.Shared => StellaOps.Concelier.Tests.Shared}/AssemblyInfo.cs (100%) rename src/{StellaOps.Feedser.Tests.Shared => StellaOps.Concelier.Tests.Shared}/MongoFixtureCollection.cs (79%) rename src/{StellaOps.Feedser.WebService.Tests/FeedserOptionsPostConfigureTests.cs => StellaOps.Concelier.WebService.Tests/ConcelierOptionsPostConfigureTests.cs} (58%) rename src/{StellaOps.Feedser.WebService.Tests => StellaOps.Concelier.WebService.Tests}/PluginLoaderTests.cs (91%) create mode 100644 src/StellaOps.Concelier.WebService.Tests/StellaOps.Concelier.WebService.Tests.csproj rename src/{StellaOps.Feedser.WebService.Tests => StellaOps.Concelier.WebService.Tests}/WebServiceEndpointsTests.cs (80%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/AGENTS.md (80%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Diagnostics/HealthContracts.cs (89%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Diagnostics/JobMetrics.cs (84%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Diagnostics/ProblemTypes.cs (90%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Diagnostics/ServiceStatus.cs (94%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Extensions/ConfigurationExtensions.cs (83%) create mode 100644 src/StellaOps.Concelier.WebService/Extensions/JobRegistrationExtensions.cs rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Extensions/TelemetryExtensions.cs (81%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Filters/JobAuthorizationAuditFilter.cs (89%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Jobs/JobDefinitionResponse.cs (84%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Jobs/JobRunResponse.cs (86%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Jobs/JobTriggerRequest.cs (77%) rename src/{StellaOps.Feedser.WebService/Options/FeedserOptions.cs => StellaOps.Concelier.WebService/Options/ConcelierOptions.cs} (95%) rename src/{StellaOps.Feedser.WebService/Options/FeedserOptionsPostConfigure.cs => StellaOps.Concelier.WebService/Options/ConcelierOptionsPostConfigure.cs} (80%) rename src/{StellaOps.Feedser.WebService/Options/FeedserOptionsValidator.cs => StellaOps.Concelier.WebService/Options/ConcelierOptionsValidator.cs} (90%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Program.cs (85%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/Properties/launchSettings.json (83%) rename src/{StellaOps.Feedser.WebService/StellaOps.Feedser.WebService.csproj => StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj} (75%) rename src/{StellaOps.Feedser.WebService => StellaOps.Concelier.WebService}/TASKS.md (50%) rename src/{StellaOps.Feedser.sln => StellaOps.Concelier.sln} (83%) delete mode 100644 src/StellaOps.Feedser.Exporter.Json.Tests/StellaOps.Feedser.Exporter.Json.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Exporter.TrivyDb.Tests/StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj delete mode 100644 src/StellaOps.Feedser.Source.Acsc.Tests/StellaOps.Feedser.Source.Acsc.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Acsc/StellaOps.Feedser.Source.Acsc.csproj delete mode 100644 src/StellaOps.Feedser.Source.Cccs/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Cccs/StellaOps.Feedser.Source.Cccs.csproj delete mode 100644 src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md delete mode 100644 src/StellaOps.Feedser.Source.CertCc/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.CertFr.Tests/StellaOps.Feedser.Source.CertFr.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj delete mode 100644 src/StellaOps.Feedser.Source.CertIn.Tests/StellaOps.Feedser.Source.CertIn.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj delete mode 100644 src/StellaOps.Feedser.Source.Common/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Cve.Tests/StellaOps.Feedser.Source.Cve.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Debian.Tests/StellaOps.Feedser.Source.Distro.Debian.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Debian/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Distro.Debian/StellaOps.Feedser.Source.Distro.Debian.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.RedHat.Tests/StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.RedHat/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Suse.Tests/StellaOps.Feedser.Source.Distro.Suse.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Suse/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Distro.Suse/StellaOps.Feedser.Source.Distro.Suse.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/StellaOps.Feedser.Source.Distro.Ubuntu.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Distro.Ubuntu/StellaOps.Feedser.Source.Distro.Ubuntu.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ghsa/StellaOps.Feedser.Source.Ghsa.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj delete mode 100644 src/StellaOps.Feedser.Source.Jvn.Tests/StellaOps.Feedser.Source.Jvn.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj delete mode 100644 src/StellaOps.Feedser.Source.Kev.Tests/StellaOps.Feedser.Source.Kev.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Kisa/StellaOps.Feedser.Source.Kisa.csproj delete mode 100644 src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Nvd/StellaOps.Feedser.Source.Nvd.csproj delete mode 100644 src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Osv/StellaOps.Feedser.Source.Osv.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ru.Bdu.Tests/StellaOps.Feedser.Source.Ru.Bdu.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ru.Bdu/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Ru.Bdu/StellaOps.Feedser.Source.Ru.Bdu.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Ru.Nkcki/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Ru.Nkcki/StellaOps.Feedser.Source.Ru.Nkcki.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Apple/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Apple/StellaOps.Feedser.Source.Vndr.Apple.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Chromium/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Cisco/StellaOps.Feedser.Source.Vndr.Cisco.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Oracle/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Oracle/StellaOps.Feedser.Source.Vndr.Oracle.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Vmware/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.Source.Vndr.Vmware/StellaOps.Feedser.Source.Vndr.Vmware.csproj delete mode 100644 src/StellaOps.Feedser.Storage.Mongo.Tests/StellaOps.Feedser.Storage.Mongo.Tests.csproj delete mode 100644 src/StellaOps.Feedser.Storage.Mongo/Properties/AssemblyInfo.cs delete mode 100644 src/StellaOps.Feedser.WebService.Tests/StellaOps.Feedser.WebService.Tests.csproj delete mode 100644 src/StellaOps.Feedser.WebService/Extensions/JobRegistrationExtensions.cs diff --git a/.gitea/workflows/_deprecated-feedser-ci.yml.disabled b/.gitea/workflows/_deprecated-concelier-ci.yml.disabled similarity index 100% rename from .gitea/workflows/_deprecated-feedser-ci.yml.disabled rename to .gitea/workflows/_deprecated-concelier-ci.yml.disabled diff --git a/.gitea/workflows/_deprecated-feedser-tests.yml.disabled b/.gitea/workflows/_deprecated-concelier-tests.yml.disabled similarity index 100% rename from .gitea/workflows/_deprecated-feedser-tests.yml.disabled rename to .gitea/workflows/_deprecated-concelier-tests.yml.disabled diff --git a/AGENTS.md b/AGENTS.md index 1b530c01..dcd1d5d6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,7 +10,7 @@ Licence audit identifies potential conflicts, especially copyleft obligations. Misconfiguration checks detect unsafe Dockerfile patterns (root user, latest tags, permissive modes). Provenance features include in-toto/SLSA attestations signed with cosign for supply-chain trust. -| Guiding principle | What it means for Feedser | +| Guiding principle | What it means for Concelier | |-------------------|---------------------------| | **SBOM-first ingest** | Prefer signed SBOMs or reproducible layer diffs before falling back to raw scraping; connectors treat source docs as provenance, never as mutable truth. | | **Deterministic outputs** | Same inputs yield identical canonical advisories and exported JSON/Trivy DB artefacts; merge hashes and export manifests are reproducible across machines. | @@ -41,14 +41,14 @@ All modules are contained by one or more projects. Each project goes in its dedi # 4) Modules StellaOps is contained by different modules installable via docker containers -- Feedser. Responsible for aggregation and delivery of vulnerability database +- Concelier. Responsible for aggregation and delivery of vulnerability database - Cli. Command line tool to unlock full potential - request database operations, install scanner, request scan, configure backend - Backend. Configures and Manages scans - UI. UI to access the backend (and scanners) - Agent. Installable daemon that does the scanning - Zastava. Realtime monitor for allowed (verified) installations. -## 4.1) Feedser +## 4.1) Concelier It is webservice based module that is responsible for aggregating vulnerabilities information from various sources, parsing and normalizing them into a canonical shape, merging and deduplicating the results in one place, with export capabilities to Json and TrivyDb. It supports init and resume for all of the sources, parse/normalize and merge/deduplication operations, plus export. Export supports delta exports—similarly to full and incremential database backups. ### 4.1.1) Usage @@ -65,7 +65,7 @@ api available on https://db.stella-ops.org 4. **Export**: JSON tree and/or Trivy DB; package and (optionally) push; write export state. ### 4.1.3) Architecture -For more information of the architecture see `./docs/ARCHITECTURE_FEEDSER.md`. +For more information of the architecture see `./docs/ARCHITECTURE_CONCELIER.md`. --- @@ -122,7 +122,7 @@ You main characteristics: - **Coordination**: In case task is discovered as blocked on other team or task, according TASKS.md files that dependency is on needs to be changed by adding new tasks describing the requirement. the current task must be updated as completed. In case task changes, scope or requirements or rules - other documentations needs be updated accordingly. - **Sprint synchronization**: When given task seek for relevant directory to work on from SPRINTS.md. Confirm its state on both SPRINTS.md and the relevant TODOS.md file. Always check the AGENTS.md in the relevant TODOS.md directory. - **Tests**: Add/extend fixtures and unit tests per change; never regress determinism or precedence. -- **Test layout**: Use module-specific projects in `StellaOps.Feedser..Tests`; shared fixtures/harnesses live in `StellaOps.Feedser.Testing`. +- **Test layout**: Use module-specific projects in `StellaOps.Concelier..Tests`; shared fixtures/harnesses live in `StellaOps.Concelier.Testing`. - **Execution autonomous**: In case you need to continue with more than one options just continue sequentially, unless the continue requires design decision. --- diff --git a/README.md b/README.md index dcc4024d..2a6184b8 100755 --- a/README.md +++ b/README.md @@ -1,27 +1,27 @@ -# StellaOps Feedser & CLI +# StellaOps Concelier & CLI -This repository hosts the StellaOps Feedser service, its plug-in ecosystem, and the -first-party CLI (`stellaops-cli`). Feedser ingests vulnerability advisories from +This repository hosts the StellaOps Concelier service, its plug-in ecosystem, and the +first-party CLI (`stellaops-cli`). Concelier ingests vulnerability advisories from authoritative sources, stores them in MongoDB, and exports deterministic JSON and Trivy DB artefacts. The CLI drives scanner distribution, scan execution, and job -control against the Feedser API. +control against the Concelier API. ## Quickstart 1. Prepare a MongoDB instance and (optionally) install `trivy-db`/`oras`. -2. Copy `etc/feedser.yaml.sample` to `etc/feedser.yaml` and update the storage + telemetry +2. Copy `etc/concelier.yaml.sample` to `etc/concelier.yaml` and update the storage + telemetry settings. 3. Copy `etc/authority.yaml.sample` to `etc/authority.yaml`, review the issuer, token lifetimes, and plug-in descriptors, then edit the companion manifests under `etc/authority.plugins/*.yaml` to match your deployment. -4. Start the web service with `dotnet run --project src/StellaOps.Feedser.WebService`. +4. Start the web service with `dotnet run --project src/StellaOps.Concelier.WebService`. 5. Configure the CLI via environment variables (e.g. `STELLAOPS_BACKEND_URL`) and trigger jobs with `dotnet run --project src/StellaOps.Cli -- db merge`. -Detailed operator guidance is available in `docs/10_FEEDSER_CLI_QUICKSTART.md`. API and +Detailed operator guidance is available in `docs/10_CONCELIER_CLI_QUICKSTART.md`. API and command reference material lives in `docs/09_API_CLI_REFERENCE.md`. -Pipeline note: deployment workflows should template `etc/feedser.yaml` during CI/CD, +Pipeline note: deployment workflows should template `etc/concelier.yaml` during CI/CD, injecting environment-specific Mongo credentials and telemetry endpoints. Upcoming releases will add Microsoft OAuth (Entra ID) authentication support—track the quickstart for integration steps once available. @@ -29,6 +29,6 @@ for integration steps once available. ## Documentation - `docs/README.md` now consolidates the platform index and points to the updated high-level architecture. -- Module architecture dossiers live under `docs/ARCHITECTURE_*.md`; the most relevant here are `docs/ARCHITECTURE_FEEDSER.md` (service layout, merge engine, exports) and `docs/ARCHITECTURE_CLI.md` (command surface, AOT packaging, auth flows). Related services such as the Signer, Attestor, Authority, Scanner, UI, Excititor, Zastava, and DevOps pipeline each have their own dossier. -- Offline operation guidance moved to `docs/24_OFFLINE_KIT.md`, which details bundle composition, verification, and delta workflows. Feedser-specific connector operations stay in `docs/ops/feedser-certbund-operations.md` and companion runbooks under `docs/ops/`. +- Module architecture dossiers live under `docs/ARCHITECTURE_*.md`; the most relevant here are `docs/ARCHITECTURE_CONCELIER.md` (service layout, merge engine, exports) and `docs/ARCHITECTURE_CLI.md` (command surface, AOT packaging, auth flows). Related services such as the Signer, Attestor, Authority, Scanner, UI, Excititor, Zastava, and DevOps pipeline each have their own dossier. +- Offline operation guidance moved to `docs/24_OFFLINE_KIT.md`, which details bundle composition, verification, and delta workflows. Concelier-specific connector operations stay in `docs/ops/concelier-certbund-operations.md` and companion runbooks under `docs/ops/`. diff --git a/SPRINTS.md b/SPRINTS.md index 976be584..6494f3d9 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -1,52 +1,52 @@ | Sprint | Theme | Tasks File Path | Status | Type of Specialist | Task ID | Task Description | | --- | --- | --- | --- | --- | --- | --- | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Models/TASKS.md | DONE (2025-10-12) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-001 | SemVer primitive range-style metadata
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Feedser.Models/AGENTS.md. This task lays the groundwork—complete the SemVer helper updates before teammates pick up FEEDMODELS-SCHEMA-01-002/003 and FEEDMODELS-SCHEMA-02-900. Use ./src/FASTER_MODELING_AND_NORMALIZATION.md for the target rule structure. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Models/TASKS.md | DONE (2025-10-11) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-002 | Provenance decision rationale field
Instructions to work:
AdvisoryProvenance now carries `decisionReason` and docs/tests were updated. Connectors and merge tasks should populate the field when applying precedence/freshness/tie-breaker logic; see src/StellaOps.Feedser.Models/PROVENANCE_GUIDELINES.md for usage guidance. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Models/TASKS.md | DONE (2025-10-11) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-003 | Normalized version rules collection
Instructions to work:
`AffectedPackage.NormalizedVersions` and supporting comparer/docs/tests shipped. Connector owners must emit rule arrays per ./src/FASTER_MODELING_AND_NORMALIZATION.md and report progress via FEEDMERGE-COORD-02-900 so merge/storage backfills can proceed. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Models/TASKS.md | DONE (2025-10-12) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-02-900 | Range primitives for SemVer/EVR/NEVRA metadata
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Feedser.Models/AGENTS.md before resuming this stalled effort. Confirm helpers align with the new `NormalizedVersions` representation so connectors finishing in Sprint 2 can emit consistent metadata. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Normalization/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDNORM-NORM-02-001 | SemVer normalized rule emitter
Shared `SemVerRangeRuleBuilder` now outputs primitives + normalized rules per `FASTER_MODELING_AND_NORMALIZATION.md`; CVE/GHSA connectors consuming the API have verified fixtures. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill
AdvisoryStore dual-writes flattened `normalizedVersions` when `feedser.storage.enableSemVerStyle` is set; migration `20251011-semver-style-backfill` updates historical records and docs outline the rollout. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-002 | Provenance decision reason persistence
Storage now persists `provenance.decisionReason` for advisories and merge events; tests cover round-trips. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-003 | Normalized versions indexing
Bootstrapper seeds compound/sparse indexes for flattened normalized rules and `docs/dev/mongo_indices.md` documents query guidance. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-TESTS-02-004 | Restore AdvisoryStore build after normalized versions refactor
Updated constructors/tests keep storage suites passing with the new feature flag defaults. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-ENGINE-01-002 | Plumb Authority client resilience options
WebService wires `authority.resilience.*` into `AddStellaOpsAuthClient` and adds binding coverage via `AuthorityClientResilienceOptionsAreBound`. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-003 | Author ops guidance for resilience tuning
Install/runbooks document connected vs air-gapped resilience profiles and monitoring hooks. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-004 | Document authority bypass logging patterns
Operator guides now call out `route/status/subject/clientId/scopes/bypass/remote` audit fields and SIEM triggers. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-005 | Update Feedser operator guide for enforcement cutoff
Install guide reiterates the 2025-12-31 cutoff and links audit signals to the rollout checklist. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Models/TASKS.md | DONE (2025-10-12) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-001 | SemVer primitive range-style metadata
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Concelier.Models/AGENTS.md. This task lays the groundwork—complete the SemVer helper updates before teammates pick up FEEDMODELS-SCHEMA-01-002/003 and FEEDMODELS-SCHEMA-02-900. Use ./src/FASTER_MODELING_AND_NORMALIZATION.md for the target rule structure. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Models/TASKS.md | DONE (2025-10-11) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-002 | Provenance decision rationale field
Instructions to work:
AdvisoryProvenance now carries `decisionReason` and docs/tests were updated. Connectors and merge tasks should populate the field when applying precedence/freshness/tie-breaker logic; see src/StellaOps.Concelier.Models/PROVENANCE_GUIDELINES.md for usage guidance. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Models/TASKS.md | DONE (2025-10-11) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-01-003 | Normalized version rules collection
Instructions to work:
`AffectedPackage.NormalizedVersions` and supporting comparer/docs/tests shipped. Connector owners must emit rule arrays per ./src/FASTER_MODELING_AND_NORMALIZATION.md and report progress via FEEDMERGE-COORD-02-900 so merge/storage backfills can proceed. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Models/TASKS.md | DONE (2025-10-12) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-02-900 | Range primitives for SemVer/EVR/NEVRA metadata
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Concelier.Models/AGENTS.md before resuming this stalled effort. Confirm helpers align with the new `NormalizedVersions` representation so connectors finishing in Sprint 2 can emit consistent metadata. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Normalization/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDNORM-NORM-02-001 | SemVer normalized rule emitter
Shared `SemVerRangeRuleBuilder` now outputs primitives + normalized rules per `FASTER_MODELING_AND_NORMALIZATION.md`; CVE/GHSA connectors consuming the API have verified fixtures. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill
AdvisoryStore dual-writes flattened `normalizedVersions` when `concelier.storage.enableSemVerStyle` is set; migration `20251011-semver-style-backfill` updates historical records and docs outline the rollout. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-002 | Provenance decision reason persistence
Storage now persists `provenance.decisionReason` for advisories and merge events; tests cover round-trips. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-003 | Normalized versions indexing
Bootstrapper seeds compound/sparse indexes for flattened normalized rules and `docs/dev/mongo_indices.md` documents query guidance. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-TESTS-02-004 | Restore AdvisoryStore build after normalized versions refactor
Updated constructors/tests keep storage suites passing with the new feature flag defaults. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-ENGINE-01-002 | Plumb Authority client resilience options
WebService wires `authority.resilience.*` into `AddStellaOpsAuthClient` and adds binding coverage via `AuthorityClientResilienceOptionsAreBound`. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-003 | Author ops guidance for resilience tuning
Install/runbooks document connected vs air-gapped resilience profiles and monitoring hooks. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-004 | Document authority bypass logging patterns
Operator guides now call out `route/status/subject/clientId/scopes/bypass/remote` audit fields and SIEM triggers. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-005 | Update Concelier operator guide for enforcement cutoff
Install guide reiterates the 2025-12-31 cutoff and links audit signals to the rollout checklist. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | SEC3.HOST | Rate limiter policy binding
Authority host now applies configuration-driven fixed windows to `/token`, `/authorize`, and `/internal/*`; integration tests assert 429 + `Retry-After` headers; docs/config samples refreshed for Docs guild diagrams. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | SEC3.BUILD | Authority rate-limiter follow-through
`Security.RateLimiting` now fronts token/authorize/internal limiters; Authority + Configuration matrices (`dotnet test src/StellaOps.Authority/StellaOps.Authority.sln`, `dotnet test src/StellaOps.Configuration.Tests/StellaOps.Configuration.Tests.csproj`) passed on 2025-10-11; awaiting #authority-core broadcast. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/TASKS.md | DONE (2025-10-14) | Team Authority Platform & Security Guild | AUTHCORE-BUILD-OPENIDDICT / AUTHCORE-STORAGE-DEVICE-TOKENS / AUTHCORE-BOOTSTRAP-INVITES | Address remaining Authority compile blockers (OpenIddict transaction shim, token device document, bootstrap invite cleanup) so `dotnet build src/StellaOps.Authority.sln` returns success. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/StellaOps.Authority.Plugin.Standard/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | PLG6.DOC | Plugin developer guide polish
Section 9 now documents rate limiter metadata, config keys, and lockout interplay; YAML samples updated alongside Authority config templates. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-001 | Fetch pipeline & state tracking
Summary planner now drives monthly/yearly VINCE fetches, persists pending summaries/notes, and hydrates VINCE detail queue with telemetry.
Team instructions: Read ./AGENTS.md and src/StellaOps.Feedser.Source.CertCc/AGENTS.md. Coordinate daily with Models/Merge leads so new normalizedVersions output and provenance tags stay aligned with ./src/FASTER_MODELING_AND_NORMALIZATION.md. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-002 | VINCE note detail fetcher
Summary planner queues VINCE note detail endpoints, persists raw JSON with SHA/ETag metadata, and records retry/backoff metrics. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-003 | DTO & parser implementation
Added VINCE DTO aggregate, Markdown→text sanitizer, vendor/status/vulnerability parsers, and parser regression fixture. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-004 | Canonical mapping & range primitives
VINCE DTO aggregate flows through `CertCcMapper`, emitting vendor range primitives + normalized version rules that persist via `_advisoryStore`. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-005 | Deterministic fixtures/tests
Snapshot harness refreshed 2025-10-12; `certcc-*.snapshot.json` regenerated and regression suite green without UPDATE flag drift. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-006 | Telemetry & documentation
`CertCcDiagnostics` publishes summary/detail/parse/map metrics (meter `StellaOps.Feedser.Source.CertCc`), README documents instruments, and log guidance captured for Ops on 2025-10-12. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-007 | Connector test harness remediation
Harness now wires `AddSourceCommon`, resets `FakeTimeProvider`, and passes canned-response regression run dated 2025-10-12. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-008 | Snapshot coverage handoff
Fixtures regenerated with normalized ranges + provenance fields on 2025-10-11; QA handoff notes published and merge backfill unblocked. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-012 | Schema sync & snapshot regen follow-up
Fixtures regenerated with normalizedVersions + provenance decision reasons; handoff notes updated for Merge backfill 2025-10-12. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-009 | Detail/map reintegration plan
Staged reintegration plan published in `src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md`; coordinates enablement with FEEDCONN-CERTCC-02-004. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-010 | Partial-detail graceful degradation
Detail fetch now tolerates 404/403/410 responses and regression tests cover mixed endpoint availability. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Distro.RedHat/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-REDHAT-02-001 | Fixture validation sweep
Instructions to work:
Fixtures regenerated post-model-helper rollout; provenance ordering and normalizedVersions scaffolding verified via tests. Conflict resolver deltas logged in src/StellaOps.Feedser.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md for Sprint 3 consumers. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-001 | Canonical mapping & range primitives
Mapper emits SemVer rules (`scheme=apple:*`); fixtures regenerated with trimmed references + new RSR coverage, update tooling finalized. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-002 | Deterministic fixtures/tests
Sanitized live fixtures + regression snapshots wired into tests; normalized rule coverage asserted. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-003 | Telemetry & documentation
Apple meter metrics wired into Feedser WebService OpenTelemetry configuration; README and fixtures document normalizedVersions coverage. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-004 | Live HTML regression sweep
Sanitised HT125326/HT125328/HT106355/HT214108/HT215500 fixtures recorded and regression tests green on 2025-10-12. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-005 | Fixture regeneration tooling
`UPDATE_APPLE_FIXTURES=1` flow fetches & rewrites fixtures; README documents usage.
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Feedser.Source.Vndr.Apple/AGENTS.md. Resume stalled tasks, ensuring normalizedVersions output and fixtures align with ./src/FASTER_MODELING_AND_NORMALIZATION.md before handing data to the conflict sprint. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-GHSA-02-001 | GHSA normalized versions & provenance
Team instructions: Read ./AGENTS.md and each module's AGENTS file. Adopt the `NormalizedVersions` array emitted by the models sprint, wiring provenance `decisionReason` where merge overrides occur. Follow ./src/FASTER_MODELING_AND_NORMALIZATION.md; report via src/StellaOps.Feedser.Merge/TASKS.md (FEEDMERGE-COORD-02-900). Progress 2025-10-11: GHSA/OSV emit normalized arrays with refreshed fixtures; CVE mapper now surfaces SemVer normalized ranges; NVD/KEV adoption pending; outstanding follow-ups include FEEDSTORAGE-DATA-02-001, FEEDMERGE-ENGINE-02-002, and rolling `tools/FixtureUpdater` updates across connectors. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-OSV-02-003 | OSV normalized versions & freshness | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-NVD-02-002 | NVD normalized versions & timestamps | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Cve/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-CVE-02-003 | CVE normalized versions uplift | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Kev/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-KEV-02-003 | KEV normalized versions propagation | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-OSV-04-003 | OSV parity fixture refresh | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-10) | Team WebService & Authority | FEEDWEB-DOCS-01-001 | Document authority toggle & scope requirements
Quickstart carries toggle/scope guidance pending docs guild review (no change this sprint). | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-ENGINE-01-002 | Plumb Authority client resilience options
WebService wires `authority.resilience.*` into `AddStellaOpsAuthClient` and adds binding coverage via `AuthorityClientResilienceOptionsAreBound`. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-003 | Author ops guidance for resilience tuning
Operator docs now outline connected vs air-gapped resilience profiles and monitoring cues. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-004 | Document authority bypass logging patterns
Audit logging guidance highlights `route/status/subject/clientId/scopes/bypass/remote` fields and SIEM alerts. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-005 | Update Feedser operator guide for enforcement cutoff
Install guide reiterates the 2025-12-31 cutoff and ties audit signals to rollout checks. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | FEEDWEB-OPS-01-006 | Rename plugin drop directory to namespaced path
Build outputs, tests, and docs now target `StellaOps.Feedser.PluginBinaries`/`StellaOps.Authority.PluginBinaries`. | -| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Feedser.WebService/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | FEEDWEB-OPS-01-007 | Authority resilience adoption
Deployment docs and CLI notes explain the LIB5 resilience knobs for rollout.
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Feedser.WebService/AGENTS.md. These items were mid-flight; resume implementation ensuring docs/operators receive timely updates. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-001 | Fetch pipeline & state tracking
Summary planner now drives monthly/yearly VINCE fetches, persists pending summaries/notes, and hydrates VINCE detail queue with telemetry.
Team instructions: Read ./AGENTS.md and src/StellaOps.Concelier.Source.CertCc/AGENTS.md. Coordinate daily with Models/Merge leads so new normalizedVersions output and provenance tags stay aligned with ./src/FASTER_MODELING_AND_NORMALIZATION.md. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-002 | VINCE note detail fetcher
Summary planner queues VINCE note detail endpoints, persists raw JSON with SHA/ETag metadata, and records retry/backoff metrics. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-003 | DTO & parser implementation
Added VINCE DTO aggregate, Markdown→text sanitizer, vendor/status/vulnerability parsers, and parser regression fixture. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-004 | Canonical mapping & range primitives
VINCE DTO aggregate flows through `CertCcMapper`, emitting vendor range primitives + normalized version rules that persist via `_advisoryStore`. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-005 | Deterministic fixtures/tests
Snapshot harness refreshed 2025-10-12; `certcc-*.snapshot.json` regenerated and regression suite green without UPDATE flag drift. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-006 | Telemetry & documentation
`CertCcDiagnostics` publishes summary/detail/parse/map metrics (meter `StellaOps.Concelier.Source.CertCc`), README documents instruments, and log guidance captured for Ops on 2025-10-12. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-007 | Connector test harness remediation
Harness now wires `AddSourceCommon`, resets `FakeTimeProvider`, and passes canned-response regression run dated 2025-10-12. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-008 | Snapshot coverage handoff
Fixtures regenerated with normalized ranges + provenance fields on 2025-10-11; QA handoff notes published and merge backfill unblocked. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-012 | Schema sync & snapshot regen follow-up
Fixtures regenerated with normalizedVersions + provenance decision reasons; handoff notes updated for Merge backfill 2025-10-12. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-009 | Detail/map reintegration plan
Staged reintegration plan published in `src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md`; coordinates enablement with FEEDCONN-CERTCC-02-004. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-010 | Partial-detail graceful degradation
Detail fetch now tolerates 404/403/410 responses and regression tests cover mixed endpoint availability. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Distro.RedHat/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-REDHAT-02-001 | Fixture validation sweep
Instructions to work:
Fixtures regenerated post-model-helper rollout; provenance ordering and normalizedVersions scaffolding verified via tests. Conflict resolver deltas logged in src/StellaOps.Concelier.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md for Sprint 3 consumers. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-001 | Canonical mapping & range primitives
Mapper emits SemVer rules (`scheme=apple:*`); fixtures regenerated with trimmed references + new RSR coverage, update tooling finalized. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-002 | Deterministic fixtures/tests
Sanitized live fixtures + regression snapshots wired into tests; normalized rule coverage asserted. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-003 | Telemetry & documentation
Apple meter metrics wired into Concelier WebService OpenTelemetry configuration; README and fixtures document normalizedVersions coverage. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-004 | Live HTML regression sweep
Sanitised HT125326/HT125328/HT106355/HT214108/HT215500 fixtures recorded and regression tests green on 2025-10-12. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-005 | Fixture regeneration tooling
`UPDATE_APPLE_FIXTURES=1` flow fetches & rewrites fixtures; README documents usage.
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Concelier.Source.Vndr.Apple/AGENTS.md. Resume stalled tasks, ensuring normalizedVersions output and fixtures align with ./src/FASTER_MODELING_AND_NORMALIZATION.md before handing data to the conflict sprint. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-GHSA-02-001 | GHSA normalized versions & provenance
Team instructions: Read ./AGENTS.md and each module's AGENTS file. Adopt the `NormalizedVersions` array emitted by the models sprint, wiring provenance `decisionReason` where merge overrides occur. Follow ./src/FASTER_MODELING_AND_NORMALIZATION.md; report via src/StellaOps.Concelier.Merge/TASKS.md (FEEDMERGE-COORD-02-900). Progress 2025-10-11: GHSA/OSV emit normalized arrays with refreshed fixtures; CVE mapper now surfaces SemVer normalized ranges; NVD/KEV adoption pending; outstanding follow-ups include FEEDSTORAGE-DATA-02-001, FEEDMERGE-ENGINE-02-002, and rolling `tools/FixtureUpdater` updates across connectors. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-OSV-02-003 | OSV normalized versions & freshness | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-NVD-02-002 | NVD normalized versions & timestamps | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Cve/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-CVE-02-003 | CVE normalized versions uplift | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Kev/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-KEV-02-003 | KEV normalized versions propagation | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-OSV-04-003 | OSV parity fixture refresh | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-10) | Team WebService & Authority | FEEDWEB-DOCS-01-001 | Document authority toggle & scope requirements
Quickstart carries toggle/scope guidance pending docs guild review (no change this sprint). | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-ENGINE-01-002 | Plumb Authority client resilience options
WebService wires `authority.resilience.*` into `AddStellaOpsAuthClient` and adds binding coverage via `AuthorityClientResilienceOptionsAreBound`. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-003 | Author ops guidance for resilience tuning
Operator docs now outline connected vs air-gapped resilience profiles and monitoring cues. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-004 | Document authority bypass logging patterns
Audit logging guidance highlights `route/status/subject/clientId/scopes/bypass/remote` fields and SIEM alerts. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-12) | Team WebService & Authority | FEEDWEB-DOCS-01-005 | Update Concelier operator guide for enforcement cutoff
Install guide reiterates the 2025-12-31 cutoff and ties audit signals to rollout checks. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | FEEDWEB-OPS-01-006 | Rename plugin drop directory to namespaced path
Build outputs, tests, and docs now target `StellaOps.Concelier.PluginBinaries`/`StellaOps.Authority.PluginBinaries`. | +| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.WebService/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | FEEDWEB-OPS-01-007 | Authority resilience adoption
Deployment docs and CLI notes explain the LIB5 resilience knobs for rollout.
Instructions to work:
DONE Read ./AGENTS.md and src/StellaOps.Concelier.WebService/AGENTS.md. These items were mid-flight; resume implementation ensuring docs/operators receive timely updates. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/TASKS.md | DONE (2025-10-11) | Team Authority Platform & Security Guild | AUTHCORE-ENGINE-01-001 | CORE8.RL — Rate limiter plumbing validated; integration tests green and docs handoff recorded for middleware ordering + Retry-After headers (see `docs/dev/authority-rate-limit-tuning-outline.md` for continuing guidance). | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Cryptography/TASKS.md | DONE (2025-10-11) | Team Authority Platform & Security Guild | AUTHCRYPTO-ENGINE-01-001 | SEC3.A — Shared metadata resolver confirmed via host test run; SEC3.B now unblocked for tuning guidance (outline captured in `docs/dev/authority-rate-limit-tuning-outline.md`). | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Cryptography/TASKS.md | DONE (2025-10-13) | Team Authority Platform & Security Guild | AUTHSEC-DOCS-01-002 | SEC3.B — Published `docs/security/rate-limits.md` with tuning matrix, alert thresholds, and lockout interplay guidance; Docs guild can lift copy into plugin guide. | @@ -54,59 +54,59 @@ | Sprint 1 | Bootstrap & Replay Hardening | src/StellaOps.Cryptography/TASKS.md | DONE (2025-10-14) | Security Guild | AUTHSEC-CRYPTO-02-004 | SEC5.D/E — Finish bootstrap invite lifecycle (API/store/cleanup) and token device heuristics; build currently red due to pending handler integration. | | Sprint 1 | Developer Tooling | src/StellaOps.Cli/TASKS.md | DONE (2025-10-15) | DevEx/CLI | AUTHCLI-DIAG-01-001 | Surface password policy diagnostics in CLI startup/output so operators see weakened overrides immediately.
CLI now loads Authority plug-ins at startup, logs weakened password policies (length/complexity), and regression coverage lives in `StellaOps.Cli.Tests/Services/AuthorityDiagnosticsReporterTests`. | | Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Authority/StellaOps.Authority.Plugin.Standard/TASKS.md | DONE (2025-10-11) | Team Authority Platform & Security Guild | AUTHPLUG-DOCS-01-001 | PLG6.DOC — Developer guide copy + diagrams merged 2025-10-11; limiter guidance incorporated and handed to Docs guild for asset export. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Normalization/TASKS.md | DONE (2025-10-12) | Team Normalization & Storage Backbone | FEEDNORM-NORM-02-001 | SemVer normalized rule emitter
`SemVerRangeRuleBuilder` shipped 2025-10-12 with comparator/`||` support and fixtures aligning to `FASTER_MODELING_AND_NORMALIZATION.md`. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-002 | Provenance decision reason persistence | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-003 | Normalized versions indexing
Indexes seeded + docs updated 2025-10-11 to cover flattened normalized rules for connector adoption. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDMERGE-ENGINE-02-002 | Normalized versions union & dedupe
Affected package resolver unions/dedupes normalized rules, stamps merge provenance with `decisionReason`, and tests cover the rollout. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-001 | GHSA normalized versions & provenance | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-004 | GHSA credits & ecosystem severity mapping | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-005 | GitHub quota monitoring & retries | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-006 | Production credential & scheduler rollout | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-007 | Credit parity regression fixtures | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Nvd/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-002 | NVD normalized versions & timestamps | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Nvd/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-004 | NVD CVSS & CWE precedence payloads | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-005 | NVD merge/export parity regression | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-003 | OSV normalized versions & freshness | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-004 | OSV references & credits alignment | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-005 | Fixture updater workflow
Resolved 2025-10-12: OSV mapper now derives canonical PURLs for Go + scoped npm packages when raw payloads omit `purl`; conflict fixtures unchanged for invalid npm names. Verified via `dotnet test src/StellaOps.Feedser.Source.Osv.Tests`, `src/StellaOps.Feedser.Source.Ghsa.Tests`, `src/StellaOps.Feedser.Source.Nvd.Tests`, and backbone normalization/storage suites. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Acsc/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-ACSC-02-001 … 02-008 | Fetch→parse→map pipeline, fixtures, diagnostics, and README finished 2025-10-12; downstream export parity captured via FEEDEXPORT-JSON-04-001 / FEEDEXPORT-TRIVY-04-001 (completed). | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Cccs/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CCCS-02-001 … 02-008 | Observability meter, historical harvest plan, and DOM sanitizer refinements wrapped; ops notes live under `docs/ops/feedser-cccs-operations.md` with fixtures validating EN/FR list handling. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.CertBund/TASKS.md | DONE (2025-10-15) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CERTBUND-02-001 … 02-008 | Telemetry/docs (02-006) and history/locale sweep (02-007) completed alongside pipeline; runbook `docs/ops/feedser-certbund-operations.md` captures locale guidance and offline packaging. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Kisa/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-KISA-02-001 … 02-007 | Connector, tests, and telemetry/docs (02-006) finalized; localisation notes in `docs/dev/kisa_connector_notes.md` complete rollout. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ru.Bdu/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-RUBDU-02-001 … 02-008 | Fetch/parser/mapper refinements, regression fixtures, telemetry/docs, access options, and trusted root packaging all landed; README documents offline access strategy. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md | DONE (2025-10-13) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-NKCKI-02-001 … 02-008 | Listing fetch, parser, mapper, fixtures, telemetry/docs, and archive plan finished; Mongo2Go/libcrypto dependency resolved via bundled OpenSSL noted in ops guide. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Ics.Cisa/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-ICSCISA-02-001 … 02-011 | Feed parser attachment fixes, SemVer exact values, regression suites, telemetry/docs updates, and handover complete; ops runbook now details attachment verification + proxy usage. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Vndr.Cisco/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CISCO-02-001 … 02-007 | OAuth fetch pipeline, DTO/mapping, tests, and telemetry/docs shipped; monitoring/export integration follow-ups recorded in Ops docs and exporter backlog (completed). | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Vndr.Msrc/TASKS.md | DONE (2025-10-15) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-MSRC-02-001 … 02-008 | Azure AD onboarding (02-008) unblocked fetch/parse/map pipeline; fixtures, telemetry/docs, and Offline Kit guidance published in `docs/ops/feedser-msrc-operations.md`. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Cve/TASKS.md | DONE (2025-10-15) | Team Connector Support & Monitoring | FEEDCONN-CVE-02-001 … 02-002 | CVE data-source selection, fetch pipeline, and docs landed 2025-10-10. 2025-10-15: smoke verified using the seeded mirror fallback; connector now logs a warning and pulls from `seed-data/cve/` until live CVE Services credentials arrive. | -| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Feedser.Source.Kev/TASKS.md | DONE (2025-10-12) | Team Connector Support & Monitoring | FEEDCONN-KEV-02-001 … 02-002 | KEV catalog ingestion, fixtures, telemetry, and schema validation completed 2025-10-12; ops dashboard published. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Normalization/TASKS.md | DONE (2025-10-12) | Team Normalization & Storage Backbone | FEEDNORM-NORM-02-001 | SemVer normalized rule emitter
`SemVerRangeRuleBuilder` shipped 2025-10-12 with comparator/`||` support and fixtures aligning to `FASTER_MODELING_AND_NORMALIZATION.md`. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-002 | Provenance decision reason persistence | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-02-003 | Normalized versions indexing
Indexes seeded + docs updated 2025-10-11 to cover flattened normalized rules for connector adoption. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDMERGE-ENGINE-02-002 | Normalized versions union & dedupe
Affected package resolver unions/dedupes normalized rules, stamps merge provenance with `decisionReason`, and tests cover the rollout. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-001 | GHSA normalized versions & provenance | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-004 | GHSA credits & ecosystem severity mapping | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-005 | GitHub quota monitoring & retries | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-006 | Production credential & scheduler rollout | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-GHSA-02-007 | Credit parity regression fixtures | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Nvd/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-002 | NVD normalized versions & timestamps | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Nvd/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-004 | NVD CVSS & CWE precedence payloads | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-NVD-02-005 | NVD merge/export parity regression | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-003 | OSV normalized versions & freshness | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-11) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-004 | OSV references & credits alignment | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-005 | Fixture updater workflow
Resolved 2025-10-12: OSV mapper now derives canonical PURLs for Go + scoped npm packages when raw payloads omit `purl`; conflict fixtures unchanged for invalid npm names. Verified via `dotnet test src/StellaOps.Concelier.Source.Osv.Tests`, `src/StellaOps.Concelier.Source.Ghsa.Tests`, `src/StellaOps.Concelier.Source.Nvd.Tests`, and backbone normalization/storage suites. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Acsc/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-ACSC-02-001 … 02-008 | Fetch→parse→map pipeline, fixtures, diagnostics, and README finished 2025-10-12; downstream export parity captured via FEEDEXPORT-JSON-04-001 / FEEDEXPORT-TRIVY-04-001 (completed). | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Cccs/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CCCS-02-001 … 02-008 | Observability meter, historical harvest plan, and DOM sanitizer refinements wrapped; ops notes live under `docs/ops/concelier-cccs-operations.md` with fixtures validating EN/FR list handling. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.CertBund/TASKS.md | DONE (2025-10-15) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CERTBUND-02-001 … 02-008 | Telemetry/docs (02-006) and history/locale sweep (02-007) completed alongside pipeline; runbook `docs/ops/concelier-certbund-operations.md` captures locale guidance and offline packaging. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Kisa/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-KISA-02-001 … 02-007 | Connector, tests, and telemetry/docs (02-006) finalized; localisation notes in `docs/dev/kisa_connector_notes.md` complete rollout. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ru.Bdu/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-RUBDU-02-001 … 02-008 | Fetch/parser/mapper refinements, regression fixtures, telemetry/docs, access options, and trusted root packaging all landed; README documents offline access strategy. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md | DONE (2025-10-13) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-NKCKI-02-001 … 02-008 | Listing fetch, parser, mapper, fixtures, telemetry/docs, and archive plan finished; Mongo2Go/libcrypto dependency resolved via bundled OpenSSL noted in ops guide. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Ics.Cisa/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-ICSCISA-02-001 … 02-011 | Feed parser attachment fixes, SemVer exact values, regression suites, telemetry/docs updates, and handover complete; ops runbook now details attachment verification + proxy usage. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Vndr.Cisco/TASKS.md | DONE (2025-10-14) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-CISCO-02-001 … 02-007 | OAuth fetch pipeline, DTO/mapping, tests, and telemetry/docs shipped; monitoring/export integration follow-ups recorded in Ops docs and exporter backlog (completed). | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Vndr.Msrc/TASKS.md | DONE (2025-10-15) | Team Connector Expansion – Regional & Vendor Feeds | FEEDCONN-MSRC-02-001 … 02-008 | Azure AD onboarding (02-008) unblocked fetch/parse/map pipeline; fixtures, telemetry/docs, and Offline Kit guidance published in `docs/ops/concelier-msrc-operations.md`. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Cve/TASKS.md | DONE (2025-10-15) | Team Connector Support & Monitoring | FEEDCONN-CVE-02-001 … 02-002 | CVE data-source selection, fetch pipeline, and docs landed 2025-10-10. 2025-10-15: smoke verified using the seeded mirror fallback; connector now logs a warning and pulls from `seed-data/cve/` until live CVE Services credentials arrive. | +| Sprint 2 | Connector & Data Implementation Wave | src/StellaOps.Concelier.Source.Kev/TASKS.md | DONE (2025-10-12) | Team Connector Support & Monitoring | FEEDCONN-KEV-02-001 … 02-002 | KEV catalog ingestion, fixtures, telemetry, and schema validation completed 2025-10-12; ops dashboard published. | | Sprint 2 | Connector & Data Implementation Wave | docs/TASKS.md | DONE (2025-10-11) | Team Docs & Knowledge Base | FEEDDOCS-DOCS-01-001 | Canonical schema docs refresh
Updated canonical schema + provenance guides with SemVer style, normalized version rules, decision reason change log, and migration notes. | -| Sprint 2 | Connector & Data Implementation Wave | docs/TASKS.md | DONE (2025-10-11) | Team Docs & Knowledge Base | FEEDDOCS-DOCS-02-001 | Feedser-SemVer Playbook
Published merge playbook covering mapper patterns, dedupe flow, indexes, and rollout checklist. | +| Sprint 2 | Connector & Data Implementation Wave | docs/TASKS.md | DONE (2025-10-11) | Team Docs & Knowledge Base | FEEDDOCS-DOCS-02-001 | Concelier-SemVer Playbook
Published merge playbook covering mapper patterns, dedupe flow, indexes, and rollout checklist. | | Sprint 2 | Connector & Data Implementation Wave | docs/TASKS.md | DONE (2025-10-11) | Team Docs & Knowledge Base | FEEDDOCS-DOCS-02-002 | Normalized versions query guide
Delivered Mongo index/query addendum with `$unwind` recipes, dedupe checks, and operational checklist.
Instructions to work:
DONE Read ./AGENTS.md and docs/AGENTS.md. Document every schema/index/query change produced in Sprint 1-2 leveraging ./src/FASTER_MODELING_AND_NORMALIZATION.md. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Core/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-03-001 | Canonical merger implementation
`CanonicalMerger` ships with freshness/tie-breaker logic, provenance, and unit coverage feeding Merge. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Core/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-03-002 | Field precedence and tie-breaker map
Field precedence tables and tie-breaker metrics wired into the canonical merge flow; docs/tests updated.
Instructions to work:
Read ./AGENTS.md and core AGENTS. Implement the conflict resolver exactly as specified in ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md, coordinating with Merge and Storage teammates. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-DATA-03-001 | Merge event provenance audit prep
Merge events now persist `fieldDecisions` and analytics-ready provenance snapshots. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill
Dual-write/backfill flag delivered; migration + options validated in tests. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-TESTS-02-004 | Restore AdvisoryStore build after normalized versions refactor
Storage tests adjusted for normalized versions/decision reasons.
Instructions to work:
Read ./AGENTS.md and storage AGENTS. Extend merge events with decision reasons and analytics views to support the conflict rules, and deliver the dual-write/backfill for `NormalizedVersions` + `decisionReason` so connectors can roll out safely. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-001 | GHSA/NVD/OSV conflict rules
Merge pipeline consumes `CanonicalMerger` output prior to precedence merge. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-002 | Override metrics instrumentation
Merge events capture per-field decisions; counters/logs align with conflict rules. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-003 | Reference & credit union pipeline
Canonical merge preserves unions with updated tests. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-QA-04-001 | End-to-end conflict regression suite
Added regression tests (`AdvisoryMergeServiceTests`) covering canonical + precedence flow.
Instructions to work:
Read ./AGENTS.md and merge AGENTS. Integrate the canonical merger, instrument metrics, and deliver comprehensive regression tests following ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md. | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-GHSA-04-002 | GHSA conflict regression fixtures | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-NVD-04-002 | NVD conflict regression fixtures | -| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-OSV-04-002 | OSV conflict regression fixtures
Instructions to work:
Read ./AGENTS.md and module AGENTS. Produce fixture triples supporting the precedence/tie-breaker paths defined in ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md and hand them to Merge QA. | -| Sprint 3 | Conflict Resolution Integration & Communications | docs/TASKS.md | DONE (2025-10-11) | Team Documentation Guild – Conflict Guidance | FEEDDOCS-DOCS-05-001 | Feedser Conflict Rules
Runbook published at `docs/ops/feedser-conflict-resolution.md`; metrics/log guidance aligned with Sprint 3 merge counters. | -| Sprint 3 | Conflict Resolution Integration & Communications | docs/TASKS.md | DONE (2025-10-16) | Team Documentation Guild – Conflict Guidance | FEEDDOCS-DOCS-05-002 | Conflict runbook ops rollout
Ops review completed, alert thresholds applied, and change log appended in `docs/ops/feedser-conflict-resolution.md`; task closed after connector signals verified. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Models/TASKS.md | DONE (2025-10-15) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-04-001 | Advisory schema parity (description/CWE/canonical metric)
Extend `Advisory` and related records with description text, CWE collection, and canonical metric pointer; refresh validation + serializer determinism tests. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Core/TASKS.md | DONE (2025-10-15) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-04-003 | Canonical merger parity for new fields
Teach `CanonicalMerger` to populate description, CWEResults, and canonical metric pointer with provenance + regression coverage. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Core/TASKS.md | DONE (2025-10-15) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-04-004 | Reference normalization & freshness instrumentation cleanup
Implement URL normalization for reference dedupe, align freshness-sensitive instrumentation, and add analytics tests. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-15) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-004 | Merge pipeline parity for new advisory fields
Ensure merge service + merge events surface description/CWE/canonical metric decisions with updated metrics/tests. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Merge/TASKS.md | DONE (2025-10-15) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-005 | Connector coordination for new advisory fields
GHSA/NVD/OSV connectors now ship description, CWE, and canonical metric data with refreshed fixtures; merge coordination log updated and exporters notified. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Exporter.Json/TASKS.md | DONE (2025-10-15) | Team Exporters – JSON | FEEDEXPORT-JSON-04-001 | Surface new advisory fields in JSON exporter
Update schemas/offline bundle + fixtures once model/core parity lands.
2025-10-15: `dotnet test src/StellaOps.Feedser.Exporter.Json.Tests` validated canonical metric/CWE emission. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Exporter.TrivyDb/TASKS.md | DONE (2025-10-15) | Team Exporters – Trivy DB | FEEDEXPORT-TRIVY-04-001 | Propagate new advisory fields into Trivy DB package
Extend Bolt builder, metadata, and regression tests for the expanded schema.
2025-10-15: `dotnet test src/StellaOps.Feedser.Exporter.TrivyDb.Tests` confirmed canonical metric/CWE propagation. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Source.Ghsa/TASKS.md | DONE (2025-10-16) | Team Connector Regression Fixtures | FEEDCONN-GHSA-04-004 | Harden CVSS fallback so canonical metric ids persist when GitHub omits vectors; extend fixtures and document severity precedence hand-off to Merge. | -| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Feedser.Source.Osv/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-04-005 | Map OSV advisories lacking CVSS vectors to canonical metric ids/notes and document CWE provenance quirks; schedule parity fixture updates. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Core/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-03-001 | Canonical merger implementation
`CanonicalMerger` ships with freshness/tie-breaker logic, provenance, and unit coverage feeding Merge. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Core/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-03-002 | Field precedence and tie-breaker map
Field precedence tables and tie-breaker metrics wired into the canonical merge flow; docs/tests updated.
Instructions to work:
Read ./AGENTS.md and core AGENTS. Implement the conflict resolver exactly as specified in ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md, coordinating with Merge and Storage teammates. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-DATA-03-001 | Merge event provenance audit prep
Merge events now persist `fieldDecisions` and analytics-ready provenance snapshots. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-DATA-02-001 | Normalized range dual-write + backfill
Dual-write/backfill flag delivered; migration + options validated in tests. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | DONE (2025-10-11) | Team Core Engine & Storage Analytics | FEEDSTORAGE-TESTS-02-004 | Restore AdvisoryStore build after normalized versions refactor
Storage tests adjusted for normalized versions/decision reasons.
Instructions to work:
Read ./AGENTS.md and storage AGENTS. Extend merge events with decision reasons and analytics views to support the conflict rules, and deliver the dual-write/backfill for `NormalizedVersions` + `decisionReason` so connectors can roll out safely. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-001 | GHSA/NVD/OSV conflict rules
Merge pipeline consumes `CanonicalMerger` output prior to precedence merge. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-002 | Override metrics instrumentation
Merge events capture per-field decisions; counters/logs align with conflict rules. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-003 | Reference & credit union pipeline
Canonical merge preserves unions with updated tests. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-QA-04-001 | End-to-end conflict regression suite
Added regression tests (`AdvisoryMergeServiceTests`) covering canonical + precedence flow.
Instructions to work:
Read ./AGENTS.md and merge AGENTS. Integrate the canonical merger, instrument metrics, and deliver comprehensive regression tests following ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md. | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-GHSA-04-002 | GHSA conflict regression fixtures | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Source.Nvd/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-NVD-04-002 | NVD conflict regression fixtures | +| Sprint 3 | Conflict Resolution Integration & Communications | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-OSV-04-002 | OSV conflict regression fixtures
Instructions to work:
Read ./AGENTS.md and module AGENTS. Produce fixture triples supporting the precedence/tie-breaker paths defined in ./src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md and hand them to Merge QA. | +| Sprint 3 | Conflict Resolution Integration & Communications | docs/TASKS.md | DONE (2025-10-11) | Team Documentation Guild – Conflict Guidance | FEEDDOCS-DOCS-05-001 | Concelier Conflict Rules
Runbook published at `docs/ops/concelier-conflict-resolution.md`; metrics/log guidance aligned with Sprint 3 merge counters. | +| Sprint 3 | Conflict Resolution Integration & Communications | docs/TASKS.md | DONE (2025-10-16) | Team Documentation Guild – Conflict Guidance | FEEDDOCS-DOCS-05-002 | Conflict runbook ops rollout
Ops review completed, alert thresholds applied, and change log appended in `docs/ops/concelier-conflict-resolution.md`; task closed after connector signals verified. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Models/TASKS.md | DONE (2025-10-15) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-04-001 | Advisory schema parity (description/CWE/canonical metric)
Extend `Advisory` and related records with description text, CWE collection, and canonical metric pointer; refresh validation + serializer determinism tests. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Core/TASKS.md | DONE (2025-10-15) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-04-003 | Canonical merger parity for new fields
Teach `CanonicalMerger` to populate description, CWEResults, and canonical metric pointer with provenance + regression coverage. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Core/TASKS.md | DONE (2025-10-15) | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-04-004 | Reference normalization & freshness instrumentation cleanup
Implement URL normalization for reference dedupe, align freshness-sensitive instrumentation, and add analytics tests. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-15) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-004 | Merge pipeline parity for new advisory fields
Ensure merge service + merge events surface description/CWE/canonical metric decisions with updated metrics/tests. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Merge/TASKS.md | DONE (2025-10-15) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-005 | Connector coordination for new advisory fields
GHSA/NVD/OSV connectors now ship description, CWE, and canonical metric data with refreshed fixtures; merge coordination log updated and exporters notified. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Exporter.Json/TASKS.md | DONE (2025-10-15) | Team Exporters – JSON | FEEDEXPORT-JSON-04-001 | Surface new advisory fields in JSON exporter
Update schemas/offline bundle + fixtures once model/core parity lands.
2025-10-15: `dotnet test src/StellaOps.Concelier.Exporter.Json.Tests` validated canonical metric/CWE emission. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Exporter.TrivyDb/TASKS.md | DONE (2025-10-15) | Team Exporters – Trivy DB | FEEDEXPORT-TRIVY-04-001 | Propagate new advisory fields into Trivy DB package
Extend Bolt builder, metadata, and regression tests for the expanded schema.
2025-10-15: `dotnet test src/StellaOps.Concelier.Exporter.TrivyDb.Tests` confirmed canonical metric/CWE propagation. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Source.Ghsa/TASKS.md | DONE (2025-10-16) | Team Connector Regression Fixtures | FEEDCONN-GHSA-04-004 | Harden CVSS fallback so canonical metric ids persist when GitHub omits vectors; extend fixtures and document severity precedence hand-off to Merge. | +| Sprint 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Source.Osv/TASKS.md | DONE (2025-10-16) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-04-005 | Map OSV advisories lacking CVSS vectors to canonical metric ids/notes and document CWE provenance quirks; schedule parity fixture updates. | | Sprint 5 | Excititor Core Foundations | src/StellaOps.Excititor.Core/TASKS.md | DONE (2025-10-15) | Team Excititor Core & Policy | EXCITITOR-CORE-01-001 | Stand up canonical VEX claim/consensus records with deterministic serializers so Storage/Exports share a stable contract. | | Sprint 5 | Excititor Core Foundations | src/StellaOps.Excititor.Core/TASKS.md | DONE (2025-10-15) | Team Excititor Core & Policy | EXCITITOR-CORE-01-002 | Implement trust-weighted consensus resolver with baseline policy weights, justification gates, telemetry output, and majority/tie handling. | | Sprint 5 | Excititor Core Foundations | src/StellaOps.Excititor.Core/TASKS.md | DONE (2025-10-15) | Team Excititor Core & Policy | EXCITITOR-CORE-01-003 | Publish shared connector/exporter/attestation abstractions and deterministic query signature utilities for cache/attestation workflows. | @@ -147,10 +147,10 @@ | Sprint 7 | Contextual Truth Foundations | src/StellaOps.Excititor.Attestation/TASKS.md | DONE (2025-10-16) | Team Excititor Attestation | EXCITITOR-ATTEST-01-002 | Rekor v2 client integration – ship transparency log client with retries and offline queue. | | Sprint 7 | Contextual Truth Foundations | src/StellaOps.Excititor.Worker/TASKS.md | TODO | Team Excititor Worker | EXCITITOR-WORKER-01-004 | TTL refresh & stability damper – schedule re-resolve loops and guard against status flapping. | | Sprint 7 | Contextual Truth Foundations | src/StellaOps.Excititor.Export/TASKS.md | TODO | Team Excititor Export | EXCITITOR-EXPORT-01-005 | Score & resolve envelope surfaces – include signed consensus/score artifacts in exports. | -| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Feedser.Core/TASKS.md | TODO | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-07-001 | Advisory event log & asOf queries – surface immutable statements and replay capability. | -| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Feedser.Core/TASKS.md | TODO | Team Core Engine & Data Science | FEEDCORE-ENGINE-07-002 | Noise prior computation service – learn false-positive priors and expose deterministic summaries. | -| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | TODO | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-07-001 | Advisory statement & conflict collections – provision Mongo schema/indexes for event-sourced merge. | -| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Feedser.Merge/TASKS.md | TODO | BE-Merge | FEEDMERGE-ENGINE-07-001 | Conflict sets & explainers – persist conflict materialization and replay hashes for merge decisions. | -| Sprint 8 | Mongo strengthening | src/StellaOps.Feedser.Storage.Mongo/TASKS.md | TODO | Team Normalization & Storage Backbone | FEEDSTORAGE-MONGO-08-001 | Causal-consistent Feedser storage sessions
Ensure `AddMongoStorage` registers a scoped session facilitator (causal consistency + majority concerns), update repositories to accept optional session handles, and add integration coverage proving read-your-write and monotonic reads across a replica set/election scenario. | +| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Concelier.Core/TASKS.md | TODO | Team Core Engine & Storage Analytics | FEEDCORE-ENGINE-07-001 | Advisory event log & asOf queries – surface immutable statements and replay capability. | +| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Concelier.Core/TASKS.md | TODO | Team Core Engine & Data Science | FEEDCORE-ENGINE-07-002 | Noise prior computation service – learn false-positive priors and expose deterministic summaries. | +| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | TODO | Team Normalization & Storage Backbone | FEEDSTORAGE-DATA-07-001 | Advisory statement & conflict collections – provision Mongo schema/indexes for event-sourced merge. | +| Sprint 7 | Contextual Truth Foundations | src/StellaOps.Concelier.Merge/TASKS.md | TODO | BE-Merge | FEEDMERGE-ENGINE-07-001 | Conflict sets & explainers – persist conflict materialization and replay hashes for merge decisions. | +| Sprint 8 | Mongo strengthening | src/StellaOps.Concelier.Storage.Mongo/TASKS.md | TODO | Team Normalization & Storage Backbone | FEEDSTORAGE-MONGO-08-001 | Causal-consistent Concelier storage sessions
Ensure `AddMongoStorage` registers a scoped session facilitator (causal consistency + majority concerns), update repositories to accept optional session handles, and add integration coverage proving read-your-write and monotonic reads across a replica set/election scenario. | | Sprint 8 | Mongo strengthening | src/StellaOps.Authority/TASKS.md | TODO | Authority Core & Storage Guild | AUTHSTORAGE-MONGO-08-001 | Harden Authority Mongo usage
Introduce scoped MongoDB sessions with `writeConcern`/`readConcern` majority defaults, flow the session through stores used in mutations + follow-up reads, and document middleware pattern for web/API & GraphQL layers. | | Sprint 8 | Mongo strengthening | src/StellaOps.Excititor.Storage.Mongo/TASKS.md | TODO | Team Excititor Storage | EXCITITOR-STORAGE-MONGO-08-001 | Causal consistency for Excititor repositories
Register Mongo options with majority defaults, push session-aware overloads through raw/export/consensus/cache stores, and extend migration/tests to validate causal reads after writes (including GridFS-backed content) under replica-set failover. | diff --git a/TODOS.md b/TODOS.md index fc6f4d21..7f27bef3 100644 --- a/TODOS.md +++ b/TODOS.md @@ -4,7 +4,7 @@ |FEEDCONN-CERTCC-02-005 Deterministic fixtures/tests|DONE (2025-10-11)|Snapshot regression for summary/detail fetch landed; fixtures regenerate via `UPDATE_CERTCC_FIXTURES`.| |FEEDCONN-CERTCC-02-008 Snapshot coverage handoff|DONE (2025-10-11)|Fixtures + README guidance shipped; QA can rerun with `UPDATE_CERTCC_FIXTURES=1` and share recorded-request diff with Merge.| |FEEDCONN-CERTCC-02-007 Connector test harness remediation|DONE (2025-10-11)|Harness now resets time provider, wires Source.Common, and verifies VINCE canned responses across fetch→parse→map.| -|FEEDCONN-CERTCC-02-009 Detail/map reintegration plan|DONE (2025-10-11)|Plan published in `src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md`; outlines staged enablement + rollback.| +|FEEDCONN-CERTCC-02-009 Detail/map reintegration plan|DONE (2025-10-11)|Plan published in `src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md`; outlines staged enablement + rollback.| # Connector Apple Status | Task | Status | Notes | diff --git a/docs/07_HIGH_LEVEL_ARCHITECTURE.md b/docs/07_HIGH_LEVEL_ARCHITECTURE.md index 32e743e1..cd6d0b6b 100755 --- a/docs/07_HIGH_LEVEL_ARCHITECTURE.md +++ b/docs/07_HIGH_LEVEL_ARCHITECTURE.md @@ -36,7 +36,7 @@ It **absorbs** all content from `components.md` so you have a single, authoritat | **Scanner.Worker** | `stellaops/scanner-worker` | Runs analyzers (OS, Lang: Java/Node/Python/Go/.NET/Rust, Native ELF/PE/Mach‑O, EntryTrace); emits per‑layer SBOMs and composes image SBOMs. | Horizontal; queue‑driven; sharded by layer digest. | | **Scanner.Sbomer.BuildXPlugin** | `stellaops/sbom-indexer` | BuildKit **generator** for build‑time SBOMs as OCI **referrers**. | CI‑side; ephemeral. | | **Scanner.Sbomer.DockerImage** | `stellaops/scanner-cli` | CLI‑orchestrated scanner container for post‑build scans. | Local/CI; ephemeral. | -| **Feedser.WebService** | `stellaops/feedser-web` | Vulnerability ingest/normalize/merge/export (JSON + Trivy DB). | HA via Mongo locks. | +| **Concelier.WebService** | `stellaops/concelier-web` | Vulnerability ingest/normalize/merge/export (JSON + Trivy DB). | HA via Mongo locks. | | **Excititor.WebService** | `stellaops/excititor-web` | VEX ingest/normalize/consensus; conflict retention; exports. | HA via Mongo locks. | | **Policy Engine** | (in `scanner-web`) | YAML DSL evaluator (waivers, vendor preferences, KEV/EPSS, license, usage‑gating); produces **policy digest**. | In‑process; cache per digest. | | **Signer** | `stellaops/signer` | **Hard gate:** validates entitlement + release integrity; mints signing cert (Fulcio keyless) or uses KMS; signs DSSE. | Stateless; HPA by QPS. | @@ -71,7 +71,7 @@ flowchart LR Auth[Authority (OIDC)\nOpTok (DPoP/mTLS)] SW[Scanner.WebService] WK[Scanner.Worker xN] - FEED[Feedser] + FEED[Concelier] VEX[Excititor] POL[Policy Engine (in Scanner.Web)] SGN[Signer\n(entitlement + signing)] @@ -177,7 +177,7 @@ LS --> IA: PoE (mTLS client cert or JWT with cnf=K_inst), CRL/OCSP/introspect ## 4) Backend evaluation (decider) -### 4.1 Feedser (advisories) +### 4.1 Concelier (advisories) * Ingests vendor, distro, OSS feeds; normalizes & merges; persists canonical advisories in Mongo; exports **deterministic JSON** and **Trivy DB**. * Offline kit bundles for air‑gapped sites. @@ -194,7 +194,7 @@ LS --> IA: PoE (mTLS client cert or JWT with cnf=K_inst), CRL/OCSP/introspect ### 4.4 PASS/FAIL flow -1. SBOM (Inventory / Usage) → join with **Feedser** advisories. +1. SBOM (Inventory / Usage) → join with **Concelier** advisories. 2. Apply **Excititor** consensus (statuses & justifications). 3. Apply **Policy**; compute PASS/FAIL with waiver TTLs. 4. Sign the **final report** (DSSE via **Signer**) and log to **Rekor v2** via **Attestor**. @@ -349,9 +349,9 @@ services: image: stellaops/scanner-worker deploy: { replicas: 4 } depends_on: [scanner-web] - feedser: { image: stellaops/feedser-web, depends_on: [mongo] } + concelier: { image: stellaops/concelier-web, depends_on: [mongo] } excititor: { image: stellaops/excititor-web, depends_on: [mongo] } - ui: { image: stellaops/ui, depends_on: [scanner-web, feedser, excititor] } + ui: { image: stellaops/ui, depends_on: [scanner-web, concelier, excititor] } ``` * **Backups:** Mongo dumps; MinIO versioned buckets & replication; Rekor v2 DB snapshots; JWKS/Fulcio/KMS key rotation. diff --git a/docs/09_API_CLI_REFERENCE.md b/docs/09_API_CLI_REFERENCE.md index 564ae818..23c5ee3a 100755 --- a/docs/09_API_CLI_REFERENCE.md +++ b/docs/09_API_CLI_REFERENCE.md @@ -200,7 +200,7 @@ Returns `202 Accepted` and `Location: /attest/{id}` for async verify. ## 3 StellaOps CLI (`stellaops-cli`) -The new CLI is built on **System.CommandLine 2.0.0‑beta5** and mirrors the Feedser backend REST API. +The new CLI is built on **System.CommandLine 2.0.0‑beta5** and mirrors the Concelier backend REST API. Configuration follows the same precedence chain everywhere: 1. Environment variables (e.g. `API_KEY`, `STELLAOPS_BACKEND_URL`, `StellaOps:ApiKey`) @@ -250,7 +250,7 @@ When running on an interactive terminal without explicit override flags, the CLI - Downloads are verified against the `X-StellaOps-Digest` header (SHA-256). When `StellaOps:ScannerSignaturePublicKeyPath` points to a PEM-encoded RSA key, the optional `X-StellaOps-Signature` header is validated as well. - Metadata for each bundle is written alongside the artefact (`*.metadata.json`) with digest, signature, source URL, and timestamps. - Retry behaviour is controlled via `StellaOps:ScannerDownloadAttempts` (default **3** with exponential backoff). -- Successful `scan run` executions create timestamped JSON artefacts inside `ResultsDirectory` plus a `scan-run-*.json` metadata envelope documenting the runner, arguments, timing, and stdout/stderr. The artefact is posted back to Feedser automatically. +- Successful `scan run` executions create timestamped JSON artefacts inside `ResultsDirectory` plus a `scan-run-*.json` metadata envelope documenting the runner, arguments, timing, and stdout/stderr. The artefact is posted back to Concelier automatically. #### Trivy DB export metadata (`metadata.json`) @@ -265,18 +265,18 @@ When running on an interactive terminal without explicit override flags, the CLI | `treeDigest` | string | Canonical SHA-256 digest of the JSON tree used to build the database. | | `treeBytes` | number | Total bytes across exported JSON files. | | `advisoryCount` | number | Count of advisories included in the export. | -| `exporterVersion` | string | Version stamp of `StellaOps.Feedser.Exporter.TrivyDb`. | +| `exporterVersion` | string | Version stamp of `StellaOps.Concelier.Exporter.TrivyDb`. | | `builder` | object? | Raw metadata emitted by `trivy-db build` (version, update cadence, etc.). | | `delta.changedFiles[]` | array | Present when `mode = delta`. Each entry lists `{ "path": "", "length": , "digest": "sha256:..." }`. | | `delta.removedPaths[]` | array | Paths that existed in the previous manifest but were removed in the new run. | When the planner opts for a delta run, the exporter copies unmodified blobs from the baseline layout identified by `baseManifestDigest`. Consumers that cache OCI blobs only need to fetch the `changedFiles` and the new manifest/metadata unless `resetBaseline` is true. -When pushing to ORAS, set `feedser:exporters:trivyDb:oras:publishFull` / `publishDelta` to control whether full or delta runs are copied to the registry. Offline bundles follow the analogous `includeFull` / `includeDelta` switches under `offlineBundle`. +When pushing to ORAS, set `concelier:exporters:trivyDb:oras:publishFull` / `publishDelta` to control whether full or delta runs are copied to the registry. Offline bundles follow the analogous `includeFull` / `includeDelta` switches under `offlineBundle`. Example configuration (`appsettings.yaml`): ```yaml -feedser: +concelier: exporters: trivyDb: oras: @@ -293,7 +293,7 @@ feedser: **Authentication** - API key is sent as `Authorization: Bearer ` automatically when configured. -- Anonymous operation is permitted only when Feedser runs with +- Anonymous operation is permitted only when Concelier runs with `authority.allowAnonymousFallback: true`. This flag is temporary—plan to disable it before **2025-12-31 UTC** so bearer tokens become mandatory. @@ -303,7 +303,7 @@ Authority-backed auth workflow: 3. Execute CLI commands as normal—the backend client injects the cached bearer token automatically and retries on transient 401/403 responses with operator guidance. 4. Inspect the cache with `stellaops-cli auth status` (shows expiry, scope, mode) or clear it via `stellaops-cli auth logout`. 5. Run `stellaops-cli auth whoami` to dump token subject, audience, issuer, scopes, and remaining lifetime (verbose mode prints additional claims). -6. Expect Feedser to emit audit logs for each `/jobs*` request showing `subject`, +6. Expect Concelier to emit audit logs for each `/jobs*` request showing `subject`, `clientId`, `scopes`, `status`, and whether network bypass rules were applied. Tokens live in `~/.stellaops/tokens` unless `StellaOps:Authority:TokenCacheDirectory` overrides it. Cached tokens are reused offline until they expire; the CLI surfaces clear errors if refresh fails. @@ -314,7 +314,7 @@ Tokens live in `~/.stellaops/tokens` unless `StellaOps:Authority:TokenCacheDirec { "StellaOps": { "ApiKey": "your-api-token", - "BackendUrl": "https://feedser.example.org", + "BackendUrl": "https://concelier.example.org", "ScannerCacheDirectory": "scanners", "ResultsDirectory": "results", "DefaultRunner": "docker", @@ -322,11 +322,11 @@ Tokens live in `~/.stellaops/tokens` unless `StellaOps:Authority:TokenCacheDirec "ScannerDownloadAttempts": 3, "Authority": { "Url": "https://authority.example.org", - "ClientId": "feedser-cli", + "ClientId": "concelier-cli", "ClientSecret": "REDACTED", "Username": "", "Password": "", - "Scope": "feedser.jobs.trigger", + "Scope": "concelier.jobs.trigger", "TokenCacheDirectory": "" } } diff --git a/docs/10_FEEDSER_CLI_QUICKSTART.md b/docs/10_CONCELIER_CLI_QUICKSTART.md similarity index 83% rename from docs/10_FEEDSER_CLI_QUICKSTART.md rename to docs/10_CONCELIER_CLI_QUICKSTART.md index 7283d6d8..25cc2993 100644 --- a/docs/10_FEEDSER_CLI_QUICKSTART.md +++ b/docs/10_CONCELIER_CLI_QUICKSTART.md @@ -1,6 +1,6 @@ -# 10 · Feedser + CLI Quickstart +# 10 · Concelier + CLI Quickstart -This guide walks through configuring the Feedser web service and the `stellaops-cli` +This guide walks through configuring the Concelier web service and the `stellaops-cli` tool so an operator can ingest advisories, merge them, and publish exports from a single workstation. It focuses on deployment-facing surfaces only (configuration, runtime wiring, CLI usage) and leaves connector/internal customization for later. @@ -16,39 +16,39 @@ runtime wiring, CLI usage) and leaves connector/internal customization for later - Optional: Docker/Podman runtime if you plan to run scanners locally > **Tip** – air-gapped installs should preload `trivy-db` and `oras` binaries into the -> runner image since Feedser never fetches them dynamically. +> runner image since Concelier never fetches them dynamically. --- -## 1 · Configure Feedser +## 1 · Configure Concelier 1. Copy the sample config to the expected location (CI/CD pipelines can stamp values into this file during deployment—see the “Deployment automation” note below): ```bash mkdir -p etc - cp etc/feedser.yaml.sample etc/feedser.yaml + cp etc/concelier.yaml.sample etc/concelier.yaml ``` -2. Edit `etc/feedser.yaml` and update the MongoDB DSN (and optional database name). +2. Edit `etc/concelier.yaml` and update the MongoDB DSN (and optional database name). The default template configures plug-in discovery to look in `PluginBinaries/` and disables remote telemetry exporters by default. 3. (Optional) Override settings via environment variables. All keys are prefixed with - `FEEDSER_`. Example: + `CONCELIER_`. Example: ```bash - export FEEDSER_STORAGE__DSN="mongodb://user:pass@mongo:27017/feedser" - export FEEDSER_TELEMETRY__ENABLETRACING=false + export CONCELIER_STORAGE__DSN="mongodb://user:pass@mongo:27017/concelier" + export CONCELIER_TELEMETRY__ENABLETRACING=false ``` 4. Start the web service from the repository root: ```bash - dotnet run --project src/StellaOps.Feedser.WebService + dotnet run --project src/StellaOps.Concelier.WebService ``` - On startup Feedser validates the options, boots MongoDB indexes, loads plug-ins, + On startup Concelier validates the options, boots MongoDB indexes, loads plug-ins, and exposes: - `GET /health` – returns service status and telemetry settings @@ -90,7 +90,7 @@ defaults live in `src/StellaOps.Cli/appsettings.json` and expect overrides at ru | Setting | Environment variable | Default | Purpose | | ------- | -------------------- | ------- | ------- | -| `BackendUrl` | `STELLAOPS_BACKEND_URL` | _empty_ | Base URL of the Feedser web service | +| `BackendUrl` | `STELLAOPS_BACKEND_URL` | _empty_ | Base URL of the Concelier web service | | `ApiKey` | `API_KEY` | _empty_ | Reserved for legacy key auth; leave empty when using Authority | | `ScannerCacheDirectory` | `STELLAOPS_SCANNER_CACHE_DIRECTORY` | `scanners` | Local cache folder | | `ResultsDirectory` | `STELLAOPS_RESULTS_DIRECTORY` | `results` | Where scan outputs are written | @@ -99,7 +99,7 @@ defaults live in `src/StellaOps.Cli/appsettings.json` and expect overrides at ru | `Authority.ClientSecret` | `STELLAOPS_AUTHORITY_CLIENT_SECRET` | _empty_ | Client secret (omit when using username/password grant) | | `Authority.Username` | `STELLAOPS_AUTHORITY_USERNAME` | _empty_ | Username for password grant flows | | `Authority.Password` | `STELLAOPS_AUTHORITY_PASSWORD` | _empty_ | Password for password grant flows | -| `Authority.Scope` | `STELLAOPS_AUTHORITY_SCOPE` | `feedser.jobs.trigger` | OAuth scope requested for backend operations | +| `Authority.Scope` | `STELLAOPS_AUTHORITY_SCOPE` | `concelier.jobs.trigger` | OAuth scope requested for backend operations | | `Authority.TokenCacheDirectory` | `STELLAOPS_AUTHORITY_TOKEN_CACHE_DIR` | `~/.stellaops/tokens` | Directory that persists cached tokens | | `Authority.Resilience.EnableRetries` | `STELLAOPS_AUTHORITY_ENABLE_RETRIES` | `true` | Toggle Polly retry handler for Authority HTTP calls | | `Authority.Resilience.RetryDelays` | `STELLAOPS_AUTHORITY_RETRY_DELAYS` | `1s,2s,5s` | Comma- or space-separated backoff delays (hh:mm:ss) | @@ -112,7 +112,7 @@ Example bootstrap: export STELLAOPS_BACKEND_URL="http://localhost:5000" export STELLAOPS_RESULTS_DIRECTORY="$HOME/.stellaops/results" export STELLAOPS_AUTHORITY_URL="https://authority.local" -export STELLAOPS_AUTHORITY_CLIENT_ID="feedser-cli" +export STELLAOPS_AUTHORITY_CLIENT_ID="concelier-cli" export STELLAOPS_AUTHORITY_CLIENT_SECRET="s3cr3t" dotnet run --project src/StellaOps.Cli -- db merge @@ -161,7 +161,7 @@ rely on environment variables for ephemeral runners. dotnet run --project src/StellaOps.Cli -- db export --format trivy-db --delta ``` - Feedser always produces a deterministic OCI layout. The first run after a clean + Concelier always produces a deterministic OCI layout. The first run after a clean bootstrap emits a **full** baseline; subsequent `--delta` runs reuse the previous baseline’s blobs when only JSON manifests change. If the exporter detects that a prior delta is still active (i.e., `LastDeltaDigest` is recorded) it automatically @@ -175,7 +175,7 @@ rely on environment variables for ephemeral runners. while reusing the previous layer blob. ```bash - export_root=${FEEDSER_EXPORT_ROOT:-exports/trivy} + export_root=${CONCELIER_EXPORT_ROOT:-exports/trivy} base=$(ls -1d "$export_root"/* | sort | tail -n2 | head -n1) delta=$(ls -1d "$export_root"/* | sort | tail -n1) @@ -209,10 +209,10 @@ a problem document. ## 4 · Verification Checklist -- Feedser `/health` returns `"status":"healthy"` and Storage bootstrap is marked +- Concelier `/health` returns `"status":"healthy"` and Storage bootstrap is marked complete after startup. - CLI commands return HTTP 202 with a `Location` header (job tracking URL) when - triggering Feedser jobs. + triggering Concelier jobs. - Export artefacts are materialised under the configured output directories and their manifests record digests. - MongoDB contains the expected `document`, `dto`, `advisory`, and `export_state` @@ -222,7 +222,7 @@ a problem document. ## 5 · Deployment Automation -- Treat `etc/feedser.yaml.sample` as the canonical template. CI/CD should copy it to +- Treat `etc/concelier.yaml.sample` as the canonical template. CI/CD should copy it to the deployment artifact and replace placeholders (DSN, telemetry endpoints, cron overrides) with environment-specific secrets. - Keep secret material (Mongo credentials, OTLP tokens) outside of the repository; @@ -238,15 +238,15 @@ a problem document. `authority.enabled: true` while keeping `authority.allowAnonymousFallback: true` to observe logs, then flip it to `false` before 2025-12-31 UTC to enforce tokens. - Automate the workflow above via CI/CD (compose stack or Kubernetes CronJobs). -- Pair with the Feedser connector teams when enabling additional sources so their +- Pair with the Concelier connector teams when enabling additional sources so their module-specific requirements are pulled in safely. --- ## 6 · Authority Integration -- Feedser now authenticates callers through StellaOps Authority using OAuth 2.0 - resource server flows. Populate the `authority` block in `feedser.yaml`: +- Concelier now authenticates callers through StellaOps Authority using OAuth 2.0 + resource server flows. Populate the `authority` block in `concelier.yaml`: ```yaml authority: @@ -254,20 +254,20 @@ a problem document. allowAnonymousFallback: false # keep true only during the staged rollout window issuer: "https://authority.example.org" audiences: - - "api://feedser" + - "api://concelier" requiredScopes: - - "feedser.jobs.trigger" - clientId: "feedser-jobs" - clientSecretFile: "../secrets/feedser-jobs.secret" + - "concelier.jobs.trigger" + clientId: "concelier-jobs" + clientSecretFile: "../secrets/concelier-jobs.secret" clientScopes: - - "feedser.jobs.trigger" + - "concelier.jobs.trigger" bypassNetworks: - "127.0.0.1/32" - "::1/128" ``` - Store the client secret outside of source control. Either provide it via - `authority.clientSecret` (environment variable `FEEDSER_AUTHORITY__CLIENTSECRET`) + `authority.clientSecret` (environment variable `CONCELIER_AUTHORITY__CLIENTSECRET`) or point `authority.clientSecretFile` to a file mounted at runtime. - Cron jobs running on the same host can keep using the API thanks to the loopback bypass mask. Add additional CIDR ranges as needed; every bypass is logged. @@ -275,15 +275,15 @@ a problem document. variables such as: ```bash - export FEEDSER_AUTHORITY__ENABLED=true - export FEEDSER_AUTHORITY__ALLOWANONYMOUSFALLBACK=false - export FEEDSER_AUTHORITY__ISSUER="https://authority.example.org" - export FEEDSER_AUTHORITY__CLIENTID="feedser-jobs" - export FEEDSER_AUTHORITY__CLIENTSECRETFILE="/var/run/secrets/feedser/authority-client" + export CONCELIER_AUTHORITY__ENABLED=true + export CONCELIER_AUTHORITY__ALLOWANONYMOUSFALLBACK=false + export CONCELIER_AUTHORITY__ISSUER="https://authority.example.org" + export CONCELIER_AUTHORITY__CLIENTID="concelier-jobs" + export CONCELIER_AUTHORITY__CLIENTSECRETFILE="/var/run/secrets/concelier/authority-client" ``` - CLI commands already pass `Authorization` headers when credentials are supplied. Configure the CLI with matching Authority settings (`docs/09_API_CLI_REFERENCE.md`) - so that automation can obtain tokens with the same client credentials. Feedser + so that automation can obtain tokens with the same client credentials. Concelier logs every job request with the client ID, subject (if present), scopes, and a `bypass` flag so operators can audit cron traffic. diff --git a/docs/11_AUTHORITY.md b/docs/11_AUTHORITY.md index 3fad4471..9cd379b5 100644 --- a/docs/11_AUTHORITY.md +++ b/docs/11_AUTHORITY.md @@ -3,14 +3,14 @@ > **Status:** Drafted 2025-10-12 (CORE5B.DOC / DOC1.AUTH) – aligns with Authority revocation store, JWKS rotation, and bootstrap endpoints delivered in Sprint 1. ## 1. Purpose -The **StellaOps Authority** service issues OAuth2/OIDC tokens for every StellaOps module (Feedser, Backend, Agent, Zastava) and exposes the policy controls required in sovereign/offline environments. Authority is built as a minimal ASP.NET host that: +The **StellaOps Authority** service issues OAuth2/OIDC tokens for every StellaOps module (Concelier, Backend, Agent, Zastava) and exposes the policy controls required in sovereign/offline environments. Authority is built as a minimal ASP.NET host that: - brokers password, client-credentials, and device-code flows through pluggable identity providers; - persists access/refresh/device tokens in MongoDB with deterministic schemas for replay analysis and air-gapped audit copies; - distributes revocation bundles and JWKS material so downstream services can enforce lockouts without direct database access; - offers bootstrap APIs for first-run provisioning and key rotation without redeploying binaries. -Authority is deployed alongside Feedser in air-gapped environments and never requires outbound internet access. All trusted metadata (OpenIddict discovery, JWKS, revocation bundles) is cacheable, signed, and reproducible. +Authority is deployed alongside Concelier in air-gapped environments and never requires outbound internet access. All trusted metadata (OpenIddict discovery, JWKS, revocation bundles) is cacheable, signed, and reproducible. ## 2. Component Architecture Authority is composed of five cooperating subsystems: @@ -46,7 +46,7 @@ Authority persists every issued token in MongoDB so operators can audit or revok - **Expiry maintenance:** `AuthorityTokenStore.DeleteExpiredAsync` prunes non-revoked tokens past their `expiresAt` timestamp. Operators should schedule this in maintenance windows if large volumes of tokens are issued. ### Expectations for resource servers -Resource servers (Feedser WebService, Backend, Agent) **must not** assume in-memory caches are authoritative. They should: +Resource servers (Concelier WebService, Backend, Agent) **must not** assume in-memory caches are authoritative. They should: - cache `/jwks` and `/revocations/export` responses within configured lifetimes; - honour `revokedReason` metadata when shaping audit trails; @@ -73,7 +73,7 @@ Authority centralises revocation in `authority_revocations` with deterministic c **Consumer guidance:** -1. Mirror `revocation-bundle.json*` alongside Feedser exports. Offline agents fetch both over the existing update channel. +1. Mirror `revocation-bundle.json*` alongside Concelier exports. Offline agents fetch both over the existing update channel. 2. Use bundle `sequence` and `bundleId` to detect replay or monotonicity regressions. Ignore bundles with older sequence numbers unless `bundleId` changes and `issuedAt` advances. 3. Treat `revokedReason` taxonomy as machine-friendly codes (`compromised`, `rotation`, `policy`, `lifecycle`). Translating to human-readable logs is the consumer’s responsibility. @@ -154,7 +154,7 @@ All administrative calls emit `AuthEventRecord` entries enriched with correlatio ## 9. Operational Checklist - [ ] Protect the bootstrap API key and disable bootstrap endpoints (`bootstrap.enabled: false`) once initial setup is complete. -- [ ] Schedule `stella auth revoke export` (or `/internal/revocations/export`) at the same cadence as Feedser exports so bundles remain in lockstep. +- [ ] Schedule `stella auth revoke export` (or `/internal/revocations/export`) at the same cadence as Concelier exports so bundles remain in lockstep. - [ ] Rotate signing keys before expiration; keep at least one retired key until all cached bundles/tokens signed with it have expired. - [ ] Monitor `/health` and `/ready` plus rate-limiter metrics to detect plugin outages early. - [ ] Ensure downstream services cache JWKS and revocation bundles within tolerances; stale caches risk accepting revoked tokens. diff --git a/docs/13_SECURITY_POLICY.md b/docs/13_SECURITY_POLICY.md index 1956a68d..f74c380c 100755 --- a/docs/13_SECURITY_POLICY.md +++ b/docs/13_SECURITY_POLICY.md @@ -81,7 +81,7 @@ cosign verify \ ## 5 · Private‑feed mirrors 🌐 -The **Feedser (vulnerability ingest/merge/export service)** provides signed JSON and Trivy DB snapshots that merge: +The **Concelier (vulnerability ingest/merge/export service)** provides signed JSON and Trivy DB snapshots that merge: * OSV + GHSA * (optional) NVD 2.0, CNNVD, CNVD, ENISA, JVN and BDU regionals diff --git a/docs/14_GLOSSARY_OF_TERMS.md b/docs/14_GLOSSARY_OF_TERMS.md index 300c0ade..d16782c2 100755 --- a/docs/14_GLOSSARY_OF_TERMS.md +++ b/docs/14_GLOSSARY_OF_TERMS.md @@ -20,7 +20,7 @@ open a PR and append it alphabetically.* | **ADR** | *Architecture Decision Record* – lightweight Markdown file that captures one irreversible design decision. | ADR template lives at `/docs/adr/` | | **AIRE** | *AI Risk Evaluator* – optional Plus/Pro plug‑in that suggests mute rules using an ONNX model. | Commercial feature | | **Azure‑Pipelines** | CI/CD service in Microsoft Azure DevOps. | Recipe in Pipeline Library | -| **BDU** | Russian (FSTEC) national vulnerability database: *База данных уязвимостей*. | Merged with NVD by Feedser (vulnerability ingest/merge/export service) | +| **BDU** | Russian (FSTEC) national vulnerability database: *База данных уязвимостей*. | Merged with NVD by Concelier (vulnerability ingest/merge/export service) | | **BuildKit** | Modern Docker build engine with caching and concurrency. | Needed for layer cache patterns | | **CI** | *Continuous Integration* – automated build/test pipeline. | Stella integrates via CLI | | **Cosign** | Open‑source Sigstore tool that signs & verifies container images **and files**. | Images & OUK tarballs | @@ -36,7 +36,7 @@ open a PR and append it alphabetically.* | **Digest (image)** | SHA‑256 hash uniquely identifying a container image or layer. | Pin digests for reproducible builds | | **Docker‑in‑Docker (DinD)** | Running Docker daemon inside a CI container. | Used in GitHub / GitLab recipes | | **DTO** | *Data Transfer Object* – C# record serialised to JSON. | Schemas in doc 11 | -| **Feedser** | Vulnerability ingest/merge/export service consolidating OVN, GHSA, NVD 2.0, CNNVD, CNVD, ENISA, JVN and BDU feeds into the canonical MongoDB store and export artifacts. | Cron default `0 1 * * *` | +| **Concelier** | Vulnerability ingest/merge/export service consolidating OVN, GHSA, NVD 2.0, CNNVD, CNVD, ENISA, JVN and BDU feeds into the canonical MongoDB store and export artifacts. | Cron default `0 1 * * *` | | **FSTEC** | Russian regulator issuing SOBIT certificates. | Pro GA target | | **Gitea** | Self‑hosted Git service – mirrors GitHub repo. | OSS hosting | | **GOST TLS** | TLS cipher‑suites defined by Russian GOST R 34.10‑2012 / 34.11‑2012. | Provided by `OpenSslGost` or CryptoPro | diff --git a/docs/17_SECURITY_HARDENING_GUIDE.md b/docs/17_SECURITY_HARDENING_GUIDE.md index 9b95eaa6..355f4c0d 100755 --- a/docs/17_SECURITY_HARDENING_GUIDE.md +++ b/docs/17_SECURITY_HARDENING_GUIDE.md @@ -145,28 +145,28 @@ cosign verify ghcr.io/stellaops/backend@sha256: \ | Audit events | Redis stream audit; export daily to SIEM | | Alert rules | Feed age  ≥ 48 h, P95 wall‑time > 5 s, Redis used memory > 75 % | -###  7.1 Feedser authorization audits +###  7.1 Concelier authorization audits -- Enable the Authority integration for Feedser (`authority.enabled=true`). Keep +- Enable the Authority integration for Concelier (`authority.enabled=true`). Keep `authority.allowAnonymousFallback` set to `true` only during migration and plan to disable it before **2025-12-31 UTC** so the `/jobs*` surface always demands a bearer token. - Store the Authority client secret using Docker/Kubernetes secrets and point `authority.clientSecretFile` at the mounted path; the value is read at startup and never logged. -- Watch the `Feedser.Authorization.Audit` logger. Each entry contains the HTTP +- Watch the `Concelier.Authorization.Audit` logger. Each entry contains the HTTP status, subject, client ID, scopes, remote IP, and a boolean `bypass` flag showing whether a network bypass CIDR allowed the request. Configure your SIEM to alert when unauthenticated requests (`status=401`) appear with `bypass=true`, or when unexpected scopes invoke job triggers. - Detailed monitoring and response guidance lives in `docs/ops/feedser-authority-audit-runbook.md`. + Detailed monitoring and response guidance lives in `docs/ops/concelier-authority-audit-runbook.md`. ##  8 Update & patch strategy | Layer | Cadence | Method | | -------------------- | -------------------------------------------------------- | ------------------------------ | | Backend & CLI images | Monthly or CVE‑driven docker pull + docker compose up -d | -| Trivy DB | 24 h scheduler via Feedser (vulnerability ingest/merge/export service) | configurable via Feedser scheduler options | +| Trivy DB | 24 h scheduler via Concelier (vulnerability ingest/merge/export service) | configurable via Concelier scheduler options | | Docker Engine | vendor LTS | distro package manager | | Host OS | security repos enabled | unattended‑upgrades | diff --git a/docs/19_TEST_SUITE_OVERVIEW.md b/docs/19_TEST_SUITE_OVERVIEW.md index f204be35..28d98e75 100755 --- a/docs/19_TEST_SUITE_OVERVIEW.md +++ b/docs/19_TEST_SUITE_OVERVIEW.md @@ -16,7 +16,7 @@ contributors who need to extend coverage or diagnose failures. | **1. Unit** | `xUnit` (dotnet test) | `*.Tests.csproj` | per PR / push | | **2. Property‑based** | `FsCheck` | `SbomPropertyTests` | per PR | | **3. Integration (API)** | `Testcontainers` suite | `test/Api.Integration` | per PR + nightly | -| **4. Integration (DB-merge)** | in-memory Mongo + Redis | `Feedser.Integration` (vulnerability ingest/merge/export service) | per PR | +| **4. Integration (DB-merge)** | in-memory Mongo + Redis | `Concelier.Integration` (vulnerability ingest/merge/export service) | per PR | | **5. Contract (gRPC)** | `Buf breaking` | `buf.yaml` files | per PR | | **6. Front‑end unit** | `Jest` | `ui/src/**/*.spec.ts` | per PR | | **7. Front‑end E2E** | `Playwright` | `ui/e2e/**` | nightly | @@ -59,17 +59,17 @@ The script spins up MongoDB/Redis via Testcontainers and requires: --- -### Feedser OSV↔GHSA parity fixtures +### Concelier OSV↔GHSA parity fixtures -The Feedser connector suite includes a regression test (`OsvGhsaParityRegressionTests`) +The Concelier connector suite includes a regression test (`OsvGhsaParityRegressionTests`) that checks a curated set of GHSA identifiers against OSV responses. The fixture -snapshots live in `src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/` and are kept +snapshots live in `src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/` and are kept deterministic so the parity report remains reproducible. To refresh the fixtures when GHSA/OSV payloads change: 1. Ensure outbound HTTPS access to `https://api.osv.dev` and `https://api.github.com`. -2. Run `UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj`. +2. Run `UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj`. 3. Commit the regenerated `osv-ghsa.*.json` files that the test emits (raw snapshots and canonical advisories). The regen flow logs `[Parity]` messages and normalises `recordedAt` timestamps so the @@ -88,7 +88,7 @@ flowchart LR I1 --> FE[Jest] FE --> E2E[Playwright] E2E --> Lighthouse - Lighthouse --> INTEG2[Feedser] + Lighthouse --> INTEG2[Concelier] INTEG2 --> LOAD[k6] LOAD --> CHAOS[pumba] CHAOS --> RELEASE[Attestation diff] diff --git a/docs/21_INSTALL_GUIDE.md b/docs/21_INSTALL_GUIDE.md index 0a363545..1686632f 100755 --- a/docs/21_INSTALL_GUIDE.md +++ b/docs/21_INSTALL_GUIDE.md @@ -76,51 +76,51 @@ UI: [https://\<host\>:8443](https://<host>:8443) (self‑signed cert > `stella-ops:latest` with the immutable digest printed by > `docker images --digests`. -### 1.1 · Feedser authority configuration +### 1.1 · Concelier authority configuration -The Feedser container reads configuration from `etc/feedser.yaml` plus -`FEEDSER_` environment variables. To enable the new Authority integration: +The Concelier container reads configuration from `etc/concelier.yaml` plus +`CONCELIER_` environment variables. To enable the new Authority integration: 1. Add the following keys to `.env` (replace values for your environment): ```bash - FEEDSER_AUTHORITY__ENABLED=true - FEEDSER_AUTHORITY__ALLOWANONYMOUSFALLBACK=true # temporary rollout only - FEEDSER_AUTHORITY__ISSUER="https://authority.internal" - FEEDSER_AUTHORITY__AUDIENCES__0="api://feedser" - FEEDSER_AUTHORITY__REQUIREDSCOPES__0="feedser.jobs.trigger" - FEEDSER_AUTHORITY__CLIENTID="feedser-jobs" - FEEDSER_AUTHORITY__CLIENTSECRETFILE="/run/secrets/feedser_authority_client" - FEEDSER_AUTHORITY__BYPASSNETWORKS__0="127.0.0.1/32" - FEEDSER_AUTHORITY__BYPASSNETWORKS__1="::1/128" - FEEDSER_AUTHORITY__RESILIENCE__ENABLERETRIES=true - FEEDSER_AUTHORITY__RESILIENCE__RETRYDELAYS__0="00:00:01" - FEEDSER_AUTHORITY__RESILIENCE__RETRYDELAYS__1="00:00:02" - FEEDSER_AUTHORITY__RESILIENCE__RETRYDELAYS__2="00:00:05" - FEEDSER_AUTHORITY__RESILIENCE__ALLOWOFFLINECACHEFALLBACK=true - FEEDSER_AUTHORITY__RESILIENCE__OFFLINECACHETOLERANCE="00:10:00" + CONCELIER_AUTHORITY__ENABLED=true + CONCELIER_AUTHORITY__ALLOWANONYMOUSFALLBACK=true # temporary rollout only + CONCELIER_AUTHORITY__ISSUER="https://authority.internal" + CONCELIER_AUTHORITY__AUDIENCES__0="api://concelier" + CONCELIER_AUTHORITY__REQUIREDSCOPES__0="concelier.jobs.trigger" + CONCELIER_AUTHORITY__CLIENTID="concelier-jobs" + CONCELIER_AUTHORITY__CLIENTSECRETFILE="/run/secrets/concelier_authority_client" + CONCELIER_AUTHORITY__BYPASSNETWORKS__0="127.0.0.1/32" + CONCELIER_AUTHORITY__BYPASSNETWORKS__1="::1/128" + CONCELIER_AUTHORITY__RESILIENCE__ENABLERETRIES=true + CONCELIER_AUTHORITY__RESILIENCE__RETRYDELAYS__0="00:00:01" + CONCELIER_AUTHORITY__RESILIENCE__RETRYDELAYS__1="00:00:02" + CONCELIER_AUTHORITY__RESILIENCE__RETRYDELAYS__2="00:00:05" + CONCELIER_AUTHORITY__RESILIENCE__ALLOWOFFLINECACHEFALLBACK=true + CONCELIER_AUTHORITY__RESILIENCE__OFFLINECACHETOLERANCE="00:10:00" ``` Store the client secret outside source control (Docker secrets, mounted file, - or Kubernetes Secret). Feedser loads the secret during post-configuration, so + or Kubernetes Secret). Concelier loads the secret during post-configuration, so the value never needs to appear in the YAML template. Connected sites can keep the retry ladder short (1 s, 2 s, 5 s) so job triggers fail fast when Authority is down. For air‑gapped or intermittently connected deployments, extend `RESILIENCE__OFFLINECACHETOLERANCE` (e.g. `00:30:00`) so cached discovery/JWKS data remains valid while the Offline Kit synchronises upstream changes. -2. Redeploy Feedser: +2. Redeploy Concelier: ```bash - docker compose --env-file .env -f docker-compose.stella-ops.yml up -d feedser + docker compose --env-file .env -f docker-compose.stella-ops.yml up -d concelier ``` -3. Tail the logs: `docker compose logs -f feedser`. Successful `/jobs*` calls now - emit `Feedser.Authorization.Audit` entries with `route`, `status`, `subject`, +3. Tail the logs: `docker compose logs -f concelier`. Successful `/jobs*` calls now + emit `Concelier.Authorization.Audit` entries with `route`, `status`, `subject`, `clientId`, `scopes`, `bypass`, and `remote` fields. 401 denials keep the same shape—watch for `bypass=True`, which indicates a bypass CIDR accepted an anonymous - call. See `docs/ops/feedser-authority-audit-runbook.md` for a full audit/alerting checklist. + call. See `docs/ops/concelier-authority-audit-runbook.md` for a full audit/alerting checklist. -> **Enforcement deadline** – keep `FEEDSER_AUTHORITY__ALLOWANONYMOUSFALLBACK=true` -> only while validating the rollout. Set it to `false` (and restart Feedser) +> **Enforcement deadline** – keep `CONCELIER_AUTHORITY__ALLOWANONYMOUSFALLBACK=true` +> only while validating the rollout. Set it to `false` (and restart Concelier) > before **2025-12-31 UTC** to require tokens in production. --- diff --git a/docs/24_OFFLINE_KIT.md b/docs/24_OFFLINE_KIT.md index df6427da..f4f47355 100755 --- a/docs/24_OFFLINE_KIT.md +++ b/docs/24_OFFLINE_KIT.md @@ -18,7 +18,7 @@ completely isolated network: | **Attested manifest** | `offline-manifest.json` + detached JWS covering bundle metadata, signed during export. | | **Delta patches** | Daily diff bundles keep size \< 350 MB | -**RU BDU note:** ship the official Russian Trusted Root/Sub CA bundle (`certificates/russian_trusted_bundle.pem`) inside the kit so `feedser:httpClients:source.bdu:trustedRootPaths` can resolve it when the service runs in an air‑gapped network. Drop the most recent `vulxml.zip` alongside the kit if operators need a cold-start cache. +**RU BDU note:** ship the official Russian Trusted Root/Sub CA bundle (`certificates/russian_trusted_bundle.pem`) inside the kit so `concelier:httpClients:source.bdu:trustedRootPaths` can resolve it when the service runs in an air‑gapped network. Drop the most recent `vulxml.zip` alongside the kit if operators need a cold-start cache. *Scanner core:* C# 12 on **.NET {{ dotnet }}**. *Imports are idempotent and atomic — no service downtime.* @@ -110,4 +110,4 @@ See the detailed rules in * **Install guide:** `/install/#air-gapped` * **Sovereign mode rationale:** `/sovereign/` * **Security policy:** `/security/#reporting-a-vulnerability` -* **CERT-Bund snapshots:** `python tools/certbund_offline_snapshot.py --help` (see `docs/ops/feedser-certbund-operations.md`) +* **CERT-Bund snapshots:** `python tools/certbund_offline_snapshot.py --help` (see `docs/ops/concelier-certbund-operations.md`) diff --git a/docs/40_ARCHITECTURE_OVERVIEW.md b/docs/40_ARCHITECTURE_OVERVIEW.md index 15b2c05c..01f0469c 100755 --- a/docs/40_ARCHITECTURE_OVERVIEW.md +++ b/docs/40_ARCHITECTURE_OVERVIEW.md @@ -32,7 +32,7 @@ why the system leans *monolith‑plus‑plug‑ins*, and where extension points graph TD A(API Gateway) B1(Scanner Core
.NET latest LTS) - B2(Feedser service\n(vuln ingest/merge/export)) + B2(Concelier service\n(vuln ingest/merge/export)) B3(Policy Engine OPA) C1(Redis 7) C2(MongoDB 7) @@ -53,7 +53,7 @@ graph TD | ---------------------------- | --------------------- | ---------------------------------------------------- | | **API Gateway** | ASP.NET Minimal API | Auth (JWT), quotas, request routing | | **Scanner Core** | C# 12, Polly | Layer diffing, SBOM generation, vuln correlation | -| **Feedser (vulnerability ingest/merge/export service)** | C# source-gen workers | Consolidate NVD + regional CVE feeds into the canonical MongoDB store and drive JSON / Trivy DB exports | +| **Concelier (vulnerability ingest/merge/export service)** | C# source-gen workers | Consolidate NVD + regional CVE feeds into the canonical MongoDB store and drive JSON / Trivy DB exports | | **Policy Engine** | OPA (Rego) | admission decisions, custom org rules | | **Redis 7** | Key‑DB compatible | LRU cache, quota counters | | **MongoDB 7** | WiredTiger | SBOM & findings storage | @@ -121,7 +121,7 @@ Hot‑plugging is deferred until after v 1.0 for security review. Although the default deployment is a single container, each sub‑service can be extracted: -* Feedser → standalone cron pod. +* Concelier → standalone cron pod. * Policy Engine → side‑car (OPA) with gRPC contract. * ResultSink → queue worker (RabbitMQ or Azure Service Bus). diff --git a/docs/AGENTS.md b/docs/AGENTS.md index a313840b..6e138c0e 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -5,7 +5,7 @@ Produce and maintain offline-friendly documentation for StellaOps modules, cover ## Scope Highlights - Authority docs (`docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md`, upcoming `docs/11_AUTHORITY.md`). -- Feedser quickstarts, CLI guides, Offline Kit manuals. +- Concelier quickstarts, CLI guides, Offline Kit manuals. - Release notes and migration playbooks. ## Operating Principles diff --git a/docs/ARCHITECTURE_AUTHORITY.md b/docs/ARCHITECTURE_AUTHORITY.md index d974d50b..38fa91c0 100644 --- a/docs/ARCHITECTURE_AUTHORITY.md +++ b/docs/ARCHITECTURE_AUTHORITY.md @@ -6,7 +6,7 @@ ## 0) Mission & boundaries -**Mission.** Provide **fast, local, verifiable** authentication for Stella Ops microservices and tools by minting **very short‑lived** OAuth2/OIDC tokens that are **sender‑constrained** (DPoP or mTLS‑bound). Support RBAC scopes, multi‑tenant claims, and deterministic validation for APIs (Scanner, Signer, Attestor, Excititor, Feedser, UI, CLI, Zastava). +**Mission.** Provide **fast, local, verifiable** authentication for Stella Ops microservices and tools by minting **very short‑lived** OAuth2/OIDC tokens that are **sender‑constrained** (DPoP or mTLS‑bound). Support RBAC scopes, multi‑tenant claims, and deterministic validation for APIs (Scanner, Signer, Attestor, Excititor, Concelier, UI, CLI, Zastava). **Boundaries.** @@ -43,7 +43,7 @@ ``` iss = https://authority. sub = -aud = +aud = exp = (<= 300 s from iat) iat = nbf = iat - 30 @@ -140,7 +140,7 @@ plan? = // optional hint for UIs; not used for e ### 4.1 Audiences * `signer` — only the **Signer** service should accept tokens with `aud=signer`. -* `attestor`, `scanner`, `feedser`, `excititor`, `ui`, `zastava` similarly. +* `attestor`, `scanner`, `concelier`, `excititor`, `ui`, `zastava` similarly. Services **must** verify `aud` and **sender constraint** (DPoP/mTLS) per their policy. @@ -154,7 +154,7 @@ Services **must** verify `aud` and **sender constraint** (DPoP/mTLS) per their p | `scanner.export` | Scanner.WebService | Export SBOMs | | `scanner.read` | Scanner.WebService | Read catalog/SBOMs | | `vex.read` / `vex.admin` | Excititor | Query/operate | -| `feedser.read` / `feedser.export` | Feedser | Query/exports | +| `concelier.read` / `concelier.export` | Concelier | Query/exports | | `ui.read` / `ui.admin` | UI | View/admin | | `zastava.emit` / `zastava.enforce` | Scanner/Zastava | Runtime events / admission | diff --git a/docs/ARCHITECTURE_CLI.md b/docs/ARCHITECTURE_CLI.md index fcd9f5ca..ff822d03 100644 --- a/docs/ARCHITECTURE_CLI.md +++ b/docs/ARCHITECTURE_CLI.md @@ -1,6 +1,6 @@ # component_architecture_cli.md — **Stella Ops CLI** (2025Q4) -> **Scope.** Implementation‑ready architecture for **Stella Ops CLI**: command surface, process model, auth (Authority/DPoP), integration with Scanner/Excititor/Feedser/Signer/Attestor, Buildx plug‑in management, offline kit behavior, packaging, observability, security posture, and CI ergonomics. +> **Scope.** Implementation‑ready architecture for **Stella Ops CLI**: command surface, process model, auth (Authority/DPoP), integration with Scanner/Excititor/Concelier/Signer/Attestor, Buildx plug‑in management, offline kit behavior, packaging, observability, security posture, and CI ergonomics. --- @@ -18,7 +18,7 @@ * CLI **never** signs; it only calls **Signer**/**Attestor** via backend APIs when needed (e.g., `report --attest`). * CLI **does not** store long‑lived credentials beyond OS keychain; tokens are **short** (Authority OpToks). -* Heavy work (scanning, merging, policy) is executed **server‑side** (Scanner/Excititor/Feedser). +* Heavy work (scanning, merging, policy) is executed **server‑side** (Scanner/Excititor/Concelier). --- @@ -76,7 +76,7 @@ src/ ### 2.4 Policy & data * `policy get/set/apply` — fetch active policy, apply staged policy, compute digest. -* `feedser export` — trigger/export canonical JSON or Trivy DB (admin). +* `concelier export` — trigger/export canonical JSON or Trivy DB (admin). * `excititor export` — trigger/export consensus/raw claims (admin). ### 2.5 Verification @@ -91,8 +91,8 @@ src/ ### 2.7 Offline kit -* `offline kit pull` — fetch latest **Feedser JSON + Trivy DB + Excititor exports** as a tarball from a mirror. -* `offline kit import ` — upload the kit to on‑prem services (Feedser/Excititor). +* `offline kit pull` — fetch latest **Concelier JSON + Trivy DB + Excititor exports** as a tarball from a mirror. +* `offline kit import ` — upload the kit to on‑prem services (Concelier/Excititor). * `offline kit status` — list current seed versions. ### 2.8 Utilities @@ -122,7 +122,7 @@ src/ * `scanner` for scan/export/report/diff * `signer` (indirect; usually backend calls Signer) * `attestor` for verify - * `feedser`/`excititor` for admin verbs + * `concelier`/`excititor` for admin verbs CLI rejects verbs if required scopes are missing. @@ -167,7 +167,7 @@ cli: backend: scanner: "https://scanner-web.internal" attestor: "https://attestor.internal" - feedser: "https://feedser-web.internal" + concelier: "https://concelier-web.internal" excititor: "https://excititor-web.internal" auth: audienceDefault: "scanner" @@ -263,7 +263,7 @@ Exit code: 2 ## 13) Admin & advanced flags -* `--authority`, `--scanner`, `--attestor`, `--feedser`, `--excititor` override config URLs. +* `--authority`, `--scanner`, `--attestor`, `--concelier`, `--excititor` override config URLs. * `--no-color`, `--quiet`, `--json`. * `--timeout`, `--retries`, `--retry-backoff-ms`. * `--ca-bundle`, `--insecure` (dev only; prints warning). diff --git a/docs/ARCHITECTURE_FEEDSER.md b/docs/ARCHITECTURE_CONCELIER.md similarity index 86% rename from docs/ARCHITECTURE_FEEDSER.md rename to docs/ARCHITECTURE_CONCELIER.md index da3ba502..88c96a82 100644 --- a/docs/ARCHITECTURE_FEEDSER.md +++ b/docs/ARCHITECTURE_CONCELIER.md @@ -1,6 +1,6 @@ -# component_architecture_feedser.md — **Stella Ops Feedser** (2025Q4) +# component_architecture_concelier.md — **Stella Ops Concelier** (2025Q4) -> **Scope.** Implementation‑ready architecture for **Feedser**: the vulnerability ingest/normalize/merge/export subsystem that produces deterministic advisory data for the Scanner + Policy + Excititor pipeline. Covers domain model, connectors, merge rules, storage schema, exports, APIs, performance, security, and test matrices. +> **Scope.** Implementation‑ready architecture for **Concelier**: the vulnerability ingest/normalize/merge/export subsystem that produces deterministic advisory data for the Scanner + Policy + Excititor pipeline. Covers domain model, connectors, merge rules, storage schema, exports, APIs, performance, security, and test matrices. --- @@ -10,15 +10,15 @@ **Boundaries.** -* Feedser **does not** sign with private keys. When attestation is required, the export artifact is handed to the **Signer**/**Attestor** pipeline (out‑of‑process). -* Feedser **does not** decide PASS/FAIL; it provides data to the **Policy** engine. +* Concelier **does not** sign with private keys. When attestation is required, the export artifact is handed to the **Signer**/**Attestor** pipeline (out‑of‑process). +* Concelier **does not** decide PASS/FAIL; it provides data to the **Policy** engine. * Online operation is **allowlist‑only**; air‑gapped deployments use the **Offline Kit**. --- ## 1) Topology & processes -**Process shape:** single ASP.NET Core service `StellaOps.Feedser.WebService` hosting: +**Process shape:** single ASP.NET Core service `StellaOps.Concelier.WebService` hosting: * **Scheduler** with distributed locks (Mongo backed). * **Connectors** (fetch/parse/map). @@ -32,7 +32,7 @@ ## 2) Canonical domain model -> Stored in MongoDB (database `feedser`), serialized with a **canonical JSON** writer (stable order, camelCase, normalized timestamps). +> Stored in MongoDB (database `concelier`), serialized with a **canonical JSON** writer (stable order, camelCase, normalized timestamps). ### 2.1 Core entities @@ -173,7 +173,7 @@ public interface IFeedConnector { ### 5.1 Keying & identity -* Identity graph: **CVE** is primary node; vendor/distro IDs resolved via **Alias** edges (from connectors and Feedser’s alias tables). +* Identity graph: **CVE** is primary node; vendor/distro IDs resolved via **Alias** edges (from connectors and Concelier’s alias tables). * `advisoryKey` is the canonical primary key (CVE if present, else vendor/distro key). ### 5.2 Merge algorithm (deterministic) @@ -255,14 +255,14 @@ public interface IFeedConnector { ### 7.3 Hand‑off to Signer/Attestor (optional) -* On export completion, if `attest: true` is set in job args, Feedser **posts** the artifact metadata to **Signer**/**Attestor**; Feedser itself **does not** hold signing keys. +* On export completion, if `attest: true` is set in job args, Concelier **posts** the artifact metadata to **Signer**/**Attestor**; Concelier itself **does not** hold signing keys. * Export record stores returned `{ uuid, index, url }` from **Rekor v2**. --- ## 8) REST APIs -All under `/api/v1/feedser`. +All under `/api/v1/concelier`. **Health & status** @@ -296,18 +296,18 @@ GET /advisories?scheme=CVE&value=CVE-2025-12345 GET /affected?productKey=pkg:rpm/openssl&limit=100 ``` -**AuthN/Z:** Authority tokens (OpTok) with roles: `feedser.read`, `feedser.admin`, `feedser.export`. +**AuthN/Z:** Authority tokens (OpTok) with roles: `concelier.read`, `concelier.admin`, `concelier.export`. --- ## 9) Configuration (YAML) ```yaml -feedser: - mongo: { uri: "mongodb://mongo/feedser" } +concelier: + mongo: { uri: "mongodb://mongo/concelier" } s3: endpoint: "http://minio:9000" - bucket: "stellaops-feedser" + bucket: "stellaops-concelier" scheduler: windowSeconds: 30 maxParallelSources: 4 @@ -337,14 +337,14 @@ feedser: exporters: json: enabled: true - output: s3://stellaops-feedser/json/ + output: s3://stellaops-concelier/json/ trivy: enabled: true mode: full - output: s3://stellaops-feedser/trivy/ + output: s3://stellaops-concelier/trivy/ oras: enabled: false - repo: ghcr.io/org/feedser + repo: ghcr.io/org/concelier precedence: vendorWinsOverDistro: true distroWinsOverOsv: true @@ -372,7 +372,7 @@ feedser: * **Export**: 1M advisories JSON in ≤ 90 s (streamed, zstd), Trivy DB in ≤ 60 s on 8 cores. * **Memory**: hard cap per job; chunked streaming writers; backpressure to avoid GC spikes. -**Scale pattern**: add Feedser replicas; Mongo scaling via indices and read/write concerns; GridFS only for oversized docs. +**Scale pattern**: add Concelier replicas; Mongo scaling via indices and read/write concerns; GridFS only for oversized docs. --- @@ -380,13 +380,13 @@ feedser: * **Metrics** - * `feedser.fetch.docs_total{source}` - * `feedser.fetch.bytes_total{source}` - * `feedser.parse.failures_total{source}` - * `feedser.map.affected_total{source}` - * `feedser.merge.changed_total` - * `feedser.export.bytes{kind}` - * `feedser.export.duration_seconds{kind}` + * `concelier.fetch.docs_total{source}` + * `concelier.fetch.bytes_total{source}` + * `concelier.parse.failures_total{source}` + * `concelier.map.affected_total{source}` + * `concelier.merge.changed_total` + * `concelier.export.bytes{kind}` + * `concelier.export.duration_seconds{kind}` * **Tracing** around fetch/parse/map/merge/export. * **Logs**: structured with `source`, `uri`, `docDigest`, `advisoryKey`, `exportId`. @@ -415,11 +415,11 @@ feedser: ## 15) Operator runbook (quick) -* **Trigger all sources:** `POST /api/v1/feedser/sources/*/trigger` -* **Force full export JSON:** `POST /api/v1/feedser/exports/json { "full": true, "force": true }` -* **Force Trivy DB delta publish:** `POST /api/v1/feedser/exports/trivy { "full": false, "publish": true }` -* **Inspect advisory:** `GET /api/v1/feedser/advisories?scheme=CVE&value=CVE-2025-12345` -* **Pause noisy source:** `POST /api/v1/feedser/sources/osv/pause` +* **Trigger all sources:** `POST /api/v1/concelier/sources/*/trigger` +* **Force full export JSON:** `POST /api/v1/concelier/exports/json { "full": true, "force": true }` +* **Force Trivy DB delta publish:** `POST /api/v1/concelier/exports/trivy { "full": false, "publish": true }` +* **Inspect advisory:** `GET /api/v1/concelier/advisories?scheme=CVE&value=CVE-2025-12345` +* **Pause noisy source:** `POST /api/v1/concelier/sources/osv/pause` --- diff --git a/docs/ARCHITECTURE_DEVOPS.md b/docs/ARCHITECTURE_DEVOPS.md index 356abf31..42f28812 100644 --- a/docs/ARCHITECTURE_DEVOPS.md +++ b/docs/ARCHITECTURE_DEVOPS.md @@ -42,7 +42,7 @@ Semantic core + calendar tag: A release is a **bundle** of image digests + charts + manifests. All services in a bundle are **wire‑compatible**. Mixed minor versions are allowed within a bounded skew: * **Web UI ↔ backend**: `±1 minor`. -* **Scanner ↔ Policy/Excititor/Feedser**: `±1 minor`. +* **Scanner ↔ Policy/Excititor/Concelier**: `±1 minor`. * **Authority/Signer/Attestor triangle**: **must** be same minor (crypto and DPoP/mTLS binding rules). At startup, services **self‑advertise** their semver & channel; the UI surfaces **mismatch warnings**. @@ -75,7 +75,7 @@ At startup, services **self‑advertise** their semver & channel; the UI surface * **Static**: linters, codegen checks, protobuf API freeze (backward‑compat tests). * **Unit/integration**: per‑component, plus **end‑to‑end** flows (scan→vex→policy→sign→attest). * **Perf SLOs**: hot paths (SBOM compose, diff, export) measured against budgets. -* **Security**: dependency audit vs Feedser export; container hardening tests; minimal caps. +* **Security**: dependency audit vs Concelier export; container hardening tests; minimal caps. * **Canary cohort**: internal staging + selected customers; one week on **edge** before **stable** tag. --- @@ -90,7 +90,7 @@ At startup, services **self‑advertise** their semver & channel; the UI surface **Gating policy**: -* **Core images** (Authority, Scanner, Feedser, Excititor, Attestor, UI): public **read**. +* **Core images** (Authority, Scanner, Concelier, Excititor, Attestor, UI): public **read**. * **Enterprise add‑ons** (if any) and **pre‑release**: private repos via OAuth2 token service. > Monetization lever is **signing** (PoE gate), not image pulls, so the core remains simple to consume. @@ -115,7 +115,7 @@ At startup, services **self‑advertise** their semver & channel; the UI surface /attest/ DSSE bundles + Rekor proofs /charts/ Helm charts + values templates /compose/ docker-compose.yml + .env template - /plugins/ Feedser/Excititor connectors (restart-time) + /plugins/ Concelier/Excititor connectors (restart-time) /policy/ example policies /manifest/ release.yaml (see §6.1) ``` @@ -169,7 +169,7 @@ helm install stella stellaops/platform \ --set authority.issuer=https://authority.stella.local \ --set scanner.minio.endpoint=http://minio.stella.local:9000 \ --set scanner.mongo.uri=mongodb://mongo/scanner \ - --set feedser.mongo.uri=mongodb://mongo/feedser \ + --set concelier.mongo.uri=mongodb://mongo/concelier \ --set excititor.mongo.uri=mongodb://mongo/excititor ``` @@ -185,7 +185,7 @@ helm install stella stellaops/platform \ 1. Authority (stateless, dual‑key rotation ready) 2. Signer/Attestor (same minor) 3. Scanner WebService & Workers - 4. Feedser, then Excititor (schema migrations are expand/contract) + 4. Concelier, then Excititor (schema migrations are expand/contract) 5. UI last * **DB migrations** are **expand/contract**: @@ -263,7 +263,7 @@ s3://stellaops/ images//usage.cdx.pb diffs/_/diff.json.zst attest/.dsse.json - feedser/ + concelier/ json//... trivy//... excititor/ @@ -289,14 +289,14 @@ s3://stellaops/ ### 7.4 Mongo retention * **Scanner**: `runtime.events` use TTL (e.g., 30–90 days); **catalog** permanent. -* **Feedser/Excititor**: raw docs keep **last N windows**; canonical stores permanent. +* **Concelier/Excititor**: raw docs keep **last N windows**; canonical stores permanent. * **Attestor**: `entries` permanent; `dedupe` TTL 24–48h. --- ## 8) Observability & SLOs (operations) -* **Uptime SLO**: 99.9% for Signer/Authority/Attestor; 99.5% for Scanner WebService; Excititor/Feedser 99.0%. +* **Uptime SLO**: 99.9% for Signer/Authority/Attestor; 99.5% for Scanner WebService; Excititor/Concelier 99.0%. * **Error budgets**: tracked per month; dashboards show burn rates. * **Golden signals**: @@ -324,7 +324,7 @@ Prometheus + OTLP; Grafana dashboards ship in the charts. * **Vulnerability response**: - * Feedser red‑flag advisories trigger accelerated **stable** patch rollout; UI/CLI “security patch available” notice. + * Concelier red‑flag advisories trigger accelerated **stable** patch rollout; UI/CLI “security patch available” notice. * **Backups/DR**: @@ -408,8 +408,8 @@ services: scanner-worker: image: registry.stella-ops.org/stellaops/scanner-worker@sha256:... deploy: { replicas: 4 } - feedser: - image: registry.stella-ops.org/stellaops/feedser@sha256:... + concelier: + image: registry.stella-ops.org/stellaops/concelier@sha256:... excititor: image: registry.stella-ops.org/stellaops/excititor@sha256:... web-ui: @@ -446,7 +446,7 @@ services: * `signer.requests_total{result="success"}/minute` > 0 (when scans occur). * `attestor.submit_latency_seconds{quantile=0.95}` < 0.3. * `scanner.scan_latency_seconds{quantile=0.95}` < target per image size. -* `feedser.export.duration_seconds` stable; `excititor.consensus.conflicts_total` not exploding after policy changes. +* `concelier.export.duration_seconds` stable; `excititor.consensus.conflicts_total` not exploding after policy changes. * MinIO `s3_requests_errors_total` near zero; Mongo `opcounters` hit expected baseline. ### Appendix B — Upgrade safety checklist diff --git a/docs/ARCHITECTURE_EXCITITOR.md b/docs/ARCHITECTURE_EXCITITOR.md index 18888d19..5c0eadd2 100644 --- a/docs/ARCHITECTURE_EXCITITOR.md +++ b/docs/ARCHITECTURE_EXCITITOR.md @@ -1,6 +1,6 @@ # component_architecture_excititor.md — **Stella Ops Excititor** (2025Q4) -> **Scope.** This document specifies the **Excititor** service: its purpose, trust model, data structures, APIs, plug‑in contracts, storage schema, normalization/consensus algorithms, performance budgets, testing matrix, and how it integrates with Scanner, Policy, Feedser, and the attestation chain. It is implementation‑ready. +> **Scope.** This document specifies the **Excititor** service: its purpose, trust model, data structures, APIs, plug‑in contracts, storage schema, normalization/consensus algorithms, performance budgets, testing matrix, and how it integrates with Scanner, Policy, Concelier, and the attestation chain. It is implementation‑ready. --- @@ -67,7 +67,7 @@ All exports are **deterministic**, and (optionally) **attested** via DSSE and lo ### 2.1 Vuln identity * Accepts **CVE**, **GHSA**, vendor IDs (MSRC, RHSA…), distro IDs (DSA/USN/RHSA…) — normalized to `vulnId` with alias sets. -* **Alias graph** maintained (from Feedser) to map vendor/distro IDs → CVE (primary) and to **GHSA** where applicable. +* **Alias graph** maintained (from Concelier) to map vendor/distro IDs → CVE (primary) and to **GHSA** where applicable. ### 2.2 Product identity (`productKey`) @@ -427,7 +427,7 @@ excititor: ## 14) Integration points * **Backend Policy Engine** (in Scanner.WebService): calls `POST /resolve` with batched `(purl, vulnId)` pairs to fetch `rollupStatus + sources`. -* **Feedser**: provides alias graph (CVE↔vendor IDs) and may supply VEX‑adjacent metadata (e.g., KEV flag) for policy escalation. +* **Concelier**: provides alias graph (CVE↔vendor IDs) and may supply VEX‑adjacent metadata (e.g., KEV flag) for policy escalation. * **UI**: VEX explorer screens use `/claims/search` and `/consensus/search`; show conflicts & provenance. * **CLI**: `stellaops vex export --consensus --since 7d --out vex.json` for audits. diff --git a/docs/ARCHITECTURE_SCANNER.md b/docs/ARCHITECTURE_SCANNER.md index 555c11d3..952a0d94 100644 --- a/docs/ARCHITECTURE_SCANNER.md +++ b/docs/ARCHITECTURE_SCANNER.md @@ -1,6 +1,6 @@ # component_architecture_scanner.md — **Stella Ops Scanner** (2025Q4) -> **Scope.** Implementation‑ready architecture for the **Scanner** subsystem: WebService, Workers, analyzers, SBOM assembly (inventory & usage), per‑layer caching, three‑way diffs, artifact catalog (MinIO+Mongo), attestation hand‑off, and scale/security posture. This document is the contract between the scanning plane and everything else (Policy, Excititor, Feedser, UI, CLI). +> **Scope.** Implementation‑ready architecture for the **Scanner** subsystem: WebService, Workers, analyzers, SBOM assembly (inventory & usage), per‑layer caching, three‑way diffs, artifact catalog (MinIO+Mongo), attestation hand‑off, and scale/security posture. This document is the contract between the scanning plane and everything else (Policy, Excititor, Concelier, UI, CLI). --- @@ -10,7 +10,7 @@ **Boundaries.** -* Scanner **does not** produce PASS/FAIL. The backend (Policy + Excititor + Feedser) decides presentation and verdicts. +* Scanner **does not** produce PASS/FAIL. The backend (Policy + Excititor + Concelier) decides presentation and verdicts. * Scanner **does not** keep third‑party SBOM warehouses. It may **bind** to existing attestations for exact hashes. * Core analyzers are **deterministic** (no fuzzy identity). Optional heuristic plug‑ins (e.g., patch‑presence) run under explicit flags and never contaminate the core SBOM. diff --git a/docs/ARCHITECTURE_UI.md b/docs/ARCHITECTURE_UI.md index 1e00d13b..54880d3f 100644 --- a/docs/ARCHITECTURE_UI.md +++ b/docs/ARCHITECTURE_UI.md @@ -1,6 +1,6 @@ # component_architecture_web_ui.md — **Stella Ops Web UI** (2025Q4) -> **Scope.** Implementation‑ready architecture for the **Angular SPA** that operators and developers use to drive Stella Ops. This document defines UX surfaces, module boundaries, data flows, auth, RBAC, real‑time updates, performance targets, i18n/a11y, security headers, testing and deployment. The UI is a *consumer* of backend APIs (Scanner, Policy, Excititor, Feedser, Attestor, Authority) and never performs scanning, merging, or signing on its own. +> **Scope.** Implementation‑ready architecture for the **Angular SPA** that operators and developers use to drive Stella Ops. This document defines UX surfaces, module boundaries, data flows, auth, RBAC, real‑time updates, performance targets, i18n/a11y, security headers, testing and deployment. The UI is a *consumer* of backend APIs (Scanner, Policy, Excititor, Concelier, Attestor, Authority) and never performs scanning, merging, or signing on its own. --- @@ -10,7 +10,7 @@ * Scans (status, SBOMs, diffs, EntryTrace, attestation). * Policy management (rules, exemptions, VEX consumption view). -* Vulnerability intel (Feedser status), VEX consensus exploration (Excititor). +* Vulnerability intel (Concelier status), VEX consensus exploration (Excititor). * Runtime posture (Zastava observer + admission). * Admin operations (tenants, tokens, quotas, licensing posture). @@ -42,7 +42,7 @@ ├─ runtime/ # Zastava posture, drift events, admission decisions ├─ policy/ # rules editor (YAML/Rego), exemptions, previews ├─ vex/ # VEX explorer (claims, consensus, conflicts) - ├─ feedser/ # source health, export cursors, rebuild/export triggers + ├─ concelier/ # source health, export cursors, rebuild/export triggers ├─ attest/ # attestation proofs, verification bundles, Rekor links ├─ admin/ # tenants, roles, clients, quotas, licensing posture └─ plugins/ # route plug-ins (lazy remote modules, governed) @@ -92,7 +92,7 @@ Each feature folder builds as a **standalone route** (lazy loaded). All HTTP sha * **Consensus view**: rollup per (vuln, product) with accepted/rejected sources, weights, timestamps. * **Conflicts**: grid of top conflicts; filters for justification gates failed. -### 3.6 Feedser +### 3.6 Concelier * **Sources** table: staleness, last run, errors. * **Advisory search**: by CVE/alias; show normalized affected ranges. @@ -136,7 +136,7 @@ Each feature folder builds as a **standalone route** (lazy loaded). All HTTP sha * **`core/http/api-client.ts`** centralizes: - * Base URLs (Scanner, Excititor, Feedser, Attestor). + * Base URLs (Scanner, Excititor, Concelier, Attestor). * **Retry** policies on idempotent GETs (backoff + jitter). * **Problem+JSON** parser → uniform error toasts with correlation ID. * **SSE** helper (EventSource) with auto‑reconnect & backpressure. @@ -144,7 +144,7 @@ Each feature folder builds as a **standalone route** (lazy loaded). All HTTP sha * Typed API clients (DTOs in `core/api/models.ts`): - * `ScannerApi`, `PolicyApi`, `ExcititorApi`, `FeedserApi`, `AttestorApi`, `AuthorityApi`. + * `ScannerApi`, `PolicyApi`, `ExcititorApi`, `ConcelierApi`, `AttestorApi`, `AuthorityApi`. **DTO examples (abbrev):** @@ -184,7 +184,7 @@ export interface VexConsensus { * **Huge tables** rendered with **virtual scrolling** (CDK Virtual Scroll); sort/filter performed client‑side for ≤ 20k rows; beyond that, server‑side queries via BOM‑Index endpoints. * **Component row** shows purl, version, origin (OS pkg / metadata / linker / attested), licenses, and **used** badge (Usage view). -* **Diff**: compact heatmap per layer; clicking opens a right‑pane with evidence: introducing paths, file hashes, VEX notes (from Excititor consensus) and links to advisories (Feedser). +* **Diff**: compact heatmap per layer; clicking opens a right‑pane with evidence: introducing paths, file hashes, VEX notes (from Excititor consensus) and links to advisories (Concelier). --- diff --git a/docs/EXCITITOR_SCORRING.md b/docs/EXCITITOR_SCORRING.md index a6a53a47..f6ca89da 100644 --- a/docs/EXCITITOR_SCORRING.md +++ b/docs/EXCITITOR_SCORRING.md @@ -8,7 +8,7 @@ This document tracks the future-looking risk scoring model for Excititor. The ca * **Gate(VEX_status)**: `affected`/`under_investigation` → 1, `not_affected`/`fixed` → 0. A trusted “not affected” or “fixed” still zeroes the score. * **W_trust(source)**: normalized policy weight (baseline 0‒1). Policies may opt into >1 boosts for signed vendor feeds once Phase 1 closes. -* **Severity_base**: canonical numeric severity from Feedser (CVSS or org-defined scale). +* **Severity_base**: canonical numeric severity from Concelier (CVSS or org-defined scale). * **KEV flag**: 0/1 boost when CISA Known Exploited Vulnerabilities applies. * **EPSS**: probability [0,1]; bounded multiplier. * **α, β**: configurable coefficients (default α=0.25, β=0.5) stored in policy. @@ -19,9 +19,9 @@ Safeguards: freeze boosts when product identity is unknown, clamp outputs ≥0, | Phase | Scope | Artifacts | | --- | --- | --- | -| **Phase 1 – Schema foundations** | Extend Excititor consensus/claims and Feedser canonical advisories with severity, KEV, EPSS, and expose α/β + weight ceilings in policy. | Sprint 7 tasks `EXCITITOR-CORE-02-001`, `EXCITITOR-POLICY-02-001`, `EXCITITOR-STORAGE-02-001`, `FEEDCORE-ENGINE-07-001`. | +| **Phase 1 – Schema foundations** | Extend Excititor consensus/claims and Concelier canonical advisories with severity, KEV, EPSS, and expose α/β + weight ceilings in policy. | Sprint 7 tasks `EXCITITOR-CORE-02-001`, `EXCITITOR-POLICY-02-001`, `EXCITITOR-STORAGE-02-001`, `FEEDCORE-ENGINE-07-001`. | | **Phase 2 – Deterministic score engine** | Implement a scoring component that executes alongside consensus and persists score envelopes with hashes. | Planned task `EXCITITOR-CORE-02-002` (backlog). | -| **Phase 3 – Surfacing & enforcement** | Expose scores via WebService/CLI, integrate with Feedser noise priors, and enforce policy-based suppressions. | To be scheduled after Phase 2. | +| **Phase 3 – Surfacing & enforcement** | Expose scores via WebService/CLI, integrate with Concelier noise priors, and enforce policy-based suppressions. | To be scheduled after Phase 2. | ## Data model (after Phase 1) @@ -60,7 +60,7 @@ Safeguards: freeze boosts when product identity is unknown, clamp outputs ≥0, ## Operational guidance -* **Inputs**: Feedser delivers severity/KEV/EPSS via the advisory event log; Excititor connectors load VEX statements. Policy owns trust tiers and coefficients. +* **Inputs**: Concelier delivers severity/KEV/EPSS via the advisory event log; Excititor connectors load VEX statements. Policy owns trust tiers and coefficients. * **Processing**: the scoring engine (Phase 2) runs next to consensus, storing results with deterministic hashes so exports and attestations can reference them. * **Consumption**: WebService/CLI will return consensus plus score; scanners may suppress findings only when policy-authorized VEX gating and signed score envelopes agree. diff --git a/docs/README.md b/docs/README.md index d904ec76..0a9767cc 100755 --- a/docs/README.md +++ b/docs/README.md @@ -36,7 +36,7 @@ Everything here is open‑source and versioned — when you check out a git ta - **07 – [High‑Level Architecture](07_HIGH_LEVEL_ARCHITECTURE.md)** - **08 – Module Architecture Dossiers** - [Scanner](ARCHITECTURE_SCANNER.md) - - [Feedser](ARCHITECTURE_FEEDSER.md) + - [Concelier](ARCHITECTURE_CONCELIER.md) - [Excititor](ARCHITECTURE_EXCITITOR.md) - [Signer](ARCHITECTURE_SIGNER.md) - [Attestor](ARCHITECTURE_ATTESTOR.md) @@ -47,7 +47,7 @@ Everything here is open‑source and versioned — when you check out a git ta - [Release & Operations](ARCHITECTURE_DEVOPS.md) - **09 – [API & CLI Reference](09_API_CLI_REFERENCE.md)** - **10 – [Plug‑in SDK Guide](10_PLUGIN_SDK_GUIDE.md)** -- **10 – [Feedser CLI Quickstart](10_FEEDSER_CLI_QUICKSTART.md)** +- **10 – [Concelier CLI Quickstart](10_CONCELIER_CLI_QUICKSTART.md)** - **30 – [Excititor Connector Packaging Guide](dev/30_EXCITITOR_CONNECTOR_GUIDE.md)** - **30 – Developer Templates** - [Excititor Connector Skeleton](dev/templates/excititor-connector/) @@ -67,12 +67,12 @@ Everything here is open‑source and versioned — when you check out a git ta - **22 – [CI/CD Recipes Library](ci/20_CI_RECIPES.md)** - **23 – [FAQ](23_FAQ_MATRIX.md)** - **24 – [Offline Update Kit Admin Guide](24_OFFLINE_KIT.md)** -- **25 – [Feedser Apple Connector Operations](ops/feedser-apple-operations.md)** +- **25 – [Concelier Apple Connector Operations](ops/concelier-apple-operations.md)** - **26 – [Authority Key Rotation Playbook](ops/authority-key-rotation.md)** -- **27 – [Feedser CCCS Connector Operations](ops/feedser-cccs-operations.md)** -- **28 – [Feedser CISA ICS Connector Operations](ops/feedser-icscisa-operations.md)** -- **29 – [Feedser CERT-Bund Connector Operations](ops/feedser-certbund-operations.md)** -- **30 – [Feedser MSRC Connector – AAD Onboarding](ops/feedser-msrc-operations.md)** +- **27 – [Concelier CCCS Connector Operations](ops/concelier-cccs-operations.md)** +- **28 – [Concelier CISA ICS Connector Operations](ops/concelier-icscisa-operations.md)** +- **29 – [Concelier CERT-Bund Connector Operations](ops/concelier-certbund-operations.md)** +- **30 – [Concelier MSRC Connector – AAD Onboarding](ops/concelier-msrc-operations.md)** ### Legal & licence - **31 – [Legal & Quota FAQ](29_LEGAL_FAQ_QUOTA.md)** diff --git a/docs/TASKS.md b/docs/TASKS.md index 2b14c092..4763b7b8 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -5,10 +5,10 @@ | DOC7.README-INDEX | DONE (2025-10-17) | Docs Guild | — | Refresh index docs (docs/README.md + root README) after architecture dossier split and Offline Kit overhaul. | ✅ ToC reflects new component architecture docs; ✅ root README highlights updated doc set; ✅ Offline Kit guide linked correctly. | | DOC4.AUTH-PDG | REVIEW | Docs Guild, Plugin Team | PLG6.DOC | Copy-edit `docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md`, export lifecycle diagram, add LDAP RFC cross-link. | ✅ PR merged with polish; ✅ Diagram committed; ✅ Slack handoff posted. | | DOC1.AUTH | DONE (2025-10-12) | Docs Guild, Authority Core | CORE5B.DOC | Draft `docs/11_AUTHORITY.md` covering architecture, configuration, bootstrap flows. | ✅ Architecture + config sections approved by Core; ✅ Samples reference latest options; ✅ Offline note added. | -| DOC3.Feedser-Authority | DONE (2025-10-12) | Docs Guild, DevEx | FSR4 | Polish operator/runbook sections (DOC3/DOC5) to document Feedser authority rollout, bypass logging, and enforcement checklist. | ✅ DOC3/DOC5 updated with audit runbook references; ✅ enforcement deadline highlighted; ✅ Docs guild sign-off. | -| DOC5.Feedser-Runbook | DONE (2025-10-12) | Docs Guild | DOC3.Feedser-Authority | Produce dedicated Feedser authority audit runbook covering log fields, monitoring recommendations, and troubleshooting steps. | ✅ Runbook published; ✅ linked from DOC3/DOC5; ✅ alerting guidance included. | -| FEEDDOCS-DOCS-05-001 | DONE (2025-10-11) | Docs Guild | FEEDMERGE-ENGINE-04-001, FEEDMERGE-ENGINE-04-002 | Publish Feedser conflict resolution runbook covering precedence workflow, merge-event auditing, and Sprint 3 metrics. | ✅ `docs/ops/feedser-conflict-resolution.md` committed; ✅ metrics/log tables align with latest merge code; ✅ Ops alert guidance handed to Feedser team. | -| FEEDDOCS-DOCS-05-002 | DONE (2025-10-16) | Docs Guild, Feedser Ops | FEEDDOCS-DOCS-05-001 | Ops sign-off captured: conflict runbook circulated, alert thresholds tuned, and rollout decisions documented in change log. | ✅ Ops review recorded; ✅ alert thresholds finalised using `docs/ops/feedser-authority-audit-runbook.md`; ✅ change-log entry linked from runbook once GHSA/NVD/OSV regression fixtures land. | +| DOC3.Concelier-Authority | DONE (2025-10-12) | Docs Guild, DevEx | FSR4 | Polish operator/runbook sections (DOC3/DOC5) to document Concelier authority rollout, bypass logging, and enforcement checklist. | ✅ DOC3/DOC5 updated with audit runbook references; ✅ enforcement deadline highlighted; ✅ Docs guild sign-off. | +| DOC5.Concelier-Runbook | DONE (2025-10-12) | Docs Guild | DOC3.Concelier-Authority | Produce dedicated Concelier authority audit runbook covering log fields, monitoring recommendations, and troubleshooting steps. | ✅ Runbook published; ✅ linked from DOC3/DOC5; ✅ alerting guidance included. | +| FEEDDOCS-DOCS-05-001 | DONE (2025-10-11) | Docs Guild | FEEDMERGE-ENGINE-04-001, FEEDMERGE-ENGINE-04-002 | Publish Concelier conflict resolution runbook covering precedence workflow, merge-event auditing, and Sprint 3 metrics. | ✅ `docs/ops/concelier-conflict-resolution.md` committed; ✅ metrics/log tables align with latest merge code; ✅ Ops alert guidance handed to Concelier team. | +| FEEDDOCS-DOCS-05-002 | DONE (2025-10-16) | Docs Guild, Concelier Ops | FEEDDOCS-DOCS-05-001 | Ops sign-off captured: conflict runbook circulated, alert thresholds tuned, and rollout decisions documented in change log. | ✅ Ops review recorded; ✅ alert thresholds finalised using `docs/ops/concelier-authority-audit-runbook.md`; ✅ change-log entry linked from runbook once GHSA/NVD/OSV regression fixtures land. | > Update statuses (TODO/DOING/REVIEW/DONE/BLOCKED) as progress changes. Keep guides in sync with configuration samples under `etc/`. diff --git a/docs/assets/authority/authority-rate-limit-flow.svg b/docs/assets/authority/authority-rate-limit-flow.svg index f2db1be5..4c46a142 100644 --- a/docs/assets/authority/authority-rate-limit-flow.svg +++ b/docs/assets/authority/authority-rate-limit-flow.svg @@ -101,5 +101,5 @@ 429 path → add `authority.client_id`, `authority.remote_ip` tags for dashboards. - Lockout path → reuse precedence strategy from Feedser dedup (see DEDUP_CONFLICTS_RESOLUTION_ALGO.md). + Lockout path → reuse precedence strategy from Concelier dedup (see DEDUP_CONFLICTS_RESOLUTION_ALGO.md). diff --git a/docs/feedser-connector-research-20251011.md b/docs/concelier-connector-research-20251011.md similarity index 80% rename from docs/feedser-connector-research-20251011.md rename to docs/concelier-connector-research-20251011.md index 97936ede..84de135e 100644 --- a/docs/feedser-connector-research-20251011.md +++ b/docs/concelier-connector-research-20251011.md @@ -1,4 +1,4 @@ -# Feedser Connector Research – 2025-10-11 +# Concelier Connector Research – 2025-10-11 Snapshot of direct network checks performed on 2025-10-11 (UTC) for the national/vendor connectors in scope. Use alongside each module’s `TASKS.md` notes. @@ -8,7 +8,7 @@ Snapshot of direct network checks performed on 2025-10-11 (UTC) for the national ## CCCS (Canada) - JSON endpoint (`https://www.cyber.gc.ca/api/cccs/threats/v1/get?lang=&content_type=cccs_threat`) returns ~5 100 records per language; `page=` still works for segmented pulls and the earliest `date_created` seen is 2018‑06‑08 (EN) / 2018‑06‑08 (FR). Use an explicit `User-Agent` to avoid 403 responses. -- Follow-up: telemetry, sanitiser coverage, and backfill procedures are documented in `docs/ops/feedser-cccs-operations.md` (2025‑10‑15). Adjust `maxEntriesPerFetch` when performing historical sweeps so cursor state remains responsive. +- Follow-up: telemetry, sanitiser coverage, and backfill procedures are documented in `docs/ops/concelier-cccs-operations.md` (2025‑10‑15). Adjust `maxEntriesPerFetch` when performing historical sweeps so cursor state remains responsive. ## CERT-Bund (Germany) - `https://wid.cert-bund.de/content/public/securityAdvisory/rss` responds 200 without cookies (≈250-item window, German taxonomy). Detail links load an Angular SPA that fetches JSON behind the bootstrap session. @@ -16,7 +16,7 @@ Snapshot of direct network checks performed on 2025-10-11 (UTC) for the national - Historical advisories accessible through the SPA search/export endpoints once the `XSRF-TOKEN` cookie (exposed via `GET /portal/api/security/csrf`) is supplied with the `X-XSRF-TOKEN` header: - `POST /portal/api/securityadvisory/search` (`{"page":N,"size":100,"sort":["published,desc"]}`) pages data back to 2014. - `GET /portal/api/securityadvisory/export?format=json&from=YYYY-MM-DD` emits JSON bundles suitable for Offline Kit mirrors. -- Locale note: content is German-only; Feedser preserves `language=de` and Docs will publish a CERT-Bund glossary so operators can bridge terminology without machine translation. +- Locale note: content is German-only; Concelier preserves `language=de` and Docs will publish a CERT-Bund glossary so operators can bridge terminology without machine translation. ## KISA / KNVD (Korea) - `https://knvd.krcert.or.kr/rss/securityInfo.do` and `/rss/securityNotice.do` return UTF-8 RSS (10-item window) with `detailDos.do?IDX=` links. No cookies required for feed fetch. @@ -24,11 +24,11 @@ Snapshot of direct network checks performed on 2025-10-11 (UTC) for the national ## BDU (Russia / FSTEC) - Candidate endpoints (`https://bdu.fstec.ru/component/rsform/form/7-bdu?format=xml/json`) return 403/404; TLS chain requires Russian Trusted Sub CA and WAF expects additional headers. -- Next actions: acquire official PEM chain, point `feedser:httpClients:source.bdu:trustedRootPaths` (or `feedser:sources:bdu:http:trustedRootPaths`) at the Offline Kit PEM, keep `allowInvalidCertificates=false`, script session bootstrap, then capture RSS/HTML schema for parser work. +- Next actions: acquire official PEM chain, point `concelier:httpClients:source.bdu:trustedRootPaths` (or `concelier:sources:bdu:http:trustedRootPaths`) at the Offline Kit PEM, keep `allowInvalidCertificates=false`, script session bootstrap, then capture RSS/HTML schema for parser work. ## NKTsKI / cert.gov.ru (Russia) - `https://cert.gov.ru/rss/advisories.xml` served via Bitrix returns 403/404 even with `Accept-Language: ru-RU`; TLS chain also requires Russian trust anchors. -- Next actions: source trust store, configure `feedser:httpClients:source.nkcki:trustedRootPaths` (Offline Kit root via `feedser:offline:root`), prepare proxy fallback, and once accessible document taxonomy/retention plus attachment handling. +- Next actions: source trust store, configure `concelier:httpClients:source.nkcki:trustedRootPaths` (Offline Kit root via `concelier:offline:root`), prepare proxy fallback, and once accessible document taxonomy/retention plus attachment handling. ## CISA ICS (United States) - `curl -I https://www.cisa.gov/cybersecurity-advisories/ics-advisories.xml` returns HTTP 403 + `x-reference-error` (Akamai). Same for legacy feed paths. diff --git a/docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md b/docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md index 788f6044..6d4b9be4 100644 --- a/docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md +++ b/docs/dev/31_AUTHORITY_PLUGIN_DEVELOPER_GUIDE.md @@ -3,7 +3,7 @@ > **Status:** Updated 2025-10-11 (AUTHPLUG-DOCS-01-001) with lifecycle + limiter diagrams and refreshed rate-limit guidance aligned to PLG6 acceptance criteria. ## 1. Overview -Authority plug-ins extend the **StellaOps Authority** service with custom identity providers, credential stores, and client-management logic. Unlike Feedser plug-ins (which ingest or export advisories), Authority plug-ins participate directly in authentication flows: +Authority plug-ins extend the **StellaOps Authority** service with custom identity providers, credential stores, and client-management logic. Unlike Concelier plug-ins (which ingest or export advisories), Authority plug-ins participate directly in authentication flows: - **Use cases:** integrate corporate directories (LDAP/AD), delegate to external IDPs, enforce bespoke password/lockout policies, or add client provisioning automation. - **Constraints:** plug-ins load only during service start (no hot-reload), must function without outbound internet access, and must emit deterministic results for identical configuration and input data. diff --git a/docs/dev/32_AUTH_CLIENT_GUIDE.md b/docs/dev/32_AUTH_CLIENT_GUIDE.md index 48587a41..8d170959 100644 --- a/docs/dev/32_AUTH_CLIENT_GUIDE.md +++ b/docs/dev/32_AUTH_CLIENT_GUIDE.md @@ -1,6 +1,6 @@ # StellaOps Auth Client — Integration Guide -> **Status:** Drafted 2025-10-10 as part of LIB5. Consumer teams (Feedser, CLI, Agent) should review before wiring the new options into their configuration surfaces. +> **Status:** Drafted 2025-10-10 as part of LIB5. Consumer teams (Concelier, CLI, Agent) should review before wiring the new options into their configuration surfaces. The `StellaOps.Auth.Client` library provides a resilient OpenID Connect client for services and tools that talk to **StellaOps Authority**. LIB5 introduced configurable HTTP retry/backoff policies and an offline-fallback window so downstream components stay deterministic even when Authority is briefly unavailable. @@ -14,7 +14,7 @@ services.AddStellaOpsAuthClient(options => options.Authority = configuration["StellaOps:Authority:Url"]!; options.ClientId = configuration["StellaOps:Authority:ClientId"]!; options.ClientSecret = configuration["StellaOps:Authority:ClientSecret"]; - options.DefaultScopes.Add("feedser.jobs.trigger"); + options.DefaultScopes.Add("concelier.jobs.trigger"); options.EnableRetries = true; options.RetryDelays.Clear(); @@ -53,7 +53,7 @@ Suggested configuration keys (coordinate with consuming teams before finalising) StellaOps: Authority: Url: "https://authority.stella-ops.local" - ClientId: "feedser" + ClientId: "concelier" ClientSecret: "change-me" AuthClient: EnableRetries: true @@ -72,7 +72,7 @@ STELLAOPS__AUTHORITY__AUTHCLIENT__RETRYDELAYS__0=00:00:02 STELLAOPS__AUTHORITY__AUTHCLIENT__OFFLINECACHETOLERANCE=00:05:00 ``` -CLI and Feedser teams should expose these knobs once they adopt the auth client. +CLI and Concelier teams should expose these knobs once they adopt the auth client. ## 4. Testing recommendations @@ -88,4 +88,4 @@ CLI and Feedser teams should expose these knobs once they adopt the auth client. - [ ] Extend smoke tests to cover Authority outage scenarios. - [ ] Coordinate with Docs Guild so user-facing quickstarts reference the new knobs. -Once Feedser and CLI integrate these changes, we can mark LIB5 **DONE**; further packaging work is deferred until the backlog reintroduces it. +Once Concelier and CLI integrate these changes, we can mark LIB5 **DONE**; further packaging work is deferred until the backlog reintroduces it. diff --git a/docs/dev/fixtures.md b/docs/dev/fixtures.md index 15f759be..e6aa0faf 100644 --- a/docs/dev/fixtures.md +++ b/docs/dev/fixtures.md @@ -1,45 +1,45 @@ -# Feedser Fixture Maintenance +# Concelier Fixture Maintenance -Feedser uses a handful of deterministic fixtures to keep connector regressions in check. This guide lists the +Concelier uses a handful of deterministic fixtures to keep connector regressions in check. This guide lists the fixture sets, where they live, and how to regenerate them safely. --- ## GHSA ↔ OSV parity fixtures -- **Location:** `src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.*.json` +- **Location:** `src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.*.json` - **Purpose:** Exercised by `OsvGhsaParityRegressionTests` to ensure OSV + GHSA outputs stay aligned on aliases, ranges, references, and credits. -- **Regeneration:** Either run the test harness with online regeneration (`UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj`) +- **Regeneration:** Either run the test harness with online regeneration (`UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj`) or execute the fixture updater (`dotnet run --project tools/FixtureUpdater/FixtureUpdater.csproj`). Both paths normalise timestamps and canonical ordering. - **SemVer provenance:** The regenerated fixtures should show `normalizedVersions[].notes` in the `osv:{ecosystem}:{advisoryId}:{identifier}` shape emitted by `SemVerRangeRuleBuilder`. Confirm the constraints and notes line up with GHSA/NVD composites before committing. -- **Verification:** Inspect the diff, then re-run `dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj` to confirm parity. +- **Verification:** Inspect the diff, then re-run `dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj` to confirm parity. ## GHSA credit parity fixtures -- **Location:** `src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.{ghsa,osv,nvd}.json` +- **Location:** `src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.{ghsa,osv,nvd}.json` - **Purpose:** Exercised by `GhsaCreditParityRegressionTests` to guarantee GHSA/NVD/OSV acknowledgements remain in lockstep. - **Regeneration:** `dotnet run --project tools/FixtureUpdater/FixtureUpdater.csproj` rewrites all three canonical snapshots. -- **Verification:** `dotnet test src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj`. +- **Verification:** `dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj`. > Always commit fixture changes together with the code that motivated them and reference the regression test that guards the behaviour. ## Apple security update fixtures -- **Location:** `src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/*.html` and `.expected.json`. +- **Location:** `src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/*.html` and `.expected.json`. - **Purpose:** Exercised by `AppleLiveRegressionTests` to guarantee the Apple HTML parser and mapper stay deterministic while covering Rapid Security Responses and multi-device advisories. - **Regeneration:** Use the helper scripts (`scripts/update-apple-fixtures.sh` or `scripts/update-apple-fixtures.ps1`). They export `UPDATE_APPLE_FIXTURES=1`, propagate the flag through `WSLENV`, touch `.update-apple-fixtures`, and then run the Apple test project. This keeps WSL/VSCode test invocations in sync while the refresh workflow fetches live Apple support pages, sanitises them, and rewrites both the HTML and expected DTO snapshots with normalised ordering. -- **Verification:** Inspect the generated diffs and re-run `dotnet test src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj` without the env var to confirm determinism. +- **Verification:** Inspect the generated diffs and re-run `dotnet test src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj` without the env var to confirm determinism. > **Tip for other connector owners:** mirror the sentinel + `WSLENV` pattern (`touch .update--fixtures`, append the env var via `WSLENV`) when you add fixture refresh scripts so contributors running under WSL inherit the regeneration flag automatically. ## KISA advisory fixtures -- **Location:** `src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-{feed,detail}.(xml|json)` +- **Location:** `src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-{feed,detail}.(xml|json)` - **Purpose:** Used by `KisaConnectorTests` to verify Hangul-aware fetch → parse → map flows and to assert telemetry counters stay wired. -- **Regeneration:** `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj` +- **Regeneration:** `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj` - **Verification:** Re-run the same test suite without the env var; confirm advisory content remains NFC-normalised and HTML is sanitised. Metrics assertions will fail if counters drift. - **Localisation note:** RSS `category` values (e.g. `취약점정보`) remain in Hangul—do not translate them in fixtures; they feed directly into metrics/log tags. diff --git a/docs/dev/kisa_connector_notes.md b/docs/dev/kisa_connector_notes.md index ae8dba52..bee33738 100644 --- a/docs/dev/kisa_connector_notes.md +++ b/docs/dev/kisa_connector_notes.md @@ -4,7 +4,7 @@ The KISA/KNVD connector now ships with structured telemetry, richer logging, and ## Telemetry counters -All metrics are emitted from `KisaDiagnostics` (`Meter` name `StellaOps.Feedser.Source.Kisa`). +All metrics are emitted from `KisaDiagnostics` (`Meter` name `StellaOps.Concelier.Source.Kisa`). | Metric | Description | Tags | | --- | --- | --- | @@ -39,7 +39,7 @@ The messages use structured properties (`Idx`, `Category`, `DocumentId`, `Severi - Hangul fields (`title`, `summary`, `category`, `reference.label`, product vendor/name) are normalised to NFC before storage. Sample category `취약점정보` roughly translates to “vulnerability information”. - Advisory HTML is sanitised via `HtmlContentSanitizer`, stripping script/style while preserving inline anchors for translation pipelines. - Metrics carry Hangul `category` tags and logging keeps Hangul strings intact; this ensures air-gapped operators can validate native-language content without relying on MT. -- Fixtures live under `src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/`. Regenerate with `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj`. +- Fixtures live under `src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/`. Regenerate with `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj`. - The regression suite asserts canonical mapping, state cleanup, and telemetry counters (`KisaConnectorTests.Telemetry_RecordsMetrics`) so QA can track instrumentation drift. For operator docs, link to this brief when documenting Hangul handling or counter dashboards so localisation reviewers have a single reference point. diff --git a/docs/dev/merge_semver_playbook.md b/docs/dev/merge_semver_playbook.md index 7ae3044a..019d8320 100644 --- a/docs/dev/merge_semver_playbook.md +++ b/docs/dev/merge_semver_playbook.md @@ -1,4 +1,4 @@ -# Feedser SemVer Merge Playbook (Sprint 1–2) +# Concelier SemVer Merge Playbook (Sprint 1–2) This playbook describes how the merge layer and connector teams should emit the new SemVer primitives introduced in Sprint 1–2, how those primitives become normalized version rules, and how downstream jobs query them deterministically. @@ -8,7 +8,7 @@ This playbook describes how the merge layer and connector teams should emit the - `NormalizedVersionRule` documents the analytics-friendly projection of each `AffectedPackage` coverage entry and is persisted alongside legacy `versionRanges`. - `AdvisoryProvenance.decisionReason` records whether merge resolution favored precedence, freshness, or a tie-breaker comparison. -See `src/StellaOps.Feedser.Models/CANONICAL_RECORDS.md` for the full schema and field descriptions. +See `src/StellaOps.Concelier.Models/CANONICAL_RECORDS.md` for the full schema and field descriptions. ## 2. Mapper pattern @@ -150,5 +150,5 @@ If a new scheme is required (for example, `apple.build` or `ios.semver`), raise ## 9. Observability signals -- `feedser.merge.normalized_rules` (counter, tags: `package_type`, `scheme`) – increments once per normalized rule retained after precedence merge. -- `feedser.merge.normalized_rules_missing` (counter, tags: `package_type`) – increments when a merged package still carries version ranges but no normalized rules; watch for spikes to catch connectors that have not emitted normalized arrays yet. +- `concelier.merge.normalized_rules` (counter, tags: `package_type`, `scheme`) – increments once per normalized rule retained after precedence merge. +- `concelier.merge.normalized_rules_missing` (counter, tags: `package_type`) – increments when a merged package still carries version ranges but no normalized rules; watch for spikes to catch connectors that have not emitted normalized arrays yet. diff --git a/docs/dev/mongo_indices.md b/docs/dev/mongo_indices.md index 53992628..b68a6fcd 100644 --- a/docs/dev/mongo_indices.md +++ b/docs/dev/mongo_indices.md @@ -2,11 +2,11 @@ This guide complements the Sprint 1–2 normalized versions rollout. It documents recommended indexes and aggregation patterns for querying `AffectedPackage.normalizedVersions`. -For a field-by-field look at how normalized rules persist in MongoDB (including provenance metadata), see Section 8 of the [Feedser SemVer Merge Playbook](merge_semver_playbook.md). +For a field-by-field look at how normalized rules persist in MongoDB (including provenance metadata), see Section 8 of the [Concelier SemVer Merge Playbook](merge_semver_playbook.md). ## 1. Recommended indexes -When `feedser.storage.enableSemVerStyle` is enabled, advisories expose a flattened +When `concelier.storage.enableSemVerStyle` is enabled, advisories expose a flattened `normalizedVersions` array at the document root. Create these indexes in `mongosh` after the migration completes (adjust collection name if you use a prefix): @@ -105,4 +105,4 @@ Use this to confirm the merge dedupe logic keeps only one normalized rule per un - [ ] Notify downstream services that consume advisory snapshots about the new `normalizedVersions` array. - [ ] Update export fixtures once dedupe verification passes. -Additional background and mapper examples live in [Feedser SemVer Merge Playbook](merge_semver_playbook.md). +Additional background and mapper examples live in [Concelier SemVer Merge Playbook](merge_semver_playbook.md). diff --git a/docs/dev/normalized_versions_rollout.md b/docs/dev/normalized_versions_rollout.md index 94a91193..b348bcd8 100644 --- a/docs/dev/normalized_versions_rollout.md +++ b/docs/dev/normalized_versions_rollout.md @@ -1,11 +1,11 @@ -# Normalized Versions Rollout Dashboard (Sprint 2 – Feedser) +# Normalized Versions Rollout Dashboard (Sprint 2 – Concelier) _Status date: 2025-10-12 17:05 UTC_ This dashboard tracks connector readiness for emitting `AffectedPackage.NormalizedVersions` arrays and highlights upcoming coordination checkpoints. Use it alongside: -- [`src/StellaOps.Feedser.Merge/RANGE_PRIMITIVES_COORDINATION.md`](../../src/StellaOps.Feedser.Merge/RANGE_PRIMITIVES_COORDINATION.md) for detailed guidance and timelines. -- [Feedser SemVer Merge Playbook](merge_semver_playbook.md) §8 for persisted Mongo document shapes. +- [`src/StellaOps.Concelier.Merge/RANGE_PRIMITIVES_COORDINATION.md`](../../src/StellaOps.Concelier.Merge/RANGE_PRIMITIVES_COORDINATION.md) for detailed guidance and timelines. +- [Concelier SemVer Merge Playbook](merge_semver_playbook.md) §8 for persisted Mongo document shapes. - [Normalized Versions Query Guide](mongo_indices.md) for index/query validation steps. ## Key milestones @@ -18,28 +18,28 @@ This dashboard tracks connector readiness for emitting `AffectedPackage.Normaliz | Connector | Owner team | Normalized versions status | Last update | Next action / link | |-----------|------------|---------------------------|-------------|--------------------| -| Acsc | BE-Conn-ACSC | ❌ Not started – mapper pending | 2025-10-11 | Design DTOs + mapper with normalized rule array; see `src/StellaOps.Feedser.Source.Acsc/TASKS.md`. | +| Acsc | BE-Conn-ACSC | ❌ Not started – mapper pending | 2025-10-11 | Design DTOs + mapper with normalized rule array; see `src/StellaOps.Concelier.Source.Acsc/TASKS.md`. | | Cccs | BE-Conn-CCCS | ❌ Not started – mapper pending | 2025-10-11 | Add normalized SemVer array in canonical mapper; coordinate fixtures per `TASKS.md`. | -| CertBund | BE-Conn-CERTBUND | ✅ Canonical mapper emitting vendor ranges | 2025-10-14 | Normalized vendor range payloads landed alongside telemetry/docs updates; see `src/StellaOps.Feedser.Source.CertBund/TASKS.md`. | -| CertCc | BE-Conn-CERTCC | ⚠️ In progress – fetch pipeline DOING | 2025-10-11 | Implement VINCE mapper with SemVer/NEVRA rules; unblock snapshot regeneration; `src/StellaOps.Feedser.Source.CertCc/TASKS.md`. | -| Kev | BE-Conn-KEV | ✅ Normalized catalog/due-date rules verified | 2025-10-12 | Fixtures reconfirmed via `dotnet test src/StellaOps.Feedser.Source.Kev.Tests`; `src/StellaOps.Feedser.Source.Kev/TASKS.md`. | -| Cve | BE-Conn-CVE | ✅ Normalized SemVer rules verified | 2025-10-12 | Snapshot parity green (`dotnet test src/StellaOps.Feedser.Source.Cve.Tests`); `src/StellaOps.Feedser.Source.Cve/TASKS.md`. | -| Ghsa | BE-Conn-GHSA | ⚠️ DOING – normalized rollout task active | 2025-10-11 18:45 UTC | Wire `SemVerRangeRuleBuilder` + refresh fixtures; `src/StellaOps.Feedser.Source.Ghsa/TASKS.md`. | -| Osv | BE-Conn-OSV | ✅ SemVer mapper & parity fixtures verified | 2025-10-12 | GHSA parity regression passing (`dotnet test src/StellaOps.Feedser.Source.Osv.Tests`); `src/StellaOps.Feedser.Source.Osv/TASKS.md`. | -| Ics.Cisa | BE-Conn-ICS-CISA | ❌ Not started – mapper TODO | 2025-10-11 | Plan SemVer/firmware scheme selection; `src/StellaOps.Feedser.Source.Ics.Cisa/TASKS.md`. | +| CertBund | BE-Conn-CERTBUND | ✅ Canonical mapper emitting vendor ranges | 2025-10-14 | Normalized vendor range payloads landed alongside telemetry/docs updates; see `src/StellaOps.Concelier.Source.CertBund/TASKS.md`. | +| CertCc | BE-Conn-CERTCC | ⚠️ In progress – fetch pipeline DOING | 2025-10-11 | Implement VINCE mapper with SemVer/NEVRA rules; unblock snapshot regeneration; `src/StellaOps.Concelier.Source.CertCc/TASKS.md`. | +| Kev | BE-Conn-KEV | ✅ Normalized catalog/due-date rules verified | 2025-10-12 | Fixtures reconfirmed via `dotnet test src/StellaOps.Concelier.Source.Kev.Tests`; `src/StellaOps.Concelier.Source.Kev/TASKS.md`. | +| Cve | BE-Conn-CVE | ✅ Normalized SemVer rules verified | 2025-10-12 | Snapshot parity green (`dotnet test src/StellaOps.Concelier.Source.Cve.Tests`); `src/StellaOps.Concelier.Source.Cve/TASKS.md`. | +| Ghsa | BE-Conn-GHSA | ⚠️ DOING – normalized rollout task active | 2025-10-11 18:45 UTC | Wire `SemVerRangeRuleBuilder` + refresh fixtures; `src/StellaOps.Concelier.Source.Ghsa/TASKS.md`. | +| Osv | BE-Conn-OSV | ✅ SemVer mapper & parity fixtures verified | 2025-10-12 | GHSA parity regression passing (`dotnet test src/StellaOps.Concelier.Source.Osv.Tests`); `src/StellaOps.Concelier.Source.Osv/TASKS.md`. | +| Ics.Cisa | BE-Conn-ICS-CISA | ❌ Not started – mapper TODO | 2025-10-11 | Plan SemVer/firmware scheme selection; `src/StellaOps.Concelier.Source.Ics.Cisa/TASKS.md`. | | Kisa | BE-Conn-KISA | ✅ Landed 2025-10-14 (mapper + telemetry) | 2025-10-11 | Hangul-aware mapper emits normalized rules; see `docs/dev/kisa_connector_notes.md` for localisation/metric details. | -| Ru.Bdu | BE-Conn-BDU | ✅ Raw scheme emitted | 2025-10-14 | Mapper now writes `ru-bdu.raw` normalized rules with provenance + telemetry; `src/StellaOps.Feedser.Source.Ru.Bdu/TASKS.md`. | -| Ru.Nkcki | BE-Conn-Nkcki | ❌ Not started – mapper TODO | 2025-10-11 | Similar to BDU; ensure Cyrillic provenance preserved; `src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md`. | -| Vndr.Apple | BE-Conn-Apple | ✅ Shipped – emitting normalized arrays | 2025-10-11 | Continue fixture/tooling work; `src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md`. | +| Ru.Bdu | BE-Conn-BDU | ✅ Raw scheme emitted | 2025-10-14 | Mapper now writes `ru-bdu.raw` normalized rules with provenance + telemetry; `src/StellaOps.Concelier.Source.Ru.Bdu/TASKS.md`. | +| Ru.Nkcki | BE-Conn-Nkcki | ❌ Not started – mapper TODO | 2025-10-11 | Similar to BDU; ensure Cyrillic provenance preserved; `src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md`. | +| Vndr.Apple | BE-Conn-Apple | ✅ Shipped – emitting normalized arrays | 2025-10-11 | Continue fixture/tooling work; `src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md`. | | Vndr.Cisco | BE-Conn-Cisco | ✅ SemVer + vendor extensions emitted | 2025-10-14 | Connector outputs SemVer primitives with `cisco.productId` notes; see `CiscoMapper` and fixtures for coverage. | -| Vndr.Msrc | BE-Conn-MSRC | ✅ Map + normalized build rules landed | 2025-10-15 | `MsrcMapper` emits `msrc.build` normalized rules with CVRF references; see `src/StellaOps.Feedser.Source.Vndr.Msrc/TASKS.md`. | -| Nvd | BE-Conn-NVD | ⚠️ Needs follow-up – mapper complete but normalized array MR pending | 2025-10-11 | Align CVE notes + normalized payload flag; `src/StellaOps.Feedser.Source.Nvd/TASKS.md`. | +| Vndr.Msrc | BE-Conn-MSRC | ✅ Map + normalized build rules landed | 2025-10-15 | `MsrcMapper` emits `msrc.build` normalized rules with CVRF references; see `src/StellaOps.Concelier.Source.Vndr.Msrc/TASKS.md`. | +| Nvd | BE-Conn-NVD | ⚠️ Needs follow-up – mapper complete but normalized array MR pending | 2025-10-11 | Align CVE notes + normalized payload flag; `src/StellaOps.Concelier.Source.Nvd/TASKS.md`. | Legend: ✅ complete, ⚠️ in progress/partial, ❌ not started. ## Monitoring -- Merge now emits `feedser.merge.normalized_rules` (tags: `package_type`, `scheme`) and `feedser.merge.normalized_rules_missing` (tags: `package_type`). Track these counters to confirm normalized arrays land as connectors roll out. +- Merge now emits `concelier.merge.normalized_rules` (tags: `package_type`, `scheme`) and `concelier.merge.normalized_rules_missing` (tags: `package_type`). Track these counters to confirm normalized arrays land as connectors roll out. - Expect `normalized_rules_missing` to trend toward zero as each connector flips on normalized output. Investigate any sustained counts by checking the corresponding module `TASKS.md`. ## Implementation tips diff --git a/docs/ops/feedser-apple-operations.md b/docs/ops/concelier-apple-operations.md similarity index 70% rename from docs/ops/feedser-apple-operations.md rename to docs/ops/concelier-apple-operations.md index d87fa39b..53a83663 100644 --- a/docs/ops/feedser-apple-operations.md +++ b/docs/ops/concelier-apple-operations.md @@ -1,4 +1,4 @@ -# Feedser Apple Security Update Connector Operations +# Concelier Apple Security Update Connector Operations This runbook covers staging and production rollout for the Apple security updates connector (`source:vndr-apple:*`), including observability checks and fixture maintenance. @@ -6,10 +6,10 @@ This runbook covers staging and production rollout for the Apple security update - Network egress (or mirrored cache) for `https://gdmf.apple.com/v2/pmv` and the Apple Support domain (`https://support.apple.com/`). - Optional: corporate proxy exclusions for the Apple hosts if outbound traffic is normally filtered. -- Updated configuration (environment variables or `feedser.yaml`) with an `apple` section. Example baseline: +- Updated configuration (environment variables or `concelier.yaml`) with an `apple` section. Example baseline: ```yaml -feedser: +concelier: sources: apple: softwareLookupUri: "https://gdmf.apple.com/v2/pmv" @@ -21,23 +21,23 @@ feedser: failureBackoff: "00:05:00" ``` -> ℹ️ `softwareLookupUri` and `advisoryBaseUri` must stay absolute and aligned with the HTTP allow-list; Feedser automatically adds both hosts to the connector HttpClient. +> ℹ️ `softwareLookupUri` and `advisoryBaseUri` must stay absolute and aligned with the HTTP allow-list; Concelier automatically adds both hosts to the connector HttpClient. ## 2. Staging Smoke Test -1. Deploy the configuration and restart the Feedser workers to ensure the Apple connector options are bound. +1. Deploy the configuration and restart the Concelier workers to ensure the Apple connector options are bound. 2. Trigger a full connector cycle: - CLI: `stella db jobs run source:vndr-apple:fetch --and-then source:vndr-apple:parse --and-then source:vndr-apple:map` - REST: `POST /jobs/run { "kind": "source:vndr-apple:fetch", "chain": ["source:vndr-apple:parse", "source:vndr-apple:map"] }` -3. Validate metrics exported under meter `StellaOps.Feedser.Source.Vndr.Apple`: +3. Validate metrics exported under meter `StellaOps.Concelier.Source.Vndr.Apple`: - `apple.fetch.items` (documents fetched) - `apple.fetch.failures` - `apple.fetch.unchanged` - `apple.parse.failures` - `apple.map.affected.count` (histogram of affected package counts) 4. Cross-check the shared HTTP counters: - - `feedser.source.http.requests_total{feedser_source="vndr-apple"}` should increase for both index and detail phases. - - `feedser.source.http.failures_total{feedser_source="vndr-apple"}` should remain flat (0) during a healthy run. + - `concelier.source.http.requests_total{concelier_source="vndr-apple"}` should increase for both index and detail phases. + - `concelier.source.http.failures_total{concelier_source="vndr-apple"}` should remain flat (0) during a healthy run. 5. Inspect the info logs: - `Apple software index fetch … processed=X newDocuments=Y` - `Apple advisory parse complete … aliases=… affected=…` @@ -50,28 +50,28 @@ feedser: ## 3. Production Monitoring -- **Dashboards** – Add the following expressions to your Feedser Grafana board (OTLP/Prometheus naming assumed): - - `rate(apple_fetch_items_total[15m])` vs `rate(feedser_source_http_requests_total{feedser_source="vndr-apple"}[15m])` +- **Dashboards** – Add the following expressions to your Concelier Grafana board (OTLP/Prometheus naming assumed): + - `rate(apple_fetch_items_total[15m])` vs `rate(concelier_source_http_requests_total{concelier_source="vndr-apple"}[15m])` - `rate(apple_fetch_failures_total[5m])` for error spikes (`severity=warning` at `>0`) - `histogram_quantile(0.95, rate(apple_map_affected_count_bucket[1h]))` to watch affected-package fan-out - `increase(apple_parse_failures_total[6h])` to catch parser drift (alerts at `>0`) - **Alerts** – Page if `rate(apple_fetch_items_total[2h]) == 0` during business hours while other connectors are active. This often indicates lookup feed failures or misconfigured allow-lists. - **Logs** – Surface warnings `Apple document {DocumentId} missing GridFS payload` or `Apple parse failed`—repeated hits imply storage issues or HTML regressions. -- **Telemetry pipeline** – `StellaOps.Feedser.WebService` now exports `StellaOps.Feedser.Source.Vndr.Apple` alongside existing Feedser meters; ensure your OTEL collector or Prometheus scraper includes it. +- **Telemetry pipeline** – `StellaOps.Concelier.WebService` now exports `StellaOps.Concelier.Source.Vndr.Apple` alongside existing Concelier meters; ensure your OTEL collector or Prometheus scraper includes it. ## 4. Fixture Maintenance -Regression fixtures live under `src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures`. Refresh them whenever Apple reshapes the HT layout or when new platforms appear. +Regression fixtures live under `src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures`. Refresh them whenever Apple reshapes the HT layout or when new platforms appear. 1. Run the helper script matching your platform: - Bash: `./scripts/update-apple-fixtures.sh` - PowerShell: `./scripts/update-apple-fixtures.ps1` 2. Each script exports `UPDATE_APPLE_FIXTURES=1`, updates the `WSLENV` passthrough, and touches `.update-apple-fixtures` so WSL+VS Code test runs observe the flag. The subsequent test execution fetches the live HT articles listed in `AppleFixtureManager`, sanitises the HTML, and rewrites the `.expected.json` DTO snapshots. -3. Review the diff for localisation or nav noise. Once satisfied, re-run the tests without the env var (`dotnet test src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj`) to verify determinism. +3. Review the diff for localisation or nav noise. Once satisfied, re-run the tests without the env var (`dotnet test src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj`) to verify determinism. 4. Commit fixture updates together with any parser/mapping changes that motivated them. ## 5. Known Issues & Follow-up Tasks - Apple occasionally throttles anonymous requests after bursts. The connector backs off automatically, but persistent `apple.fetch.failures` spikes might require mirroring the HT content or scheduling wider fetch windows. - Rapid Security Responses may appear before the general patch notes surface in the lookup JSON. When that happens, the fetch run will log `detailFailures>0`. Collect sample HTML and refresh fixtures to confirm parser coverage. -- Multi-locale content is still under regression sweep (`src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md`). Capture non-`en-us` snapshots once the fixture tooling stabilises. +- Multi-locale content is still under regression sweep (`src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md`). Capture non-`en-us` snapshots once the fixture tooling stabilises. diff --git a/docs/ops/feedser-authority-audit-runbook.md b/docs/ops/concelier-authority-audit-runbook.md similarity index 58% rename from docs/ops/feedser-authority-audit-runbook.md rename to docs/ops/concelier-authority-audit-runbook.md index 3262037a..91b777dd 100644 --- a/docs/ops/feedser-authority-audit-runbook.md +++ b/docs/ops/concelier-authority-audit-runbook.md @@ -1,32 +1,32 @@ -# Feedser Authority Audit Runbook +# Concelier Authority Audit Runbook _Last updated: 2025-10-12_ -This runbook helps operators verify and monitor the StellaOps Feedser ⇆ Authority integration. It focuses on the `/jobs*` surface, which now requires StellaOps Authority tokens, and the corresponding audit/metric signals that expose authentication and bypass activity. +This runbook helps operators verify and monitor the StellaOps Concelier ⇆ Authority integration. It focuses on the `/jobs*` surface, which now requires StellaOps Authority tokens, and the corresponding audit/metric signals that expose authentication and bypass activity. ## 1. Prerequisites -- Authority integration is enabled in `feedser.yaml` (or via `FEEDSER_AUTHORITY__*` environment variables) with a valid `clientId`, secret, audience, and required scopes. -- OTLP metrics/log exporters are configured (`feedser.telemetry.*`) or container stdout is shipped to your SIEM. -- Operators have access to the Feedser job trigger endpoints via CLI or REST for smoke tests. +- Authority integration is enabled in `concelier.yaml` (or via `CONCELIER_AUTHORITY__*` environment variables) with a valid `clientId`, secret, audience, and required scopes. +- OTLP metrics/log exporters are configured (`concelier.telemetry.*`) or container stdout is shipped to your SIEM. +- Operators have access to the Concelier job trigger endpoints via CLI or REST for smoke tests. ### Configuration snippet ```yaml -feedser: +concelier: authority: enabled: true allowAnonymousFallback: false # keep true only during initial rollout issuer: "https://authority.internal" audiences: - - "api://feedser" + - "api://concelier" requiredScopes: - - "feedser.jobs.trigger" + - "concelier.jobs.trigger" bypassNetworks: - "127.0.0.1/32" - "::1/128" - clientId: "feedser-jobs" - clientSecretFile: "/run/secrets/feedser_authority_client" + clientId: "concelier-jobs" + clientSecretFile: "/run/secrets/concelier_authority_client" tokenClockSkewSeconds: 60 resilience: enableRetries: true @@ -38,22 +38,22 @@ feedser: offlineCacheTolerance: "00:10:00" ``` -> Store secrets outside source control. Feedser reads `clientSecretFile` on startup; rotate by updating the mounted file and restarting the service. +> Store secrets outside source control. Concelier reads `clientSecretFile` on startup; rotate by updating the mounted file and restarting the service. ### Resilience tuning -- **Connected sites:** keep the default 1 s / 2 s / 5 s retry ladder so Feedser retries transient Authority hiccups but still surfaces outages quickly. Leave `allowOfflineCacheFallback=true` so cached discovery/JWKS data can bridge short Pathfinder restarts. -- **Air-gapped/Offline Kit installs:** extend `offlineCacheTolerance` (15–30 minutes) to keep the cached metadata valid between manual synchronisations. You can also disable retries (`enableRetries=false`) if infrastructure teams prefer to handle exponential backoff at the network layer; Feedser will fail fast but keep deterministic logs. -- Feedser resolves these knobs through `IOptionsMonitor`. Edits to `feedser.yaml` are applied on configuration reload; restart the container if you change environment variables or do not have file-watch reloads enabled. +- **Connected sites:** keep the default 1 s / 2 s / 5 s retry ladder so Concelier retries transient Authority hiccups but still surfaces outages quickly. Leave `allowOfflineCacheFallback=true` so cached discovery/JWKS data can bridge short Pathfinder restarts. +- **Air-gapped/Offline Kit installs:** extend `offlineCacheTolerance` (15–30 minutes) to keep the cached metadata valid between manual synchronisations. You can also disable retries (`enableRetries=false`) if infrastructure teams prefer to handle exponential backoff at the network layer; Concelier will fail fast but keep deterministic logs. +- Concelier resolves these knobs through `IOptionsMonitor`. Edits to `concelier.yaml` are applied on configuration reload; restart the container if you change environment variables or do not have file-watch reloads enabled. ## 2. Key Signals ### 2.1 Audit log channel -Feedser emits structured audit entries via the `Feedser.Authorization.Audit` logger for every `/jobs*` request once Authority enforcement is active. +Concelier emits structured audit entries via the `Concelier.Authorization.Audit` logger for every `/jobs*` request once Authority enforcement is active. ``` -Feedser authorization audit route=/jobs/definitions status=200 subject=ops@example.com clientId=feedser-cli scopes=feedser.jobs.trigger bypass=False remote=10.1.4.7 +Concelier authorization audit route=/jobs/definitions status=200 subject=ops@example.com clientId=concelier-cli scopes=concelier.jobs.trigger bypass=False remote=10.1.4.7 ``` | Field | Sample value | Meaning | @@ -61,8 +61,8 @@ Feedser authorization audit route=/jobs/definitions status=200 subject=ops@examp | `route` | `/jobs/definitions` | Endpoint that processed the request. | | `status` | `200` / `401` / `409` | Final HTTP status code returned to the caller. | | `subject` | `ops@example.com` | User or service principal subject (falls back to `(anonymous)` when unauthenticated). | -| `clientId` | `feedser-cli` | OAuth client ID provided by Authority ( `(none)` if the token lacked the claim). | -| `scopes` | `feedser.jobs.trigger` | Normalised scope list extracted from token claims; `(none)` if the token carried none. | +| `clientId` | `concelier-cli` | OAuth client ID provided by Authority ( `(none)` if the token lacked the claim). | +| `scopes` | `concelier.jobs.trigger` | Normalised scope list extracted from token claims; `(none)` if the token carried none. | | `bypass` | `True` / `False` | Indicates whether the request succeeded because its source IP matched a bypass CIDR. | | `remote` | `10.1.4.7` | Remote IP recorded from the connection / forwarded header test hooks. | @@ -74,7 +74,7 @@ Use your logging backend (e.g., Loki) to index the logger name and filter for su ### 2.2 Metrics -Feedser publishes counters under the OTEL meter `StellaOps.Feedser.WebService.Jobs`. Tags: `job.kind`, `job.trigger`, `job.outcome`. +Concelier publishes counters under the OTEL meter `StellaOps.Concelier.WebService.Jobs`. Tags: `job.kind`, `job.trigger`, `job.outcome`. | Metric name | Description | PromQL example | |-------------------------------|----------------------------------------------------|----------------| @@ -84,42 +84,42 @@ Feedser publishes counters under the OTEL meter `StellaOps.Feedser.WebService.Jo > Prometheus/OTEL collectors typically surface counters with `_total` suffix. Adjust queries to match your pipeline’s generated metric names. -Correlate audit logs with the following global meter exported via `Feedser.SourceDiagnostics`: +Correlate audit logs with the following global meter exported via `Concelier.SourceDiagnostics`: -- `feedser.source.http.requests_total{feedser_source="jobs-run"}` – ensures REST/manual triggers route through Authority. -- If Grafana dashboards are deployed, extend the “Feedser Jobs” board with the above counters plus a table of recent audit log entries. +- `concelier.source.http.requests_total{concelier_source="jobs-run"}` – ensures REST/manual triggers route through Authority. +- If Grafana dashboards are deployed, extend the “Concelier Jobs” board with the above counters plus a table of recent audit log entries. ## 3. Alerting Guidance 1. **Unauthorized bypass attempt** - - Query: `sum(rate(log_messages_total{logger="Feedser.Authorization.Audit", status="401", bypass="True"}[5m])) > 0` + - Query: `sum(rate(log_messages_total{logger="Concelier.Authorization.Audit", status="401", bypass="True"}[5m])) > 0` - Action: verify `bypassNetworks` list; confirm expected maintenance windows; rotate credentials if suspicious. 2. **Missing scopes** - - Query: `sum(rate(log_messages_total{logger="Feedser.Authorization.Audit", scopes="(none)", status="200"}[5m])) > 0` - - Action: audit Authority client registration; ensure `requiredScopes` includes `feedser.jobs.trigger`. + - Query: `sum(rate(log_messages_total{logger="Concelier.Authorization.Audit", scopes="(none)", status="200"}[5m])) > 0` + - Action: audit Authority client registration; ensure `requiredScopes` includes `concelier.jobs.trigger`. 3. **Trigger failure surge** - Query: `sum(rate(web_jobs_trigger_failed_total[10m])) > 0` with severity `warning` if sustained for 10 minutes. - - Action: inspect correlated audit entries and `Feedser.Telemetry` traces for job execution errors. + - Action: inspect correlated audit entries and `Concelier.Telemetry` traces for job execution errors. 4. **Conflict spike** - Query: `sum(rate(web_jobs_trigger_conflict_total[10m])) > 5` (tune threshold). - Action: downstream scheduling may be firing repetitive triggers; ensure precedence is configured properly. 5. **Authority offline** - - Watch `Feedser.Authorization.Audit` logs for `status=503` or `status=500` along with `clientId="(none)"`. Investigate Authority availability before re-enabling anonymous fallback. + - Watch `Concelier.Authorization.Audit` logs for `status=503` or `status=500` along with `clientId="(none)"`. Investigate Authority availability before re-enabling anonymous fallback. ## 4. Rollout & Verification Procedure 1. **Pre-checks** - Confirm `allowAnonymousFallback` is `false` in production; keep `true` only during staged validation. - - Validate Authority issuer metadata is reachable from Feedser (`curl https://authority.internal/.well-known/openid-configuration` from the host). + - Validate Authority issuer metadata is reachable from Concelier (`curl https://authority.internal/.well-known/openid-configuration` from the host). 2. **Smoke test with valid token** - - Obtain a token via CLI: `stella auth login --scope feedser.jobs.trigger`. - - Trigger a read-only endpoint: `curl -H "Authorization: Bearer $TOKEN" https://feedser.internal/jobs/definitions`. - - Expect HTTP 200/202 and an audit log with `bypass=False`, `scopes=feedser.jobs.trigger`. + - Obtain a token via CLI: `stella auth login --scope concelier.jobs.trigger`. + - Trigger a read-only endpoint: `curl -H "Authorization: Bearer $TOKEN" https://concelier.internal/jobs/definitions`. + - Expect HTTP 200/202 and an audit log with `bypass=False`, `scopes=concelier.jobs.trigger`. 3. **Negative test without token** - Call the same endpoint without a token. Expect HTTP 401, `bypass=False`. @@ -130,21 +130,21 @@ Correlate audit logs with the following global meter exported via `Feedser.Sourc 5. **Metrics validation** - Ensure `web.jobs.triggered` counter increments during accepted runs. - - Exporters should show corresponding spans (`feedser.job.trigger`) if tracing is enabled. + - Exporters should show corresponding spans (`concelier.job.trigger`) if tracing is enabled. ## 5. Troubleshooting | Symptom | Probable cause | Remediation | |---------|----------------|-------------| | Audit log shows `clientId=(none)` for all requests | Authority not issuing `client_id` claim or CLI outdated | Update StellaOps Authority configuration (`StellaOpsAuthorityOptions.Token.Claims.ClientId`), or upgrade the CLI token acquisition flow. | -| Requests succeed with `bypass=True` unexpectedly | Local network added to `bypassNetworks` or fallback still enabled | Remove/adjust the CIDR list, disable anonymous fallback, restart Feedser. | -| HTTP 401 with valid token | `requiredScopes` missing from client registration or token audience mismatch | Verify Authority client scopes (`feedser.jobs.trigger`) and ensure the token audience matches `audiences` config. | -| Metrics missing from Prometheus | Telemetry exporters disabled or filter missing OTEL meter | Set `feedser.telemetry.enableMetrics=true`, ensure collector includes `StellaOps.Feedser.WebService.Jobs` meter. | -| Sudden spike in `web.jobs.trigger.failed` | Downstream job failure or Authority timeout mid-request | Inspect Feedser job logs, re-run with tracing enabled, validate Authority latency. | +| Requests succeed with `bypass=True` unexpectedly | Local network added to `bypassNetworks` or fallback still enabled | Remove/adjust the CIDR list, disable anonymous fallback, restart Concelier. | +| HTTP 401 with valid token | `requiredScopes` missing from client registration or token audience mismatch | Verify Authority client scopes (`concelier.jobs.trigger`) and ensure the token audience matches `audiences` config. | +| Metrics missing from Prometheus | Telemetry exporters disabled or filter missing OTEL meter | Set `concelier.telemetry.enableMetrics=true`, ensure collector includes `StellaOps.Concelier.WebService.Jobs` meter. | +| Sudden spike in `web.jobs.trigger.failed` | Downstream job failure or Authority timeout mid-request | Inspect Concelier job logs, re-run with tracing enabled, validate Authority latency. | ## 6. References - `docs/21_INSTALL_GUIDE.md` – Authority configuration quick start. - `docs/17_SECURITY_HARDENING_GUIDE.md` – Security guardrails and enforcement deadlines. - `docs/ops/authority-monitoring.md` – Authority-side monitoring and alerting playbook. -- `StellaOps.Feedser.WebService/Filters/JobAuthorizationAuditFilter.cs` – source of audit log fields. +- `StellaOps.Concelier.WebService/Filters/JobAuthorizationAuditFilter.cs` – source of audit log fields. diff --git a/docs/ops/feedser-cccs-operations.md b/docs/ops/concelier-cccs-operations.md similarity index 85% rename from docs/ops/feedser-cccs-operations.md rename to docs/ops/concelier-cccs-operations.md index 9d423944..3111ee12 100644 --- a/docs/ops/feedser-cccs-operations.md +++ b/docs/ops/concelier-cccs-operations.md @@ -1,14 +1,14 @@ -# Feedser CCCS Connector Operations +# Concelier CCCS Connector Operations This runbook covers day‑to‑day operation of the Canadian Centre for Cyber Security (`source:cccs:*`) connector, including configuration, telemetry, and historical backfill guidance for English/French advisories. ## 1. Configuration Checklist - Network egress (or mirrored cache) for `https://www.cyber.gc.ca/` and the JSON API endpoints under `/api/cccs/`. -- Set the Feedser options before restarting workers. Example `feedser.yaml` snippet: +- Set the Concelier options before restarting workers. Example `concelier.yaml` snippet: ```yaml -feedser: +concelier: sources: cccs: feeds: @@ -27,15 +27,15 @@ feedser: ## 2. Telemetry & Logging -- **Metrics (Meter `StellaOps.Feedser.Source.Cccs`):** +- **Metrics (Meter `StellaOps.Concelier.Source.Cccs`):** - `cccs.fetch.attempts`, `cccs.fetch.success`, `cccs.fetch.failures` - `cccs.fetch.documents`, `cccs.fetch.unchanged` - `cccs.parse.success`, `cccs.parse.failures`, `cccs.parse.quarantine` - `cccs.map.success`, `cccs.map.failures` - **Shared HTTP metrics** via `SourceDiagnostics`: - - `feedser.source.http.requests{feedser.source="cccs"}` - - `feedser.source.http.failures{feedser.source="cccs"}` - - `feedser.source.http.duration{feedser.source="cccs"}` + - `concelier.source.http.requests{concelier.source="cccs"}` + - `concelier.source.http.failures{concelier.source="cccs"}` + - `concelier.source.http.duration{concelier.source="cccs"}` - **Structured logs** - `CCCS fetch completed feeds=… items=… newDocuments=… pendingDocuments=…` - `CCCS parse completed parsed=… failures=…` @@ -45,13 +45,13 @@ feedser: Suggested Grafana alerts: - `increase(cccs.fetch.failures_total[15m]) > 0` - `rate(cccs.map.success_total[1h]) == 0` while other connectors are active -- `histogram_quantile(0.95, rate(feedser_source_http_duration_bucket{feedser_source="cccs"}[1h])) > 5s` +- `histogram_quantile(0.95, rate(concelier_source_http_duration_bucket{concelier_source="cccs"}[1h])) > 5s` ## 3. Historical Backfill Plan 1. **Snapshot the source** – the API accepts `page=` and `lang=` query parameters. `page=0` returns the full dataset (observed earliest `date_created`: 2018‑06‑08 for EN, 2018‑06‑08 for FR). Mirror those responses into Offline Kit storage when operating air‑gapped. 2. **Stage ingestion**: - - Temporarily raise `maxEntriesPerFetch` (e.g. 500) and restart Feedser workers. + - Temporarily raise `maxEntriesPerFetch` (e.g. 500) and restart Concelier workers. - Run chained jobs until `pendingDocuments` drains: `stella db jobs run source:cccs:fetch --and-then source:cccs:parse --and-then source:cccs:map` - Monitor `cccs.fetch.unchanged` growth; once it approaches dataset size the backfill is complete. @@ -67,6 +67,6 @@ Suggested Grafana alerts: ## 5. Fixture Maintenance -- Regression fixtures live in `src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures`. -- Refresh via `UPDATE_CCCS_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Cccs.Tests/StellaOps.Feedser.Source.Cccs.Tests.csproj`. +- Regression fixtures live in `src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures`. +- Refresh via `UPDATE_CCCS_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj`. - Fixtures capture both EN/FR advisories with nested lists to guard against sanitiser regressions; review diffs for heading/list changes before committing. diff --git a/docs/ops/feedser-certbund-operations.md b/docs/ops/concelier-certbund-operations.md similarity index 89% rename from docs/ops/feedser-certbund-operations.md rename to docs/ops/concelier-certbund-operations.md index 0b09a906..19fc656f 100644 --- a/docs/ops/feedser-certbund-operations.md +++ b/docs/ops/concelier-certbund-operations.md @@ -1,8 +1,8 @@ -# Feedser CERT-Bund Connector Operations +# Concelier CERT-Bund Connector Operations _Last updated: 2025-10-17_ -Germany’s Federal Office for Information Security (BSI) operates the Warn- und Informationsdienst (WID) portal. The Feedser CERT-Bund connector (`source:cert-bund:*`) ingests the public RSS feed, hydrates the portal’s JSON detail endpoint, and maps the result into canonical advisories while preserving the original German content. +Germany’s Federal Office for Information Security (BSI) operates the Warn- und Informationsdienst (WID) portal. The Concelier CERT-Bund connector (`source:cert-bund:*`) ingests the public RSS feed, hydrates the portal’s JSON detail endpoint, and maps the result into canonical advisories while preserving the original German content. --- @@ -14,10 +14,10 @@ Germany’s Federal Office for Information Security (BSI) operates the Warn- und - `https://wid.cert-bund.de/portal/api/securityadvisory` (detail/search/export JSON) - Ensure the HTTP client reuses a cookie container (the connector’s dependency injection wiring already sets this up). -Example `feedser.yaml` fragment: +Example `concelier.yaml` fragment: ```yaml -feedser: +concelier: sources: cert-bund: feedUri: "https://wid.cert-bund.de/content/public/securityAdvisory/rss" @@ -36,7 +36,7 @@ feedser: ## 2. Telemetry & Logging -- **Meter**: `StellaOps.Feedser.Source.CertBund` +- **Meter**: `StellaOps.Concelier.Source.CertBund` - **Counters / histograms**: - `certbund.feed.fetch.attempts|success|failures` - `certbund.feed.items.count` @@ -47,7 +47,7 @@ feedser: - `certbund.parse.products.count`, `certbund.parse.cve.count` - `certbund.map.success|failures{reason}` - `certbund.map.affected.count`, `certbund.map.aliases.count` -- Shared HTTP metrics remain available through `feedser.source.http.*`. +- Shared HTTP metrics remain available through `concelier.source.http.*`. **Structured logs** (all emitted at information level when work occurs): @@ -59,7 +59,7 @@ Alerting ideas: 1. `increase(certbund.detail.fetch.failures_total[10m]) > 0` 2. `rate(certbund.map.success_total[30m]) == 0` -3. `histogram_quantile(0.95, rate(feedser_source_http_duration_bucket{feedser_source="cert-bund"}[15m])) > 5s` +3. `histogram_quantile(0.95, rate(concelier_source_http_duration_bucket{concelier_source="cert-bund"}[15m])) > 5s` The WebService now registers the meter so metrics surface automatically once OpenTelemetry metrics are enabled. @@ -114,7 +114,7 @@ The helper stores yearly exports under `seed-data/cert-bund/export/`, captures paginated search snapshots in `seed-data/cert-bund/search/`, and generates the manifest + SHA files in `seed-data/cert-bund/manifest/`. Split ranges according to your compliance window (default: one file per -calendar year). Feedser can ingest these JSON payloads directly when +calendar year). Concelier can ingest these JSON payloads directly when operating offline. > When automatic bootstrap fails (e.g. portal introduces CAPTCHA), run the diff --git a/docs/ops/feedser-cisco-operations.md b/docs/ops/concelier-cisco-operations.md similarity index 73% rename from docs/ops/feedser-cisco-operations.md rename to docs/ops/concelier-cisco-operations.md index 3d0ae8e8..c565aa2c 100644 --- a/docs/ops/feedser-cisco-operations.md +++ b/docs/ops/concelier-cisco-operations.md @@ -1,16 +1,16 @@ -# Feedser Cisco PSIRT Connector – OAuth Provisioning SOP +# Concelier Cisco PSIRT Connector – OAuth Provisioning SOP _Last updated: 2025-10-14_ ## 1. Scope -This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT openVuln OAuth client credentials for the Feedser Cisco connector. It covers online and air-gapped (Offline Kit) environments, quota-aware execution, and escalation paths. +This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT openVuln OAuth client credentials for the Concelier Cisco connector. It covers online and air-gapped (Offline Kit) environments, quota-aware execution, and escalation paths. ## 2. Prerequisites - Active Cisco.com (CCO) account with access to the Cisco API Console. - Cisco PSIRT openVuln API entitlement (visible under “My Apps & Keys” once granted).citeturn3search0 -- Feedser configuration location (typically `/etc/stella/feedser.yaml` in production) or Offline Kit secret bundle staging directory. +- Concelier configuration location (typically `/etc/stella/concelier.yaml` in production) or Offline Kit secret bundle staging directory. ## 3. Provisioning workflow @@ -29,11 +29,11 @@ This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT ``` - Confirm HTTP 200 and an `expires_in` value of 3600 seconds (tokens live for one hour).citeturn3search0turn3search7 - Preserve the response only long enough to validate syntax; do **not** persist tokens. -3. **Authorize Feedser runtime** - - Update `feedser:sources:cisco:auth` (or the module-specific secret template) with the stored credentials. +3. **Authorize Concelier runtime** + - Update `concelier:sources:cisco:auth` (or the module-specific secret template) with the stored credentials. - For Offline Kit delivery, export encrypted secrets into `offline-kit/secrets/cisco-openvuln.json` using the platform’s sealed secret format. 4. **Connectivity validation** - - From the Feedser control plane, run `stella db jobs run source:vndr-cisco:fetch --dry-run`. + - From the Concelier control plane, run `stella db jobs run source:vndr-cisco:fetch --dry-run`. - Ensure the Source HTTP diagnostics record `Bearer` authorization headers and no 401/403 responses. ## 4. Rotation SOP @@ -42,12 +42,12 @@ This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT | --- | --- | --- | | 1. Schedule rotation | Ops (monthly board) | Rotate every 90 days or immediately after suspected credential exposure. | | 2. Create replacement app | Ops | Repeat §3.1 with “-next” suffix; verify token issuance. | -| 3. Stage dual credentials | Ops + Feedser On-Call | Publish new credentials to secret store alongside current pair. | -| 4. Cut over | Feedser On-Call | Restart connector workers during a low-traffic window (<10 min) to pick up the new secret. | +| 3. Stage dual credentials | Ops + Concelier On-Call | Publish new credentials to secret store alongside current pair. | +| 4. Cut over | Concelier On-Call | Restart connector workers during a low-traffic window (<10 min) to pick up the new secret. | | 5. Deactivate legacy app | Ops | Delete prior app in Cisco API Console once telemetry confirms successful fetch/parse cycles for 2 consecutive hours. | **Automation hooks** -- Rotation reminders are tracked in OpsRunbookOps board (`OPS-RUN-KEYS` swim lane); add checklist items for Feedser Cisco when opening a rotation task. +- Rotation reminders are tracked in OpsRunbookOps board (`OPS-RUN-KEYS` swim lane); add checklist items for Concelier Cisco when opening a rotation task. - Use the secret management pipeline (`ops/secrets/rotate.sh --connector cisco`) to template vault updates; the script renders a redacted diff for audit. ## 5. Offline Kit packaging @@ -61,19 +61,19 @@ This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT ## 6. Quota and throttling guidance - Cisco enforces combined limits of 5 requests/second, 30 requests/minute, and 5 000 requests/day per application.citeturn0search0turn3search6 -- Feedser fetch jobs must respect `Retry-After` headers on HTTP 429 responses; Ops should monitor for sustained quota saturation and consider paging window adjustments. -- Telemetry to watch: `feedser.source.http.requests{feedser.source="vndr-cisco"}`, `feedser.source.http.failures{...}`, and connector-specific metrics once implemented. +- Concelier fetch jobs must respect `Retry-After` headers on HTTP 429 responses; Ops should monitor for sustained quota saturation and consider paging window adjustments. +- Telemetry to watch: `concelier.source.http.requests{concelier.source="vndr-cisco"}`, `concelier.source.http.failures{...}`, and connector-specific metrics once implemented. ## 7. Telemetry & Monitoring -- **Metrics (Meter `StellaOps.Feedser.Source.Vndr.Cisco`)** +- **Metrics (Meter `StellaOps.Concelier.Source.Vndr.Cisco`)** - `cisco.fetch.documents`, `cisco.fetch.failures`, `cisco.fetch.unchanged` - `cisco.parse.success`, `cisco.parse.failures` - `cisco.map.success`, `cisco.map.failures`, `cisco.map.affected.packages` - **Shared HTTP metrics** via `SourceDiagnostics`: - - `feedser.source.http.requests{feedser.source="vndr-cisco"}` - - `feedser.source.http.failures{feedser.source="vndr-cisco"}` - - `feedser.source.http.duration{feedser.source="vndr-cisco"}` + - `concelier.source.http.requests{concelier.source="vndr-cisco"}` + - `concelier.source.http.failures{concelier.source="vndr-cisco"}` + - `concelier.source.http.duration{concelier.source="vndr-cisco"}` - **Structured logs** - `Cisco fetch completed date=… pages=… added=…` (info) - `Cisco parse completed parsed=… failures=…` (info) diff --git a/docs/ops/feedser-conflict-resolution.md b/docs/ops/concelier-conflict-resolution.md similarity index 52% rename from docs/ops/feedser-conflict-resolution.md rename to docs/ops/concelier-conflict-resolution.md index 804e87dd..6d13215c 100644 --- a/docs/ops/feedser-conflict-resolution.md +++ b/docs/ops/concelier-conflict-resolution.md @@ -1,12 +1,12 @@ -# Feedser Conflict Resolution Runbook (Sprint 3) +# Concelier Conflict Resolution Runbook (Sprint 3) -This runbook equips Feedser operators to detect, triage, and resolve advisory conflicts now that the Sprint 3 merge engine landed (`AdvisoryPrecedenceMerger`, merge-event hashing, and telemetry counters). It builds on the canonical rules defined in `src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md` and the metrics/logging instrumentation delivered this sprint. +This runbook equips Concelier operators to detect, triage, and resolve advisory conflicts now that the Sprint 3 merge engine landed (`AdvisoryPrecedenceMerger`, merge-event hashing, and telemetry counters). It builds on the canonical rules defined in `src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md` and the metrics/logging instrumentation delivered this sprint. --- ## 1. Precedence Model (recap) -- **Default ranking:** `GHSA -> NVD -> OSV`, with distro/vendor PSIRTs outranking ecosystem feeds (`AdvisoryPrecedenceDefaults`). Use `feedser:merge:precedence:ranks` to override per source when incident response requires it. +- **Default ranking:** `GHSA -> NVD -> OSV`, with distro/vendor PSIRTs outranking ecosystem feeds (`AdvisoryPrecedenceDefaults`). Use `concelier:merge:precedence:ranks` to override per source when incident response requires it. - **Freshness override:** if a lower-ranked source is >= 48 hours newer for a freshness-sensitive field (title, summary, affected ranges, references, credits), it wins. Every override stamps `provenance[].decisionReason = freshness`. - **Tie-breakers:** when precedence and freshness tie, the engine falls back to (1) primary source order, (2) shortest normalized text, (3) lowest stable hash. Merge-generated provenance records set `decisionReason = tie-breaker`. - **Audit trail:** each merged advisory receives a `merge` provenance entry listing the participating sources plus a `merge_event` record with canonical before/after SHA-256 hashes. @@ -17,41 +17,41 @@ This runbook equips Feedser operators to detect, triage, and resolve advisory co | Instrument | Type | Key Tags | Purpose | |------------|------|----------|---------| -| `feedser.merge.operations` | Counter | `inputs` | Total precedence merges executed. | -| `feedser.merge.overrides` | Counter | `primary_source`, `suppressed_source`, `primary_rank`, `suppressed_rank` | Field-level overrides chosen by precedence. | -| `feedser.merge.range_overrides` | Counter | `advisory_key`, `package_type`, `primary_source`, `suppressed_source`, `primary_range_count`, `suppressed_range_count` | Package range overrides emitted by `AffectedPackagePrecedenceResolver`. | -| `feedser.merge.conflicts` | Counter | `type` (`severity`, `precedence_tie`), `reason` (`mismatch`, `primary_missing`, `equal_rank`) | Conflicts requiring operator review. | -| `feedser.merge.identity_conflicts` | Counter | `scheme`, `alias_value`, `advisory_count` | Alias collisions surfaced by the identity graph. | +| `concelier.merge.operations` | Counter | `inputs` | Total precedence merges executed. | +| `concelier.merge.overrides` | Counter | `primary_source`, `suppressed_source`, `primary_rank`, `suppressed_rank` | Field-level overrides chosen by precedence. | +| `concelier.merge.range_overrides` | Counter | `advisory_key`, `package_type`, `primary_source`, `suppressed_source`, `primary_range_count`, `suppressed_range_count` | Package range overrides emitted by `AffectedPackagePrecedenceResolver`. | +| `concelier.merge.conflicts` | Counter | `type` (`severity`, `precedence_tie`), `reason` (`mismatch`, `primary_missing`, `equal_rank`) | Conflicts requiring operator review. | +| `concelier.merge.identity_conflicts` | Counter | `scheme`, `alias_value`, `advisory_count` | Alias collisions surfaced by the identity graph. | ### Structured logs - `AdvisoryOverride` (EventId 1000) - logs merge suppressions with alias/provenance counts. - `PackageRangeOverride` (EventId 1001) - logs package-level precedence decisions. - `PrecedenceConflict` (EventId 1002) - logs mismatched severity or equal-rank scenarios. -- `Alias collision ...` (no EventId) - emitted when `feedser.merge.identity_conflicts` increments. +- `Alias collision ...` (no EventId) - emitted when `concelier.merge.identity_conflicts` increments. -Expect all logs at `Information`. Ensure OTEL exporters include the scope `StellaOps.Feedser.Merge`. +Expect all logs at `Information`. Ensure OTEL exporters include the scope `StellaOps.Concelier.Merge`. --- ## 3. Detection & Alerting 1. **Dashboard panels** - - `feedser.merge.conflicts` - table grouped by `type/reason`. Alert when > 0 in a 15 minute window. - - `feedser.merge.range_overrides` - stacked bar by `package_type`. Spikes highlight vendor PSIRT overrides over registry data. - - `feedser.merge.overrides` with `primary_source|suppressed_source` - catches unexpected precedence flips (e.g., OSV overtaking GHSA). - - `feedser.merge.identity_conflicts` - single-stat; alert when alias collisions occur more than once per day. + - `concelier.merge.conflicts` - table grouped by `type/reason`. Alert when > 0 in a 15 minute window. + - `concelier.merge.range_overrides` - stacked bar by `package_type`. Spikes highlight vendor PSIRT overrides over registry data. + - `concelier.merge.overrides` with `primary_source|suppressed_source` - catches unexpected precedence flips (e.g., OSV overtaking GHSA). + - `concelier.merge.identity_conflicts` - single-stat; alert when alias collisions occur more than once per day. 2. **Log based alerts** - `eventId=1002` with `reason="equal_rank"` - indicates precedence table gaps; page merge owners. - `eventId=1002` with `reason="mismatch"` - severity disagreement; open connector bug if sustained. 3. **Job health** - - `stellaops-cli db merge` exit code `1` signifies unresolved conflicts. Pipe to automation that captures logs and notifies #feedser-ops. + - `stellaops-cli db merge` exit code `1` signifies unresolved conflicts. Pipe to automation that captures logs and notifies #concelier-ops. ### Threshold updates (2025-10-12) -- `feedser.merge.conflicts` – Page only when ≥ 2 events fire within 30 minutes; the synthetic conflict fixture run produces 0 conflicts, so the first event now routes to Slack for manual review instead of paging. -- `feedser.merge.overrides` – Raise a warning when the 30-minute sum exceeds 10 (canonical triple yields exactly 1 summary override with `primary_source=osv`, `suppressed_source=ghsa`). -- `feedser.merge.range_overrides` – Maintain the 15-minute alert at ≥ 3 but annotate dashboards that the regression triple emits a single `package_type=semver` override so ops can spot unexpected spikes. +- `concelier.merge.conflicts` – Page only when ≥ 2 events fire within 30 minutes; the synthetic conflict fixture run produces 0 conflicts, so the first event now routes to Slack for manual review instead of paging. +- `concelier.merge.overrides` – Raise a warning when the 30-minute sum exceeds 10 (canonical triple yields exactly 1 summary override with `primary_source=osv`, `suppressed_source=ghsa`). +- `concelier.merge.range_overrides` – Maintain the 15-minute alert at ≥ 3 but annotate dashboards that the regression triple emits a single `package_type=semver` override so ops can spot unexpected spikes. --- @@ -60,16 +60,16 @@ Expect all logs at `Information`. Ensure OTEL exporters include the scope `Stell 1. **Confirm job context** - `stellaops-cli db merge` (CLI) or `POST /jobs/merge:reconcile` (API) to rehydrate the merge job. Use `--verbose` to stream structured logs during triage. 2. **Inspect metrics** - - Correlate spikes in `feedser.merge.conflicts` with `primary_source`/`suppressed_source` tags from `feedser.merge.overrides`. + - Correlate spikes in `concelier.merge.conflicts` with `primary_source`/`suppressed_source` tags from `concelier.merge.overrides`. 3. **Pull structured logs** - Example (vector output): ``` - jq 'select(.EventId.Name=="PrecedenceConflict") | {advisory: .State[0].Value, type: .ConflictType, reason: .Reason, primary: .PrimarySources, suppressed: .SuppressedSources}' stellaops-feedser.log + jq 'select(.EventId.Name=="PrecedenceConflict") | {advisory: .State[0].Value, type: .ConflictType, reason: .Reason, primary: .PrimarySources, suppressed: .SuppressedSources}' stellaops-concelier.log ``` 4. **Review merge events** - `mongosh`: ```javascript - use feedser; + use concelier; db.merge_event.find({ advisoryKey: "CVE-2025-1234" }).sort({ mergedAt: -1 }).limit(5); ``` - Compare `beforeHash` vs `afterHash` to confirm the merge actually changed canonical output. @@ -85,9 +85,9 @@ Expect all logs at `Information`. Ensure OTEL exporters include the scope `Stell |--------|--------------|------------------| | `reason="mismatch"` with `type="severity"` | Upstream feeds disagree on CVSS vector/severity. | Verify which feed is freshest; if correctness is known, adjust connector mapping or precedence override. | | `reason="primary_missing"` | Higher-ranked source lacks the field entirely. | Backfill connector data or temporarily allow lower-ranked source via precedence override. | -| `reason="equal_rank"` | Two feeds share the same precedence rank (custom config or missing entry). | Update `feedser:merge:precedence:ranks` to break the tie; restart merge job. | -| Rising `feedser.merge.range_overrides` for a package type | Vendor PSIRT now supplies richer ranges. | Validate connectors emit `decisionReason="precedence"` and update dashboards to treat registry ranges as fallback. | -| `feedser.merge.identity_conflicts` > 0 | Alias scheme mapping produced collisions (duplicate CVE <-> advisory pairs). | Inspect `Alias collision` log payload; reconcile the alias graph by adjusting connector alias output. | +| `reason="equal_rank"` | Two feeds share the same precedence rank (custom config or missing entry). | Update `concelier:merge:precedence:ranks` to break the tie; restart merge job. | +| Rising `concelier.merge.range_overrides` for a package type | Vendor PSIRT now supplies richer ranges. | Validate connectors emit `decisionReason="precedence"` and update dashboards to treat registry ranges as fallback. | +| `concelier.merge.identity_conflicts` > 0 | Alias scheme mapping produced collisions (duplicate CVE <-> advisory pairs). | Inspect `Alias collision` log payload; reconcile the alias graph by adjusting connector alias output. | --- @@ -97,16 +97,16 @@ Expect all logs at `Information`. Ensure OTEL exporters include the scope `Stell - Re-run the offending connector stages (`stellaops-cli db fetch --source ghsa --stage map` etc.). - Once fixed, rerun merge and verify `decisionReason` reflects `freshness` or `precedence` as expected. 2. **Temporary precedence override** - - Edit `etc/feedser.yaml`: + - Edit `etc/concelier.yaml`: ```yaml - feedser: + concelier: merge: precedence: ranks: osv: 1 ghsa: 0 ``` - - Restart Feedser workers; confirm tags in `feedser.merge.overrides` show the new ranks. + - Restart Concelier workers; confirm tags in `concelier.merge.overrides` show the new ranks. - Document the override with expiry in the change log. 3. **Alias remediation** - Update connector mapping rules to weed out duplicate aliases (e.g., skip GHSA aliases that mirror CVE IDs). @@ -119,7 +119,7 @@ Expect all logs at `Information`. Ensure OTEL exporters include the scope `Stell ## 7. Validation Checklist - [ ] Merge job rerun returns exit code `0`. -- [ ] `feedser.merge.conflicts` baseline returns to zero after corrective action. +- [ ] `concelier.merge.conflicts` baseline returns to zero after corrective action. - [ ] Latest `merge_event` entry shows expected hash delta. - [ ] Affected advisory document shows updated `provenance[].decisionReason`. - [ ] Ops change log updated with incident summary, config overrides, and rollback plan. @@ -129,9 +129,9 @@ Expect all logs at `Information`. Ensure OTEL exporters include the scope `Stell ## 8. Reference Material - Canonical conflict rules: `src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md`. -- Merge engine internals: `src/StellaOps.Feedser.Merge/Services/AdvisoryPrecedenceMerger.cs`. -- Metrics definitions: `src/StellaOps.Feedser.Merge/Services/AdvisoryMergeService.cs` (identity conflicts) and `AdvisoryPrecedenceMerger`. -- Storage audit trail: `src/StellaOps.Feedser.Merge/Services/MergeEventWriter.cs`, `src/StellaOps.Feedser.Storage.Mongo/MergeEvents`. +- Merge engine internals: `src/StellaOps.Concelier.Merge/Services/AdvisoryPrecedenceMerger.cs`. +- Metrics definitions: `src/StellaOps.Concelier.Merge/Services/AdvisoryMergeService.cs` (identity conflicts) and `AdvisoryPrecedenceMerger`. +- Storage audit trail: `src/StellaOps.Concelier.Merge/Services/MergeEventWriter.cs`, `src/StellaOps.Concelier.Storage.Mongo/MergeEvents`. Keep this runbook synchronized with future sprint notes and update alert thresholds as baseline volumes change. @@ -139,17 +139,17 @@ Keep this runbook synchronized with future sprint notes and update alert thresho ## 9. Synthetic Regression Fixtures -- **Locations** – Canonical conflict snapshots now live at `src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json`, `src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json`, and `src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json`. +- **Locations** – Canonical conflict snapshots now live at `src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json`, `src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json`, and `src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json`. - **Validation commands** – To regenerate and verify the fixtures offline, run: ```bash -dotnet test src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj --filter GhsaConflictFixtureTests -dotnet test src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj --filter NvdConflictFixtureTests -dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj --filter OsvConflictFixtureTests -dotnet test src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.csproj --filter MergeAsync_AppliesCanonicalRulesAndPersistsDecisions +dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj --filter GhsaConflictFixtureTests +dotnet test src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj --filter NvdConflictFixtureTests +dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj --filter OsvConflictFixtureTests +dotnet test src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj --filter MergeAsync_AppliesCanonicalRulesAndPersistsDecisions ``` -- **Expected signals** – The triple produces one freshness-driven summary override (`primary_source=osv`, `suppressed_source=ghsa`) and one range override for the npm SemVer package while leaving `feedser.merge.conflicts` at zero. Use these values as the baseline when tuning dashboards or load-testing alert pipelines. +- **Expected signals** – The triple produces one freshness-driven summary override (`primary_source=osv`, `suppressed_source=ghsa`) and one range override for the npm SemVer package while leaving `concelier.merge.conflicts` at zero. Use these values as the baseline when tuning dashboards or load-testing alert pipelines. --- @@ -157,4 +157,4 @@ dotnet test src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.cspr | Date (UTC) | Change | Notes | |------------|--------|-------| -| 2025-10-16 | Ops review signed off after connector expansion (CCCS, CERT-Bund, KISA, ICS CISA, MSRC) landed. Alert thresholds from §3 reaffirmed; dashboards updated to watch attachment signals emitted by ICS CISA connector. | Ops sign-off recorded by Feedser Ops Guild; no additional overrides required. | +| 2025-10-16 | Ops review signed off after connector expansion (CCCS, CERT-Bund, KISA, ICS CISA, MSRC) landed. Alert thresholds from §3 reaffirmed; dashboards updated to watch attachment signals emitted by ICS CISA connector. | Ops sign-off recorded by Concelier Ops Guild; no additional overrides required. | diff --git a/docs/ops/feedser-cve-kev-grafana-dashboard.json b/docs/ops/concelier-cve-kev-grafana-dashboard.json similarity index 97% rename from docs/ops/feedser-cve-kev-grafana-dashboard.json rename to docs/ops/concelier-cve-kev-grafana-dashboard.json index 51df8cc4..97444051 100644 --- a/docs/ops/feedser-cve-kev-grafana-dashboard.json +++ b/docs/ops/concelier-cve-kev-grafana-dashboard.json @@ -1,6 +1,6 @@ { - "title": "Feedser CVE & KEV Observability", - "uid": "feedser-cve-kev", + "title": "Concelier CVE & KEV Observability", + "uid": "concelier-cve-kev", "schemaVersion": 38, "version": 1, "editable": true, diff --git a/docs/ops/feedser-cve-kev-operations.md b/docs/ops/concelier-cve-kev-operations.md similarity index 76% rename from docs/ops/feedser-cve-kev-operations.md rename to docs/ops/concelier-cve-kev-operations.md index c3e84bd1..e486c03b 100644 --- a/docs/ops/feedser-cve-kev-operations.md +++ b/docs/ops/concelier-cve-kev-operations.md @@ -1,4 +1,4 @@ -# Feedser CVE & KEV Connector Operations +# Concelier CVE & KEV Connector Operations This playbook equips operators with the steps required to roll out and monitor the CVE Services and CISA KEV connectors across environments. @@ -7,17 +7,17 @@ This playbook equips operators with the steps required to roll out and monitor t ### 1.1 Prerequisites - CVE Services API credentials (organisation ID, user ID, API key) with access to the JSON 5 API. -- Network egress to `https://cveawg.mitre.org` (or a mirrored endpoint) from the Feedser workers. -- Updated `feedser.yaml` (or the matching environment variables) with the following section: +- Network egress to `https://cveawg.mitre.org` (or a mirrored endpoint) from the Concelier workers. +- Updated `concelier.yaml` (or the matching environment variables) with the following section: ```yaml -feedser: +concelier: sources: cve: baseEndpoint: "https://cveawg.mitre.org/api/" apiOrg: "ORG123" apiUser: "user@example.org" - apiKeyFile: "/var/run/secrets/feedser/cve-api-key" + apiKeyFile: "/var/run/secrets/concelier/cve-api-key" seedDirectory: "./seed-data/cve" pageSize: 200 maxPagesPerFetch: 5 @@ -26,44 +26,44 @@ feedser: failureBackoff: "00:10:00" ``` -> ℹ️ Store the API key outside source control. When using `apiKeyFile`, mount the secret file into the container/host; alternatively supply `apiKey` via `FEEDSER_SOURCES__CVE__APIKEY`. +> ℹ️ Store the API key outside source control. When using `apiKeyFile`, mount the secret file into the container/host; alternatively supply `apiKey` via `CONCELIER_SOURCES__CVE__APIKEY`. > 🪙 When credentials are not yet available, configure `seedDirectory` to point at mirrored CVE JSON (for example, the repo’s `seed-data/cve/` bundle). The connector will ingest those records and log a warning instead of failing the job; live fetching resumes automatically once `apiOrg` / `apiUser` / `apiKey` are supplied. ### 1.2 Smoke Test (staging) -1. Deploy the updated configuration and restart the Feedser service so the connector picks up the credentials. +1. Deploy the updated configuration and restart the Concelier service so the connector picks up the credentials. 2. Trigger one end-to-end cycle: - - Feedser CLI: `stella db jobs run source:cve:fetch --and-then source:cve:parse --and-then source:cve:map` + - Concelier CLI: `stella db jobs run source:cve:fetch --and-then source:cve:parse --and-then source:cve:map` - REST fallback: `POST /jobs/run { "kind": "source:cve:fetch", "chain": ["source:cve:parse", "source:cve:map"] }` -3. Observe the following metrics (exported via OTEL meter `StellaOps.Feedser.Source.Cve`): +3. Observe the following metrics (exported via OTEL meter `StellaOps.Concelier.Source.Cve`): - `cve.fetch.attempts`, `cve.fetch.success`, `cve.fetch.documents`, `cve.fetch.failures`, `cve.fetch.unchanged` - `cve.parse.success`, `cve.parse.failures`, `cve.parse.quarantine` - `cve.map.success` -4. Verify Prometheus shows matching `feedser.source.http.requests_total{feedser_source="cve"}` deltas (list vs detail phases) while `feedser.source.http.failures_total{feedser_source="cve"}` stays flat. +4. Verify Prometheus shows matching `concelier.source.http.requests_total{concelier_source="cve"}` deltas (list vs detail phases) while `concelier.source.http.failures_total{concelier_source="cve"}` stays flat. 5. Confirm the info-level summary log `CVEs fetch window … pages=X detailDocuments=Y detailFailures=Z` appears once per fetch run and shows `detailFailures=0`. 6. Verify the MongoDB advisory store contains fresh CVE advisories (`advisoryKey` prefix `cve/`) and that the source cursor (`source_states` collection) advanced. ### 1.3 Production Monitoring -- **Dashboards** – Plot `rate(cve_fetch_success_total[5m])`, `rate(cve_fetch_failures_total[5m])`, and `rate(cve_fetch_documents_total[5m])` alongside `feedser_source_http_requests_total{feedser_source="cve"}` to confirm HTTP and connector counters stay aligned. Keep `feedser.range.primitives{scheme=~"semver|vendor"}` on the same board for range coverage. Example alerts: +- **Dashboards** – Plot `rate(cve_fetch_success_total[5m])`, `rate(cve_fetch_failures_total[5m])`, and `rate(cve_fetch_documents_total[5m])` alongside `concelier_source_http_requests_total{concelier_source="cve"}` to confirm HTTP and connector counters stay aligned. Keep `concelier.range.primitives{scheme=~"semver|vendor"}` on the same board for range coverage. Example alerts: - `rate(cve_fetch_failures_total[5m]) > 0` for 10 minutes (`severity=warning`) - `rate(cve_map_success_total[15m]) == 0` while `rate(cve_fetch_success_total[15m]) > 0` (`severity=critical`) - `sum_over_time(cve_parse_quarantine_total[1h]) > 0` to catch schema anomalies - **Logs** – Monitor warnings such as `Failed fetching CVE record {CveId}` and `Malformed CVE JSON`, and surface the summary info log `CVEs fetch window … detailFailures=0 detailUnchanged=0` on dashboards. A non-zero `detailFailures` usually indicates rate-limit or auth issues on detail requests. -- **Grafana pack** – Import `docs/ops/feedser-cve-kev-grafana-dashboard.json` and filter by panel legend (`CVE`, `KEV`) to reuse the canned layout. -- **Backfill window** – Operators can tighten or widen `initialBackfill` / `maxPagesPerFetch` after validating throughput. Update config and restart Feedser to apply changes. +- **Grafana pack** – Import `docs/ops/concelier-cve-kev-grafana-dashboard.json` and filter by panel legend (`CVE`, `KEV`) to reuse the canned layout. +- **Backfill window** – Operators can tighten or widen `initialBackfill` / `maxPagesPerFetch` after validating throughput. Update config and restart Concelier to apply changes. ### 1.4 Staging smoke log (2025-10-15) While Ops finalises long-lived CVE Services credentials, we validated the connector end-to-end against the recorded CVE-2024-0001 payloads used in regression tests: -- Command: `dotnet test src/StellaOps.Feedser.Source.Cve.Tests/StellaOps.Feedser.Source.Cve.Tests.csproj -l "console;verbosity=detailed"` +- Command: `dotnet test src/StellaOps.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj -l "console;verbosity=detailed"` - Summary log emitted by the connector: ``` CVEs fetch window 2024-09-01T00:00:00Z->2024-10-01T00:00:00Z pages=1 listSuccess=1 detailDocuments=1 detailFailures=0 detailUnchanged=0 pendingDocuments=0->1 pendingMappings=0->1 hasMorePages=False nextWindowStart=2024-09-15T12:00:00Z nextWindowEnd=(none) nextPage=1 ``` -- Telemetry captured by `Meter` `StellaOps.Feedser.Source.Cve`: +- Telemetry captured by `Meter` `StellaOps.Concelier.Source.Cve`: | Metric | Value | |--------|-------| | `cve.fetch.attempts` | 1 | @@ -72,7 +72,7 @@ While Ops finalises long-lived CVE Services credentials, we validated the connec | `cve.parse.success` | 1 | | `cve.map.success` | 1 | -The Grafana pack `docs/ops/feedser-cve-kev-grafana-dashboard.json` has been imported into staging so the panels referenced above render against these counters once the live API keys are in place. +The Grafana pack `docs/ops/concelier-cve-kev-grafana-dashboard.json` has been imported into staging so the panels referenced above render against these counters once the live API keys are in place. ## 2. CISA KEV Connector (`source:kev:*`) @@ -80,10 +80,10 @@ The Grafana pack `docs/ops/feedser-cve-kev-grafana-dashboard.json` has been impo - Network egress (or mirrored content) for `https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json`. - No credentials are required, but the HTTP allow-list must include `www.cisa.gov`. -- Confirm the following snippet in `feedser.yaml` (defaults shown; tune as needed): +- Confirm the following snippet in `concelier.yaml` (defaults shown; tune as needed): ```yaml -feedser: +concelier: sources: kev: feedUri: "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json" @@ -105,15 +105,15 @@ Treat repeated schema failures or growing anomaly counts as an upstream regressi ### 2.3 Smoke Test (staging) -1. Deploy the configuration and restart Feedser. +1. Deploy the configuration and restart Concelier. 2. Trigger a pipeline run: - CLI: `stella db jobs run source:kev:fetch --and-then source:kev:parse --and-then source:kev:map` - REST: `POST /jobs/run { "kind": "source:kev:fetch", "chain": ["source:kev:parse", "source:kev:map"] }` -3. Verify the metrics exposed by meter `StellaOps.Feedser.Source.Kev`: +3. Verify the metrics exposed by meter `StellaOps.Concelier.Source.Kev`: - `kev.fetch.attempts`, `kev.fetch.success`, `kev.fetch.unchanged`, `kev.fetch.failures` - `kev.parse.entries` (tag `catalogVersion`), `kev.parse.failures`, `kev.parse.anomalies` (tag `reason`) - `kev.map.advisories` (tag `catalogVersion`) -4. Confirm `feedser.source.http.requests_total{feedser_source="kev"}` increments once per fetch and that the paired `feedser.source.http.failures_total` stays flat (zero increase). +4. Confirm `concelier.source.http.requests_total{concelier_source="kev"}` increments once per fetch and that the paired `concelier.source.http.failures_total` stays flat (zero increase). 5. Inspect the info logs `Fetched KEV catalog document … pendingDocuments=…` and `Parsed KEV catalog document … entries=…`—they should appear exactly once per run and `Mapped X/Y… skipped=0` should match the `kev.map.advisories` delta. 6. Confirm MongoDB documents exist for the catalog JSON (`raw_documents` & `dtos`) and that advisories with prefix `kev/` are written. @@ -126,7 +126,7 @@ Treat repeated schema failures or growing anomaly counts as an upstream regressi ### 2.5 Known good dashboard tiles -Add the following panels to the Feedser observability board: +Add the following panels to the Concelier observability board: | Metric | Recommended visualisation | |--------|---------------------------| @@ -140,4 +140,4 @@ Add the following panels to the Feedser observability board: - Record staging/production smoke test results (date, catalog version, advisory counts) in your team’s change log. - Add the CVE/KEV job kinds to the standard maintenance checklist so operators can manually trigger them after planned downtime. - Keep this document in sync with future connector changes (for example, new anomaly reasons or additional metrics). -- Version-control dashboard tweaks alongside `docs/ops/feedser-cve-kev-grafana-dashboard.json` so operations can re-import the observability pack during restores. +- Version-control dashboard tweaks alongside `docs/ops/concelier-cve-kev-grafana-dashboard.json` so operations can re-import the observability pack during restores. diff --git a/docs/ops/feedser-ghsa-operations.md b/docs/ops/concelier-ghsa-operations.md similarity index 87% rename from docs/ops/feedser-ghsa-operations.md rename to docs/ops/concelier-ghsa-operations.md index fb29fe6c..7b8f9cbb 100644 --- a/docs/ops/feedser-ghsa-operations.md +++ b/docs/ops/concelier-ghsa-operations.md @@ -1,4 +1,4 @@ -# Feedser GHSA Connector – Operations Runbook +# Concelier GHSA Connector – Operations Runbook _Last updated: 2025-10-16_ @@ -32,9 +32,9 @@ When GitHub reports zero remaining calls, the connector logs and sleeps for the After the quota recovers above the warning threshold the connector writes an informational log with the refreshed remaining/headroom, letting operators clear alerts quickly. -## 4. Configuration knobs (`feedser.yaml`) +## 4. Configuration knobs (`concelier.yaml`) ```yaml -feedser: +concelier: sources: ghsa: apiToken: "${GITHUB_PAT}" @@ -58,18 +58,18 @@ feedser: | `source:ghsa:parse` | `3,13,23,33,43,53 * * * *` | 5 minutes | 4 minutes | | `source:ghsa:map` | `5,15,25,35,45,55 * * * *` | 5 minutes | 4 minutes | -These defaults spread GHSA stages across the hour so fetch completes before parse/map fire. Override them via `feedser.jobs.definitions[...]` when coordinating multiple connectors on the same runner. +These defaults spread GHSA stages across the hour so fetch completes before parse/map fire. Override them via `concelier.jobs.definitions[...]` when coordinating multiple connectors on the same runner. ## 5. Provisioning credentials -Feedser requires a GitHub personal access token (classic) with the **`read:org`** and **`security_events`** scopes to pull GHSA data. Store it as a secret and reference it via `feedser.sources.ghsa.apiToken`. +Concelier requires a GitHub personal access token (classic) with the **`read:org`** and **`security_events`** scopes to pull GHSA data. Store it as a secret and reference it via `concelier.sources.ghsa.apiToken`. ### Docker Compose (stack operators) ```yaml services: - feedser: + concelier: environment: - FEEDSER__SOURCES__GHSA__APITOKEN: /run/secrets/ghsa_pat + CONCELIER__SOURCES__GHSA__APITOKEN: /run/secrets/ghsa_pat secrets: - ghsa_pat @@ -80,25 +80,25 @@ secrets: ### Helm values (cluster operators) ```yaml -feedser: +concelier: extraEnv: - - name: FEEDSER__SOURCES__GHSA__APITOKEN + - name: CONCELIER__SOURCES__GHSA__APITOKEN valueFrom: secretKeyRef: - name: feedser-ghsa + name: concelier-ghsa key: apiToken extraSecrets: - feedser-ghsa: + concelier-ghsa: apiToken: "" ``` -After rotating the PAT, restart the Feedser workers (or run `kubectl rollout restart deployment/feedser`) to ensure the configuration reloads. +After rotating the PAT, restart the Concelier workers (or run `kubectl rollout restart deployment/concelier`) to ensure the configuration reloads. When enabling GHSA the first time, run a staged backfill: 1. Trigger `source:ghsa:fetch` manually (CLI or API) outside of peak hours. -2. Watch `feedser.jobs.health` for the GHSA jobs until they report `healthy`. +2. Watch `concelier.jobs.health` for the GHSA jobs until they report `healthy`. 3. Allow the scheduled cron cadence to resume once the initial backlog drains (typically < 30 minutes). ## 6. Runbook steps when throttled @@ -107,7 +107,7 @@ When enabling GHSA the first time, run a staged backfill: 3. If rate limits stay exhausted: - Verify no other jobs are sharing the PAT. - Temporarily reduce `MaxPagesPerFetch` or `PageSize` to shrink burst size. - - Consider provisioning a dedicated PAT (GHSA permissions only) for Feedser. + - Consider provisioning a dedicated PAT (GHSA permissions only) for Concelier. 4. After the quota resets, reset `rateLimitWarningThreshold`/`requestDelay` to their normal values and monitor the histograms for at least one hour. ## 7. Alert integration quick reference diff --git a/docs/ops/feedser-icscisa-operations.md b/docs/ops/concelier-icscisa-operations.md similarity index 77% rename from docs/ops/feedser-icscisa-operations.md rename to docs/ops/concelier-icscisa-operations.md index 06b2db0d..d67b8375 100644 --- a/docs/ops/feedser-icscisa-operations.md +++ b/docs/ops/concelier-icscisa-operations.md @@ -1,4 +1,4 @@ -# Feedser CISA ICS Connector Operations +# Concelier CISA ICS Connector Operations This runbook documents how to provision, rotate, and validate credentials for the CISA Industrial Control Systems (ICS) connector (`source:ics-cisa:*`). Follow it before enabling the connector in staging or offline installations. @@ -10,16 +10,16 @@ This runbook documents how to provision, rotate, and validate credentials for th - `USDHSCISA_19` — ICS medical advisories (`ICSMA-YY-###`). - `USDHSCISA_17` — ICS alerts (`IR-ALERT-YY-###`) for completeness. 3. Complete the verification email. After confirmation, note the **personalised subscription code** included in the “Manage Preferences” link. It has the shape `code=AB12CD34EF`. -4. Store the code in the shared secret vault (or Offline Kit secrets bundle) as `feedser/sources/icscisa/govdelivery/code`. +4. Store the code in the shared secret vault (or Offline Kit secrets bundle) as `concelier/sources/icscisa/govdelivery/code`. > ℹ️ GovDelivery does not expose a one-time API key; the personalised code is what authenticates the RSS pull. Never commit it to git. ## 2. Feed Validation -Use the following command to confirm the feed is reachable before wiring it into Feedser (substitute `` with the personalised value): +Use the following command to confirm the feed is reachable before wiring it into Concelier (substitute `` with the personalised value): ```bash -curl -H "User-Agent: StellaOpsFeedser/ics-cisa" \ +curl -H "User-Agent: StellaOpsConcelier/ics-cisa" \ "https://content.govdelivery.com/accounts/USDHSCISA/topics/ICS-CERT/feed.rss?format=xml&code=" ``` @@ -27,14 +27,14 @@ If the endpoint returns HTTP 200 and an RSS payload, record the sample response ## 3. Configuration Snippet -Add the connector configuration to `feedser.yaml` (or equivalent environment variables): +Add the connector configuration to `concelier.yaml` (or equivalent environment variables): ```yaml -feedser: +concelier: sources: icscisa: govDelivery: - code: "${FEEDSER_ICS_CISA_GOVDELIVERY_CODE}" + code: "${CONCELIER_ICS_CISA_GOVDELIVERY_CODE}" topics: - "USDHSCISA_16" - "USDHSCISA_19" @@ -47,10 +47,10 @@ feedser: Environment variable example: ```bash -export FEEDSER_SOURCES_ICSCISA_GOVDELIVERY_CODE="AB12CD34EF" +export CONCELIER_SOURCES_ICSCISA_GOVDELIVERY_CODE="AB12CD34EF" ``` -Feedser automatically register the host with the Source.Common HTTP allow-list when the connector assembly is loaded. +Concelier automatically register the host with the Source.Common HTTP allow-list when the connector assembly is loaded. Optional tuning keys (set only when needed): @@ -68,21 +68,21 @@ If credentials are still pending, populate the connector with the community CSV 1. Run `./scripts/fetch-ics-cisa-seed.sh` (or `.ps1`) to download the latest `CISA_ICS_ADV_*.csv` files into `seed-data/ics-cisa/`. 2. Copy the CSVs (and the generated `.sha256` files) into your Offline Kit staging area so they ship alongside the other feeds. 3. Import the kit as usual. The connector can parse the seed data for historical context, but **live GovDelivery credentials are still required** for fresh advisories. -4. Once credentials arrive, update `feedser:sources:icscisa:govDelivery:code` and re-trigger `source:ics-cisa:fetch` so the connector switches to the authorised feed. +4. Once credentials arrive, update `concelier:sources:icscisa:govDelivery:code` and re-trigger `source:ics-cisa:fetch` so the connector switches to the authorised feed. > The CSVs are licensed under ODbL 1.0 by the ICS Advisory Project. Preserve the attribution when redistributing them. ## 4. Integration Validation -1. Ensure secrets are in place and restart the Feedser workers. +1. Ensure secrets are in place and restart the Concelier workers. 2. Run a dry-run fetch/parse/map chain against an Akamai-protected topic: ```bash - FEEDSER_SOURCES_ICSCISA_GOVDELIVERY_CODE=... \ - FEEDSER_SOURCES_ICSCISA_ENABLEDETAILSCRAPE=1 \ + CONCELIER_SOURCES_ICSCISA_GOVDELIVERY_CODE=... \ + CONCELIER_SOURCES_ICSCISA_ENABLEDETAILSCRAPE=1 \ stella db jobs run source:ics-cisa:fetch --and-then source:ics-cisa:parse --and-then source:ics-cisa:map ``` 3. Confirm logs contain `ics-cisa detail fetch` entries and that new documents/DTOs include attachments (see `docs/artifacts/icscisa`). Canonical advisories should expose PDF links as `references.kind == "attachment"` and affected packages should surface `primitives.semVer.exactValue` for single-version hits. -4. If Akamai blocks direct fetches, set `feedser:sources:icscisa:proxyUri` to your allow-listed egress proxy and rerun the dry-run. +4. If Akamai blocks direct fetches, set `concelier:sources:icscisa:proxyUri` to your allow-listed egress proxy and rerun the dry-run. ## 4. Rotation & Incident Response @@ -92,19 +92,19 @@ If credentials are still pending, populate the connector with the community CSV ## 5. Offline Kit Handling -Include the personalised code in `offline-kit/secrets/feedser/icscisa.env`: +Include the personalised code in `offline-kit/secrets/concelier/icscisa.env`: ``` -FEEDSER_SOURCES_ICSCISA_GOVDELIVERY_CODE=AB12CD34EF +CONCELIER_SOURCES_ICSCISA_GOVDELIVERY_CODE=AB12CD34EF ``` -The Offline Kit deployment script copies this file into the container secret directory mounted at `/run/secrets/feedser`. Ensure permissions are `600` and ownership matches the Feedser runtime user. +The Offline Kit deployment script copies this file into the container secret directory mounted at `/run/secrets/concelier`. Ensure permissions are `600` and ownership matches the Concelier runtime user. ## 6. Telemetry & Monitoring -The connector emits metrics under the meter `StellaOps.Feedser.Source.Ics.Cisa`. They allow operators to track Akamai fallbacks, detail enrichment health, and advisory fan-out. +The connector emits metrics under the meter `StellaOps.Concelier.Source.Ics.Cisa`. They allow operators to track Akamai fallbacks, detail enrichment health, and advisory fan-out. -- `icscisa.fetch.*` – counters for `attempts`, `success`, `failures`, `not_modified`, and `fallbacks`, plus histogram `icscisa.fetch.documents` showing documents added per topic pull (tags: `feedser.source`, `icscisa.topic`). +- `icscisa.fetch.*` – counters for `attempts`, `success`, `failures`, `not_modified`, and `fallbacks`, plus histogram `icscisa.fetch.documents` showing documents added per topic pull (tags: `concelier.source`, `icscisa.topic`). - `icscisa.parse.*` – counters for `success`/`failures` and histograms `icscisa.parse.advisories`, `icscisa.parse.attachments`, `icscisa.parse.detail_fetches` to monitor enrichment workload per feed document. - `icscisa.detail.*` – counters `success` / `failures` per advisory (tagged with `icscisa.advisory`) to alert when Akamai blocks detail pages. - `icscisa.map.*` – counters for `success`/`failures` and histograms `icscisa.map.references`, `icscisa.map.packages`, `icscisa.map.aliases` capturing canonical fan-out. @@ -114,7 +114,7 @@ Suggested alerts: - `increase(icscisa.fetch.failures_total[15m]) > 0` or `increase(icscisa.fetch.fallbacks_total[15m]) > 5` — sustained Akamai or proxy issues. - `increase(icscisa.detail.failures_total[30m]) > 0` — detail enrichment breaking (potential HTML layout change). - `histogram_quantile(0.95, rate(icscisa.map.references_bucket[1h]))` trending sharply higher — sudden advisory reference explosion worth investigating. -- Keep an eye on shared HTTP metrics (`feedser.source.http.*{feedser.source="ics-cisa"}`) for request latency and retry patterns. +- Keep an eye on shared HTTP metrics (`concelier.source.http.*{concelier.source="ics-cisa"}`) for request latency and retry patterns. ## 6. Related Tasks diff --git a/docs/ops/feedser-kisa-operations.md b/docs/ops/concelier-kisa-operations.md similarity index 84% rename from docs/ops/feedser-kisa-operations.md rename to docs/ops/concelier-kisa-operations.md index d2d25caf..d2b4ec42 100644 --- a/docs/ops/feedser-kisa-operations.md +++ b/docs/ops/concelier-kisa-operations.md @@ -1,14 +1,14 @@ -# Feedser KISA Connector Operations +# Concelier KISA Connector Operations Operational guidance for the Korea Internet & Security Agency (KISA / KNVD) connector (`source:kisa:*`). Pair this with the engineering brief in `docs/dev/kisa_connector_notes.md`. ## 1. Prerequisites - Outbound HTTPS (or mirrored cache) for `https://knvd.krcert.or.kr/`. -- Connector options defined under `feedser:sources:kisa`: +- Connector options defined under `concelier:sources:kisa`: ```yaml -feedser: +concelier: sources: kisa: feedUri: "https://knvd.krcert.or.kr/rss/securityInfo.do" @@ -19,15 +19,15 @@ feedser: failureBackoff: "00:05:00" ``` -> Ensure the URIs stay absolute—Feedser adds the `feedUri`/`detailApiUri` hosts to the HttpClient allow-list automatically. +> Ensure the URIs stay absolute—Concelier adds the `feedUri`/`detailApiUri` hosts to the HttpClient allow-list automatically. ## 2. Staging Smoke Test -1. Restart the Feedser workers so the KISA options bind. +1. Restart the Concelier workers so the KISA options bind. 2. Run a full connector cycle: - CLI: `stella db jobs run source:kisa:fetch --and-then source:kisa:parse --and-then source:kisa:map` - REST: `POST /jobs/run { "kind": "source:kisa:fetch", "chain": ["source:kisa:parse", "source:kisa:map"] }` -3. Confirm telemetry (Meter `StellaOps.Feedser.Source.Kisa`): +3. Confirm telemetry (Meter `StellaOps.Concelier.Source.Kisa`): - `kisa.feed.success`, `kisa.feed.items` - `kisa.detail.success` / `.failures` - `kisa.parse.success` / `.failures` @@ -47,7 +47,7 @@ feedser: ## 3. Production Monitoring - **Dashboards** – Add the following Prometheus/OTEL expressions: - - `rate(kisa_feed_items_total[15m])` versus `rate(feedser_source_http_requests_total{feedser_source="kisa"}[15m])` + - `rate(kisa_feed_items_total[15m])` versus `rate(concelier_source_http_requests_total{concelier_source="kisa"}[15m])` - `increase(kisa_detail_failures_total{reason!="empty-document"}[1h])` alert at `>0` - `increase(kisa_parse_failures_total[1h])` for storage/JSON issues - `increase(kisa_map_failures_total[1h])` to flag schema drift @@ -63,8 +63,8 @@ feedser: ## 5. Fixture & Regression Maintenance -- Regression fixtures: `src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-feed.xml` and `kisa-detail.json`. -- Refresh via `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj`. +- Regression fixtures: `src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-feed.xml` and `kisa-detail.json`. +- Refresh via `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj`. - The telemetry regression (`KisaConnectorTests.Telemetry_RecordsMetrics`) will fail if counters/log wiring drifts—treat failures as gating. ## 6. Known Issues diff --git a/docs/ops/feedser-msrc-operations.md b/docs/ops/concelier-msrc-operations.md similarity index 84% rename from docs/ops/feedser-msrc-operations.md rename to docs/ops/concelier-msrc-operations.md index 828b5a9c..40b71e4f 100644 --- a/docs/ops/feedser-msrc-operations.md +++ b/docs/ops/concelier-msrc-operations.md @@ -1,4 +1,4 @@ -# Feedser MSRC Connector – Azure AD Onboarding Brief +# Concelier MSRC Connector – Azure AD Onboarding Brief _Drafted: 2025-10-15_ @@ -8,18 +8,18 @@ _Drafted: 2025-10-15_ - **Application type**: confidential client (web/API) issuing client credentials. - **API permissions**: `api://api.msrc.microsoft.com/.default` (Application). Admin consent required once. - **Token audience**: `https://api.msrc.microsoft.com/`. -- **Grant type**: client credentials. Feedser will request tokens via `POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token`. +- **Grant type**: client credentials. Concelier will request tokens via `POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token`. ## 2. Secret/credential policy - Maintain two client secrets (primary + standby) rotating every 90 days. -- Store secrets in the Feedser secrets vault; Offline Kit deployments must mirror the secret payloads in their encrypted store. -- Record rotation cadence in Ops runbook and update Feedser configuration (`FEEDSER__SOURCES__VNDR__MSRC__CLIENTSECRET`) ahead of expiry. +- Store secrets in the Concelier secrets vault; Offline Kit deployments must mirror the secret payloads in their encrypted store. +- Record rotation cadence in Ops runbook and update Concelier configuration (`CONCELIER__SOURCES__VNDR__MSRC__CLIENTSECRET`) ahead of expiry. -## 3. Feedser configuration sample +## 3. Concelier configuration sample ```yaml -feedser: +concelier: sources: vndr.msrc: tenantId: "" @@ -73,7 +73,7 @@ Run the helper: ```bash dotnet run --project tools/SourceStateSeeder -- \ --connection-string "mongodb://localhost:27017" \ - --database feedser \ + --database concelier \ --input seeds/msrc-backfill.json ``` diff --git a/docs/ops/feedser-nkcki-operations.md b/docs/ops/concelier-nkcki-operations.md similarity index 84% rename from docs/ops/feedser-nkcki-operations.md rename to docs/ops/concelier-nkcki-operations.md index 4424c9ee..a619ca22 100644 --- a/docs/ops/feedser-nkcki-operations.md +++ b/docs/ops/concelier-nkcki-operations.md @@ -6,7 +6,7 @@ The NKCKI connector ingests JSON bulletin archives from cert.gov.ru, expanding e ## Configuration -Key options exposed through `feedser:sources:ru-nkcki:http`: +Key options exposed through `concelier:sources:ru-nkcki:http`: - `maxBulletinsPerFetch` – limits new bulletin downloads in a single run (default `5`). - `maxListingPagesPerFetch` – maximum listing pages visited during pagination (default `3`). @@ -14,11 +14,11 @@ Key options exposed through `feedser:sources:ru-nkcki:http`: - `cacheDirectory` – optional path for persisted bulletin archives used during offline or failure scenarios. - `requestDelay` – delay inserted between bulletin downloads to respect upstream politeness. -When operating in offline-first mode, set `cacheDirectory` to a writable path (e.g. `/var/lib/feedser/cache/ru-nkcki`) and pre-populate bulletin archives via the offline kit. +When operating in offline-first mode, set `cacheDirectory` to a writable path (e.g. `/var/lib/concelier/cache/ru-nkcki`) and pre-populate bulletin archives via the offline kit. ## Telemetry -`RuNkckiDiagnostics` emits the following metrics under meter `StellaOps.Feedser.Source.Ru.Nkcki`: +`RuNkckiDiagnostics` emits the following metrics under meter `StellaOps.Concelier.Source.Ru.Nkcki`: - `nkcki.listing.fetch.attempts` / `nkcki.listing.fetch.success` / `nkcki.listing.fetch.failures` - `nkcki.listing.pages.visited` (histogram, `pages`) @@ -26,7 +26,7 @@ When operating in offline-first mode, set `cacheDirectory` to a writable path (e - `nkcki.bulletin.fetch.success` / `nkcki.bulletin.fetch.cached` / `nkcki.bulletin.fetch.failures` - `nkcki.entries.processed` (histogram, `entries`) -Integrate these counters into standard Feedser observability dashboards to track crawl coverage and cache hit rates. +Integrate these counters into standard Concelier observability dashboards to track crawl coverage and cache hit rates. ## Archive Backfill Strategy @@ -35,7 +35,7 @@ Bitrix pagination surfaces archives via `?PAGEN_1=n`. The connector now walks up 1. Enumerate pages from newest to oldest, respecting `maxListingPagesPerFetch` and `listingCacheDuration` to avoid refetch storms. 2. Persist every `*.json.zip` attachment to the configured cache directory. This enables replay when listing access is temporarily blocked. 3. During archive replay, `ProcessCachedBulletinsAsync` enqueues missing documents while respecting `maxVulnerabilitiesPerFetch`. -4. For historical HTML-only advisories, collect page URLs and metadata while offline (future work: HTML and PDF extraction pipeline documented in `docs/feedser-connector-research-20251011.md`). +4. For historical HTML-only advisories, collect page URLs and metadata while offline (future work: HTML and PDF extraction pipeline documented in `docs/concelier-connector-research-20251011.md`). For large migrations, seed caches with archived zip bundles, then run fetch/parse/map cycles in chronological order to maintain deterministic outputs. @@ -45,4 +45,4 @@ For large migrations, seed caches with archived zip bundles, then run fetch/pars - Bulletin fetches fall back to cached copies before surfacing an error. - Mongo integration tests rely on bundled OpenSSL 1.1 libraries (`tools/openssl/linux-x64`) to keep `Mongo2Go` operational on modern distros. -Refer to `ru-nkcki` entries in `src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md` for outstanding items. +Refer to `ru-nkcki` entries in `src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md` for outstanding items. diff --git a/docs/ops/feedser-osv-operations.md b/docs/ops/concelier-osv-operations.md similarity index 94% rename from docs/ops/feedser-osv-operations.md rename to docs/ops/concelier-osv-operations.md index a00dcac5..137e1a95 100644 --- a/docs/ops/feedser-osv-operations.md +++ b/docs/ops/concelier-osv-operations.md @@ -1,4 +1,4 @@ -# Feedser OSV Connector – Operations Notes +# Concelier OSV Connector – Operations Notes _Last updated: 2025-10-16_ @@ -20,5 +20,5 @@ The OSV connector ingests advisories from OSV.dev across OSS ecosystems. This no - Exporters already surface `canonicalMetricId`; no schema change is required, but ORAS/Trivy bundles should be spot-checked after deploying the connector update. ## 4. Runbook updates -- Fixture parity suites (`osv-ghsa.*`) now assert the fallback id and provenance notes. Regenerate via `dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj`. +- Fixture parity suites (`osv-ghsa.*`) now assert the fallback id and provenance notes. Regenerate via `dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj`. - When investigating merge severity conflicts, include the fallback counter and confirm OSV advisories carry the expected `osv:severity/` id before raising connector bugs. diff --git a/docs/ops/migrations/SEMVER_STYLE.md b/docs/ops/migrations/SEMVER_STYLE.md index 151f078b..cd619c4f 100644 --- a/docs/ops/migrations/SEMVER_STYLE.md +++ b/docs/ops/migrations/SEMVER_STYLE.md @@ -6,12 +6,12 @@ _Last updated: 2025-10-11_ The SemVer style migration populates the new `normalizedVersions` field on advisory documents and ensures provenance `decisionReason` values are preserved during future reads. The migration is idempotent and only -runs when the feature flag `feedser:storage:enableSemVerStyle` is enabled. +runs when the feature flag `concelier:storage:enableSemVerStyle` is enabled. ## Preconditions -1. **Review configuration** – set `feedser.storage.enableSemVerStyle` to `true` on all Feedser services. -2. **Confirm batch size** – adjust `feedser.storage.backfillBatchSize` if you need smaller batches for older +1. **Review configuration** – set `concelier.storage.enableSemVerStyle` to `true` on all Concelier services. +2. **Confirm batch size** – adjust `concelier.storage.backfillBatchSize` if you need smaller batches for older deployments (default: `250`). 3. **Back up** – capture a fresh snapshot of the `advisory` collection or a full MongoDB backup. 4. **Staging dry-run** – enable the flag in a staging environment and observe the migration output before @@ -19,7 +19,7 @@ runs when the feature flag `feedser:storage:enableSemVerStyle` is enabled. ## Execution -No manual command is required. After deploying the configuration change, restart the Feedser WebService or +No manual command is required. After deploying the configuration change, restart the Concelier WebService or any component that hosts the Mongo migration runner. During startup you will see log entries similar to: ``` @@ -27,7 +27,7 @@ Applying Mongo migration 20251011-semver-style-backfill: Populate advisory.norma Mongo migration 20251011-semver-style-backfill applied ``` -The migration reads advisories in batches (`feedser.storage.backfillBatchSize`) and writes flattened +The migration reads advisories in batches (`concelier.storage.backfillBatchSize`) and writes flattened `normalizedVersions` arrays. Existing documents without SemVer ranges remain untouched. ## Post-checks @@ -39,12 +39,12 @@ The migration reads advisories in batches (`feedser.storage.backfillBatchSize`) You should see `advisory_normalizedVersions_pkg_scheme_type` and `advisory_normalizedVersions_value`. 2. Spot check a few advisories to confirm the top-level `normalizedVersions` array exists and matches the embedded package data. -3. Run `dotnet test` for `StellaOps.Feedser.Storage.Mongo.Tests` (optional but recommended) in CI to confirm +3. Run `dotnet test` for `StellaOps.Concelier.Storage.Mongo.Tests` (optional but recommended) in CI to confirm the storage suite passes with the feature flag enabled. ## Rollback -Set `feedser.storage.enableSemVerStyle` back to `false` and redeploy. The migration will be skipped on +Set `concelier.storage.enableSemVerStyle` back to `false` and redeploy. The migration will be skipped on subsequent startups. You can leave the populated `normalizedVersions` arrays in place; they are ignored when the feature flag is off. If you must remove them entirely, restore from the backup captured during preparation. diff --git a/docs/security/authority-threat-model.md b/docs/security/authority-threat-model.md index f9ad5c99..2bb09f31 100644 --- a/docs/security/authority-threat-model.md +++ b/docs/security/authority-threat-model.md @@ -14,7 +14,7 @@ |-----------------|-------------|----------------| | Token issuance APIs (`/token`, `/authorize`) | OAuth/OIDC endpoints mediated by OpenIddict | CLI, UI, automation agents | | Bootstrap channel | Initial admin invite + bootstrap CLI workflow | Platform operators | -| Revocation bundle | Offline JSON + detached JWS consumed by agents | Feedser, Agents, Zastava | +| Revocation bundle | Offline JSON + detached JWS consumed by agents | Concelier, Agents, Zastava | | Plug-in manifests | Standard plug-in configuration and password policy overrides | Operators, DevOps | | Signing keys | ES256 signing keys backing tokens and revocation manifests | Security Guild, HSM/KeyOps | | Audit telemetry | Structured login/audit stream persisted to Mongo/observability stack | SOC, SecOps | @@ -68,7 +68,7 @@ flowchart LR end subgraph Distribution OFFKIT[Offline Kit Bundle] - AGENT[Authorized Agent / Feedser] + AGENT[Authorized Agent / Concelier] end OPS -->|Bootstrap CLI (`stellaops auth bootstrap`)| AUTH AUTH -->|One-time invite + Argon2 hash| STORE diff --git a/docs/security/revocation-bundle-example.json b/docs/security/revocation-bundle-example.json index b82477ad..c53b7520 100644 --- a/docs/security/revocation-bundle-example.json +++ b/docs/security/revocation-bundle-example.json @@ -12,14 +12,14 @@ "id": "7ad4f3d2c21b461d9b3420e1151be9c4", "category": "token", "tokenType": "access_token", - "clientId": "feedser-cli", + "clientId": "concelier-cli", "subjectId": "user:ops-admin", "reason": "compromised", "reasonDescription": "Access token reported by SOC automation run R-2045.", "revokedAt": "2025-10-12T14:32:05Z", "scopes": [ - "feedser:export", - "feedser:jobs" + "concelier:export", + "concelier:jobs" ], "fingerprint": "AD35E719C12204D7E7C92ED3F6DEBF0A44642D41AAF94233F9A47E183F4C5F18", "metadata": { diff --git a/docs/security/revocation-bundle.md b/docs/security/revocation-bundle.md index 657c10e0..0a5dc6b3 100644 --- a/docs/security/revocation-bundle.md +++ b/docs/security/revocation-bundle.md @@ -1,6 +1,6 @@ # Authority Revocation Bundle -The Authority service exports revocation information as an offline-friendly JSON document plus a detached JWS signature. Operators can mirror the bundle alongside Feedser exports to ensure air-gapped scanners receive the latest token, subject, and client revocations. +The Authority service exports revocation information as an offline-friendly JSON document plus a detached JWS signature. Operators can mirror the bundle alongside Concelier exports to ensure air-gapped scanners receive the latest token, subject, and client revocations. ## File layout @@ -88,4 +88,4 @@ The repository contains an [example bundle](revocation-bundle-example.json) demo - `stella auth revoke verify` validates a bundle using cached JWKS or an offline PEM key, honours the `provider` metadata embedded in the signature, and reports digest mismatches before distribution. - `POST /internal/revocations/export` provides the same payload for orchestrators that already talk to the bootstrap API. - `POST /internal/signing/rotate` rotates JWKS material without downtime; always export a fresh bundle afterward so downstream mirrors receive signatures from the new `kid`. -- Offline Kit automation should mirror `revocation-bundle.json*` alongside Feedser exports so agents ingest revocations during the same sync pass. +- Offline Kit automation should mirror `revocation-bundle.json*` alongside Concelier exports so agents ingest revocations during the same sync pass. diff --git a/etc/feedser.yaml.sample b/etc/concelier.yaml.sample similarity index 77% rename from etc/feedser.yaml.sample rename to etc/concelier.yaml.sample index a36cdd1f..98b3e9d1 100644 --- a/etc/feedser.yaml.sample +++ b/etc/concelier.yaml.sample @@ -1,23 +1,23 @@ -# Feedser configuration template for StellaOps deployments. -# Copy to ../etc/feedser.yaml (relative to the web service content root) +# Concelier configuration template for StellaOps deployments. +# Copy to ../etc/concelier.yaml (relative to the web service content root) # and adjust the values to match your environment. Environment variables -# (prefixed with FEEDSER_) override these settings at runtime. +# (prefixed with CONCELIER_) override these settings at runtime. storage: driver: mongo # Mongo connection string. Use SRV URI or standard connection string. - dsn: "mongodb://feedser:feedser@mongo:27017/feedser?authSource=admin" - # Optional database name; defaults to the name embedded in the DSN or 'feedser'. - database: "feedser" + dsn: "mongodb://concelier:concelier@mongo:27017/concelier?authSource=admin" + # Optional database name; defaults to the name embedded in the DSN or 'concelier'. + database: "concelier" # Mongo command timeout in seconds. commandTimeoutSeconds: 30 plugins: - # Feedser resolves plug-ins relative to the content root; override as needed. + # Concelier resolves plug-ins relative to the content root; override as needed. baseDirectory: ".." directory: "PluginBinaries" searchPatterns: - - "StellaOps.Feedser.Plugin.*.dll" + - "StellaOps.Concelier.Plugin.*.dll" telemetry: enabled: true @@ -25,7 +25,7 @@ telemetry: enableMetrics: false enableLogging: true minimumLogLevel: "Information" - serviceName: "stellaops-feedser" + serviceName: "stellaops-concelier" # Configure OTLP endpoint when shipping traces/metrics/logs out-of-band. otlpEndpoint: "" # Optional headers for OTLP exporters, for example authentication tokens. @@ -38,7 +38,7 @@ telemetry: authority: enabled: false - # Temporary rollout flag. When true, Feedser logs anonymous access but does not fail requests + # Temporary rollout flag. When true, Concelier logs anonymous access but does not fail requests # without tokens. Set to false before 2025-12-31 UTC to enforce authentication fully. allowAnonymousFallback: true # Issuer advertised by StellaOps Authority (e.g. https://authority.stella-ops.local). @@ -49,16 +49,16 @@ authority: backchannelTimeoutSeconds: 30 tokenClockSkewSeconds: 60 audiences: - - "api://feedser" + - "api://concelier" requiredScopes: - - "feedser.jobs.trigger" - # Outbound credentials Feedser can use to call Authority (client credentials flow). - clientId: "feedser-jobs" + - "concelier.jobs.trigger" + # Outbound credentials Concelier can use to call Authority (client credentials flow). + clientId: "concelier-jobs" # Prefer storing the secret outside of the config file. Provide either clientSecret or clientSecretFile. clientSecret: "" clientSecretFile: "" clientScopes: - - "feedser.jobs.trigger" + - "concelier.jobs.trigger" resilience: # Enable deterministic retry/backoff when Authority is briefly unavailable. enableRetries: true diff --git a/scripts/update-apple-fixtures.ps1 b/scripts/update-apple-fixtures.ps1 index 34e74881..9d74276b 100644 --- a/scripts/update-apple-fixtures.ps1 +++ b/scripts/update-apple-fixtures.ps1 @@ -10,9 +10,9 @@ $env:UPDATE_APPLE_FIXTURES = "1" Push-Location $rootDir try { - $sentinel = Join-Path $rootDir "src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures" + $sentinel = Join-Path $rootDir "src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures" New-Item -ItemType File -Path $sentinel -Force | Out-Null - dotnet test "src\StellaOps.Feedser.Source.Vndr.Apple.Tests\StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj" @Args + dotnet test "src\StellaOps.Concelier.Source.Vndr.Apple.Tests\StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj" @Args } finally { Pop-Location diff --git a/scripts/update-apple-fixtures.sh b/scripts/update-apple-fixtures.sh index 60ebc818..75da107d 100644 --- a/scripts/update-apple-fixtures.sh +++ b/scripts/update-apple-fixtures.sh @@ -10,5 +10,5 @@ else export WSLENV="UPDATE_APPLE_FIXTURES/up" fi -touch "$ROOT_DIR/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures" -( cd "$ROOT_DIR" && dotnet test "src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj" "$@" ) +touch "$ROOT_DIR/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures" +( cd "$ROOT_DIR" && dotnet test "src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj" "$@" ) diff --git a/scripts/update-model-goldens.ps1 b/scripts/update-model-goldens.ps1 index e4b5a39a..9bb20554 100644 --- a/scripts/update-model-goldens.ps1 +++ b/scripts/update-model-goldens.ps1 @@ -6,4 +6,4 @@ Param( $Root = Split-Path -Parent $PSScriptRoot $env:UPDATE_GOLDENS = "1" -dotnet test (Join-Path $Root "src/StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj") @RestArgs +dotnet test (Join-Path $Root "src/StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj") @RestArgs diff --git a/scripts/update-model-goldens.sh b/scripts/update-model-goldens.sh index e668b616..5e0d0984 100644 --- a/scripts/update-model-goldens.sh +++ b/scripts/update-model-goldens.sh @@ -5,4 +5,4 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" export UPDATE_GOLDENS=1 -dotnet test "$ROOT_DIR/src/StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj" "$@" +dotnet test "$ROOT_DIR/src/StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj" "$@" diff --git a/seed-data/cert-bund/README.md b/seed-data/cert-bund/README.md index 28c5c642..c31fea90 100644 --- a/seed-data/cert-bund/README.md +++ b/seed-data/cert-bund/README.md @@ -40,7 +40,7 @@ python tools/certbund_offline_snapshot.py --output seed-data/cert-bund ``` See the connector operations guide -(`docs/ops/feedser-certbund-operations.md`) for detailed usage, +(`docs/ops/concelier-certbund-operations.md`) for detailed usage, including how to provide cookies/tokens when the portal requires manual authentication. diff --git a/src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md b/src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md index 71160900..a70daa48 100644 --- a/src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md +++ b/src/DEDUP_CONFLICTS_RESOLUTION_ALGO.md @@ -1,7 +1,7 @@ ````markdown -# Feedser Vulnerability Conflict Resolution Rules +# Concelier Vulnerability Conflict Resolution Rules -This document defines the canonical, deterministic conflict resolution strategy for merging vulnerability data from **NVD**, **GHSA**, and **OSV** in Feedser. +This document defines the canonical, deterministic conflict resolution strategy for merging vulnerability data from **NVD**, **GHSA**, and **OSV** in Concelier. --- @@ -128,7 +128,7 @@ return out ## 🧰 Optional C# Helper Class -`StellaOps.Feedser.Core/CanonicalMerger.cs` +`StellaOps.Concelier.Core/CanonicalMerger.cs` Implements: diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 1b0a699d..6a5f61eb 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,11 +1,11 @@ - $(SolutionDir)PluginBinaries - $(MSBuildThisFileDirectory)PluginBinaries + $(SolutionDir)PluginBinaries + $(MSBuildThisFileDirectory)PluginBinaries $(SolutionDir)PluginBinaries\Authority $(MSBuildThisFileDirectory)PluginBinaries\Authority - true - true + true + true true @@ -24,10 +24,10 @@ - - - - + + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index a2e810fb..48393b88 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,18 +1,18 @@ - + - $(FeedserPluginOutputRoot)\$(MSBuildProjectName) + $(ConcelierPluginOutputRoot)\$(MSBuildProjectName) - + - - - + + + - + diff --git a/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsPrincipalBuilderTests.cs b/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsPrincipalBuilderTests.cs index 1dd7b2dd..4cf41844 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsPrincipalBuilderTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsPrincipalBuilderTests.cs @@ -12,15 +12,15 @@ public class StellaOpsPrincipalBuilderTests public void NormalizedScopes_AreSortedDeduplicatedLowerCased() { var builder = new StellaOpsPrincipalBuilder() - .WithScopes(new[] { "Feedser.Jobs.Trigger", " feedser.jobs.trigger ", "AUTHORITY.USERS.MANAGE" }) - .WithAudiences(new[] { " api://feedser ", "api://cli", "api://feedser" }); + .WithScopes(new[] { "Concelier.Jobs.Trigger", " concelier.jobs.trigger ", "AUTHORITY.USERS.MANAGE" }) + .WithAudiences(new[] { " api://concelier ", "api://cli", "api://concelier" }); Assert.Equal( - new[] { "authority.users.manage", "feedser.jobs.trigger" }, + new[] { "authority.users.manage", "concelier.jobs.trigger" }, builder.NormalizedScopes); Assert.Equal( - new[] { "api://cli", "api://feedser" }, + new[] { "api://cli", "api://concelier" }, builder.Audiences); } @@ -38,8 +38,8 @@ public class StellaOpsPrincipalBuilderTests .WithTokenId(Guid.NewGuid().ToString("N")) .WithAuthenticationMethod("password") .WithAuthenticationType(" custom ") - .WithScopes(new[] { "Feedser.Jobs.Trigger", "AUTHORITY.USERS.MANAGE" }) - .WithAudience(" api://feedser ") + .WithScopes(new[] { "Concelier.Jobs.Trigger", "AUTHORITY.USERS.MANAGE" }) + .WithAudience(" api://concelier ") .WithIssuedAt(now) .WithExpires(now.AddMinutes(5)) .AddClaim(" custom ", " value "); @@ -57,13 +57,13 @@ public class StellaOpsPrincipalBuilderTests Assert.Equal("value", principal.FindFirstValue("custom")); var scopeClaims = principal.Claims.Where(claim => claim.Type == StellaOpsClaimTypes.ScopeItem).Select(claim => claim.Value).ToArray(); - Assert.Equal(new[] { "authority.users.manage", "feedser.jobs.trigger" }, scopeClaims); + Assert.Equal(new[] { "authority.users.manage", "concelier.jobs.trigger" }, scopeClaims); var scopeList = principal.FindFirstValue(StellaOpsClaimTypes.Scope); - Assert.Equal("authority.users.manage feedser.jobs.trigger", scopeList); + Assert.Equal("authority.users.manage concelier.jobs.trigger", scopeList); var audienceClaims = principal.Claims.Where(claim => claim.Type == StellaOpsClaimTypes.Audience).Select(claim => claim.Value).ToArray(); - Assert.Equal(new[] { "api://feedser" }, audienceClaims); + Assert.Equal(new[] { "api://concelier" }, audienceClaims); var issuedAt = principal.FindFirstValue("iat"); Assert.Equal(now.ToUnixTimeSeconds().ToString(), issuedAt); diff --git a/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsProblemResultFactoryTests.cs b/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsProblemResultFactoryTests.cs index c9243ccc..00fb12c2 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsProblemResultFactoryTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.Abstractions.Tests/StellaOpsProblemResultFactoryTests.cs @@ -37,7 +37,7 @@ public class StellaOpsProblemResultFactoryTests public void InsufficientScope_AddsScopeExtensions() { var result = StellaOpsProblemResultFactory.InsufficientScope( - new[] { StellaOpsScopes.FeedserJobsTrigger }, + new[] { StellaOpsScopes.ConcelierJobsTrigger }, new[] { StellaOpsScopes.AuthorityUsersManage }, instance: "/jobs/trigger"); @@ -46,7 +46,7 @@ public class StellaOpsProblemResultFactoryTests var details = Assert.IsType(result.ProblemDetails); Assert.Equal("https://docs.stella-ops.org/problems/insufficient-scope", details.Type); Assert.Equal("insufficient_scope", details.Extensions["error"]); - Assert.Equal(new[] { StellaOpsScopes.FeedserJobsTrigger }, Assert.IsType(details.Extensions["required_scopes"])); + Assert.Equal(new[] { StellaOpsScopes.ConcelierJobsTrigger }, Assert.IsType(details.Extensions["required_scopes"])); Assert.Equal(new[] { StellaOpsScopes.AuthorityUsersManage }, Assert.IsType(details.Extensions["granted_scopes"])); Assert.Equal("/jobs/trigger", details.Instance); } diff --git a/src/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs b/src/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs index 42587835..3f0130ff 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs @@ -9,14 +9,14 @@ namespace StellaOps.Auth.Abstractions; public static class StellaOpsScopes { /// - /// Scope required to trigger Feedser jobs. + /// Scope required to trigger Concelier jobs. /// - public const string FeedserJobsTrigger = "feedser.jobs.trigger"; + public const string ConcelierJobsTrigger = "concelier.jobs.trigger"; /// - /// Scope required to manage Feedser merge operations. + /// Scope required to manage Concelier merge operations. /// - public const string FeedserMerge = "feedser.merge"; + public const string ConcelierMerge = "concelier.merge"; /// /// Scope granting administrative access to Authority user management. @@ -40,8 +40,8 @@ public static class StellaOpsScopes private static readonly HashSet KnownScopes = new(StringComparer.OrdinalIgnoreCase) { - FeedserJobsTrigger, - FeedserMerge, + ConcelierJobsTrigger, + ConcelierMerge, AuthorityUsersManage, AuthorityClientsManage, AuthorityAuditRead, diff --git a/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsAuthClientOptionsTests.cs b/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsAuthClientOptionsTests.cs index e49deb14..b952bd56 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsAuthClientOptionsTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsAuthClientOptionsTests.cs @@ -15,13 +15,13 @@ public class StellaOpsAuthClientOptionsTests ClientId = "cli", HttpTimeout = TimeSpan.FromSeconds(15) }; - options.DefaultScopes.Add(" Feedser.Jobs.Trigger "); - options.DefaultScopes.Add("feedser.jobs.trigger"); + options.DefaultScopes.Add(" Concelier.Jobs.Trigger "); + options.DefaultScopes.Add("concelier.jobs.trigger"); options.DefaultScopes.Add("AUTHORITY.USERS.MANAGE"); options.Validate(); - Assert.Equal(new[] { "authority.users.manage", "feedser.jobs.trigger" }, options.NormalizedScopes); + Assert.Equal(new[] { "authority.users.manage", "concelier.jobs.trigger" }, options.NormalizedScopes); Assert.Equal(new Uri("https://authority.test"), options.AuthorityUri); Assert.Equal(options.RetryDelays, options.NormalizedRetryDelays); } diff --git a/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsTokenClientTests.cs b/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsTokenClientTests.cs index 6dbe89ed..475394fc 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsTokenClientTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.Client.Tests/StellaOpsTokenClientTests.cs @@ -21,7 +21,7 @@ public class StellaOpsTokenClientTests var timeProvider = new FakeTimeProvider(DateTimeOffset.Parse("2025-02-01T00:00:00Z")); var responses = new Queue(); responses.Enqueue(CreateJsonResponse("{\"token_endpoint\":\"https://authority.test/connect/token\",\"jwks_uri\":\"https://authority.test/jwks\"}")); - responses.Enqueue(CreateJsonResponse("{\"access_token\":\"abc\",\"token_type\":\"Bearer\",\"expires_in\":120,\"scope\":\"feedser.jobs.trigger\"}")); + responses.Enqueue(CreateJsonResponse("{\"access_token\":\"abc\",\"token_type\":\"Bearer\",\"expires_in\":120,\"scope\":\"concelier.jobs.trigger\"}")); responses.Enqueue(CreateJsonResponse("{\"keys\":[]}")); var handler = new StubHttpMessageHandler((request, cancellationToken) => @@ -37,7 +37,7 @@ public class StellaOpsTokenClientTests Authority = "https://authority.test", ClientId = "cli" }; - options.DefaultScopes.Add("feedser.jobs.trigger"); + options.DefaultScopes.Add("concelier.jobs.trigger"); options.Validate(); var optionsMonitor = new TestOptionsMonitor(options); @@ -49,7 +49,7 @@ public class StellaOpsTokenClientTests var result = await client.RequestPasswordTokenAsync("user", "pass"); Assert.Equal("abc", result.AccessToken); - Assert.Contains("feedser.jobs.trigger", result.Scopes); + Assert.Contains("concelier.jobs.trigger", result.Scopes); await client.CacheTokenAsync("key", result.ToCacheEntry()); var cached = await client.GetCachedTokenAsync("key"); diff --git a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs index c0477f2a..9f61d2cc 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/ServiceCollectionExtensionsTests.cs @@ -19,8 +19,8 @@ public class ServiceCollectionExtensionsTests .AddInMemoryCollection(new Dictionary { ["Authority:ResourceServer:Authority"] = "https://authority.example", - ["Authority:ResourceServer:Audiences:0"] = "api://feedser", - ["Authority:ResourceServer:RequiredScopes:0"] = "feedser.jobs.trigger", + ["Authority:ResourceServer:Audiences:0"] = "api://concelier", + ["Authority:ResourceServer:RequiredScopes:0"] = "concelier.jobs.trigger", ["Authority:ResourceServer:BypassNetworks:0"] = "127.0.0.1/32" }) .Build(); @@ -37,8 +37,8 @@ public class ServiceCollectionExtensionsTests Assert.NotNull(jwtOptions.Authority); Assert.Equal(new Uri("https://authority.example/"), new Uri(jwtOptions.Authority!)); Assert.True(jwtOptions.TokenValidationParameters.ValidateAudience); - Assert.Contains("api://feedser", jwtOptions.TokenValidationParameters.ValidAudiences); + Assert.Contains("api://concelier", jwtOptions.TokenValidationParameters.ValidAudiences); Assert.Equal(TimeSpan.FromSeconds(60), jwtOptions.TokenValidationParameters.ClockSkew); - Assert.Equal(new[] { "feedser.jobs.trigger" }, resourceOptions.NormalizedScopes); + Assert.Equal(new[] { "concelier.jobs.trigger" }, resourceOptions.NormalizedScopes); } } diff --git a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsResourceServerOptionsTests.cs b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsResourceServerOptionsTests.cs index 91454125..a7a34191 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsResourceServerOptionsTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsResourceServerOptionsTests.cs @@ -17,12 +17,12 @@ public class StellaOpsResourceServerOptionsTests TokenClockSkew = TimeSpan.FromSeconds(30) }; - options.Audiences.Add(" api://feedser "); - options.Audiences.Add("api://feedser"); - options.Audiences.Add("api://feedser-admin"); + options.Audiences.Add(" api://concelier "); + options.Audiences.Add("api://concelier"); + options.Audiences.Add("api://concelier-admin"); - options.RequiredScopes.Add(" Feedser.Jobs.Trigger "); - options.RequiredScopes.Add("feedser.jobs.trigger"); + options.RequiredScopes.Add(" Concelier.Jobs.Trigger "); + options.RequiredScopes.Add("concelier.jobs.trigger"); options.RequiredScopes.Add("AUTHORITY.USERS.MANAGE"); options.BypassNetworks.Add("127.0.0.1/32"); @@ -32,8 +32,8 @@ public class StellaOpsResourceServerOptionsTests options.Validate(); Assert.Equal(new Uri("https://authority.stella-ops.test"), options.AuthorityUri); - Assert.Equal(new[] { "api://feedser", "api://feedser-admin" }, options.Audiences); - Assert.Equal(new[] { "authority.users.manage", "feedser.jobs.trigger" }, options.NormalizedScopes); + Assert.Equal(new[] { "api://concelier", "api://concelier-admin" }, options.Audiences); + Assert.Equal(new[] { "authority.users.manage", "concelier.jobs.trigger" }, options.NormalizedScopes); Assert.True(options.BypassMatcher.IsAllowed(IPAddress.Parse("127.0.0.1"))); Assert.True(options.BypassMatcher.IsAllowed(IPAddress.IPv6Loopback)); } diff --git a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsScopeAuthorizationHandlerTests.cs b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsScopeAuthorizationHandlerTests.cs index 534a6ef0..24c814c7 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsScopeAuthorizationHandlerTests.cs +++ b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration.Tests/StellaOpsScopeAuthorizationHandlerTests.cs @@ -24,10 +24,10 @@ public class StellaOpsScopeAuthorizationHandlerTests }); var (handler, accessor) = CreateHandler(optionsMonitor, remoteAddress: IPAddress.Parse("10.0.0.1")); - var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.FeedserJobsTrigger }); + var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.ConcelierJobsTrigger }); var principal = new StellaOpsPrincipalBuilder() .WithSubject("user-1") - .WithScopes(new[] { StellaOpsScopes.FeedserJobsTrigger }) + .WithScopes(new[] { StellaOpsScopes.ConcelierJobsTrigger }) .Build(); var context = new AuthorizationHandlerContext(new[] { requirement }, principal, accessor.HttpContext); @@ -48,7 +48,7 @@ public class StellaOpsScopeAuthorizationHandlerTests }); var (handler, accessor) = CreateHandler(optionsMonitor, remoteAddress: IPAddress.Parse("127.0.0.1")); - var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.FeedserJobsTrigger }); + var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.ConcelierJobsTrigger }); var principal = new ClaimsPrincipal(new ClaimsIdentity()); var context = new AuthorizationHandlerContext(new[] { requirement }, principal, accessor.HttpContext); @@ -67,7 +67,7 @@ public class StellaOpsScopeAuthorizationHandlerTests }); var (handler, accessor) = CreateHandler(optionsMonitor, remoteAddress: IPAddress.Parse("203.0.113.10")); - var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.FeedserJobsTrigger }); + var requirement = new StellaOpsScopeRequirement(new[] { StellaOpsScopes.ConcelierJobsTrigger }); var principal = new ClaimsPrincipal(new ClaimsIdentity()); var context = new AuthorizationHandlerContext(new[] { requirement }, principal, accessor.HttpContext); diff --git a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration/README.NuGet.md b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration/README.NuGet.md index 1f7eba7f..01631d36 100644 --- a/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration/README.NuGet.md +++ b/src/StellaOps.Authority/StellaOps.Auth.ServerIntegration/README.NuGet.md @@ -4,6 +4,6 @@ ASP.NET Core helpers that enable resource servers to authenticate with **StellaO - `AddStellaOpsResourceServerAuthentication` extension for JWT bearer + scope policies. - Network bypass mask evaluation for on-host automation. -- Consistent `ProblemDetails` responses and policy helpers shared with Feedser/Backend services. +- Consistent `ProblemDetails` responses and policy helpers shared with Concelier/Backend services. Pair this package with `StellaOps.Auth.Abstractions` and `StellaOps.Auth.Client` for end-to-end Authority integration. diff --git a/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/ClientCredentialsAndTokenHandlersTests.cs b/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/ClientCredentialsAndTokenHandlersTests.cs index 25b3e059..4fe34c90 100644 --- a/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/ClientCredentialsAndTokenHandlersTests.cs +++ b/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/ClientCredentialsAndTokenHandlersTests.cs @@ -197,7 +197,7 @@ public class TokenValidationHandlersTests { TokenId = "token-1", Status = "revoked", - ClientId = "feedser" + ClientId = "concelier" }; var metadataAccessor = new TestRateLimiterMetadataAccessor(); @@ -219,7 +219,7 @@ public class TokenValidationHandlersTests Request = new OpenIddictRequest() }; - var principal = CreatePrincipal("feedser", "token-1", "standard"); + var principal = CreatePrincipal("concelier", "token-1", "standard"); var context = new OpenIddictServerEvents.ValidateTokenContext(transaction) { Principal = principal, @@ -526,7 +526,7 @@ internal static class TestHelpers { return new AuthorityClientDocument { - ClientId = "feedser", + ClientId = "concelier", ClientType = clientType, SecretHash = secret is null ? null : AuthoritySecretHasher.ComputeHash(secret), Plugin = "standard", diff --git a/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/TokenPersistenceIntegrationTests.cs b/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/TokenPersistenceIntegrationTests.cs index bf7e8dc5..3bd67374 100644 --- a/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/TokenPersistenceIntegrationTests.cs +++ b/src/StellaOps.Authority/StellaOps.Authority.Tests/OpenIddict/TokenPersistenceIntegrationTests.cs @@ -17,7 +17,7 @@ using StellaOps.Authority.Storage.Mongo.Documents; using StellaOps.Authority.Storage.Mongo.Extensions; using StellaOps.Authority.Storage.Mongo.Initialization; using StellaOps.Authority.Storage.Mongo.Stores; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Testing; using StellaOps.Authority.RateLimiting; using StellaOps.Cryptography.Audit; using Xunit; diff --git a/src/StellaOps.Authority/StellaOps.Authority.Tests/RateLimiting/AuthorityRateLimiterIntegrationTests.cs b/src/StellaOps.Authority/StellaOps.Authority.Tests/RateLimiting/AuthorityRateLimiterIntegrationTests.cs index d7dc1f8c..e11a15ce 100644 --- a/src/StellaOps.Authority/StellaOps.Authority.Tests/RateLimiting/AuthorityRateLimiterIntegrationTests.cs +++ b/src/StellaOps.Authority/StellaOps.Authority.Tests/RateLimiting/AuthorityRateLimiterIntegrationTests.cs @@ -30,10 +30,10 @@ public class AuthorityRateLimiterIntegrationTests using var client = server.CreateClient(); client.DefaultRequestHeaders.Add("X-Forwarded-For", "198.51.100.50"); - var firstResponse = await client.PostAsync("/token", CreateTokenForm("feedser")); + var firstResponse = await client.PostAsync("/token", CreateTokenForm("concelier")); Assert.Equal(HttpStatusCode.OK, firstResponse.StatusCode); - var secondResponse = await client.PostAsync("/token", CreateTokenForm("feedser")); + var secondResponse = await client.PostAsync("/token", CreateTokenForm("concelier")); Assert.Equal(HttpStatusCode.TooManyRequests, secondResponse.StatusCode); Assert.NotNull(secondResponse.Headers.RetryAfter); } diff --git a/src/StellaOps.Authority/StellaOps.Authority.sln b/src/StellaOps.Authority/StellaOps.Authority.sln index 69348851..58ee2491 100644 --- a/src/StellaOps.Authority/StellaOps.Authority.sln +++ b/src/StellaOps.Authority/StellaOps.Authority.sln @@ -25,17 +25,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins.Abstractions.Tests", "StellaOps.Authority.Plugins.Abstractions.Tests\StellaOps.Authority.Plugins.Abstractions.Tests.csproj", "{EE97137B-22AF-4A84-9F65-9B4C6468B3CF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Testing", "..\StellaOps.Feedser.Testing\StellaOps.Feedser.Testing.csproj", "{D48E48BF-80C8-43DA-8BE6-E2B9E769C49E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "..\StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{D48E48BF-80C8-43DA-8BE6-E2B9E769C49E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common", "..\StellaOps.Feedser.Source.Common\StellaOps.Feedser.Source.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common", "..\StellaOps.Concelier.Source.Common\StellaOps.Concelier.Source.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo", "..\StellaOps.Feedser.Storage.Mongo\StellaOps.Feedser.Storage.Mongo.csproj", "{67C85AC6-1670-4A0D-A81F-6015574F46C7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo", "..\StellaOps.Concelier.Storage.Mongo\StellaOps.Concelier.Storage.Mongo.csproj", "{67C85AC6-1670-4A0D-A81F-6015574F46C7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "..\StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{17829125-C0F5-47E6-A16C-EC142BD58220}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "..\StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{17829125-C0F5-47E6-A16C-EC142BD58220}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models", "..\StellaOps.Feedser.Models\StellaOps.Feedser.Models.csproj", "{9B4BA030-C979-4191-8B4F-7E2AD9F88A94}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "..\StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{9B4BA030-C979-4191-8B4F-7E2AD9F88A94}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization", "..\StellaOps.Feedser.Normalization\StellaOps.Feedser.Normalization.csproj", "{26B58A9B-DB0B-4E3D-9827-3722859E5FB4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "..\StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{26B58A9B-DB0B-4E3D-9827-3722859E5FB4}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Tests", "StellaOps.Authority.Tests\StellaOps.Authority.Tests.csproj", "{D719B01C-2424-4DAB-94B9-C9B6004F450B}" EndProject diff --git a/src/StellaOps.Authority/TASKS.md b/src/StellaOps.Authority/TASKS.md index c7d7db2a..e8b07e7e 100644 --- a/src/StellaOps.Authority/TASKS.md +++ b/src/StellaOps.Authority/TASKS.md @@ -15,7 +15,7 @@ > Remark (2025-10-14): Background sweep emits invite expiry audits; integration test added. | SEC5.HOST-REPLAY | DONE (2025-10-14) | Security Guild, Zastava | SEC5.E | Persist token usage metadata and surface suspected replay heuristics. | ✅ Validation handlers record device metadata; ✅ Suspected replay flagged via audit/logs; ✅ Tests cover regression cases. | > Remark (2025-10-14): Token validation handler logs suspected replay audits with device metadata; coverage via unit/integration tests. -| SEC3.BUILD | DONE (2025-10-11) | Authority Core, Security Guild | SEC3.HOST, FEEDMERGE-COORD-02-900 | Track normalized-range dependency fallout and restore full test matrix once Feedser range primitives land. | ✅ Feedser normalized range libraries merged; ✅ Authority + Configuration test suites (`dotnet test src/StellaOps.Authority.sln`, `dotnet test src/StellaOps.Configuration.Tests/StellaOps.Configuration.Tests.csproj`) pass without Feedser compile failures; ✅ Status recorded here/Sprints (authority-core broadcast not available). | +| SEC3.BUILD | DONE (2025-10-11) | Authority Core, Security Guild | SEC3.HOST, FEEDMERGE-COORD-02-900 | Track normalized-range dependency fallout and restore full test matrix once Concelier range primitives land. | ✅ Concelier normalized range libraries merged; ✅ Authority + Configuration test suites (`dotnet test src/StellaOps.Authority.sln`, `dotnet test src/StellaOps.Configuration.Tests/StellaOps.Configuration.Tests.csproj`) pass without Concelier compile failures; ✅ Status recorded here/Sprints (authority-core broadcast not available). | | AUTHCORE-BUILD-OPENIDDICT | DONE (2025-10-14) | Authority Core | SEC2.HOST | Adapt host/audit handlers for OpenIddict 6.4 API surface (no `OpenIddictServerTransaction`) and restore Authority solution build. | ✅ Build `dotnet build src/StellaOps.Authority.sln` succeeds; ✅ Audit correlation + tamper logging verified under new abstractions; ✅ Tests updated. | | AUTHCORE-STORAGE-DEVICE-TOKENS | DONE (2025-10-14) | Authority Core, Storage Guild | AUTHCORE-BUILD-OPENIDDICT | Reintroduce `AuthorityTokenDeviceDocument` + projections removed during refactor so storage layer compiles. | ✅ Document type restored with mappings/migrations; ✅ Storage tests cover device artifacts; ✅ Authority solution build green. | | AUTHCORE-BOOTSTRAP-INVITES | DONE (2025-10-14) | Authority Core, DevOps | AUTHCORE-STORAGE-DEVICE-TOKENS | Wire bootstrap invite cleanup service against restored document schema and re-enable lifecycle tests. | ✅ `BootstrapInviteCleanupService` passes integration tests; ✅ Operator guide updated if behavior changes; ✅ Build/test matrices green. | diff --git a/src/StellaOps.Cli.Tests/Commands/CommandHandlersTests.cs b/src/StellaOps.Cli.Tests/Commands/CommandHandlersTests.cs index 31545959..c3ca71be 100644 --- a/src/StellaOps.Cli.Tests/Commands/CommandHandlersTests.cs +++ b/src/StellaOps.Cli.Tests/Commands/CommandHandlersTests.cs @@ -128,7 +128,7 @@ public sealed class CommandHandlersTests Url = "https://authority.example", ClientId = "cli", ClientSecret = "secret", - Scope = "feedser.jobs.trigger", + Scope = "concelier.jobs.trigger", TokenCacheDirectory = tempDir.Path } }; @@ -263,7 +263,7 @@ public sealed class CommandHandlersTests "token", "Bearer", DateTimeOffset.UtcNow.AddMinutes(30), - new[] { StellaOpsScopes.FeedserJobsTrigger }); + new[] { StellaOpsScopes.ConcelierJobsTrigger }); var provider = BuildServiceProvider(new StubBackendClient(new JobTriggerResult(true, "ok", null, null)), options: options, tokenClient: tokenClient); @@ -331,13 +331,13 @@ public sealed class CommandHandlersTests tokenClient.CachedEntry = new StellaOpsTokenCacheEntry( CreateUnsignedJwt( ("sub", "cli-user"), - ("aud", "feedser"), + ("aud", "concelier"), ("iss", "https://authority.example"), ("iat", 1_700_000_000), ("nbf", 1_700_000_000)), "Bearer", DateTimeOffset.UtcNow.AddMinutes(30), - new[] { StellaOpsScopes.FeedserJobsTrigger }); + new[] { StellaOpsScopes.ConcelierJobsTrigger }); var provider = BuildServiceProvider(new StubBackendClient(new JobTriggerResult(true, "ok", null, null)), options: options, tokenClient: tokenClient); @@ -375,7 +375,7 @@ public sealed class CommandHandlersTests "token", "Bearer", DateTimeOffset.UtcNow.AddMinutes(5), - new[] { StellaOpsScopes.FeedserJobsTrigger }); + new[] { StellaOpsScopes.ConcelierJobsTrigger }); var provider = BuildServiceProvider(new StubBackendClient(new JobTriggerResult(true, "ok", null, null)), options: options, tokenClient: tokenClient); @@ -573,7 +573,7 @@ public sealed class CommandHandlersTests "token-123", "Bearer", DateTimeOffset.UtcNow.AddMinutes(30), - new[] { StellaOpsScopes.FeedserJobsTrigger }); + new[] { StellaOpsScopes.ConcelierJobsTrigger }); } public int ClientCredentialRequests { get; private set; } diff --git a/src/StellaOps.Cli.Tests/Configuration/CliBootstrapperTests.cs b/src/StellaOps.Cli.Tests/Configuration/CliBootstrapperTests.cs index d19deb4f..38562646 100644 --- a/src/StellaOps.Cli.Tests/Configuration/CliBootstrapperTests.cs +++ b/src/StellaOps.Cli.Tests/Configuration/CliBootstrapperTests.cs @@ -24,7 +24,7 @@ public sealed class CliBootstrapperTests : IDisposable Environment.SetEnvironmentVariable("STELLAOPS_BACKEND_URL", "https://env-backend.example"); Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_URL", "https://authority.env"); Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_CLIENT_ID", "cli-env"); - Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_SCOPE", "feedser.jobs.trigger"); + Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_SCOPE", "concelier.jobs.trigger"); Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_ENABLE_RETRIES", "false"); Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_RETRY_DELAYS", "00:00:02,00:00:05"); Environment.SetEnvironmentVariable("STELLAOPS_AUTHORITY_ALLOW_OFFLINE_CACHE_FALLBACK", "false"); @@ -38,7 +38,7 @@ public sealed class CliBootstrapperTests : IDisposable Assert.Equal("https://env-backend.example", options.BackendUrl); Assert.Equal("https://authority.env", options.Authority.Url); Assert.Equal("cli-env", options.Authority.ClientId); - Assert.Equal("feedser.jobs.trigger", options.Authority.Scope); + Assert.Equal("concelier.jobs.trigger", options.Authority.Scope); Assert.NotNull(options.Authority.Resilience); Assert.False(options.Authority.Resilience.EnableRetries); @@ -73,7 +73,7 @@ public sealed class CliBootstrapperTests : IDisposable { Url = "https://authority.file", ClientId = "cli-file", - Scope = "feedser.jobs.trigger" + Scope = "concelier.jobs.trigger" } } }); diff --git a/src/StellaOps.Cli.Tests/Services/BackendOperationsClientTests.cs b/src/StellaOps.Cli.Tests/Services/BackendOperationsClientTests.cs index 14587016..8a95df94 100644 --- a/src/StellaOps.Cli.Tests/Services/BackendOperationsClientTests.cs +++ b/src/StellaOps.Cli.Tests/Services/BackendOperationsClientTests.cs @@ -46,12 +46,12 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", ScannerCacheDirectory = temp.Path, ScannerDownloadAttempts = 1 }; @@ -92,12 +92,12 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", ScannerCacheDirectory = temp.Path, ScannerDownloadAttempts = 1 }; @@ -144,12 +144,12 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", ScannerCacheDirectory = temp.Path, ScannerDownloadAttempts = 3 }; @@ -196,12 +196,12 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", ScanUploadAttempts = 3 }; @@ -234,12 +234,12 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", ScanUploadAttempts = 2 }; @@ -273,10 +273,10 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; - var options = new StellaOpsCliOptions { BackendUrl = "https://feedser.example" }; + var options = new StellaOpsCliOptions { BackendUrl = "https://concelier.example" }; var loggerFactory = LoggerFactory.Create(builder => builder.SetMinimumLevel(LogLevel.Debug)); var client = new BackendOperationsClient(httpClient, options, loggerFactory.CreateLogger()); @@ -308,10 +308,10 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; - var options = new StellaOpsCliOptions { BackendUrl = "https://feedser.example" }; + var options = new StellaOpsCliOptions { BackendUrl = "https://concelier.example" }; var loggerFactory = LoggerFactory.Create(builder => builder.SetMinimumLevel(LogLevel.Debug)); var client = new BackendOperationsClient(httpClient, options, loggerFactory.CreateLogger()); @@ -348,18 +348,18 @@ public sealed class BackendOperationsClientTests var httpClient = new HttpClient(handler) { - BaseAddress = new Uri("https://feedser.example") + BaseAddress = new Uri("https://concelier.example") }; var options = new StellaOpsCliOptions { - BackendUrl = "https://feedser.example", + BackendUrl = "https://concelier.example", Authority = { Url = "https://authority.example", ClientId = "cli", ClientSecret = "secret", - Scope = "feedser.jobs.trigger", + Scope = "concelier.jobs.trigger", TokenCacheDirectory = temp.Path } }; @@ -387,7 +387,7 @@ public sealed class BackendOperationsClientTests "token-123", "Bearer", DateTimeOffset.UtcNow.AddMinutes(5), - new[] { StellaOpsScopes.FeedserJobsTrigger }); + new[] { StellaOpsScopes.ConcelierJobsTrigger }); } public ValueTask CacheTokenAsync(string key, StellaOpsTokenCacheEntry entry, CancellationToken cancellationToken = default) diff --git a/src/StellaOps.Cli/AGENTS.md b/src/StellaOps.Cli/AGENTS.md index 77dc3e3a..e72b6563 100644 --- a/src/StellaOps.Cli/AGENTS.md +++ b/src/StellaOps.Cli/AGENTS.md @@ -1,14 +1,14 @@ # StellaOps.Cli — Agent Brief ## Mission -- Deliver an offline-capable command-line interface that drives StellaOps back-end operations: scanner distribution, scan execution, result uploads, and Feedser database lifecycle calls (init/resume/export). +- Deliver an offline-capable command-line interface that drives StellaOps back-end operations: scanner distribution, scan execution, result uploads, and Concelier database lifecycle calls (init/resume/export). - Honour StellaOps principles of determinism, observability, and offline-first behaviour while providing a polished operator experience. ## Role Charter | Role | Mandate | Collaboration | | --- | --- | --- | | **DevEx/CLI** | Own CLI UX, command routing, and configuration model. Ensure commands work with empty/default config and document overrides. | Coordinate with Backend/WebService for API contracts and with Docs for operator workflows. | -| **Ops Integrator** | Maintain integration paths for shell/dotnet/docker tooling. Validate that air-gapped runners can bootstrap required binaries. | Work with Feedser/Agent teams to mirror packaging and signing requirements. | +| **Ops Integrator** | Maintain integration paths for shell/dotnet/docker tooling. Validate that air-gapped runners can bootstrap required binaries. | Work with Concelier/Agent teams to mirror packaging and signing requirements. | | **QA** | Provide command-level fixtures, golden outputs, and regression coverage (unit & smoke). Ensure commands respect cancellation and deterministic logging. | Partner with QA guild for shared harnesses and test data. | ## Working Agreements @@ -21,7 +21,7 @@ - Update `TASKS.md` as states change (TODO → DOING → DONE/BLOCKED) and record added tests/fixtures alongside implementation notes. ## Reference Materials -- `docs/ARCHITECTURE_FEEDSER.md` for database operations surface area. +- `docs/ARCHITECTURE_CONCELIER.md` for database operations surface area. - Backend OpenAPI/contract docs (once available) for job triggers and scanner endpoints. - Existing module AGENTS/TASKS files for style and coordination cues. - `docs/09_API_CLI_REFERENCE.md` (section 3) for the user-facing synopsis of the CLI verbs and flags. diff --git a/src/StellaOps.Cli/Commands/CommandFactory.cs b/src/StellaOps.Cli/Commands/CommandFactory.cs index cc1b5873..576d3835 100644 --- a/src/StellaOps.Cli/Commands/CommandFactory.cs +++ b/src/StellaOps.Cli/Commands/CommandFactory.cs @@ -137,7 +137,7 @@ internal static class CommandFactory private static Command BuildDatabaseCommand(IServiceProvider services, Option verboseOption, CancellationToken cancellationToken) { - var db = new Command("db", "Trigger Feedser database operations via backend jobs."); + var db = new Command("db", "Trigger Concelier database operations via backend jobs."); var fetch = new Command("fetch", "Trigger connector fetch/parse/map stages."); var sourceOption = new Option("--source") @@ -174,7 +174,7 @@ internal static class CommandFactory return CommandHandlers.HandleMergeJobAsync(services, verbose, cancellationToken); }); - var export = new Command("export", "Run Feedser export jobs."); + var export = new Command("export", "Run Concelier export jobs."); var formatOption = new Option("--format") { Description = "Export format: json or trivy-db." diff --git a/src/StellaOps.Cli/Configuration/AuthorityTokenUtilities.cs b/src/StellaOps.Cli/Configuration/AuthorityTokenUtilities.cs index 8694a4c7..d208fc8a 100644 --- a/src/StellaOps.Cli/Configuration/AuthorityTokenUtilities.cs +++ b/src/StellaOps.Cli/Configuration/AuthorityTokenUtilities.cs @@ -11,7 +11,7 @@ internal static class AuthorityTokenUtilities var scope = options.Authority?.Scope; return string.IsNullOrWhiteSpace(scope) - ? StellaOpsScopes.FeedserJobsTrigger + ? StellaOpsScopes.ConcelierJobsTrigger : scope.Trim(); } diff --git a/src/StellaOps.Cli/Configuration/CliBootstrapper.cs b/src/StellaOps.Cli/Configuration/CliBootstrapper.cs index a84f5d3c..ffba6a75 100644 --- a/src/StellaOps.Cli/Configuration/CliBootstrapper.cs +++ b/src/StellaOps.Cli/Configuration/CliBootstrapper.cs @@ -113,7 +113,7 @@ public static class CliBootstrapper authority.ClientSecret = string.IsNullOrWhiteSpace(authority.ClientSecret) ? null : authority.ClientSecret.Trim(); authority.Username = authority.Username?.Trim() ?? string.Empty; authority.Password = string.IsNullOrWhiteSpace(authority.Password) ? null : authority.Password.Trim(); - authority.Scope = string.IsNullOrWhiteSpace(authority.Scope) ? StellaOpsScopes.FeedserJobsTrigger : authority.Scope.Trim(); + authority.Scope = string.IsNullOrWhiteSpace(authority.Scope) ? StellaOpsScopes.ConcelierJobsTrigger : authority.Scope.Trim(); authority.Resilience ??= new StellaOpsCliAuthorityResilienceOptions(); authority.Resilience.RetryDelays ??= new List(); diff --git a/src/StellaOps.Cli/Configuration/StellaOpsCliOptions.cs b/src/StellaOps.Cli/Configuration/StellaOpsCliOptions.cs index 0cacb7cb..54355bbc 100644 --- a/src/StellaOps.Cli/Configuration/StellaOpsCliOptions.cs +++ b/src/StellaOps.Cli/Configuration/StellaOpsCliOptions.cs @@ -37,7 +37,7 @@ public sealed class StellaOpsCliAuthorityOptions public string? Password { get; set; } - public string Scope { get; set; } = StellaOpsScopes.FeedserJobsTrigger; + public string Scope { get; set; } = StellaOpsScopes.ConcelierJobsTrigger; public string TokenCacheDirectory { get; set; } = string.Empty; diff --git a/src/StellaOps.Cli/Program.cs b/src/StellaOps.Cli/Program.cs index ad93a34c..a533a5b3 100644 --- a/src/StellaOps.Cli/Program.cs +++ b/src/StellaOps.Cli/Program.cs @@ -46,7 +46,7 @@ internal static class Program clientOptions.ClientSecret = options.Authority.ClientSecret; clientOptions.DefaultScopes.Clear(); clientOptions.DefaultScopes.Add(string.IsNullOrWhiteSpace(options.Authority.Scope) - ? StellaOps.Auth.Abstractions.StellaOpsScopes.FeedserJobsTrigger + ? StellaOps.Auth.Abstractions.StellaOpsScopes.ConcelierJobsTrigger : options.Authority.Scope); var resilience = options.Authority.Resilience ?? new StellaOpsCliAuthorityResilienceOptions(); diff --git a/src/StellaOps.Cli/TASKS.md b/src/StellaOps.Cli/TASKS.md index 6f2cdc9e..38391e6e 100644 --- a/src/StellaOps.Cli/TASKS.md +++ b/src/StellaOps.Cli/TASKS.md @@ -6,7 +6,7 @@ If you are working on this file you need to read docs/ARCHITECTURE_EXCITITOR.md |Introduce command host & routing skeleton|DevEx/CLI|Configuration|**DONE** – System.CommandLine (v2.0.0-beta5) router stitched with `scanner`, `scan`, `db`, and `config` verbs.| |Scanner artifact download/install commands|Ops Integrator|Backend contracts|**DONE** – `scanner download` caches bundles, validates SHA-256 (plus optional RSA signature), installs via `docker load`, persists metadata, and retries with exponential backoff.| |Scan execution & result upload workflow|Ops Integrator, QA|Scanner cmd|**DONE** – `scan run` drives container scans against directories, emits artefacts in `ResultsDirectory`, auto-uploads on success, and `scan upload` covers manual retries.| -|Feedser DB operations passthrough|DevEx/CLI|Backend, Feedser APIs|**DONE** – `db fetch|merge|export` trigger `/jobs/*` endpoints with parameter binding and consistent exit codes.| +|Concelier DB operations passthrough|DevEx/CLI|Backend, Concelier APIs|**DONE** – `db fetch|merge|export` trigger `/jobs/*` endpoints with parameter binding and consistent exit codes.| |CLI observability & tests|QA|Command host|**DONE** – Added console logging defaults & configuration bootstrap tests; future metrics hooks tracked separately.| |Authority auth commands|DevEx/CLI|Auth libraries|**DONE** – `auth login/logout/status` wrap the shared auth client, manage token cache, and surface status messages.| |Document authority workflow in CLI help & quickstart|Docs/CLI|Authority auth commands|**DONE (2025-10-10)** – CLI help now surfaces Authority config fields and docs/09 + docs/10 describe env vars, auth login/status flow, and cache location.| diff --git a/src/StellaOps.Feedser.Core.Tests/CanonicalMergerTests.cs b/src/StellaOps.Concelier.Core.Tests/CanonicalMergerTests.cs similarity index 99% rename from src/StellaOps.Feedser.Core.Tests/CanonicalMergerTests.cs rename to src/StellaOps.Concelier.Core.Tests/CanonicalMergerTests.cs index d7db35ae..e7b479a2 100644 --- a/src/StellaOps.Feedser.Core.Tests/CanonicalMergerTests.cs +++ b/src/StellaOps.Concelier.Core.Tests/CanonicalMergerTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Core.Tests; +namespace StellaOps.Concelier.Core.Tests; public sealed class CanonicalMergerTests { diff --git a/src/StellaOps.Feedser.Core.Tests/JobCoordinatorTests.cs b/src/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs similarity index 97% rename from src/StellaOps.Feedser.Core.Tests/JobCoordinatorTests.cs rename to src/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs index 5dcdcfbc..8450839d 100644 --- a/src/StellaOps.Feedser.Core.Tests/JobCoordinatorTests.cs +++ b/src/StellaOps.Concelier.Core.Tests/JobCoordinatorTests.cs @@ -4,9 +4,9 @@ using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Core.Tests; +namespace StellaOps.Concelier.Core.Tests; public sealed class JobCoordinatorTests { diff --git a/src/StellaOps.Feedser.Core.Tests/JobPluginRegistrationExtensionsTests.cs b/src/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs similarity index 90% rename from src/StellaOps.Feedser.Core.Tests/JobPluginRegistrationExtensionsTests.cs rename to src/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs index 3946b8e4..d235e0da 100644 --- a/src/StellaOps.Feedser.Core.Tests/JobPluginRegistrationExtensionsTests.cs +++ b/src/StellaOps.Concelier.Core.Tests/JobPluginRegistrationExtensionsTests.cs @@ -4,10 +4,10 @@ using System.IO; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; using StellaOps.Plugin.Hosting; -namespace StellaOps.Feedser.Core.Tests; +namespace StellaOps.Concelier.Core.Tests; public sealed class JobPluginRegistrationExtensionsTests { @@ -53,7 +53,7 @@ public sealed class JobPluginRegistrationExtensionsTests Assert.True(schedulerOptions.Definitions.TryGetValue(PluginJob.JobKind, out var definition)); Assert.NotNull(definition); Assert.Equal(PluginJob.JobKind, definition.Kind); - Assert.Equal("StellaOps.Feedser.Core.Tests.PluginJob", definition.JobType.FullName); + Assert.Equal("StellaOps.Concelier.Core.Tests.PluginJob", definition.JobType.FullName); Assert.Equal(TimeSpan.FromSeconds(45), definition.Timeout); Assert.Equal(TimeSpan.FromSeconds(5), definition.LeaseDuration); Assert.Equal("*/10 * * * *", definition.CronExpression); diff --git a/src/StellaOps.Feedser.Core.Tests/JobSchedulerBuilderTests.cs b/src/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs similarity index 94% rename from src/StellaOps.Feedser.Core.Tests/JobSchedulerBuilderTests.cs rename to src/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs index 034546cf..6279f518 100644 --- a/src/StellaOps.Feedser.Core.Tests/JobSchedulerBuilderTests.cs +++ b/src/StellaOps.Concelier.Core.Tests/JobSchedulerBuilderTests.cs @@ -1,9 +1,9 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Core.Tests; +namespace StellaOps.Concelier.Core.Tests; public sealed class JobSchedulerBuilderTests { diff --git a/src/StellaOps.Feedser.Core.Tests/PluginRoutineFixtures.cs b/src/StellaOps.Concelier.Core.Tests/PluginRoutineFixtures.cs similarity index 90% rename from src/StellaOps.Feedser.Core.Tests/PluginRoutineFixtures.cs rename to src/StellaOps.Concelier.Core.Tests/PluginRoutineFixtures.cs index 3ba6defa..2bb54b60 100644 --- a/src/StellaOps.Feedser.Core.Tests/PluginRoutineFixtures.cs +++ b/src/StellaOps.Concelier.Core.Tests/PluginRoutineFixtures.cs @@ -4,9 +4,9 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Core.Tests; +namespace StellaOps.Concelier.Core.Tests; public sealed class TestPluginRoutine : IDependencyInjectionRoutine { diff --git a/src/StellaOps.Feedser.Core.Tests/StellaOps.Feedser.Core.Tests.csproj b/src/StellaOps.Concelier.Core.Tests/StellaOps.Concelier.Core.Tests.csproj similarity index 69% rename from src/StellaOps.Feedser.Core.Tests/StellaOps.Feedser.Core.Tests.csproj rename to src/StellaOps.Concelier.Core.Tests/StellaOps.Concelier.Core.Tests.csproj index 9e7a8693..ecb30f28 100644 --- a/src/StellaOps.Feedser.Core.Tests/StellaOps.Feedser.Core.Tests.csproj +++ b/src/StellaOps.Concelier.Core.Tests/StellaOps.Concelier.Core.Tests.csproj @@ -5,6 +5,6 @@ enable - + diff --git a/src/StellaOps.Feedser.Core/AGENTS.md b/src/StellaOps.Concelier.Core/AGENTS.md similarity index 93% rename from src/StellaOps.Feedser.Core/AGENTS.md rename to src/StellaOps.Concelier.Core/AGENTS.md index fc658bf7..e6e0b4a4 100644 --- a/src/StellaOps.Feedser.Core/AGENTS.md +++ b/src/StellaOps.Concelier.Core/AGENTS.md @@ -26,7 +26,7 @@ Out: business logic of connectors/exporters, HTTP handlers (owned by WebService) - Logs: kind, trigger, params hash, lease holder, outcome; redact params containing secrets. - Honor CancellationToken early and often. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Core.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Core.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Core/CanonicalMergeResult.cs b/src/StellaOps.Concelier.Core/CanonicalMergeResult.cs similarity index 89% rename from src/StellaOps.Feedser.Core/CanonicalMergeResult.cs rename to src/StellaOps.Concelier.Core/CanonicalMergeResult.cs index ad26a3fd..e0db80d1 100644 --- a/src/StellaOps.Feedser.Core/CanonicalMergeResult.cs +++ b/src/StellaOps.Concelier.Core/CanonicalMergeResult.cs @@ -1,7 +1,7 @@ using System.Collections.Immutable; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Core; +namespace StellaOps.Concelier.Core; /// /// Result emitted by describing the merged advisory and analytics about key decisions. diff --git a/src/StellaOps.Feedser.Core/CanonicalMerger.cs b/src/StellaOps.Concelier.Core/CanonicalMerger.cs similarity index 99% rename from src/StellaOps.Feedser.Core/CanonicalMerger.cs rename to src/StellaOps.Concelier.Core/CanonicalMerger.cs index 995708b5..e109ea90 100644 --- a/src/StellaOps.Feedser.Core/CanonicalMerger.cs +++ b/src/StellaOps.Concelier.Core/CanonicalMerger.cs @@ -1,9 +1,9 @@ using System.Collections.Immutable; using System.Security.Cryptography; using System.Text; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Core; +namespace StellaOps.Concelier.Core; /// /// Resolves conflicts between GHSA, NVD, and OSV advisories into a single canonical advisory following diff --git a/src/StellaOps.Feedser.Core/Jobs/IJob.cs b/src/StellaOps.Concelier.Core/Jobs/IJob.cs similarity index 71% rename from src/StellaOps.Feedser.Core/Jobs/IJob.cs rename to src/StellaOps.Concelier.Core/Jobs/IJob.cs index 8800c4ab..92a485f4 100644 --- a/src/StellaOps.Feedser.Core/Jobs/IJob.cs +++ b/src/StellaOps.Concelier.Core/Jobs/IJob.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public interface IJob { diff --git a/src/StellaOps.Feedser.Core/Jobs/IJobCoordinator.cs b/src/StellaOps.Concelier.Core/Jobs/IJobCoordinator.cs similarity index 93% rename from src/StellaOps.Feedser.Core/Jobs/IJobCoordinator.cs rename to src/StellaOps.Concelier.Core/Jobs/IJobCoordinator.cs index ab3588d8..961dd338 100644 --- a/src/StellaOps.Feedser.Core/Jobs/IJobCoordinator.cs +++ b/src/StellaOps.Concelier.Core/Jobs/IJobCoordinator.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public interface IJobCoordinator { diff --git a/src/StellaOps.Feedser.Core/Jobs/IJobStore.cs b/src/StellaOps.Concelier.Core/Jobs/IJobStore.cs similarity index 93% rename from src/StellaOps.Feedser.Core/Jobs/IJobStore.cs rename to src/StellaOps.Concelier.Core/Jobs/IJobStore.cs index ee3914d7..c5d544f1 100644 --- a/src/StellaOps.Feedser.Core/Jobs/IJobStore.cs +++ b/src/StellaOps.Concelier.Core/Jobs/IJobStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public interface IJobStore { diff --git a/src/StellaOps.Feedser.Core/Jobs/ILeaseStore.cs b/src/StellaOps.Concelier.Core/Jobs/ILeaseStore.cs similarity index 89% rename from src/StellaOps.Feedser.Core/Jobs/ILeaseStore.cs rename to src/StellaOps.Concelier.Core/Jobs/ILeaseStore.cs index 802d4261..467f4c29 100644 --- a/src/StellaOps.Feedser.Core/Jobs/ILeaseStore.cs +++ b/src/StellaOps.Concelier.Core/Jobs/ILeaseStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public interface ILeaseStore { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobCoordinator.cs b/src/StellaOps.Concelier.Core/Jobs/JobCoordinator.cs similarity index 97% rename from src/StellaOps.Feedser.Core/Jobs/JobCoordinator.cs rename to src/StellaOps.Concelier.Core/Jobs/JobCoordinator.cs index a7e47b42..067648af 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobCoordinator.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobCoordinator.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed class JobCoordinator : IJobCoordinator { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobDefinition.cs b/src/StellaOps.Concelier.Core/Jobs/JobDefinition.cs similarity index 80% rename from src/StellaOps.Feedser.Core/Jobs/JobDefinition.cs rename to src/StellaOps.Concelier.Core/Jobs/JobDefinition.cs index 1e56f674..de0ae8a2 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobDefinition.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobDefinition.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed record JobDefinition( string Kind, diff --git a/src/StellaOps.Feedser.Core/Jobs/JobDiagnostics.cs b/src/StellaOps.Concelier.Core/Jobs/JobDiagnostics.cs similarity index 85% rename from src/StellaOps.Feedser.Core/Jobs/JobDiagnostics.cs rename to src/StellaOps.Concelier.Core/Jobs/JobDiagnostics.cs index d90ef781..a781e07d 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobDiagnostics.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobDiagnostics.cs @@ -1,15 +1,15 @@ using System.Diagnostics; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed class JobDiagnostics : IDisposable { - public const string ActivitySourceName = "StellaOps.Feedser.Jobs"; - public const string MeterName = "StellaOps.Feedser.Jobs"; - public const string TriggerActivityName = "feedser.job.trigger"; - public const string ExecuteActivityName = "feedser.job.execute"; - public const string SchedulerActivityName = "feedser.scheduler.evaluate"; + public const string ActivitySourceName = "StellaOps.Concelier.Jobs"; + public const string MeterName = "StellaOps.Concelier.Jobs"; + public const string TriggerActivityName = "concelier.job.trigger"; + public const string ExecuteActivityName = "concelier.job.execute"; + public const string SchedulerActivityName = "concelier.scheduler.evaluate"; private readonly Counter _triggersAccepted; private readonly Counter _triggersRejected; @@ -24,32 +24,32 @@ public sealed class JobDiagnostics : IDisposable Meter = new Meter(MeterName); _triggersAccepted = Meter.CreateCounter( - name: "feedser.jobs.triggers.accepted", + name: "concelier.jobs.triggers.accepted", unit: "count", description: "Number of job trigger requests accepted for execution."); _triggersRejected = Meter.CreateCounter( - name: "feedser.jobs.triggers.rejected", + name: "concelier.jobs.triggers.rejected", unit: "count", description: "Number of job trigger requests rejected or ignored by the coordinator."); _runsCompleted = Meter.CreateCounter( - name: "feedser.jobs.runs.completed", + name: "concelier.jobs.runs.completed", unit: "count", description: "Number of job executions that have finished grouped by outcome."); _runsActive = Meter.CreateUpDownCounter( - name: "feedser.jobs.runs.active", + name: "concelier.jobs.runs.active", unit: "count", description: "Current number of running job executions."); _runDurationSeconds = Meter.CreateHistogram( - name: "feedser.jobs.runs.duration", + name: "concelier.jobs.runs.duration", unit: "s", description: "Distribution of job execution durations in seconds."); _schedulerSkewMilliseconds = Meter.CreateHistogram( - name: "feedser.scheduler.skew", + name: "concelier.scheduler.skew", unit: "ms", description: "Difference between the intended and actual scheduler fire time in milliseconds."); } diff --git a/src/StellaOps.Feedser.Core/Jobs/JobExecutionContext.cs b/src/StellaOps.Concelier.Core/Jobs/JobExecutionContext.cs similarity index 93% rename from src/StellaOps.Feedser.Core/Jobs/JobExecutionContext.cs rename to src/StellaOps.Concelier.Core/Jobs/JobExecutionContext.cs index 24141695..7302d183 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobExecutionContext.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobExecutionContext.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed class JobExecutionContext { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobLease.cs b/src/StellaOps.Concelier.Core/Jobs/JobLease.cs similarity index 78% rename from src/StellaOps.Feedser.Core/Jobs/JobLease.cs rename to src/StellaOps.Concelier.Core/Jobs/JobLease.cs index 2f01509e..d0cf12ae 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobLease.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobLease.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed record JobLease( string Key, diff --git a/src/StellaOps.Feedser.Core/Jobs/JobPluginRegistrationExtensions.cs b/src/StellaOps.Concelier.Core/Jobs/JobPluginRegistrationExtensions.cs similarity index 95% rename from src/StellaOps.Feedser.Core/Jobs/JobPluginRegistrationExtensions.cs rename to src/StellaOps.Concelier.Core/Jobs/JobPluginRegistrationExtensions.cs index b60f2608..c4e623d6 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobPluginRegistrationExtensions.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobPluginRegistrationExtensions.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging; using StellaOps.DependencyInjection; using StellaOps.Plugin.Hosting; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public static class JobPluginRegistrationExtensions { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobRunCompletion.cs b/src/StellaOps.Concelier.Core/Jobs/JobRunCompletion.cs similarity index 71% rename from src/StellaOps.Feedser.Core/Jobs/JobRunCompletion.cs rename to src/StellaOps.Concelier.Core/Jobs/JobRunCompletion.cs index 7018dba5..b6b5c5d5 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobRunCompletion.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobRunCompletion.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed record JobRunCompletion( JobRunStatus Status, diff --git a/src/StellaOps.Feedser.Core/Jobs/JobRunCreateRequest.cs b/src/StellaOps.Concelier.Core/Jobs/JobRunCreateRequest.cs similarity index 82% rename from src/StellaOps.Feedser.Core/Jobs/JobRunCreateRequest.cs rename to src/StellaOps.Concelier.Core/Jobs/JobRunCreateRequest.cs index bf576559..bcf91d6f 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobRunCreateRequest.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobRunCreateRequest.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed record JobRunCreateRequest( string Kind, diff --git a/src/StellaOps.Feedser.Core/Jobs/JobRunSnapshot.cs b/src/StellaOps.Concelier.Core/Jobs/JobRunSnapshot.cs similarity index 90% rename from src/StellaOps.Feedser.Core/Jobs/JobRunSnapshot.cs rename to src/StellaOps.Concelier.Core/Jobs/JobRunSnapshot.cs index 7ef3099b..fc4e4960 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobRunSnapshot.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobRunSnapshot.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; /// /// Immutable projection of a job run as stored in persistence. diff --git a/src/StellaOps.Feedser.Core/Jobs/JobRunStatus.cs b/src/StellaOps.Concelier.Core/Jobs/JobRunStatus.cs similarity index 65% rename from src/StellaOps.Feedser.Core/Jobs/JobRunStatus.cs rename to src/StellaOps.Concelier.Core/Jobs/JobRunStatus.cs index a6871f22..a3812ca4 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobRunStatus.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobRunStatus.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public enum JobRunStatus { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerBuilder.cs b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerBuilder.cs similarity index 93% rename from src/StellaOps.Feedser.Core/Jobs/JobSchedulerBuilder.cs rename to src/StellaOps.Concelier.Core/Jobs/JobSchedulerBuilder.cs index 4c871ada..aa5970f7 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerBuilder.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerBuilder.cs @@ -1,7 +1,7 @@ using System; using Microsoft.Extensions.DependencyInjection; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed class JobSchedulerBuilder { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerHostedService.cs b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerHostedService.cs similarity index 96% rename from src/StellaOps.Feedser.Core/Jobs/JobSchedulerHostedService.cs rename to src/StellaOps.Concelier.Core/Jobs/JobSchedulerHostedService.cs index 7f74f378..15016f6f 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerHostedService.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerHostedService.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; /// /// Background service that evaluates cron expressions for registered jobs and triggers them. diff --git a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerOptions.cs b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerOptions.cs similarity index 88% rename from src/StellaOps.Feedser.Core/Jobs/JobSchedulerOptions.cs rename to src/StellaOps.Concelier.Core/Jobs/JobSchedulerOptions.cs index f3f22186..50be8392 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobSchedulerOptions.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobSchedulerOptions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public sealed class JobSchedulerOptions { diff --git a/src/StellaOps.Feedser.Core/Jobs/JobTriggerResult.cs b/src/StellaOps.Concelier.Core/Jobs/JobTriggerResult.cs similarity index 94% rename from src/StellaOps.Feedser.Core/Jobs/JobTriggerResult.cs rename to src/StellaOps.Concelier.Core/Jobs/JobTriggerResult.cs index 49e1d60b..e2b2076c 100644 --- a/src/StellaOps.Feedser.Core/Jobs/JobTriggerResult.cs +++ b/src/StellaOps.Concelier.Core/Jobs/JobTriggerResult.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public enum JobTriggerOutcome { diff --git a/src/StellaOps.Feedser.Core/Jobs/ServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Core/Jobs/ServiceCollectionExtensions.cs similarity index 93% rename from src/StellaOps.Feedser.Core/Jobs/ServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Core/Jobs/ServiceCollectionExtensions.cs index 99e98c96..c3762329 100644 --- a/src/StellaOps.Feedser.Core/Jobs/ServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Core/Jobs/ServiceCollectionExtensions.cs @@ -2,7 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -namespace StellaOps.Feedser.Core.Jobs; +namespace StellaOps.Concelier.Core.Jobs; public static class JobServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj b/src/StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj similarity index 86% rename from src/StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj rename to src/StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj index c74e9e04..a6c73baf 100644 --- a/src/StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj +++ b/src/StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/StellaOps.Feedser.Core/TASKS.md b/src/StellaOps.Concelier.Core/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Core/TASKS.md rename to src/StellaOps.Concelier.Core/TASKS.md diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs similarity index 93% rename from src/StellaOps.Feedser.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs rename to src/StellaOps.Concelier.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs index 4dada488..98122474 100644 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExportSnapshotBuilderTests.cs @@ -7,10 +7,10 @@ using System.Security.Cryptography; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json.Tests; +namespace StellaOps.Concelier.Exporter.Json.Tests; public sealed class JsonExportSnapshotBuilderTests : IDisposable { @@ -18,7 +18,7 @@ public sealed class JsonExportSnapshotBuilderTests : IDisposable public JsonExportSnapshotBuilderTests() { - _root = Directory.CreateTempSubdirectory("feedser-json-export-tests").FullName; + _root = Directory.CreateTempSubdirectory("concelier-json-export-tests").FullName; } [Fact] @@ -141,7 +141,7 @@ public sealed class JsonExportSnapshotBuilderTests : IDisposable cvssMetrics: Array.Empty(), provenance: new[] { - new AdvisoryProvenance("feedser", "normalized", "canonical", DateTimeOffset.Parse("2024-01-02T00:00:00Z", CultureInfo.InvariantCulture)), + new AdvisoryProvenance("concelier", "normalized", "canonical", DateTimeOffset.Parse("2024-01-02T00:00:00Z", CultureInfo.InvariantCulture)), }); } diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs similarity index 89% rename from src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs rename to src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs index 9521557f..464a5ce7 100644 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterDependencyInjectionRoutineTests.cs @@ -5,13 +5,13 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Exporting; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Exporting; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json.Tests; +namespace StellaOps.Concelier.Exporter.Json.Tests; public sealed class JsonExporterDependencyInjectionRoutineTests { diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs similarity index 93% rename from src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs rename to src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs index 49aca086..72d55d72 100644 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonExporterParitySmokeTests.cs @@ -5,10 +5,10 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json.Tests; +namespace StellaOps.Concelier.Exporter.Json.Tests; public sealed class JsonExporterParitySmokeTests : IDisposable { @@ -16,7 +16,7 @@ public sealed class JsonExporterParitySmokeTests : IDisposable public JsonExporterParitySmokeTests() { - _root = Directory.CreateTempSubdirectory("feedser-json-parity-tests").FullName; + _root = Directory.CreateTempSubdirectory("concelier-json-parity-tests").FullName; } [Fact] diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonFeedExporterTests.cs b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs similarity index 95% rename from src/StellaOps.Feedser.Exporter.Json.Tests/JsonFeedExporterTests.cs rename to src/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs index 1a60c0f3..19760ca4 100644 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/JsonFeedExporterTests.cs +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/JsonFeedExporterTests.cs @@ -10,12 +10,12 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.Json.Tests; +namespace StellaOps.Concelier.Exporter.Json.Tests; public sealed class JsonFeedExporterTests : IDisposable { @@ -23,7 +23,7 @@ public sealed class JsonFeedExporterTests : IDisposable public JsonFeedExporterTests() { - _root = Directory.CreateTempSubdirectory("feedser-json-exporter-tests").FullName; + _root = Directory.CreateTempSubdirectory("concelier-json-exporter-tests").FullName; } [Fact] diff --git a/src/StellaOps.Concelier.Exporter.Json.Tests/StellaOps.Concelier.Exporter.Json.Tests.csproj b/src/StellaOps.Concelier.Exporter.Json.Tests/StellaOps.Concelier.Exporter.Json.Tests.csproj new file mode 100644 index 00000000..12cef41d --- /dev/null +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/StellaOps.Concelier.Exporter.Json.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs b/src/StellaOps.Concelier.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs similarity index 95% rename from src/StellaOps.Feedser.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs rename to src/StellaOps.Concelier.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs index 76a661e3..7ae8eb19 100644 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs +++ b/src/StellaOps.Concelier.Exporter.Json.Tests/VulnListJsonExportPathResolverTests.cs @@ -1,10 +1,10 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json.Tests; +namespace StellaOps.Concelier.Exporter.Json.Tests; public sealed class VulnListJsonExportPathResolverTests { diff --git a/src/StellaOps.Feedser.Exporter.Json/AGENTS.md b/src/StellaOps.Concelier.Exporter.Json/AGENTS.md similarity index 91% rename from src/StellaOps.Feedser.Exporter.Json/AGENTS.md rename to src/StellaOps.Concelier.Exporter.Json/AGENTS.md index 25046404..5ce605e3 100644 --- a/src/StellaOps.Feedser.Exporter.Json/AGENTS.md +++ b/src/StellaOps.Concelier.Exporter.Json/AGENTS.md @@ -22,7 +22,7 @@ Out: ORAS push and Trivy DB BoltDB writing (owned by Trivy exporter). - Metrics: export.json.records, bytes, duration, delta.changed. - Logs: target path, record counts, digest; no sensitive data. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Exporter.Json.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Exporter.Json.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Exporter.Json/ExportDigestCalculator.cs b/src/StellaOps.Concelier.Exporter.Json/ExportDigestCalculator.cs similarity index 94% rename from src/StellaOps.Feedser.Exporter.Json/ExportDigestCalculator.cs rename to src/StellaOps.Concelier.Exporter.Json/ExportDigestCalculator.cs index 64079258..a29b9445 100644 --- a/src/StellaOps.Feedser.Exporter.Json/ExportDigestCalculator.cs +++ b/src/StellaOps.Concelier.Exporter.Json/ExportDigestCalculator.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Security.Cryptography; using System.Text; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public static class ExportDigestCalculator { diff --git a/src/StellaOps.Feedser.Exporter.Json/ExporterVersion.cs b/src/StellaOps.Concelier.Exporter.Json/ExporterVersion.cs similarity index 91% rename from src/StellaOps.Feedser.Exporter.Json/ExporterVersion.cs rename to src/StellaOps.Concelier.Exporter.Json/ExporterVersion.cs index 351217d2..e5baeb46 100644 --- a/src/StellaOps.Feedser.Exporter.Json/ExporterVersion.cs +++ b/src/StellaOps.Concelier.Exporter.Json/ExporterVersion.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public static class ExporterVersion { diff --git a/src/StellaOps.Feedser.Exporter.Json/IJsonExportPathResolver.cs b/src/StellaOps.Concelier.Exporter.Json/IJsonExportPathResolver.cs similarity index 75% rename from src/StellaOps.Feedser.Exporter.Json/IJsonExportPathResolver.cs rename to src/StellaOps.Concelier.Exporter.Json/IJsonExportPathResolver.cs index e68af8e4..889e1b06 100644 --- a/src/StellaOps.Feedser.Exporter.Json/IJsonExportPathResolver.cs +++ b/src/StellaOps.Concelier.Exporter.Json/IJsonExportPathResolver.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public interface IJsonExportPathResolver { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportFile.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportFile.cs similarity index 92% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportFile.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportFile.cs index c57c69a1..608833e5 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportFile.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportFile.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; /// /// Metadata describing a single file produced by the JSON exporter. diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportJob.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportJob.cs similarity index 90% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportJob.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportJob.cs index 904dc421..eaf032f3 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportJob.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportJob.cs @@ -2,9 +2,9 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public sealed class JsonExportJob : IJob { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportManifestWriter.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportManifestWriter.cs similarity index 95% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportManifestWriter.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportManifestWriter.cs index 7a0c80d7..b8624e93 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportManifestWriter.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportManifestWriter.cs @@ -7,7 +7,7 @@ using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; internal static class JsonExportManifestWriter { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportOptions.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportOptions.cs similarity index 93% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportOptions.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportOptions.cs index a09cad61..30fedb02 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportOptions.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportOptions.cs @@ -1,6 +1,6 @@ using System.IO; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; /// /// Configuration for JSON exporter output paths and determinism controls. diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportResult.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportResult.cs similarity index 93% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportResult.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportResult.cs index 0842d1a8..8c399d18 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportResult.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportResult.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public sealed class JsonExportResult { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExportSnapshotBuilder.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExportSnapshotBuilder.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.Json/JsonExportSnapshotBuilder.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExportSnapshotBuilder.cs index c622486d..092e0831 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExportSnapshotBuilder.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExportSnapshotBuilder.cs @@ -5,9 +5,9 @@ using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; /// /// Writes canonical advisory snapshots into a vuln-list style directory tree with deterministic ordering. diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs similarity index 87% rename from src/StellaOps.Feedser.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs index 67f5c655..51739214 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExporterDependencyInjectionRoutine.cs @@ -5,14 +5,14 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public sealed class JsonExporterDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:exporters:json"; + private const string ConfigurationSection = "concelier:exporters:json"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonExporterPlugin.cs b/src/StellaOps.Concelier.Exporter.Json/JsonExporterPlugin.cs similarity index 83% rename from src/StellaOps.Feedser.Exporter.Json/JsonExporterPlugin.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonExporterPlugin.cs index d03ab541..07e36e09 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonExporterPlugin.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonExporterPlugin.cs @@ -1,9 +1,9 @@ using System; using Microsoft.Extensions.DependencyInjection; -using StellaOps.Feedser.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Advisories; using StellaOps.Plugin; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public sealed class JsonExporterPlugin : IExporterPlugin { diff --git a/src/StellaOps.Feedser.Exporter.Json/JsonFeedExporter.cs b/src/StellaOps.Concelier.Exporter.Json/JsonFeedExporter.cs similarity index 95% rename from src/StellaOps.Feedser.Exporter.Json/JsonFeedExporter.cs rename to src/StellaOps.Concelier.Exporter.Json/JsonFeedExporter.cs index 84c03d48..65ce31bc 100644 --- a/src/StellaOps.Feedser.Exporter.Json/JsonFeedExporter.cs +++ b/src/StellaOps.Concelier.Exporter.Json/JsonFeedExporter.cs @@ -4,11 +4,11 @@ using System.IO; using System.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Exporting; using StellaOps.Plugin; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; public sealed class JsonFeedExporter : IFeedExporter { diff --git a/src/StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj b/src/StellaOps.Concelier.Exporter.Json/StellaOps.Concelier.Exporter.Json.csproj similarity index 71% rename from src/StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj rename to src/StellaOps.Concelier.Exporter.Json/StellaOps.Concelier.Exporter.Json.csproj index 72b8b2a8..1c5b3932 100644 --- a/src/StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj +++ b/src/StellaOps.Concelier.Exporter.Json/StellaOps.Concelier.Exporter.Json.csproj @@ -8,9 +8,9 @@ true - - - + + + diff --git a/src/StellaOps.Feedser.Exporter.Json/TASKS.md b/src/StellaOps.Concelier.Exporter.Json/TASKS.md similarity index 91% rename from src/StellaOps.Feedser.Exporter.Json/TASKS.md rename to src/StellaOps.Concelier.Exporter.Json/TASKS.md index 04f14621..23285a11 100644 --- a/src/StellaOps.Feedser.Exporter.Json/TASKS.md +++ b/src/StellaOps.Concelier.Exporter.Json/TASKS.md @@ -9,4 +9,4 @@ |Parity smoke vs upstream vuln-list|QA|Exporters|DONE – `JsonExporterParitySmokeTests` covers common ecosystems against vuln-list layout.| |Stream advisories during export|BE-Export|Storage.Mongo|DONE – exporter + streaming-only test ensures single enumeration and per-file digest capture.| |Emit export manifest with digest metadata|BE-Export|Exporters|DONE – manifest now includes per-file digests/sizes alongside tree digest.| -|Surface new advisory fields (description/CWEs/canonical metric)|BE-Export|Models, Core|DONE (2025-10-15) – JSON exporter validated with new fixtures ensuring description/CWEs/canonical metric are preserved in outputs; `dotnet test src/StellaOps.Feedser.Exporter.Json.Tests` run 2025-10-15 for regression coverage.| +|Surface new advisory fields (description/CWEs/canonical metric)|BE-Export|Models, Core|DONE (2025-10-15) – JSON exporter validated with new fixtures ensuring description/CWEs/canonical metric are preserved in outputs; `dotnet test src/StellaOps.Concelier.Exporter.Json.Tests` run 2025-10-15 for regression coverage.| diff --git a/src/StellaOps.Feedser.Exporter.Json/VulnListJsonExportPathResolver.cs b/src/StellaOps.Concelier.Exporter.Json/VulnListJsonExportPathResolver.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.Json/VulnListJsonExportPathResolver.cs rename to src/StellaOps.Concelier.Exporter.Json/VulnListJsonExportPathResolver.cs index 31747aa3..cc4aeb7e 100644 --- a/src/StellaOps.Feedser.Exporter.Json/VulnListJsonExportPathResolver.cs +++ b/src/StellaOps.Concelier.Exporter.Json/VulnListJsonExportPathResolver.cs @@ -3,10 +3,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Identifiers; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Identifiers; -namespace StellaOps.Feedser.Exporter.Json; +namespace StellaOps.Concelier.Exporter.Json; /// /// Path resolver approximating the directory layout used by aquasecurity/vuln-list. diff --git a/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj new file mode 100644 index 00000000..3060719c --- /dev/null +++ b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs similarity index 92% rename from src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs index 5b58d2ea..59f69774 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbExportPlannerTests.cs @@ -1,8 +1,8 @@ using System; -using StellaOps.Feedser.Exporter.TrivyDb; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Exporter.TrivyDb; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; +namespace StellaOps.Concelier.Exporter.TrivyDb.Tests; public sealed class TrivyDbExportPlannerTests { @@ -33,7 +33,7 @@ public sealed class TrivyDbExportPlannerTests LastFullDigest: "sha256:base", LastDeltaDigest: null, ExportCursor: "sha256:unchanged", - TargetRepository: "feedser/trivy", + TargetRepository: "concelier/trivy", ExporterVersion: "1.0", UpdatedAt: DateTimeOffset.UtcNow, Files: existingManifest); @@ -61,7 +61,7 @@ public sealed class TrivyDbExportPlannerTests LastFullDigest: "sha256:base", LastDeltaDigest: null, ExportCursor: "sha256:old", - TargetRepository: "feedser/trivy", + TargetRepository: "concelier/trivy", ExporterVersion: "1.0", UpdatedAt: DateTimeOffset.UtcNow, Files: manifest); diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs similarity index 99% rename from src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs index 0b97a963..977c2cab 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbFeedExporterTests.cs @@ -11,13 +11,13 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Exporter.TrivyDb; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Exporter.TrivyDb; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; +namespace StellaOps.Concelier.Exporter.TrivyDb.Tests; public sealed class TrivyDbFeedExporterTests : IDisposable { @@ -26,7 +26,7 @@ public sealed class TrivyDbFeedExporterTests : IDisposable public TrivyDbFeedExporterTests() { - _root = Directory.CreateTempSubdirectory("feedser-trivy-exporter-tests").FullName; + _root = Directory.CreateTempSubdirectory("concelier-trivy-exporter-tests").FullName; _jsonRoot = Path.Combine(_root, "tree"); } diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs similarity index 98% rename from src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs index 64ae7f0b..0dffbdac 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbOciWriterTests.cs @@ -7,10 +7,10 @@ using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; using Xunit; -namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; +namespace StellaOps.Concelier.Exporter.TrivyDb.Tests; public sealed class TrivyDbOciWriterTests : IDisposable { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs index dcd4a6ab..426df91b 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb.Tests/TrivyDbPackageBuilderTests.cs @@ -4,9 +4,9 @@ using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.Json; -using StellaOps.Feedser.Exporter.TrivyDb; +using StellaOps.Concelier.Exporter.TrivyDb; -namespace StellaOps.Feedser.Exporter.TrivyDb.Tests; +namespace StellaOps.Concelier.Exporter.TrivyDb.Tests; public sealed class TrivyDbPackageBuilderTests { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/AGENTS.md b/src/StellaOps.Concelier.Exporter.TrivyDb/AGENTS.md similarity index 89% rename from src/StellaOps.Feedser.Exporter.TrivyDb/AGENTS.md rename to src/StellaOps.Concelier.Exporter.TrivyDb/AGENTS.md index 2897733c..773913bc 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/AGENTS.md +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/AGENTS.md @@ -14,7 +14,7 @@ Exporter producing a Trivy-compatible database artifact for self-hosting or offl - JSON exporter (optional precursor) if choosing the builder path. ## Interfaces & contracts - IFeedExporter.Name = "trivy-db"; ExportAsync(IServiceProvider, CancellationToken). -- FeedserOptions.packaging.trivy governs repo/tag/publish/offline_bundle. +- ConcelierOptions.packaging.trivy governs repo/tag/publish/offline_bundle. - Deterministic sorting and timestamp discipline (UTC; consider build reproducibility knobs). ## In/Out of scope In: assembling builder inputs, packing tar.gz, pushing to registry when configured. @@ -23,7 +23,7 @@ Out: signing (external pipeline), scanner behavior. - Metrics: export.trivy.records, size_bytes, duration, oras.push.success/fail. - Logs: export path, repo/tag, digest; redact credentials; backoff on push errors. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Exporter.TrivyDb.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Exporter.TrivyDb.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbBuilder.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbBuilder.cs similarity index 76% rename from src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbBuilder.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbBuilder.cs index 0f9854ba..56e93b3a 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbBuilder.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbBuilder.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Exporter.Json; +using StellaOps.Concelier.Exporter.Json; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public interface ITrivyDbBuilder { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbOrasPusher.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbOrasPusher.cs similarity index 81% rename from src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbOrasPusher.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbOrasPusher.cs index d8a44075..dfa88927 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/ITrivyDbOrasPusher.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/ITrivyDbOrasPusher.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public interface ITrivyDbOrasPusher { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/OciDescriptor.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/OciDescriptor.cs similarity index 89% rename from src/StellaOps.Feedser.Exporter.TrivyDb/OciDescriptor.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/OciDescriptor.cs index 58aeaec8..9082250e 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/OciDescriptor.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/OciDescriptor.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record OciDescriptor( [property: JsonPropertyName("mediaType")] string MediaType, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/OciIndex.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/OciIndex.cs similarity index 84% rename from src/StellaOps.Feedser.Exporter.TrivyDb/OciIndex.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/OciIndex.cs index eb00c179..1ab0f06f 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/OciIndex.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/OciIndex.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record OciIndex( [property: JsonPropertyName("schemaVersion")] int SchemaVersion, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/OciManifest.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/OciManifest.cs similarity index 88% rename from src/StellaOps.Feedser.Exporter.TrivyDb/OciManifest.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/OciManifest.cs index ee99d638..a845394c 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/OciManifest.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/OciManifest.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record OciManifest( [property: JsonPropertyName("schemaVersion")] int SchemaVersion, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj b/src/StellaOps.Concelier.Exporter.TrivyDb/StellaOps.Concelier.Exporter.TrivyDb.csproj similarity index 72% rename from src/StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj rename to src/StellaOps.Concelier.Exporter.TrivyDb/StellaOps.Concelier.Exporter.TrivyDb.csproj index fe28b621..260e48b5 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/StellaOps.Concelier.Exporter.TrivyDb.csproj @@ -8,9 +8,9 @@ true - - - + + + diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TASKS.md b/src/StellaOps.Concelier.Exporter.TrivyDb/TASKS.md similarity index 93% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TASKS.md rename to src/StellaOps.Concelier.Exporter.TrivyDb/TASKS.md index 83ca9b8c..078ec861 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TASKS.md +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TASKS.md @@ -11,4 +11,4 @@ |ExportState persistence & idempotence|BE-Export|Storage.Mongo|DONE – baseline resets wired into `ExportStateManager`, planner signals resets after delta runs, and exporters update state w/ repository-aware baseline rotation + tests.| |Streamed package building to avoid large copies|BE-Export|Exporters|DONE – metadata/config now reuse backing arrays and OCI writer streams directly without double buffering.| |Plan incremental/delta exports|BE-Export|Exporters|DONE – state captures per-file manifests, planner schedules delta vs full resets, layer reuse smoke test verifies OCI reuse, and operator guide documents the validation flow.| -|Advisory schema parity export (description/CWEs/canonical metric)|BE-Export|Models, Core|DONE (2025-10-15) – exporter/test fixtures updated to handle description/CWEs/canonical metric fields during Trivy DB packaging; `dotnet test src/StellaOps.Feedser.Exporter.TrivyDb.Tests` re-run 2025-10-15 to confirm coverage.| +|Advisory schema parity export (description/CWEs/canonical metric)|BE-Export|Models, Core|DONE (2025-10-15) – exporter/test fixtures updated to handle description/CWEs/canonical metric fields during Trivy DB packaging; `dotnet test src/StellaOps.Concelier.Exporter.TrivyDb.Tests` re-run 2025-10-15 to confirm coverage.| diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyConfigDocument.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyConfigDocument.cs similarity index 90% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyConfigDocument.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyConfigDocument.cs index 10e947c8..4b09a46f 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyConfigDocument.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyConfigDocument.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record TrivyConfigDocument( [property: JsonPropertyName("mediaType")] string MediaType, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBlob.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBlob.cs similarity index 97% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBlob.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBlob.cs index 2ff58e60..35c61366 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBlob.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBlob.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbBlob { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBoltBuilder.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBoltBuilder.cs similarity index 99% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBoltBuilder.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBoltBuilder.cs index e7723005..a4ee2339 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBoltBuilder.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBoltBuilder.cs @@ -11,9 +11,9 @@ using System.Threading.Tasks; using System.Formats.Tar; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Exporter.Json; +using StellaOps.Concelier.Exporter.Json; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbBoltBuilder : ITrivyDbBuilder { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBuilderResult.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBuilderResult.cs similarity index 81% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBuilderResult.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBuilderResult.cs index cba55dbd..ac7e57be 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbBuilderResult.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbBuilderResult.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record TrivyDbBuilderResult( string ArchivePath, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportJob.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportJob.cs similarity index 97% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportJob.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportJob.cs index 3d0acb02..8ce3bc9b 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportJob.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportJob.cs @@ -5,9 +5,9 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbExportJob : IJob { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportMode.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportMode.cs similarity index 57% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportMode.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportMode.cs index 25dc5a8c..586c34fc 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportMode.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportMode.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public enum TrivyDbExportMode { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOptions.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOptions.cs similarity index 91% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOptions.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOptions.cs index 8adec7b2..81f8ebd4 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOptions.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOptions.cs @@ -1,15 +1,15 @@ using System; using System.IO; using System.Collections.Generic; -using StellaOps.Feedser.Exporter.Json; +using StellaOps.Concelier.Exporter.Json; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbExportOptions { public string OutputRoot { get; set; } = Path.Combine("exports", "trivy"); - public string ReferencePrefix { get; set; } = "feedser/trivy"; + public string ReferencePrefix { get; set; } = "concelier/trivy"; public string TagFormat { get; set; } = "yyyyMMdd'T'HHmmss'Z'"; diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOverrides.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOverrides.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOverrides.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOverrides.cs index 6da26b0a..c63dd471 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportOverrides.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportOverrides.cs @@ -1,7 +1,7 @@ using System; using System.Threading; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; internal sealed record TrivyDbExportOverrides( bool? PublishFull, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlan.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlan.cs similarity index 77% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlan.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlan.cs index f75a2644..f07a9e4c 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlan.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlan.cs @@ -1,7 +1,7 @@ -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; using System.Collections.Generic; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; public sealed record TrivyDbExportPlan( TrivyDbExportMode Mode, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlanner.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlanner.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlanner.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlanner.cs index b82b73c7..32a514f4 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExportPlanner.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExportPlanner.cs @@ -1,12 +1,12 @@ using System; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; public sealed class TrivyDbExportPlanner { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs similarity index 88% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs index c55cb223..7f05ebe6 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterDependencyInjectionRoutine.cs @@ -5,15 +5,15 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbExporterDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:exporters:trivyDb"; + private const string ConfigurationSection = "concelier:exporters:trivyDb"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { @@ -31,7 +31,7 @@ public sealed class TrivyDbExporterDependencyInjectionRoutine : IDependencyInjec options.Json.OutputRoot = Normalize(options.Json.OutputRoot, Path.Combine("exports", "trivy", "tree")); options.TagFormat = string.IsNullOrWhiteSpace(options.TagFormat) ? "yyyyMMdd'T'HHmmss'Z'" : options.TagFormat; options.DatabaseVersionFormat = string.IsNullOrWhiteSpace(options.DatabaseVersionFormat) ? "yyyyMMdd'T'HHmmss'Z'" : options.DatabaseVersionFormat; - options.ReferencePrefix = string.IsNullOrWhiteSpace(options.ReferencePrefix) ? "feedser/trivy" : options.ReferencePrefix; + options.ReferencePrefix = string.IsNullOrWhiteSpace(options.ReferencePrefix) ? "concelier/trivy" : options.ReferencePrefix; }); services.AddSingleton(); diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterPlugin.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterPlugin.cs similarity index 85% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterPlugin.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterPlugin.cs index aab67973..b7c4e2fb 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbExporterPlugin.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbExporterPlugin.cs @@ -1,9 +1,9 @@ using System; using Microsoft.Extensions.DependencyInjection; -using StellaOps.Feedser.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Advisories; using StellaOps.Plugin; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbExporterPlugin : IExporterPlugin { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbFeedExporter.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbFeedExporter.cs similarity index 96% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbFeedExporter.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbFeedExporter.cs index 11a1aa88..de614be9 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbFeedExporter.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbFeedExporter.cs @@ -12,13 +12,13 @@ using System.Threading.Tasks; using System.Formats.Tar; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Exporting; using StellaOps.Plugin; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbFeedExporter : IFeedExporter { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbMediaTypes.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbMediaTypes.cs similarity index 88% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbMediaTypes.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbMediaTypes.cs index cf667440..70e42f14 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbMediaTypes.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbMediaTypes.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public static class TrivyDbMediaTypes { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriteResult.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriteResult.cs similarity index 78% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriteResult.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriteResult.cs index 3a22a7ab..a93199e4 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriteResult.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriteResult.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record TrivyDbOciWriteResult( string RootDirectory, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriter.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriter.cs similarity index 99% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriter.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriter.cs index eaf2a74d..8dc2f7c2 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOciWriter.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOciWriter.cs @@ -7,7 +7,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; /// /// Writes a Trivy DB package to an OCI image layout directory with deterministic content. diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOrasPusher.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOrasPusher.cs similarity index 99% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOrasPusher.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOrasPusher.cs index 5a723a01..cbbea915 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbOrasPusher.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbOrasPusher.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbOrasPusher : ITrivyDbOrasPusher { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackage.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackage.cs similarity index 82% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackage.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackage.cs index c2d842da..75a38049 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackage.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackage.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record TrivyDbPackage( OciManifest Manifest, diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageBuilder.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageBuilder.cs similarity index 98% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageBuilder.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageBuilder.cs index 2f5c8a45..bda22481 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageBuilder.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageBuilder.cs @@ -6,7 +6,7 @@ using System.Security.Cryptography; using System.Text.Json; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed class TrivyDbPackageBuilder { diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageRequest.cs b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageRequest.cs similarity index 83% rename from src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageRequest.cs rename to src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageRequest.cs index e39618a2..03300408 100644 --- a/src/StellaOps.Feedser.Exporter.TrivyDb/TrivyDbPackageRequest.cs +++ b/src/StellaOps.Concelier.Exporter.TrivyDb/TrivyDbPackageRequest.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Exporter.TrivyDb; +namespace StellaOps.Concelier.Exporter.TrivyDb; public sealed record TrivyDbPackageRequest( ReadOnlyMemory MetadataJson, diff --git a/src/StellaOps.Feedser.Merge.Tests/AdvisoryIdentityResolverTests.cs b/src/StellaOps.Concelier.Merge.Tests/AdvisoryIdentityResolverTests.cs similarity index 96% rename from src/StellaOps.Feedser.Merge.Tests/AdvisoryIdentityResolverTests.cs rename to src/StellaOps.Concelier.Merge.Tests/AdvisoryIdentityResolverTests.cs index 8924a18a..83ea3274 100644 --- a/src/StellaOps.Feedser.Merge.Tests/AdvisoryIdentityResolverTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/AdvisoryIdentityResolverTests.cs @@ -1,10 +1,10 @@ using System; using System.Linq; -using StellaOps.Feedser.Merge.Identity; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Identity; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class AdvisoryIdentityResolverTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/AdvisoryMergeServiceTests.cs b/src/StellaOps.Concelier.Merge.Tests/AdvisoryMergeServiceTests.cs similarity index 96% rename from src/StellaOps.Feedser.Merge.Tests/AdvisoryMergeServiceTests.cs rename to src/StellaOps.Concelier.Merge.Tests/AdvisoryMergeServiceTests.cs index b35c31c5..dbefc87e 100644 --- a/src/StellaOps.Feedser.Merge.Tests/AdvisoryMergeServiceTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/AdvisoryMergeServiceTests.cs @@ -1,14 +1,14 @@ using System.Collections.Concurrent; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Core; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Aliases; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Core; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class AdvisoryMergeServiceTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/AdvisoryPrecedenceMergerTests.cs b/src/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs similarity index 96% rename from src/StellaOps.Feedser.Merge.Tests/AdvisoryPrecedenceMergerTests.cs rename to src/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs index 547dda1f..d336b9aa 100644 --- a/src/StellaOps.Feedser.Merge.Tests/AdvisoryPrecedenceMergerTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/AdvisoryPrecedenceMergerTests.cs @@ -3,11 +3,11 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Merge.Options; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Options; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class AdvisoryPrecedenceMergerTests { @@ -16,7 +16,7 @@ public sealed class AdvisoryPrecedenceMergerTests { var timeProvider = new FakeTimeProvider(new DateTimeOffset(2025, 1, 1, 0, 0, 0, TimeSpan.Zero)); var merger = new AdvisoryPrecedenceMerger(new AffectedPackagePrecedenceResolver(), timeProvider); - using var metrics = new MetricCollector("StellaOps.Feedser.Merge"); + using var metrics = new MetricCollector("StellaOps.Concelier.Merge"); var (redHat, nvd) = CreateVendorAndRegistryAdvisories(); var expectedMergeTimestamp = timeProvider.GetUtcNow(); @@ -48,11 +48,11 @@ public sealed class AdvisoryPrecedenceMergerTests Assert.Contains("redhat", mergeProvenance.Value, StringComparison.OrdinalIgnoreCase); Assert.Contains("nvd", mergeProvenance.Value, StringComparison.OrdinalIgnoreCase); - var rangeMeasurement = Assert.Single(metrics.Measurements, measurement => measurement.Name == "feedser.merge.range_overrides"); + var rangeMeasurement = Assert.Single(metrics.Measurements, measurement => measurement.Name == "concelier.merge.range_overrides"); Assert.Equal(1, rangeMeasurement.Value); Assert.Contains(rangeMeasurement.Tags, tag => string.Equals(tag.Key, "suppressed_source", StringComparison.Ordinal) && tag.Value?.ToString()?.Contains("nvd", StringComparison.OrdinalIgnoreCase) == true); - var severityConflict = Assert.Single(metrics.Measurements, measurement => measurement.Name == "feedser.merge.conflicts"); + var severityConflict = Assert.Single(metrics.Measurements, measurement => measurement.Name == "concelier.merge.conflicts"); Assert.Equal(1, severityConflict.Value); Assert.Contains(severityConflict.Tags, tag => string.Equals(tag.Key, "type", StringComparison.Ordinal) && string.Equals(tag.Value?.ToString(), "severity", StringComparison.OrdinalIgnoreCase)); } @@ -337,7 +337,7 @@ public sealed class AdvisoryPrecedenceMergerTests var now = new DateTimeOffset(2025, 3, 1, 0, 0, 0, TimeSpan.Zero); var timeProvider = new FakeTimeProvider(now); var merger = new AdvisoryPrecedenceMerger(new AffectedPackagePrecedenceResolver(), timeProvider); - using var metrics = new MetricCollector("StellaOps.Feedser.Merge"); + using var metrics = new MetricCollector("StellaOps.Concelier.Merge"); var normalizedRule = new NormalizedVersionRule( NormalizedVersionSchemes.SemVer, @@ -460,13 +460,13 @@ public sealed class AdvisoryPrecedenceMergerTests Assert.Empty(missingPackage.NormalizedVersions); Assert.NotEmpty(missingPackage.VersionRanges); - var normalizedMeasurements = metrics.Measurements.Where(m => m.Name == "feedser.merge.normalized_rules").ToList(); + var normalizedMeasurements = metrics.Measurements.Where(m => m.Name == "concelier.merge.normalized_rules").ToList(); Assert.Contains(normalizedMeasurements, measurement => measurement.Value == 1 && measurement.Tags.Any(tag => string.Equals(tag.Key, "scheme", StringComparison.Ordinal) && string.Equals(tag.Value?.ToString(), "semver", StringComparison.Ordinal)) && measurement.Tags.Any(tag => string.Equals(tag.Key, "package_type", StringComparison.Ordinal) && string.Equals(tag.Value?.ToString(), "semver", StringComparison.Ordinal))); - var missingMeasurements = metrics.Measurements.Where(m => m.Name == "feedser.merge.normalized_rules_missing").ToList(); + var missingMeasurements = metrics.Measurements.Where(m => m.Name == "concelier.merge.normalized_rules_missing").ToList(); var missingMeasurement = Assert.Single(missingMeasurements); Assert.Equal(1, missingMeasurement.Value); Assert.Contains(missingMeasurement.Tags, tag => string.Equals(tag.Key, "package_type", StringComparison.Ordinal) && string.Equals(tag.Value?.ToString(), "semver", StringComparison.Ordinal)); @@ -486,7 +486,7 @@ public sealed class AdvisoryPrecedenceMergerTests }; var logger = new TestLogger(); - using var metrics = new MetricCollector("StellaOps.Feedser.Merge"); + using var metrics = new MetricCollector("StellaOps.Concelier.Merge"); var merger = new AdvisoryPrecedenceMerger( new AffectedPackagePrecedenceResolver(), @@ -507,14 +507,14 @@ public sealed class AdvisoryPrecedenceMergerTests Assert.Contains(package.Provenance, provenance => provenance.Source == "nvd"); Assert.Contains(package.Provenance, provenance => provenance.Source == "redhat"); - var overrideMeasurement = Assert.Single(metrics.Measurements, m => m.Name == "feedser.merge.overrides"); + var overrideMeasurement = Assert.Single(metrics.Measurements, m => m.Name == "concelier.merge.overrides"); Assert.Equal(1, overrideMeasurement.Value); Assert.Contains(overrideMeasurement.Tags, tag => tag.Key == "primary_source" && string.Equals(tag.Value?.ToString(), "nvd", StringComparison.OrdinalIgnoreCase)); Assert.Contains(overrideMeasurement.Tags, tag => tag.Key == "suppressed_source" && tag.Value?.ToString()?.Contains("redhat", StringComparison.OrdinalIgnoreCase) == true); - Assert.DoesNotContain(metrics.Measurements, measurement => measurement.Name == "feedser.merge.range_overrides"); + Assert.DoesNotContain(metrics.Measurements, measurement => measurement.Name == "concelier.merge.range_overrides"); - var conflictMeasurement = Assert.Single(metrics.Measurements, measurement => measurement.Name == "feedser.merge.conflicts"); + var conflictMeasurement = Assert.Single(metrics.Measurements, measurement => measurement.Name == "concelier.merge.conflicts"); Assert.Equal(1, conflictMeasurement.Value); Assert.Contains(conflictMeasurement.Tags, tag => tag.Key == "type" && string.Equals(tag.Value?.ToString(), "severity", StringComparison.OrdinalIgnoreCase)); Assert.Contains(conflictMeasurement.Tags, tag => tag.Key == "reason" && string.Equals(tag.Value?.ToString(), "mismatch", StringComparison.OrdinalIgnoreCase)); diff --git a/src/StellaOps.Feedser.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs b/src/StellaOps.Concelier.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs similarity index 94% rename from src/StellaOps.Feedser.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs rename to src/StellaOps.Concelier.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs index aa7233eb..48e1c018 100644 --- a/src/StellaOps.Feedser.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/AffectedPackagePrecedenceResolverTests.cs @@ -1,8 +1,8 @@ using System; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class AffectedPackagePrecedenceResolverTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/AliasGraphResolverTests.cs b/src/StellaOps.Concelier.Merge.Tests/AliasGraphResolverTests.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/AliasGraphResolverTests.cs rename to src/StellaOps.Concelier.Merge.Tests/AliasGraphResolverTests.cs index 6f2542ab..1b3b6a7c 100644 --- a/src/StellaOps.Feedser.Merge.Tests/AliasGraphResolverTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/AliasGraphResolverTests.cs @@ -3,12 +3,12 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Driver; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Aliases; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Aliases; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; [Collection("mongo-fixture")] public sealed class AliasGraphResolverTests : IClassFixture diff --git a/src/StellaOps.Feedser.Merge.Tests/CanonicalHashCalculatorTests.cs b/src/StellaOps.Concelier.Merge.Tests/CanonicalHashCalculatorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/CanonicalHashCalculatorTests.cs rename to src/StellaOps.Concelier.Merge.Tests/CanonicalHashCalculatorTests.cs index 93c38494..d85f9947 100644 --- a/src/StellaOps.Feedser.Merge.Tests/CanonicalHashCalculatorTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/CanonicalHashCalculatorTests.cs @@ -1,8 +1,8 @@ using System.Linq; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class CanonicalHashCalculatorTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/DebianEvrComparerTests.cs b/src/StellaOps.Concelier.Merge.Tests/DebianEvrComparerTests.cs similarity index 90% rename from src/StellaOps.Feedser.Merge.Tests/DebianEvrComparerTests.cs rename to src/StellaOps.Concelier.Merge.Tests/DebianEvrComparerTests.cs index 91925b68..42e8405a 100644 --- a/src/StellaOps.Feedser.Merge.Tests/DebianEvrComparerTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/DebianEvrComparerTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Merge.Comparers; -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Merge.Comparers; +using StellaOps.Concelier.Normalization.Distro; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class DebianEvrComparerTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/MergeEventWriterTests.cs b/src/StellaOps.Concelier.Merge.Tests/MergeEventWriterTests.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/MergeEventWriterTests.cs rename to src/StellaOps.Concelier.Merge.Tests/MergeEventWriterTests.cs index 9b6f6f5b..4577a262 100644 --- a/src/StellaOps.Feedser.Merge.Tests/MergeEventWriterTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/MergeEventWriterTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class MergeEventWriterTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/MergePrecedenceIntegrationTests.cs b/src/StellaOps.Concelier.Merge.Tests/MergePrecedenceIntegrationTests.cs similarity index 94% rename from src/StellaOps.Feedser.Merge.Tests/MergePrecedenceIntegrationTests.cs rename to src/StellaOps.Concelier.Merge.Tests/MergePrecedenceIntegrationTests.cs index 1d2fca32..4f3e42e9 100644 --- a/src/StellaOps.Feedser.Merge.Tests/MergePrecedenceIntegrationTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/MergePrecedenceIntegrationTests.cs @@ -5,13 +5,13 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Driver; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; [Collection("mongo-fixture")] public sealed class MergePrecedenceIntegrationTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Merge.Tests/MetricCollector.cs b/src/StellaOps.Concelier.Merge.Tests/MetricCollector.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/MetricCollector.cs rename to src/StellaOps.Concelier.Merge.Tests/MetricCollector.cs index 36e3bde2..fd8c478a 100644 --- a/src/StellaOps.Feedser.Merge.Tests/MetricCollector.cs +++ b/src/StellaOps.Concelier.Merge.Tests/MetricCollector.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Linq; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; internal sealed class MetricCollector : IDisposable { diff --git a/src/StellaOps.Feedser.Merge.Tests/NevraComparerTests.cs b/src/StellaOps.Concelier.Merge.Tests/NevraComparerTests.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/NevraComparerTests.cs rename to src/StellaOps.Concelier.Merge.Tests/NevraComparerTests.cs index 2dbbe53e..65fef9d6 100644 --- a/src/StellaOps.Feedser.Merge.Tests/NevraComparerTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/NevraComparerTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Merge.Comparers; -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Merge.Comparers; +using StellaOps.Concelier.Normalization.Distro; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class NevraComparerTests { diff --git a/src/StellaOps.Feedser.Merge.Tests/SemanticVersionRangeResolverTests.cs b/src/StellaOps.Concelier.Merge.Tests/SemanticVersionRangeResolverTests.cs similarity index 93% rename from src/StellaOps.Feedser.Merge.Tests/SemanticVersionRangeResolverTests.cs rename to src/StellaOps.Concelier.Merge.Tests/SemanticVersionRangeResolverTests.cs index 3937575a..7695e2b7 100644 --- a/src/StellaOps.Feedser.Merge.Tests/SemanticVersionRangeResolverTests.cs +++ b/src/StellaOps.Concelier.Merge.Tests/SemanticVersionRangeResolverTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Merge.Comparers; +using StellaOps.Concelier.Merge.Comparers; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; public sealed class SemanticVersionRangeResolverTests { diff --git a/src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj b/src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj new file mode 100644 index 00000000..fb330b60 --- /dev/null +++ b/src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Merge.Tests/TestLogger.cs b/src/StellaOps.Concelier.Merge.Tests/TestLogger.cs similarity index 94% rename from src/StellaOps.Feedser.Merge.Tests/TestLogger.cs rename to src/StellaOps.Concelier.Merge.Tests/TestLogger.cs index 5f42c8f3..e41561cb 100644 --- a/src/StellaOps.Feedser.Merge.Tests/TestLogger.cs +++ b/src/StellaOps.Concelier.Merge.Tests/TestLogger.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Merge.Tests; +namespace StellaOps.Concelier.Merge.Tests; internal sealed class TestLogger : ILogger { diff --git a/src/StellaOps.Feedser.Merge/AGENTS.md b/src/StellaOps.Concelier.Merge/AGENTS.md similarity index 82% rename from src/StellaOps.Feedser.Merge/AGENTS.md rename to src/StellaOps.Concelier.Merge/AGENTS.md index ba7327f7..9900155f 100644 --- a/src/StellaOps.Feedser.Merge/AGENTS.md +++ b/src/StellaOps.Concelier.Merge/AGENTS.md @@ -19,8 +19,8 @@ Deterministic merge and reconciliation engine; builds identity graph via aliases - Provenance propagation merges unique entries; references deduped by (url, type). ## Configuration -- Precedence overrides bind via `feedser:merge:precedence:ranks` (dictionary of `source` → `rank`, lower wins). Absent entries fall back to defaults. -- Operator workflow: update `etc/feedser.yaml` or environment variables, restart merge job; overrides surface in metrics/logs as `AdvisoryOverride` entries. +- Precedence overrides bind via `concelier:merge:precedence:ranks` (dictionary of `source` → `rank`, lower wins). Absent entries fall back to defaults. +- Operator workflow: update `etc/concelier.yaml` or environment variables, restart merge job; overrides surface in metrics/logs as `AdvisoryOverride` entries. ## In/Out of scope In: merge logic, precedence policy, hashing, event records, comparers. Out: fetching/parsing, exporter packaging, signing. @@ -28,6 +28,6 @@ Out: fetching/parsing, exporter packaging, signing. - Metrics: merge.delta.count, merge.identity.conflicts, merge.range.overrides, merge.duration_ms. - Logs: decisions (why replaced), keys involved, hashes; avoid dumping large blobs; redact secrets (none expected). ## Tests -- Author and review coverage in `../StellaOps.Feedser.Merge.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Merge.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Merge/Class1.cs b/src/StellaOps.Concelier.Merge/Class1.cs similarity index 100% rename from src/StellaOps.Feedser.Merge/Class1.cs rename to src/StellaOps.Concelier.Merge/Class1.cs diff --git a/src/StellaOps.Feedser.Merge/Comparers/DebianEvr.cs b/src/StellaOps.Concelier.Merge/Comparers/DebianEvr.cs similarity index 94% rename from src/StellaOps.Feedser.Merge/Comparers/DebianEvr.cs rename to src/StellaOps.Concelier.Merge/Comparers/DebianEvr.cs index f478cbc0..bf3ebeab 100644 --- a/src/StellaOps.Feedser.Merge/Comparers/DebianEvr.cs +++ b/src/StellaOps.Concelier.Merge/Comparers/DebianEvr.cs @@ -1,7 +1,7 @@ -namespace StellaOps.Feedser.Merge.Comparers; +namespace StellaOps.Concelier.Merge.Comparers; using System; -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Normalization.Distro; public sealed class DebianEvrComparer : IComparer, IComparer { diff --git a/src/StellaOps.Feedser.Merge/Comparers/Nevra.cs b/src/StellaOps.Concelier.Merge/Comparers/Nevra.cs similarity index 94% rename from src/StellaOps.Feedser.Merge/Comparers/Nevra.cs rename to src/StellaOps.Concelier.Merge/Comparers/Nevra.cs index 4914a6ac..5b03c6e1 100644 --- a/src/StellaOps.Feedser.Merge/Comparers/Nevra.cs +++ b/src/StellaOps.Concelier.Merge/Comparers/Nevra.cs @@ -1,7 +1,7 @@ -namespace StellaOps.Feedser.Merge.Comparers; +namespace StellaOps.Concelier.Merge.Comparers; using System; -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Normalization.Distro; public sealed class NevraComparer : IComparer, IComparer { diff --git a/src/StellaOps.Feedser.Merge/Comparers/SemanticVersionRangeResolver.cs b/src/StellaOps.Concelier.Merge/Comparers/SemanticVersionRangeResolver.cs similarity index 95% rename from src/StellaOps.Feedser.Merge/Comparers/SemanticVersionRangeResolver.cs rename to src/StellaOps.Concelier.Merge/Comparers/SemanticVersionRangeResolver.cs index 5b8c2fe7..e41e6ee5 100644 --- a/src/StellaOps.Feedser.Merge/Comparers/SemanticVersionRangeResolver.cs +++ b/src/StellaOps.Concelier.Merge/Comparers/SemanticVersionRangeResolver.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Merge.Comparers; +namespace StellaOps.Concelier.Merge.Comparers; using System.Diagnostics.CodeAnalysis; using Semver; diff --git a/src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityCluster.cs b/src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityCluster.cs similarity index 96% rename from src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityCluster.cs rename to src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityCluster.cs index 97dd7dee..716b8976 100644 --- a/src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityCluster.cs +++ b/src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityCluster.cs @@ -2,9 +2,9 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Identity; +namespace StellaOps.Concelier.Merge.Identity; /// /// Represents a connected component of advisories that refer to the same vulnerability. diff --git a/src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityResolver.cs b/src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityResolver.cs similarity index 99% rename from src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityResolver.cs rename to src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityResolver.cs index 52c94599..29a56e8f 100644 --- a/src/StellaOps.Feedser.Merge/Identity/AdvisoryIdentityResolver.cs +++ b/src/StellaOps.Concelier.Merge/Identity/AdvisoryIdentityResolver.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Runtime.CompilerServices; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Identity; +namespace StellaOps.Concelier.Merge.Identity; /// /// Builds an alias-driven identity graph that groups advisories referring to the same vulnerability. diff --git a/src/StellaOps.Feedser.Merge/Identity/AliasIdentity.cs b/src/StellaOps.Concelier.Merge/Identity/AliasIdentity.cs similarity index 92% rename from src/StellaOps.Feedser.Merge/Identity/AliasIdentity.cs rename to src/StellaOps.Concelier.Merge/Identity/AliasIdentity.cs index 193f7cc2..1a7f0a7a 100644 --- a/src/StellaOps.Feedser.Merge/Identity/AliasIdentity.cs +++ b/src/StellaOps.Concelier.Merge/Identity/AliasIdentity.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Merge.Identity; +namespace StellaOps.Concelier.Merge.Identity; /// /// Normalized alias representation used within identity clusters. diff --git a/src/StellaOps.Feedser.Merge/Jobs/MergeJobKinds.cs b/src/StellaOps.Concelier.Merge/Jobs/MergeJobKinds.cs similarity index 66% rename from src/StellaOps.Feedser.Merge/Jobs/MergeJobKinds.cs rename to src/StellaOps.Concelier.Merge/Jobs/MergeJobKinds.cs index 95cd7b3f..0f06e9cb 100644 --- a/src/StellaOps.Feedser.Merge/Jobs/MergeJobKinds.cs +++ b/src/StellaOps.Concelier.Merge/Jobs/MergeJobKinds.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Merge.Jobs; +namespace StellaOps.Concelier.Merge.Jobs; internal static class MergeJobKinds { diff --git a/src/StellaOps.Feedser.Merge/Jobs/MergeReconcileJob.cs b/src/StellaOps.Concelier.Merge/Jobs/MergeReconcileJob.cs similarity index 90% rename from src/StellaOps.Feedser.Merge/Jobs/MergeReconcileJob.cs rename to src/StellaOps.Concelier.Merge/Jobs/MergeReconcileJob.cs index 5c98f117..fa7479c6 100644 --- a/src/StellaOps.Feedser.Merge/Jobs/MergeReconcileJob.cs +++ b/src/StellaOps.Concelier.Merge/Jobs/MergeReconcileJob.cs @@ -2,10 +2,10 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Merge.Services; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Merge.Services; -namespace StellaOps.Feedser.Merge.Jobs; +namespace StellaOps.Concelier.Merge.Jobs; public sealed class MergeReconcileJob : IJob { diff --git a/src/StellaOps.Feedser.Merge/MergeServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Merge/MergeServiceCollectionExtensions.cs similarity index 76% rename from src/StellaOps.Feedser.Merge/MergeServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Merge/MergeServiceCollectionExtensions.cs index 1896e6dc..eb120c5c 100644 --- a/src/StellaOps.Feedser.Merge/MergeServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Merge/MergeServiceCollectionExtensions.cs @@ -2,12 +2,12 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Core; -using StellaOps.Feedser.Merge.Jobs; -using StellaOps.Feedser.Merge.Options; -using StellaOps.Feedser.Merge.Services; +using StellaOps.Concelier.Core; +using StellaOps.Concelier.Merge.Jobs; +using StellaOps.Concelier.Merge.Options; +using StellaOps.Concelier.Merge.Services; -namespace StellaOps.Feedser.Merge; +namespace StellaOps.Concelier.Merge; public static class MergeServiceCollectionExtensions { @@ -21,14 +21,14 @@ public static class MergeServiceCollectionExtensions services.TryAddSingleton(); services.TryAddSingleton(sp => { - var options = configuration.GetSection("feedser:merge:precedence").Get(); + var options = configuration.GetSection("concelier:merge:precedence").Get(); return options is null ? new AffectedPackagePrecedenceResolver() : new AffectedPackagePrecedenceResolver(options); }); services.TryAddSingleton(sp => { var resolver = sp.GetRequiredService(); - var options = configuration.GetSection("feedser:merge:precedence").Get(); + var options = configuration.GetSection("concelier:merge:precedence").Get(); var timeProvider = sp.GetRequiredService(); var logger = sp.GetRequiredService>(); return new AdvisoryPrecedenceMerger(resolver, options, timeProvider, logger); diff --git a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceDefaults.cs b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceDefaults.cs similarity index 94% rename from src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceDefaults.cs rename to src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceDefaults.cs index 5c22f4e3..ec432812 100644 --- a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceDefaults.cs +++ b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceDefaults.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Merge.Options; +namespace StellaOps.Concelier.Merge.Options; /// /// Provides the built-in precedence table used by the merge engine when no overrides are supplied. diff --git a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceOptions.cs b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceOptions.cs similarity index 88% rename from src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceOptions.cs rename to src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceOptions.cs index bda12f2b..c8f5b40a 100644 --- a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceOptions.cs +++ b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceOptions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Merge.Options; +namespace StellaOps.Concelier.Merge.Options; /// /// Configurable precedence overrides for advisory sources. diff --git a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceTable.cs b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceTable.cs similarity index 91% rename from src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceTable.cs rename to src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceTable.cs index 12bd9903..a7a43da7 100644 --- a/src/StellaOps.Feedser.Merge/Options/AdvisoryPrecedenceTable.cs +++ b/src/StellaOps.Concelier.Merge/Options/AdvisoryPrecedenceTable.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Merge.Options; +namespace StellaOps.Concelier.Merge.Options; internal static class AdvisoryPrecedenceTable { diff --git a/src/StellaOps.Feedser.Merge/RANGE_PRIMITIVES_COORDINATION.md b/src/StellaOps.Concelier.Merge/RANGE_PRIMITIVES_COORDINATION.md similarity index 95% rename from src/StellaOps.Feedser.Merge/RANGE_PRIMITIVES_COORDINATION.md rename to src/StellaOps.Concelier.Merge/RANGE_PRIMITIVES_COORDINATION.md index 25aad08f..7fde6d62 100644 --- a/src/StellaOps.Feedser.Merge/RANGE_PRIMITIVES_COORDINATION.md +++ b/src/StellaOps.Concelier.Merge/RANGE_PRIMITIVES_COORDINATION.md @@ -32,7 +32,7 @@ Until these blocks land, connectors should stage changes behind a feature flag o | Ru.Bdu | BE-Conn-BDU | All tasks TODO | Map product releases into normalized rules; add provenance notes referencing BDU advisory identifiers. | Verify we have UTF-8 safe handling in builder; share sample sanitized inputs. | | Ru.Nkcki | BE-Conn-Nkcki | All tasks TODO | Similar to BDU; capture vendor firmware/build numbers and map into normalized rules. | Coordinate with Localization WG for Cyrillic transliteration strategy. | | Vndr.Apple | BE-Conn-Apple | Mapper/tests/telemetry marked DOING | Continue extending vendor range primitives (`apple.version`, `apple.build`) and adopt normalized rule arrays for OS build spans. | Request builder integration review on 2025-10-16; ensure fixtures cover multi-range tables and include provenance notes. | -| Vndr.Cisco | BE-Conn-Cisco | ✅ Emits SemVer primitives with vendor notes | Parser maps versions into SemVer primitives with `cisco.productId` vendor extensions; sample fixtures landing in `StellaOps.Feedser.Source.Vndr.Cisco.Tests`. | No custom comparer required; SemVer + vendor metadata suffices. | +| Vndr.Cisco | BE-Conn-Cisco | ✅ Emits SemVer primitives with vendor notes | Parser maps versions into SemVer primitives with `cisco.productId` vendor extensions; sample fixtures landing in `StellaOps.Concelier.Source.Vndr.Cisco.Tests`. | No custom comparer required; SemVer + vendor metadata suffices. | | Vndr.Msrc | BE-Conn-MSRC | All tasks TODO | Canonical mapper must output product/build coverage as normalized rules (likely `msrc.patch` scheme) with provenance referencing KB IDs. | Sync with Models on adding scheme identifiers for MSRC packages; plan fixture coverage for monthly rollups. | ## Storage alignment quick reference (2025-10-11) @@ -86,10 +86,10 @@ Until these blocks land, connectors should stage changes behind a feature flag o - Normalization team to share draft `SemVerRangeRuleBuilder` API by **2025-10-13** for review; Merge will circulate feedback within 24 hours. - Connector owners to prepare fixture pull requests demonstrating sample normalized rule arrays (even if feature-flagged) by **2025-10-17**. - Merge team will run a cross-connector review on **2025-10-18** to confirm consistent field usage and provenance tagging before enabling merge union logic. -- Schedule held for **2025-10-14 14:00 UTC** to review the CERT/CC staging VINCE advisory sample once `enableDetailMapping` is flipped; capture findings in `#feedser-merge` with snapshot diffs. +- Schedule held for **2025-10-14 14:00 UTC** to review the CERT/CC staging VINCE advisory sample once `enableDetailMapping` is flipped; capture findings in `#concelier-merge` with snapshot diffs. ## Tracking & follow-up - Capture connector progress updates in stand-ups twice per week; link PRs/issues back to this document and the rollout dashboard (`docs/dev/normalized_versions_rollout.md`). -- Monitor merge counters `feedser.merge.normalized_rules` and `feedser.merge.normalized_rules_missing` to spot advisories that still lack normalized arrays after precedence merge. -- When a connector is ready to emit normalized rules, update its module `TASKS.md` status and ping Merge in `#feedser-merge` with fixture diff screenshots. +- Monitor merge counters `concelier.merge.normalized_rules` and `concelier.merge.normalized_rules_missing` to spot advisories that still lack normalized arrays after precedence merge. +- When a connector is ready to emit normalized rules, update its module `TASKS.md` status and ping Merge in `#concelier-merge` with fixture diff screenshots. - If new schemes or comparer logic is required (e.g., Cisco IOS), open a Models issue referencing `FEEDMODELS-SCHEMA-02-900` before implementing. diff --git a/src/StellaOps.Feedser.Merge/Services/AdvisoryMergeService.cs b/src/StellaOps.Concelier.Merge/Services/AdvisoryMergeService.cs similarity index 95% rename from src/StellaOps.Feedser.Merge/Services/AdvisoryMergeService.cs rename to src/StellaOps.Concelier.Merge/Services/AdvisoryMergeService.cs index af520e5e..e634986c 100644 --- a/src/StellaOps.Feedser.Merge/Services/AdvisoryMergeService.cs +++ b/src/StellaOps.Concelier.Merge/Services/AdvisoryMergeService.cs @@ -6,19 +6,19 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Core; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Aliases; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Core; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; public sealed class AdvisoryMergeService { - private static readonly Meter MergeMeter = new("StellaOps.Feedser.Merge"); + private static readonly Meter MergeMeter = new("StellaOps.Concelier.Merge"); private static readonly Counter AliasCollisionCounter = MergeMeter.CreateCounter( - "feedser.merge.identity_conflicts", + "concelier.merge.identity_conflicts", unit: "count", description: "Number of alias collisions detected during merge."); diff --git a/src/StellaOps.Feedser.Merge/Services/AdvisoryPrecedenceMerger.cs b/src/StellaOps.Concelier.Merge/Services/AdvisoryPrecedenceMerger.cs similarity index 95% rename from src/StellaOps.Feedser.Merge/Services/AdvisoryPrecedenceMerger.cs rename to src/StellaOps.Concelier.Merge/Services/AdvisoryPrecedenceMerger.cs index 621ce27d..eab88e5a 100644 --- a/src/StellaOps.Feedser.Merge/Services/AdvisoryPrecedenceMerger.cs +++ b/src/StellaOps.Concelier.Merge/Services/AdvisoryPrecedenceMerger.cs @@ -5,44 +5,44 @@ using System.Globalization; using System.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Merge.Options; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Options; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; /// /// Merges canonical advisories emitted by different sources into a single precedence-resolved advisory. /// public sealed class AdvisoryPrecedenceMerger { - private static readonly Meter MergeMeter = new("StellaOps.Feedser.Merge"); + private static readonly Meter MergeMeter = new("StellaOps.Concelier.Merge"); private static readonly Counter MergeCounter = MergeMeter.CreateCounter( - "feedser.merge.operations", + "concelier.merge.operations", unit: "count", description: "Number of merge invocations executed by the precedence engine."); private static readonly Counter OverridesCounter = MergeMeter.CreateCounter( - "feedser.merge.overrides", + "concelier.merge.overrides", unit: "count", description: "Number of times lower-precedence advisories were overridden by higher-precedence sources."); private static readonly Counter RangeOverrideCounter = MergeMeter.CreateCounter( - "feedser.merge.range_overrides", + "concelier.merge.range_overrides", unit: "count", description: "Number of affected-package range overrides performed during precedence merge."); private static readonly Counter ConflictCounter = MergeMeter.CreateCounter( - "feedser.merge.conflicts", + "concelier.merge.conflicts", unit: "count", description: "Number of precedence conflicts detected (severity, rank ties, etc.)."); private static readonly Counter NormalizedRuleCounter = MergeMeter.CreateCounter( - "feedser.merge.normalized_rules", + "concelier.merge.normalized_rules", unit: "rule", description: "Number of normalized version rules retained after precedence merge."); private static readonly Counter MissingNormalizedRuleCounter = MergeMeter.CreateCounter( - "feedser.merge.normalized_rules_missing", + "concelier.merge.normalized_rules_missing", unit: "package", description: "Number of affected packages with version ranges but no normalized rules."); diff --git a/src/StellaOps.Feedser.Merge/Services/AffectedPackagePrecedenceResolver.cs b/src/StellaOps.Concelier.Merge/Services/AffectedPackagePrecedenceResolver.cs similarity index 95% rename from src/StellaOps.Feedser.Merge/Services/AffectedPackagePrecedenceResolver.cs rename to src/StellaOps.Concelier.Merge/Services/AffectedPackagePrecedenceResolver.cs index ff4bf6f5..8f67c173 100644 --- a/src/StellaOps.Feedser.Merge/Services/AffectedPackagePrecedenceResolver.cs +++ b/src/StellaOps.Concelier.Merge/Services/AffectedPackagePrecedenceResolver.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using StellaOps.Feedser.Merge.Options; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Merge.Options; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; /// /// Applies source precedence rules to affected package sets so authoritative distro ranges override generic registry data. diff --git a/src/StellaOps.Feedser.Merge/Services/AliasGraphResolver.cs b/src/StellaOps.Concelier.Merge/Services/AliasGraphResolver.cs similarity index 95% rename from src/StellaOps.Feedser.Merge/Services/AliasGraphResolver.cs rename to src/StellaOps.Concelier.Merge/Services/AliasGraphResolver.cs index 5ff393f2..43125973 100644 --- a/src/StellaOps.Feedser.Merge/Services/AliasGraphResolver.cs +++ b/src/StellaOps.Concelier.Merge/Services/AliasGraphResolver.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo.Aliases; -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; public sealed class AliasGraphResolver { diff --git a/src/StellaOps.Feedser.Merge/Services/CanonicalHashCalculator.cs b/src/StellaOps.Concelier.Merge/Services/CanonicalHashCalculator.cs similarity index 85% rename from src/StellaOps.Feedser.Merge/Services/CanonicalHashCalculator.cs rename to src/StellaOps.Concelier.Merge/Services/CanonicalHashCalculator.cs index 7d6e9c4e..7235103c 100644 --- a/src/StellaOps.Feedser.Merge/Services/CanonicalHashCalculator.cs +++ b/src/StellaOps.Concelier.Merge/Services/CanonicalHashCalculator.cs @@ -1,8 +1,8 @@ -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; using System.Security.Cryptography; using System.Text; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; /// /// Computes deterministic hashes over canonical advisory JSON payloads. diff --git a/src/StellaOps.Feedser.Merge/Services/MergeEventWriter.cs b/src/StellaOps.Concelier.Merge/Services/MergeEventWriter.cs similarity index 93% rename from src/StellaOps.Feedser.Merge/Services/MergeEventWriter.cs rename to src/StellaOps.Concelier.Merge/Services/MergeEventWriter.cs index 6945e545..1d2e3c02 100644 --- a/src/StellaOps.Feedser.Merge/Services/MergeEventWriter.cs +++ b/src/StellaOps.Concelier.Merge/Services/MergeEventWriter.cs @@ -1,10 +1,10 @@ -namespace StellaOps.Feedser.Merge.Services; +namespace StellaOps.Concelier.Merge.Services; using System.Security.Cryptography; using System.Linq; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; /// /// Persists merge events with canonical before/after hashes for auditability. diff --git a/src/StellaOps.Concelier.Merge/StellaOps.Concelier.Merge.csproj b/src/StellaOps.Concelier.Merge/StellaOps.Concelier.Merge.csproj new file mode 100644 index 00000000..94468bc2 --- /dev/null +++ b/src/StellaOps.Concelier.Merge/StellaOps.Concelier.Merge.csproj @@ -0,0 +1,18 @@ + + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Merge/TASKS.md b/src/StellaOps.Concelier.Merge/TASKS.md similarity index 90% rename from src/StellaOps.Feedser.Merge/TASKS.md rename to src/StellaOps.Concelier.Merge/TASKS.md index bf3b3190..b63748ff 100644 --- a/src/StellaOps.Feedser.Merge/TASKS.md +++ b/src/StellaOps.Concelier.Merge/TASKS.md @@ -14,8 +14,8 @@ |End-to-end determinism test|QA|Merge, key connectors|**DONE** – `MergePrecedenceIntegrationTests.MergePipeline_IsDeterministicAcrossRuns` guards determinism.| |FEEDMERGE-QA-04-001 End-to-end conflict regression suite|QA|Merge|DONE – `AdvisoryMergeServiceTests.MergeAsync_AppliesCanonicalRulesAndPersistsDecisions` exercises GHSA/NVD/OSV conflict path and merge-event analytics. **Reminder:** QA to sync with connector teams once new fixture triples land.| |Override audit logging|BE-Merge|Observability|DONE – override audits now emit structured logs plus bounded-tag metrics suitable for prod telemetry.| -|Configurable precedence table|BE-Merge|Architecture|DONE – precedence options bind via feedser:merge:precedence:ranks with docs/tests covering operator workflow.| -|Range primitives backlog|BE-Merge|Connector WGs|**DOING** – Coordinate remaining connectors (`Acsc`, `Cccs`, `CertBund`, `CertCc`, `Cve`, `Ghsa`, `Ics.Cisa`, `Kisa`, `Ru.Bdu`, `Ru.Nkcki`, `Vndr.Apple`, `Vndr.Cisco`, `Vndr.Msrc`) to emit canonical RangePrimitives with provenance tags; track progress/fixtures here.
2025-10-11: Storage alignment notes + sample normalized rule JSON now captured in `RANGE_PRIMITIVES_COORDINATION.md` (see “Storage alignment quick reference”).
2025-10-11 18:45Z: GHSA normalized rules landed; OSV connector picked up next for rollout.
2025-10-11 21:10Z: `docs/dev/merge_semver_playbook.md` Section 8 now documents the persisted Mongo projection (SemVer + NEVRA) for connector reviewers.
2025-10-11 21:30Z: Added `docs/dev/normalized_versions_rollout.md` dashboard to centralize connector status and upcoming milestones.
2025-10-11 21:55Z: Merge now emits `feedser.merge.normalized_rules*` counters and unions connector-provided normalized arrays; see new test coverage in `AdvisoryPrecedenceMergerTests.Merge_RecordsNormalizedRuleMetrics`.
2025-10-12 17:05Z: CVE + KEV normalized rule verification complete; OSV parity fixtures revalidated—downstream parity/monitoring tasks may proceed.| +|Configurable precedence table|BE-Merge|Architecture|DONE – precedence options bind via concelier:merge:precedence:ranks with docs/tests covering operator workflow.| +|Range primitives backlog|BE-Merge|Connector WGs|**DOING** – Coordinate remaining connectors (`Acsc`, `Cccs`, `CertBund`, `CertCc`, `Cve`, `Ghsa`, `Ics.Cisa`, `Kisa`, `Ru.Bdu`, `Ru.Nkcki`, `Vndr.Apple`, `Vndr.Cisco`, `Vndr.Msrc`) to emit canonical RangePrimitives with provenance tags; track progress/fixtures here.
2025-10-11: Storage alignment notes + sample normalized rule JSON now captured in `RANGE_PRIMITIVES_COORDINATION.md` (see “Storage alignment quick reference”).
2025-10-11 18:45Z: GHSA normalized rules landed; OSV connector picked up next for rollout.
2025-10-11 21:10Z: `docs/dev/merge_semver_playbook.md` Section 8 now documents the persisted Mongo projection (SemVer + NEVRA) for connector reviewers.
2025-10-11 21:30Z: Added `docs/dev/normalized_versions_rollout.md` dashboard to centralize connector status and upcoming milestones.
2025-10-11 21:55Z: Merge now emits `concelier.merge.normalized_rules*` counters and unions connector-provided normalized arrays; see new test coverage in `AdvisoryPrecedenceMergerTests.Merge_RecordsNormalizedRuleMetrics`.
2025-10-12 17:05Z: CVE + KEV normalized rule verification complete; OSV parity fixtures revalidated—downstream parity/monitoring tasks may proceed.| |Merge pipeline parity for new advisory fields|BE-Merge|Models, Core|DONE (2025-10-15) – merge service now surfaces description/CWE/canonical metric decisions with updated metrics/tests.| |Connector coordination for new advisory fields|Connector Leads, BE-Merge|Models, Core|**DONE (2025-10-15)** – GHSA, NVD, and OSV connectors now emit advisory descriptions, CWE weaknesses, and canonical metric ids. Fixtures refreshed (GHSA connector regression suite, `conflict-nvd.canonical.json`, OSV parity snapshots) and completion recorded in coordination log.| |FEEDMERGE-ENGINE-07-001 Conflict sets & explainers|BE-Merge|FEEDSTORAGE-DATA-07-001|TODO – Persist conflict sets referencing advisory statements, output rule/explainer payloads with replay hashes, and add integration tests covering deterministic `asOf` evaluations.| diff --git a/src/StellaOps.Feedser.Models.Tests/AdvisoryProvenanceTests.cs b/src/StellaOps.Concelier.Models.Tests/AdvisoryProvenanceTests.cs similarity index 95% rename from src/StellaOps.Feedser.Models.Tests/AdvisoryProvenanceTests.cs rename to src/StellaOps.Concelier.Models.Tests/AdvisoryProvenanceTests.cs index b2f4e70a..bab28ca0 100644 --- a/src/StellaOps.Feedser.Models.Tests/AdvisoryProvenanceTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/AdvisoryProvenanceTests.cs @@ -1,8 +1,8 @@ using System; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class AdvisoryProvenanceTests { diff --git a/src/StellaOps.Feedser.Models.Tests/AdvisoryTests.cs b/src/StellaOps.Concelier.Models.Tests/AdvisoryTests.cs similarity index 97% rename from src/StellaOps.Feedser.Models.Tests/AdvisoryTests.cs rename to src/StellaOps.Concelier.Models.Tests/AdvisoryTests.cs index e8997e0b..62f8a8b2 100644 --- a/src/StellaOps.Feedser.Models.Tests/AdvisoryTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/AdvisoryTests.cs @@ -1,7 +1,7 @@ using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class AdvisoryTests { diff --git a/src/StellaOps.Feedser.Models.Tests/AffectedPackageStatusTests.cs b/src/StellaOps.Concelier.Models.Tests/AffectedPackageStatusTests.cs similarity index 97% rename from src/StellaOps.Feedser.Models.Tests/AffectedPackageStatusTests.cs rename to src/StellaOps.Concelier.Models.Tests/AffectedPackageStatusTests.cs index 6bac3d85..b56b6226 100644 --- a/src/StellaOps.Feedser.Models.Tests/AffectedPackageStatusTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/AffectedPackageStatusTests.cs @@ -1,7 +1,7 @@ using System; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class AffectedPackageStatusTests { diff --git a/src/StellaOps.Feedser.Models.Tests/AffectedVersionRangeExtensionsTests.cs b/src/StellaOps.Concelier.Models.Tests/AffectedVersionRangeExtensionsTests.cs similarity index 96% rename from src/StellaOps.Feedser.Models.Tests/AffectedVersionRangeExtensionsTests.cs rename to src/StellaOps.Concelier.Models.Tests/AffectedVersionRangeExtensionsTests.cs index 534bbb0a..f44fe707 100644 --- a/src/StellaOps.Feedser.Models.Tests/AffectedVersionRangeExtensionsTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/AffectedVersionRangeExtensionsTests.cs @@ -1,8 +1,8 @@ using System; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class AffectedVersionRangeExtensionsTests { diff --git a/src/StellaOps.Feedser.Models.Tests/AliasSchemeRegistryTests.cs b/src/StellaOps.Concelier.Models.Tests/AliasSchemeRegistryTests.cs similarity index 93% rename from src/StellaOps.Feedser.Models.Tests/AliasSchemeRegistryTests.cs rename to src/StellaOps.Concelier.Models.Tests/AliasSchemeRegistryTests.cs index d197b70c..30cf3cd7 100644 --- a/src/StellaOps.Feedser.Models.Tests/AliasSchemeRegistryTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/AliasSchemeRegistryTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class AliasSchemeRegistryTests { diff --git a/src/StellaOps.Feedser.Models.Tests/CanonicalExampleFactory.cs b/src/StellaOps.Concelier.Models.Tests/CanonicalExampleFactory.cs similarity index 96% rename from src/StellaOps.Feedser.Models.Tests/CanonicalExampleFactory.cs rename to src/StellaOps.Concelier.Models.Tests/CanonicalExampleFactory.cs index e308635a..82da571a 100644 --- a/src/StellaOps.Feedser.Models.Tests/CanonicalExampleFactory.cs +++ b/src/StellaOps.Concelier.Models.Tests/CanonicalExampleFactory.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.Globalization; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; internal static class CanonicalExampleFactory { diff --git a/src/StellaOps.Feedser.Models.Tests/CanonicalExamplesTests.cs b/src/StellaOps.Concelier.Models.Tests/CanonicalExamplesTests.cs similarity index 93% rename from src/StellaOps.Feedser.Models.Tests/CanonicalExamplesTests.cs rename to src/StellaOps.Concelier.Models.Tests/CanonicalExamplesTests.cs index 0b2864da..e70e64bc 100644 --- a/src/StellaOps.Feedser.Models.Tests/CanonicalExamplesTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/CanonicalExamplesTests.cs @@ -1,7 +1,7 @@ using System.Text; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class CanonicalExamplesTests { diff --git a/src/StellaOps.Feedser.Models.Tests/CanonicalJsonSerializerTests.cs b/src/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs similarity index 96% rename from src/StellaOps.Feedser.Models.Tests/CanonicalJsonSerializerTests.cs rename to src/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs index 7fb361e2..cd64f279 100644 --- a/src/StellaOps.Feedser.Models.Tests/CanonicalJsonSerializerTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/CanonicalJsonSerializerTests.cs @@ -2,9 +2,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class CanonicalJsonSerializerTests { diff --git a/src/StellaOps.Feedser.Models.Tests/EvrPrimitiveExtensionsTests.cs b/src/StellaOps.Concelier.Models.Tests/EvrPrimitiveExtensionsTests.cs similarity index 94% rename from src/StellaOps.Feedser.Models.Tests/EvrPrimitiveExtensionsTests.cs rename to src/StellaOps.Concelier.Models.Tests/EvrPrimitiveExtensionsTests.cs index 2c30aac2..788028dc 100644 --- a/src/StellaOps.Feedser.Models.Tests/EvrPrimitiveExtensionsTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/EvrPrimitiveExtensionsTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class EvrPrimitiveExtensionsTests { diff --git a/src/StellaOps.Feedser.Models.Tests/Fixtures/ghsa-semver.json b/src/StellaOps.Concelier.Models.Tests/Fixtures/ghsa-semver.json similarity index 100% rename from src/StellaOps.Feedser.Models.Tests/Fixtures/ghsa-semver.json rename to src/StellaOps.Concelier.Models.Tests/Fixtures/ghsa-semver.json diff --git a/src/StellaOps.Feedser.Models.Tests/Fixtures/kev-flag.json b/src/StellaOps.Concelier.Models.Tests/Fixtures/kev-flag.json similarity index 100% rename from src/StellaOps.Feedser.Models.Tests/Fixtures/kev-flag.json rename to src/StellaOps.Concelier.Models.Tests/Fixtures/kev-flag.json diff --git a/src/StellaOps.Feedser.Models.Tests/Fixtures/nvd-basic.json b/src/StellaOps.Concelier.Models.Tests/Fixtures/nvd-basic.json similarity index 100% rename from src/StellaOps.Feedser.Models.Tests/Fixtures/nvd-basic.json rename to src/StellaOps.Concelier.Models.Tests/Fixtures/nvd-basic.json diff --git a/src/StellaOps.Feedser.Models.Tests/Fixtures/psirt-overlay.json b/src/StellaOps.Concelier.Models.Tests/Fixtures/psirt-overlay.json similarity index 100% rename from src/StellaOps.Feedser.Models.Tests/Fixtures/psirt-overlay.json rename to src/StellaOps.Concelier.Models.Tests/Fixtures/psirt-overlay.json diff --git a/src/StellaOps.Feedser.Models.Tests/NevraPrimitiveExtensionsTests.cs b/src/StellaOps.Concelier.Models.Tests/NevraPrimitiveExtensionsTests.cs similarity index 95% rename from src/StellaOps.Feedser.Models.Tests/NevraPrimitiveExtensionsTests.cs rename to src/StellaOps.Concelier.Models.Tests/NevraPrimitiveExtensionsTests.cs index 548b2f3a..1b558c4e 100644 --- a/src/StellaOps.Feedser.Models.Tests/NevraPrimitiveExtensionsTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/NevraPrimitiveExtensionsTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class NevraPrimitiveExtensionsTests { diff --git a/src/StellaOps.Feedser.Models.Tests/NormalizedVersionRuleTests.cs b/src/StellaOps.Concelier.Models.Tests/NormalizedVersionRuleTests.cs similarity index 97% rename from src/StellaOps.Feedser.Models.Tests/NormalizedVersionRuleTests.cs rename to src/StellaOps.Concelier.Models.Tests/NormalizedVersionRuleTests.cs index 7414eed6..223ffb76 100644 --- a/src/StellaOps.Feedser.Models.Tests/NormalizedVersionRuleTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/NormalizedVersionRuleTests.cs @@ -1,9 +1,9 @@ using System; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class NormalizedVersionRuleTests { diff --git a/src/StellaOps.Feedser.Models.Tests/OsvGhsaParityDiagnosticsTests.cs b/src/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs similarity index 94% rename from src/StellaOps.Feedser.Models.Tests/OsvGhsaParityDiagnosticsTests.cs rename to src/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs index 38899e04..33387c54 100644 --- a/src/StellaOps.Feedser.Models.Tests/OsvGhsaParityDiagnosticsTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/OsvGhsaParityDiagnosticsTests.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Metrics; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class OsvGhsaParityDiagnosticsTests { @@ -34,7 +34,7 @@ public sealed class OsvGhsaParityDiagnosticsTests Assert.Equal(3, measurements.Count); - var total = Assert.Single(measurements, m => m.Instrument == "feedser.osv_ghsa.total"); + var total = Assert.Single(measurements, m => m.Instrument == "concelier.osv_ghsa.total"); Assert.Equal(2, total.Value); Assert.Equal("qa", total.Tags["dataset"]); @@ -64,7 +64,7 @@ public sealed class OsvGhsaParityDiagnosticsTests { InstrumentPublished = (instrument, l) => { - if (instrument.Meter.Name.StartsWith("StellaOps.Feedser.Models.OsvGhsaParity", StringComparison.Ordinal)) + if (instrument.Meter.Name.StartsWith("StellaOps.Concelier.Models.OsvGhsaParity", StringComparison.Ordinal)) { l.EnableMeasurementEvents(instrument); } diff --git a/src/StellaOps.Feedser.Models.Tests/OsvGhsaParityInspectorTests.cs b/src/StellaOps.Concelier.Models.Tests/OsvGhsaParityInspectorTests.cs similarity index 98% rename from src/StellaOps.Feedser.Models.Tests/OsvGhsaParityInspectorTests.cs rename to src/StellaOps.Concelier.Models.Tests/OsvGhsaParityInspectorTests.cs index b348d803..7e27edf6 100644 --- a/src/StellaOps.Feedser.Models.Tests/OsvGhsaParityInspectorTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/OsvGhsaParityInspectorTests.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class OsvGhsaParityInspectorTests { diff --git a/src/StellaOps.Feedser.Models.Tests/ProvenanceDiagnosticsTests.cs b/src/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs similarity index 90% rename from src/StellaOps.Feedser.Models.Tests/ProvenanceDiagnosticsTests.cs rename to src/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs index b410834b..37f68602 100644 --- a/src/StellaOps.Feedser.Models.Tests/ProvenanceDiagnosticsTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/ProvenanceDiagnosticsTests.cs @@ -4,10 +4,10 @@ using System.Diagnostics.Metrics; using System.Linq; using System.Reflection; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class ProvenanceDiagnosticsTests { @@ -30,7 +30,7 @@ public sealed class ProvenanceDiagnosticsTests var first = measurements[0]; Assert.Equal(1, first.Value); - Assert.Equal("feedser.provenance.missing", first.Instrument); + Assert.Equal("concelier.provenance.missing", first.Instrument); Assert.Equal("source-A", first.Tags["source"]); Assert.Equal("range:pkg", first.Tags["component"]); Assert.Equal("range", first.Tags["category"]); @@ -38,7 +38,7 @@ public sealed class ProvenanceDiagnosticsTests Assert.Equal(ProvenanceFieldMasks.VersionRanges, first.Tags["fieldMask"]); var second = measurements[1]; - Assert.Equal("feedser.provenance.missing", second.Instrument); + Assert.Equal("concelier.provenance.missing", second.Instrument); Assert.Equal("reference", second.Tags["category"]); Assert.Equal("low", second.Tags["severity"]); Assert.Equal(ProvenanceFieldMasks.References, second.Tags["fieldMask"]); @@ -106,14 +106,14 @@ public sealed class ProvenanceDiagnosticsTests VendorExtensions: new Dictionary { ["debian.release"] = "bullseye" })); var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary Tags)>(); - using var listener = CreateListener(measurements, "feedser.range.primitives"); + using var listener = CreateListener(measurements, "concelier.range.primitives"); ProvenanceDiagnostics.RecordRangePrimitive("source-D", range); listener.Dispose(); var record = Assert.Single(measurements); - Assert.Equal("feedser.range.primitives", record.Instrument); + Assert.Equal("concelier.range.primitives", record.Instrument); Assert.Equal(1, record.Value); Assert.Equal("source-D", record.Tags["source"]); Assert.Equal("evr", record.Tags["rangeKind"]); @@ -125,14 +125,14 @@ public sealed class ProvenanceDiagnosticsTests List<(string Instrument, long Value, IReadOnlyDictionary Tags)> measurements, params string[] instrumentNames) { - var allowed = instrumentNames is { Length: > 0 } ? instrumentNames : new[] { "feedser.provenance.missing" }; + var allowed = instrumentNames is { Length: > 0 } ? instrumentNames : new[] { "concelier.provenance.missing" }; var allowedSet = new HashSet(allowed, StringComparer.OrdinalIgnoreCase); var listener = new MeterListener { InstrumentPublished = (instrument, l) => { - if (instrument.Meter.Name == "StellaOps.Feedser.Models.Provenance" && allowedSet.Contains(instrument.Name)) + if (instrument.Meter.Name == "StellaOps.Concelier.Models.Provenance" && allowedSet.Contains(instrument.Name)) { l.EnableMeasurementEvents(instrument); } diff --git a/src/StellaOps.Feedser.Models.Tests/RangePrimitivesTests.cs b/src/StellaOps.Concelier.Models.Tests/RangePrimitivesTests.cs similarity index 93% rename from src/StellaOps.Feedser.Models.Tests/RangePrimitivesTests.cs rename to src/StellaOps.Concelier.Models.Tests/RangePrimitivesTests.cs index 82e55ea2..016ef2a5 100644 --- a/src/StellaOps.Feedser.Models.Tests/RangePrimitivesTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/RangePrimitivesTests.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class RangePrimitivesTests { diff --git a/src/StellaOps.Feedser.Models.Tests/SemVerPrimitiveTests.cs b/src/StellaOps.Concelier.Models.Tests/SemVerPrimitiveTests.cs similarity index 98% rename from src/StellaOps.Feedser.Models.Tests/SemVerPrimitiveTests.cs rename to src/StellaOps.Concelier.Models.Tests/SemVerPrimitiveTests.cs index 76990678..c80ebb61 100644 --- a/src/StellaOps.Feedser.Models.Tests/SemVerPrimitiveTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/SemVerPrimitiveTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class SemVerPrimitiveTests { diff --git a/src/StellaOps.Feedser.Models.Tests/SerializationDeterminismTests.cs b/src/StellaOps.Concelier.Models.Tests/SerializationDeterminismTests.cs similarity index 96% rename from src/StellaOps.Feedser.Models.Tests/SerializationDeterminismTests.cs rename to src/StellaOps.Concelier.Models.Tests/SerializationDeterminismTests.cs index 0f04755f..8ca1c797 100644 --- a/src/StellaOps.Feedser.Models.Tests/SerializationDeterminismTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/SerializationDeterminismTests.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class SerializationDeterminismTests { diff --git a/src/StellaOps.Feedser.Models.Tests/SeverityNormalizationTests.cs b/src/StellaOps.Concelier.Models.Tests/SeverityNormalizationTests.cs similarity index 92% rename from src/StellaOps.Feedser.Models.Tests/SeverityNormalizationTests.cs rename to src/StellaOps.Concelier.Models.Tests/SeverityNormalizationTests.cs index 04bc0f91..d8007744 100644 --- a/src/StellaOps.Feedser.Models.Tests/SeverityNormalizationTests.cs +++ b/src/StellaOps.Concelier.Models.Tests/SeverityNormalizationTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Models.Tests; +namespace StellaOps.Concelier.Models.Tests; public sealed class SeverityNormalizationTests { diff --git a/src/StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj b/src/StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj similarity index 79% rename from src/StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj rename to src/StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj index 8a7e97a1..5320b137 100644 --- a/src/StellaOps.Feedser.Models.Tests/StellaOps.Feedser.Models.Tests.csproj +++ b/src/StellaOps.Concelier.Models.Tests/StellaOps.Concelier.Models.Tests.csproj @@ -5,7 +5,7 @@ enable - + diff --git a/src/StellaOps.Feedser.Models/AGENTS.md b/src/StellaOps.Concelier.Models/AGENTS.md similarity index 92% rename from src/StellaOps.Feedser.Models/AGENTS.md rename to src/StellaOps.Concelier.Models/AGENTS.md index 481ffaeb..23beb90a 100644 --- a/src/StellaOps.Feedser.Models/AGENTS.md +++ b/src/StellaOps.Concelier.Models/AGENTS.md @@ -24,7 +24,7 @@ Out: fetching/parsing external schemas, storage, HTTP. - Provide debug renders for test snapshots (canonical JSON). - Emit model version identifiers in logs when canonical structures change; keep adapters for older readers until deprecated. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Models.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Models.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Models/Advisory.cs b/src/StellaOps.Concelier.Models/Advisory.cs similarity index 99% rename from src/StellaOps.Feedser.Models/Advisory.cs rename to src/StellaOps.Concelier.Models/Advisory.cs index 75a8ac19..d522d329 100644 --- a/src/StellaOps.Feedser.Models/Advisory.cs +++ b/src/StellaOps.Concelier.Models/Advisory.cs @@ -2,7 +2,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical advisory document produced after merge. Collections are pre-sorted for deterministic serialization. diff --git a/src/StellaOps.Feedser.Models/AdvisoryCredit.cs b/src/StellaOps.Concelier.Models/AdvisoryCredit.cs similarity index 98% rename from src/StellaOps.Feedser.Models/AdvisoryCredit.cs rename to src/StellaOps.Concelier.Models/AdvisoryCredit.cs index e4252410..278575d2 100644 --- a/src/StellaOps.Feedser.Models/AdvisoryCredit.cs +++ b/src/StellaOps.Concelier.Models/AdvisoryCredit.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical acknowledgement/credit metadata associated with an advisory. diff --git a/src/StellaOps.Feedser.Models/AdvisoryProvenance.cs b/src/StellaOps.Concelier.Models/AdvisoryProvenance.cs similarity index 98% rename from src/StellaOps.Feedser.Models/AdvisoryProvenance.cs rename to src/StellaOps.Concelier.Models/AdvisoryProvenance.cs index d70d4dce..00135935 100644 --- a/src/StellaOps.Feedser.Models/AdvisoryProvenance.cs +++ b/src/StellaOps.Concelier.Models/AdvisoryProvenance.cs @@ -2,7 +2,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Describes the origin of a canonical field and how/when it was captured. diff --git a/src/StellaOps.Feedser.Models/AdvisoryReference.cs b/src/StellaOps.Concelier.Models/AdvisoryReference.cs similarity index 93% rename from src/StellaOps.Feedser.Models/AdvisoryReference.cs rename to src/StellaOps.Concelier.Models/AdvisoryReference.cs index e173745c..0c414050 100644 --- a/src/StellaOps.Feedser.Models/AdvisoryReference.cs +++ b/src/StellaOps.Concelier.Models/AdvisoryReference.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical external reference associated with an advisory. diff --git a/src/StellaOps.Feedser.Models/AdvisoryWeakness.cs b/src/StellaOps.Concelier.Models/AdvisoryWeakness.cs similarity index 98% rename from src/StellaOps.Feedser.Models/AdvisoryWeakness.cs rename to src/StellaOps.Concelier.Models/AdvisoryWeakness.cs index d498e7ba..c68a6330 100644 --- a/src/StellaOps.Feedser.Models/AdvisoryWeakness.cs +++ b/src/StellaOps.Concelier.Models/AdvisoryWeakness.cs @@ -3,7 +3,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical weakness (e.g., CWE entry) associated with an advisory. diff --git a/src/StellaOps.Feedser.Models/AffectedPackage.cs b/src/StellaOps.Concelier.Models/AffectedPackage.cs similarity index 97% rename from src/StellaOps.Feedser.Models/AffectedPackage.cs rename to src/StellaOps.Concelier.Models/AffectedPackage.cs index a305ae02..922bcceb 100644 --- a/src/StellaOps.Feedser.Models/AffectedPackage.cs +++ b/src/StellaOps.Concelier.Models/AffectedPackage.cs @@ -4,7 +4,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical affected package descriptor with deterministic ordering of ranges and provenance. diff --git a/src/StellaOps.Feedser.Models/AffectedPackageStatus.cs b/src/StellaOps.Concelier.Models/AffectedPackageStatus.cs similarity index 94% rename from src/StellaOps.Feedser.Models/AffectedPackageStatus.cs rename to src/StellaOps.Concelier.Models/AffectedPackageStatus.cs index 5ca773b7..3e875bb1 100644 --- a/src/StellaOps.Feedser.Models/AffectedPackageStatus.cs +++ b/src/StellaOps.Concelier.Models/AffectedPackageStatus.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Represents a vendor-supplied status tag for an affected package when a concrete version range is unavailable or supplementary. diff --git a/src/StellaOps.Feedser.Models/AffectedPackageStatusCatalog.cs b/src/StellaOps.Concelier.Models/AffectedPackageStatusCatalog.cs similarity index 99% rename from src/StellaOps.Feedser.Models/AffectedPackageStatusCatalog.cs rename to src/StellaOps.Concelier.Models/AffectedPackageStatusCatalog.cs index 905fbee1..682a261d 100644 --- a/src/StellaOps.Feedser.Models/AffectedPackageStatusCatalog.cs +++ b/src/StellaOps.Concelier.Models/AffectedPackageStatusCatalog.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Central registry of allowed affected-package status labels to keep connectors consistent. diff --git a/src/StellaOps.Feedser.Models/AffectedVersionRange.cs b/src/StellaOps.Concelier.Models/AffectedVersionRange.cs similarity index 96% rename from src/StellaOps.Feedser.Models/AffectedVersionRange.cs rename to src/StellaOps.Concelier.Models/AffectedVersionRange.cs index a71e1224..e0e5d236 100644 --- a/src/StellaOps.Feedser.Models/AffectedVersionRange.cs +++ b/src/StellaOps.Concelier.Models/AffectedVersionRange.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Describes a contiguous range of versions impacted by an advisory. diff --git a/src/StellaOps.Feedser.Models/AffectedVersionRangeExtensions.cs b/src/StellaOps.Concelier.Models/AffectedVersionRangeExtensions.cs similarity index 99% rename from src/StellaOps.Feedser.Models/AffectedVersionRangeExtensions.cs rename to src/StellaOps.Concelier.Models/AffectedVersionRangeExtensions.cs index 6cc951cd..cbde8e54 100644 --- a/src/StellaOps.Feedser.Models/AffectedVersionRangeExtensions.cs +++ b/src/StellaOps.Concelier.Models/AffectedVersionRangeExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Helpers for deriving normalized version rules from affected version ranges. diff --git a/src/StellaOps.Feedser.Models/AliasSchemeRegistry.cs b/src/StellaOps.Concelier.Models/AliasSchemeRegistry.cs similarity index 97% rename from src/StellaOps.Feedser.Models/AliasSchemeRegistry.cs rename to src/StellaOps.Concelier.Models/AliasSchemeRegistry.cs index 5e5c01e5..7efd509b 100644 --- a/src/StellaOps.Feedser.Models/AliasSchemeRegistry.cs +++ b/src/StellaOps.Concelier.Models/AliasSchemeRegistry.cs @@ -4,7 +4,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; public static class AliasSchemeRegistry { diff --git a/src/StellaOps.Feedser.Models/AliasSchemes.cs b/src/StellaOps.Concelier.Models/AliasSchemes.cs similarity index 93% rename from src/StellaOps.Feedser.Models/AliasSchemes.cs rename to src/StellaOps.Concelier.Models/AliasSchemes.cs index 8227212a..ca60793d 100644 --- a/src/StellaOps.Feedser.Models/AliasSchemes.cs +++ b/src/StellaOps.Concelier.Models/AliasSchemes.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Well-known alias scheme identifiers referenced throughout the pipeline. diff --git a/src/StellaOps.Feedser.Models/BACKWARD_COMPATIBILITY.md b/src/StellaOps.Concelier.Models/BACKWARD_COMPATIBILITY.md similarity index 92% rename from src/StellaOps.Feedser.Models/BACKWARD_COMPATIBILITY.md rename to src/StellaOps.Concelier.Models/BACKWARD_COMPATIBILITY.md index 5cee4f67..09e97ed9 100644 --- a/src/StellaOps.Feedser.Models/BACKWARD_COMPATIBILITY.md +++ b/src/StellaOps.Concelier.Models/BACKWARD_COMPATIBILITY.md @@ -1,7 +1,7 @@ # Canonical Model Backward-Compatibility Playbook This playbook captures the policies and workflow required when evolving the canonical -`StellaOps.Feedser.Models` surface. +`StellaOps.Concelier.Models` surface. ## Principles @@ -33,7 +33,7 @@ This playbook captures the policies and workflow required when evolving the cano ## Testing Checklist -- `StellaOps.Feedser.Models.Tests` – update unit tests and golden examples. +- `StellaOps.Concelier.Models.Tests` – update unit tests and golden examples. - `Serialization determinism` – ensure the hash regression tests cover the new fields. - Exporter integration (`Json`, `TrivyDb`) – confirm manifests include provenance + tree metadata for the new shape. diff --git a/src/StellaOps.Feedser.Models/CANONICAL_RECORDS.md b/src/StellaOps.Concelier.Models/CANONICAL_RECORDS.md similarity index 97% rename from src/StellaOps.Feedser.Models/CANONICAL_RECORDS.md rename to src/StellaOps.Concelier.Models/CANONICAL_RECORDS.md index 0eaf32f4..4da20b58 100644 --- a/src/StellaOps.Feedser.Models/CANONICAL_RECORDS.md +++ b/src/StellaOps.Concelier.Models/CANONICAL_RECORDS.md @@ -1,7 +1,7 @@ # Canonical Record Definitions -> Source of truth for the normalized advisory schema emitted by `StellaOps.Feedser.Models`. -> Keep this document in sync with the public record types under `StellaOps.Feedser.Models` and +> Source of truth for the normalized advisory schema emitted by `StellaOps.Concelier.Models`. +> Keep this document in sync with the public record types under `StellaOps.Concelier.Models` and > update it whenever a new field is introduced or semantics change. ## Advisory diff --git a/src/StellaOps.Feedser.Models/CanonicalJsonSerializer.cs b/src/StellaOps.Concelier.Models/CanonicalJsonSerializer.cs similarity index 99% rename from src/StellaOps.Feedser.Models/CanonicalJsonSerializer.cs rename to src/StellaOps.Concelier.Models/CanonicalJsonSerializer.cs index 337fe129..c89d6b73 100644 --- a/src/StellaOps.Feedser.Models/CanonicalJsonSerializer.cs +++ b/src/StellaOps.Concelier.Models/CanonicalJsonSerializer.cs @@ -5,7 +5,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Deterministic JSON serializer tuned for canonical advisory output. diff --git a/src/StellaOps.Feedser.Models/CvssMetric.cs b/src/StellaOps.Concelier.Models/CvssMetric.cs similarity index 94% rename from src/StellaOps.Feedser.Models/CvssMetric.cs rename to src/StellaOps.Concelier.Models/CvssMetric.cs index 90765754..c7dacf06 100644 --- a/src/StellaOps.Feedser.Models/CvssMetric.cs +++ b/src/StellaOps.Concelier.Models/CvssMetric.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonicalized CVSS metric details supporting deterministic serialization. diff --git a/src/StellaOps.Feedser.Models/EvrPrimitiveExtensions.cs b/src/StellaOps.Concelier.Models/EvrPrimitiveExtensions.cs similarity index 98% rename from src/StellaOps.Feedser.Models/EvrPrimitiveExtensions.cs rename to src/StellaOps.Concelier.Models/EvrPrimitiveExtensions.cs index f979ccd6..6736821f 100644 --- a/src/StellaOps.Feedser.Models/EvrPrimitiveExtensions.cs +++ b/src/StellaOps.Concelier.Models/EvrPrimitiveExtensions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Helper extensions for converting instances into normalized rules. diff --git a/src/StellaOps.Feedser.Models/NevraPrimitiveExtensions.cs b/src/StellaOps.Concelier.Models/NevraPrimitiveExtensions.cs similarity index 98% rename from src/StellaOps.Feedser.Models/NevraPrimitiveExtensions.cs rename to src/StellaOps.Concelier.Models/NevraPrimitiveExtensions.cs index f5b5550a..4479e40d 100644 --- a/src/StellaOps.Feedser.Models/NevraPrimitiveExtensions.cs +++ b/src/StellaOps.Concelier.Models/NevraPrimitiveExtensions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Helper extensions for converting instances into normalized rules. diff --git a/src/StellaOps.Feedser.Models/NormalizedVersionRule.cs b/src/StellaOps.Concelier.Models/NormalizedVersionRule.cs similarity index 99% rename from src/StellaOps.Feedser.Models/NormalizedVersionRule.cs rename to src/StellaOps.Concelier.Models/NormalizedVersionRule.cs index 86406b34..61cd855b 100644 --- a/src/StellaOps.Feedser.Models/NormalizedVersionRule.cs +++ b/src/StellaOps.Concelier.Models/NormalizedVersionRule.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical normalized version rule emitted by range builders for analytical queries. diff --git a/src/StellaOps.Feedser.Models/OsvGhsaParityDiagnostics.cs b/src/StellaOps.Concelier.Models/OsvGhsaParityDiagnostics.cs similarity index 91% rename from src/StellaOps.Feedser.Models/OsvGhsaParityDiagnostics.cs rename to src/StellaOps.Concelier.Models/OsvGhsaParityDiagnostics.cs index fa2757b0..ad327711 100644 --- a/src/StellaOps.Feedser.Models/OsvGhsaParityDiagnostics.cs +++ b/src/StellaOps.Concelier.Models/OsvGhsaParityDiagnostics.cs @@ -2,20 +2,20 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Emits telemetry for OSV vs GHSA parity reports so QA dashboards can track regression trends. /// public static class OsvGhsaParityDiagnostics { - private static readonly Meter Meter = new("StellaOps.Feedser.Models.OsvGhsaParity"); + private static readonly Meter Meter = new("StellaOps.Concelier.Models.OsvGhsaParity"); private static readonly Counter TotalCounter = Meter.CreateCounter( - "feedser.osv_ghsa.total", + "concelier.osv_ghsa.total", unit: "count", description: "Total GHSA identifiers evaluated for OSV parity."); private static readonly Counter IssueCounter = Meter.CreateCounter( - "feedser.osv_ghsa.issues", + "concelier.osv_ghsa.issues", unit: "count", description: "Parity issues grouped by dataset, issue kind, and field mask."); diff --git a/src/StellaOps.Feedser.Models/OsvGhsaParityInspector.cs b/src/StellaOps.Concelier.Models/OsvGhsaParityInspector.cs similarity index 99% rename from src/StellaOps.Feedser.Models/OsvGhsaParityInspector.cs rename to src/StellaOps.Concelier.Models/OsvGhsaParityInspector.cs index 0ab7e862..12be939c 100644 --- a/src/StellaOps.Feedser.Models/OsvGhsaParityInspector.cs +++ b/src/StellaOps.Concelier.Models/OsvGhsaParityInspector.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Compares OSV and GHSA advisory datasets to surface mismatches in coverage, severity, or presence. diff --git a/src/StellaOps.Feedser.Models/PROVENANCE_GUIDELINES.md b/src/StellaOps.Concelier.Models/PROVENANCE_GUIDELINES.md similarity index 84% rename from src/StellaOps.Feedser.Models/PROVENANCE_GUIDELINES.md rename to src/StellaOps.Concelier.Models/PROVENANCE_GUIDELINES.md index 4c6f9166..aa4bbc1b 100644 --- a/src/StellaOps.Feedser.Models/PROVENANCE_GUIDELINES.md +++ b/src/StellaOps.Concelier.Models/PROVENANCE_GUIDELINES.md @@ -1,6 +1,6 @@ # Canonical Field Provenance Guidelines -- **Always attach provenance** when mapping any field into `StellaOps.Feedser.Models`. Use `AdvisoryProvenance` to capture `source` (feed identifier), `kind` (fetch|parse|map|merge), `value` (cursor or extractor hint), and the UTC timestamp when it was recorded. +- **Always attach provenance** when mapping any field into `StellaOps.Concelier.Models`. Use `AdvisoryProvenance` to capture `source` (feed identifier), `kind` (fetch|parse|map|merge), `value` (cursor or extractor hint), and the UTC timestamp when it was recorded. - **Per-field strategy** - `Advisory` metadata (title, summary, severity) should record the connector responsible for the value. When merge overrides occur, add an additional provenance record rather than mutating the original. - `References` must record whether the link originated from the primary advisory (`kind=advisory`), a vendor patch (`kind=patch`), or an enrichment feed (`kind=enrichment`). @@ -11,5 +11,5 @@ - **Determinism**: provenance collections are sorted by source → kind → recordedAt before serialization; avoid generating random identifiers inside provenance. - **Field masks**: populate `fieldMask` on each provenance entry using lowercase canonical masks (see `ProvenanceFieldMasks`). This powers metrics, parity checks, and resume diagnostics. Recent additions include `affectedpackages[].normalizedversions[]`, `affectedpackages[].versionranges[].primitives.semver`, and `credits[]`. - **Redaction**: keep provenance values free of secrets; prefer tokens or normalized descriptors when referencing authenticated fetches. -- **Range telemetry**: each `AffectedVersionRange` is observed by the `feedser.range.primitives` metric. Emit the richest `RangePrimitives` possible (SemVer/NEVRA/EVR plus vendor extensions); the telemetry tags make it easy to spot connectors missing structured range data. +- **Range telemetry**: each `AffectedVersionRange` is observed by the `concelier.range.primitives` metric. Emit the richest `RangePrimitives` possible (SemVer/NEVRA/EVR plus vendor extensions); the telemetry tags make it easy to spot connectors missing structured range data. - **Vendor extensions**: when vendor feeds surface bespoke status flags, capture them in `RangePrimitives.VendorExtensions`. SUSE advisories publish `suse.status` (open/resolved/investigating) and Ubuntu notices expose `ubuntu.pocket`/`ubuntu.release` to distinguish security vs ESM pockets; Adobe APSB bulletins emit `adobe.track`, `adobe.platform`, `adobe.priority`, `adobe.availability`, plus `adobe.affected.raw`/`adobe.updated.raw` to preserve PSIRT metadata while keeping the status catalog canonical. These values are exported for dashboards and alerting. diff --git a/src/StellaOps.Feedser.Models/ProvenanceFieldMasks.cs b/src/StellaOps.Concelier.Models/ProvenanceFieldMasks.cs similarity index 94% rename from src/StellaOps.Feedser.Models/ProvenanceFieldMasks.cs rename to src/StellaOps.Concelier.Models/ProvenanceFieldMasks.cs index 8d0695cd..d8eeca94 100644 --- a/src/StellaOps.Feedser.Models/ProvenanceFieldMasks.cs +++ b/src/StellaOps.Concelier.Models/ProvenanceFieldMasks.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Canonical field-mask identifiers for provenance coverage. diff --git a/src/StellaOps.Feedser.Models/ProvenanceInspector.cs b/src/StellaOps.Concelier.Models/ProvenanceInspector.cs similarity index 96% rename from src/StellaOps.Feedser.Models/ProvenanceInspector.cs rename to src/StellaOps.Concelier.Models/ProvenanceInspector.cs index d867e14b..acf97aa4 100644 --- a/src/StellaOps.Feedser.Models/ProvenanceInspector.cs +++ b/src/StellaOps.Concelier.Models/ProvenanceInspector.cs @@ -5,7 +5,7 @@ using System.Diagnostics.Metrics; using System.Linq; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; public static class ProvenanceInspector { @@ -111,13 +111,13 @@ public sealed record MissingProvenance( public static class ProvenanceDiagnostics { - private static readonly Meter Meter = new("StellaOps.Feedser.Models.Provenance"); + private static readonly Meter Meter = new("StellaOps.Concelier.Models.Provenance"); private static readonly Counter MissingCounter = Meter.CreateCounter( - "feedser.provenance.missing", + "concelier.provenance.missing", unit: "count", description: "Number of canonical objects missing provenance metadata."); private static readonly Counter RangePrimitiveCounter = Meter.CreateCounter( - "feedser.range.primitives", + "concelier.range.primitives", unit: "count", description: "Range coverage by kind, primitive availability, and vendor extensions."); diff --git a/src/StellaOps.Feedser.Models/RangePrimitives.cs b/src/StellaOps.Concelier.Models/RangePrimitives.cs similarity index 98% rename from src/StellaOps.Feedser.Models/RangePrimitives.cs rename to src/StellaOps.Concelier.Models/RangePrimitives.cs index 635163a5..2f645bba 100644 --- a/src/StellaOps.Feedser.Models/RangePrimitives.cs +++ b/src/StellaOps.Concelier.Models/RangePrimitives.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Optional structured representations of range semantics attached to . diff --git a/src/StellaOps.Feedser.Models/SemVerPrimitiveExtensions.cs b/src/StellaOps.Concelier.Models/SemVerPrimitiveExtensions.cs similarity index 98% rename from src/StellaOps.Feedser.Models/SemVerPrimitiveExtensions.cs rename to src/StellaOps.Concelier.Models/SemVerPrimitiveExtensions.cs index e99f6fab..60c64eb8 100644 --- a/src/StellaOps.Feedser.Models/SemVerPrimitiveExtensions.cs +++ b/src/StellaOps.Concelier.Models/SemVerPrimitiveExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Helper extensions for converting values into normalized rules. diff --git a/src/StellaOps.Feedser.Models/SeverityNormalization.cs b/src/StellaOps.Concelier.Models/SeverityNormalization.cs similarity index 98% rename from src/StellaOps.Feedser.Models/SeverityNormalization.cs rename to src/StellaOps.Concelier.Models/SeverityNormalization.cs index 280d528c..c33bb0f9 100644 --- a/src/StellaOps.Feedser.Models/SeverityNormalization.cs +++ b/src/StellaOps.Concelier.Models/SeverityNormalization.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Provides helpers to normalize vendor-provided severity labels into canonical values. diff --git a/src/StellaOps.Feedser.Models/SnapshotSerializer.cs b/src/StellaOps.Concelier.Models/SnapshotSerializer.cs similarity index 93% rename from src/StellaOps.Feedser.Models/SnapshotSerializer.cs rename to src/StellaOps.Concelier.Models/SnapshotSerializer.cs index 101c044f..3b621d69 100644 --- a/src/StellaOps.Feedser.Models/SnapshotSerializer.cs +++ b/src/StellaOps.Concelier.Models/SnapshotSerializer.cs @@ -1,7 +1,7 @@ using System.Text; using System.Text.Json; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Helper for tests/fixtures that need deterministic JSON snapshots. diff --git a/src/StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj b/src/StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj similarity index 100% rename from src/StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj rename to src/StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj diff --git a/src/StellaOps.Feedser.Models/TASKS.md b/src/StellaOps.Concelier.Models/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Models/TASKS.md rename to src/StellaOps.Concelier.Models/TASKS.md diff --git a/src/StellaOps.Feedser.Models/Validation.cs b/src/StellaOps.Concelier.Models/Validation.cs similarity index 94% rename from src/StellaOps.Feedser.Models/Validation.cs rename to src/StellaOps.Concelier.Models/Validation.cs index 6f1b0bdd..bcc5bbd2 100644 --- a/src/StellaOps.Feedser.Models/Validation.cs +++ b/src/StellaOps.Concelier.Models/Validation.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Models; +namespace StellaOps.Concelier.Models; /// /// Lightweight validation helpers shared across canonical model constructors. diff --git a/src/StellaOps.Feedser.Normalization.Tests/CpeNormalizerTests.cs b/src/StellaOps.Concelier.Normalization.Tests/CpeNormalizerTests.cs similarity index 92% rename from src/StellaOps.Feedser.Normalization.Tests/CpeNormalizerTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/CpeNormalizerTests.cs index 4fdf8a45..8842660f 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/CpeNormalizerTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/CpeNormalizerTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Identifiers; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class CpeNormalizerTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/CvssMetricNormalizerTests.cs b/src/StellaOps.Concelier.Normalization.Tests/CvssMetricNormalizerTests.cs similarity index 90% rename from src/StellaOps.Feedser.Normalization.Tests/CvssMetricNormalizerTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/CvssMetricNormalizerTests.cs index 1635e078..4eff58a2 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/CvssMetricNormalizerTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/CvssMetricNormalizerTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class CvssMetricNormalizerTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/DebianEvrParserTests.cs b/src/StellaOps.Concelier.Normalization.Tests/DebianEvrParserTests.cs similarity index 84% rename from src/StellaOps.Feedser.Normalization.Tests/DebianEvrParserTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/DebianEvrParserTests.cs index dbc4f4a9..f6447318 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/DebianEvrParserTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/DebianEvrParserTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Normalization.Distro; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class DebianEvrParserTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/DescriptionNormalizerTests.cs b/src/StellaOps.Concelier.Normalization.Tests/DescriptionNormalizerTests.cs similarity index 88% rename from src/StellaOps.Feedser.Normalization.Tests/DescriptionNormalizerTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/DescriptionNormalizerTests.cs index 79b7f25b..b6a289ed 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/DescriptionNormalizerTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/DescriptionNormalizerTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Normalization.Text; +using StellaOps.Concelier.Normalization.Text; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class DescriptionNormalizerTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/NevraParserTests.cs b/src/StellaOps.Concelier.Normalization.Tests/NevraParserTests.cs similarity index 91% rename from src/StellaOps.Feedser.Normalization.Tests/NevraParserTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/NevraParserTests.cs index 6a16797d..ab44f846 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/NevraParserTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/NevraParserTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Normalization.Distro; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class NevraParserTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/PackageUrlNormalizerTests.cs b/src/StellaOps.Concelier.Normalization.Tests/PackageUrlNormalizerTests.cs similarity index 89% rename from src/StellaOps.Feedser.Normalization.Tests/PackageUrlNormalizerTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/PackageUrlNormalizerTests.cs index 99599d30..22b19c31 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/PackageUrlNormalizerTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/PackageUrlNormalizerTests.cs @@ -1,7 +1,7 @@ using System.Linq; -using StellaOps.Feedser.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Identifiers; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class PackageUrlNormalizerTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/SemVerRangeRuleBuilderTests.cs b/src/StellaOps.Concelier.Normalization.Tests/SemVerRangeRuleBuilderTests.cs similarity index 98% rename from src/StellaOps.Feedser.Normalization.Tests/SemVerRangeRuleBuilderTests.cs rename to src/StellaOps.Concelier.Normalization.Tests/SemVerRangeRuleBuilderTests.cs index f90efa5f..4d659422 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/SemVerRangeRuleBuilderTests.cs +++ b/src/StellaOps.Concelier.Normalization.Tests/SemVerRangeRuleBuilderTests.cs @@ -1,8 +1,8 @@ -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.SemVer; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.SemVer; using Xunit; -namespace StellaOps.Feedser.Normalization.Tests; +namespace StellaOps.Concelier.Normalization.Tests; public sealed class SemVerRangeRuleBuilderTests { diff --git a/src/StellaOps.Feedser.Normalization.Tests/StellaOps.Feedser.Normalization.Tests.csproj b/src/StellaOps.Concelier.Normalization.Tests/StellaOps.Concelier.Normalization.Tests.csproj similarity index 51% rename from src/StellaOps.Feedser.Normalization.Tests/StellaOps.Feedser.Normalization.Tests.csproj rename to src/StellaOps.Concelier.Normalization.Tests/StellaOps.Concelier.Normalization.Tests.csproj index 0c41a48f..3b6886da 100644 --- a/src/StellaOps.Feedser.Normalization.Tests/StellaOps.Feedser.Normalization.Tests.csproj +++ b/src/StellaOps.Concelier.Normalization.Tests/StellaOps.Concelier.Normalization.Tests.csproj @@ -5,7 +5,7 @@ enable - - + + diff --git a/src/StellaOps.Feedser.Normalization/AssemblyInfo.cs b/src/StellaOps.Concelier.Normalization/AssemblyInfo.cs similarity index 59% rename from src/StellaOps.Feedser.Normalization/AssemblyInfo.cs rename to src/StellaOps.Concelier.Normalization/AssemblyInfo.cs index c367451d..425bb5d0 100644 --- a/src/StellaOps.Feedser.Normalization/AssemblyInfo.cs +++ b/src/StellaOps.Concelier.Normalization/AssemblyInfo.cs @@ -1,8 +1,8 @@ using System.Reflection; [assembly: AssemblyCompany("StellaOps")] -[assembly: AssemblyProduct("StellaOps.Feedser.Normalization")] -[assembly: AssemblyTitle("StellaOps.Feedser.Normalization")] +[assembly: AssemblyProduct("StellaOps.Concelier.Normalization")] +[assembly: AssemblyTitle("StellaOps.Concelier.Normalization")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] diff --git a/src/StellaOps.Feedser.Normalization/Cvss/CvssMetricNormalizer.cs b/src/StellaOps.Concelier.Normalization/Cvss/CvssMetricNormalizer.cs similarity index 96% rename from src/StellaOps.Feedser.Normalization/Cvss/CvssMetricNormalizer.cs rename to src/StellaOps.Concelier.Normalization/Cvss/CvssMetricNormalizer.cs index b6aecb23..698a27fe 100644 --- a/src/StellaOps.Feedser.Normalization/Cvss/CvssMetricNormalizer.cs +++ b/src/StellaOps.Concelier.Normalization/Cvss/CvssMetricNormalizer.cs @@ -1,8 +1,8 @@ using System.Collections.Immutable; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Normalization.Cvss; +namespace StellaOps.Concelier.Normalization.Cvss; /// /// Provides helpers to canonicalize CVSS vectors and fill in derived score/severity information. diff --git a/src/StellaOps.Feedser.Normalization/Distro/DebianEvr.cs b/src/StellaOps.Concelier.Normalization/Distro/DebianEvr.cs similarity index 95% rename from src/StellaOps.Feedser.Normalization/Distro/DebianEvr.cs rename to src/StellaOps.Concelier.Normalization/Distro/DebianEvr.cs index f563d869..afe5a132 100644 --- a/src/StellaOps.Feedser.Normalization/Distro/DebianEvr.cs +++ b/src/StellaOps.Concelier.Normalization/Distro/DebianEvr.cs @@ -1,6 +1,6 @@ using System.Globalization; -namespace StellaOps.Feedser.Normalization.Distro; +namespace StellaOps.Concelier.Normalization.Distro; /// /// Represents a Debian epoch:version-revision tuple and exposes parsing/formatting helpers. diff --git a/src/StellaOps.Feedser.Normalization/Distro/Nevra.cs b/src/StellaOps.Concelier.Normalization/Distro/Nevra.cs similarity index 95% rename from src/StellaOps.Feedser.Normalization/Distro/Nevra.cs rename to src/StellaOps.Concelier.Normalization/Distro/Nevra.cs index daf61944..c34ae453 100644 --- a/src/StellaOps.Feedser.Normalization/Distro/Nevra.cs +++ b/src/StellaOps.Concelier.Normalization/Distro/Nevra.cs @@ -1,6 +1,6 @@ using System.Globalization; -namespace StellaOps.Feedser.Normalization.Distro; +namespace StellaOps.Concelier.Normalization.Distro; /// /// Represents a parsed NEVRA (Name-Epoch:Version-Release.Architecture) identifier and exposes helpers for canonical formatting. diff --git a/src/StellaOps.Feedser.Normalization/Identifiers/Cpe23.cs b/src/StellaOps.Concelier.Normalization/Identifiers/Cpe23.cs similarity index 96% rename from src/StellaOps.Feedser.Normalization/Identifiers/Cpe23.cs rename to src/StellaOps.Concelier.Normalization/Identifiers/Cpe23.cs index bd92d20d..4ae8ecff 100644 --- a/src/StellaOps.Feedser.Normalization/Identifiers/Cpe23.cs +++ b/src/StellaOps.Concelier.Normalization/Identifiers/Cpe23.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text; -namespace StellaOps.Feedser.Normalization.Identifiers; +namespace StellaOps.Concelier.Normalization.Identifiers; /// /// Implements canonical normalization for CPE 2.3 identifiers (and URI binding conversion). diff --git a/src/StellaOps.Feedser.Normalization/Identifiers/IdentifierNormalizer.cs b/src/StellaOps.Concelier.Normalization/Identifiers/IdentifierNormalizer.cs similarity index 90% rename from src/StellaOps.Feedser.Normalization/Identifiers/IdentifierNormalizer.cs rename to src/StellaOps.Concelier.Normalization/Identifiers/IdentifierNormalizer.cs index 6b36081f..6c3da4c2 100644 --- a/src/StellaOps.Feedser.Normalization/Identifiers/IdentifierNormalizer.cs +++ b/src/StellaOps.Concelier.Normalization/Identifiers/IdentifierNormalizer.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Normalization.Identifiers; +namespace StellaOps.Concelier.Normalization.Identifiers; /// /// Provides canonical normalization helpers for package identifiers. diff --git a/src/StellaOps.Feedser.Normalization/Identifiers/PackageUrl.cs b/src/StellaOps.Concelier.Normalization/Identifiers/PackageUrl.cs similarity index 95% rename from src/StellaOps.Feedser.Normalization/Identifiers/PackageUrl.cs rename to src/StellaOps.Concelier.Normalization/Identifiers/PackageUrl.cs index fbfda254..d9f1b106 100644 --- a/src/StellaOps.Feedser.Normalization/Identifiers/PackageUrl.cs +++ b/src/StellaOps.Concelier.Normalization/Identifiers/PackageUrl.cs @@ -2,7 +2,7 @@ using System.Collections.Immutable; using System.Linq; using System.Text; -namespace StellaOps.Feedser.Normalization.Identifiers; +namespace StellaOps.Concelier.Normalization.Identifiers; /// /// Represents a parsed Package URL (purl) identifier with canonical string rendering. diff --git a/src/StellaOps.Feedser.Normalization/SemVer/SemVerRangeRuleBuilder.cs b/src/StellaOps.Concelier.Normalization/SemVer/SemVerRangeRuleBuilder.cs similarity index 99% rename from src/StellaOps.Feedser.Normalization/SemVer/SemVerRangeRuleBuilder.cs rename to src/StellaOps.Concelier.Normalization/SemVer/SemVerRangeRuleBuilder.cs index 392324b2..98c13d8f 100644 --- a/src/StellaOps.Feedser.Normalization/SemVer/SemVerRangeRuleBuilder.cs +++ b/src/StellaOps.Concelier.Normalization/SemVer/SemVerRangeRuleBuilder.cs @@ -6,9 +6,9 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using NuGet.Versioning; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Normalization.SemVer; +namespace StellaOps.Concelier.Normalization.SemVer; /// /// Parses SemVer-style range expressions into deterministic primitives and normalized rules. diff --git a/src/StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj b/src/StellaOps.Concelier.Normalization/StellaOps.Concelier.Normalization.csproj similarity index 81% rename from src/StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj rename to src/StellaOps.Concelier.Normalization/StellaOps.Concelier.Normalization.csproj index 203716ed..e3e2f671 100644 --- a/src/StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj +++ b/src/StellaOps.Concelier.Normalization/StellaOps.Concelier.Normalization.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/StellaOps.Feedser.Normalization/TASKS.md b/src/StellaOps.Concelier.Normalization/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Normalization/TASKS.md rename to src/StellaOps.Concelier.Normalization/TASKS.md diff --git a/src/StellaOps.Feedser.Normalization/Text/DescriptionNormalizer.cs b/src/StellaOps.Concelier.Normalization/Text/DescriptionNormalizer.cs similarity index 95% rename from src/StellaOps.Feedser.Normalization/Text/DescriptionNormalizer.cs rename to src/StellaOps.Concelier.Normalization/Text/DescriptionNormalizer.cs index d43d25a5..047f2511 100644 --- a/src/StellaOps.Feedser.Normalization/Text/DescriptionNormalizer.cs +++ b/src/StellaOps.Concelier.Normalization/Text/DescriptionNormalizer.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Net; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Normalization.Text; +namespace StellaOps.Concelier.Normalization.Text; /// /// Normalizes advisory descriptions by stripping markup, collapsing whitespace, and selecting the best locale fallback. diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs rename to src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs index b5e29013..025b29c1 100644 --- a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs +++ b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorFetchTests.cs @@ -10,17 +10,17 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Source.Acsc; -using StellaOps.Feedser.Source.Acsc.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Acsc; +using StellaOps.Concelier.Source.Acsc.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Acsc.Tests.Acsc; +namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; [Collection("mongo-fixture")] public sealed class AcscConnectorFetchTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs rename to src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs index a54ac2ae..05b312f8 100644 --- a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs +++ b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscConnectorParseTests.cs @@ -9,20 +9,20 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Acsc; -using StellaOps.Feedser.Source.Acsc.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Acsc; +using StellaOps.Concelier.Source.Acsc.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Acsc.Tests.Acsc; +namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; [Collection("mongo-fixture")] public sealed class AcscConnectorParseTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs rename to src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs index 45750968..c05eacab 100644 --- a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs +++ b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/AcscHttpClientConfigurationTests.cs @@ -2,11 +2,11 @@ using System.Net; using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Acsc.Configuration; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.Acsc.Configuration; +using StellaOps.Concelier.Source.Common.Http; using Xunit; -namespace StellaOps.Feedser.Source.Acsc.Tests.Acsc; +namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc; public sealed class AcscHttpClientConfigurationTests { @@ -32,7 +32,7 @@ public sealed class AcscHttpClientConfigurationTests var monitor = provider.GetRequiredService>(); var options = monitor.Get(AcscOptions.HttpClientName); - Assert.Equal("StellaOps/Feedser (+https://stella-ops.org)", options.UserAgent); + Assert.Equal("StellaOps/Concelier (+https://stella-ops.org)", options.UserAgent); Assert.Equal(HttpVersion.Version20, options.RequestVersion); Assert.Equal(HttpVersionPolicy.RequestVersionOrLower, options.VersionPolicy); Assert.Equal(TimeSpan.FromSeconds(42), options.Timeout); diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories-multi.snapshot.json b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories-multi.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories-multi.snapshot.json rename to src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories-multi.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Acsc.Tests/Acsc/Fixtures/acsc-advisories.snapshot.json diff --git a/src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj b/src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj new file mode 100644 index 00000000..71714c17 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj @@ -0,0 +1,19 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Acsc/AGENTS.md b/src/StellaOps.Concelier.Source.Acsc/AGENTS.md similarity index 84% rename from src/StellaOps.Feedser.Source.Acsc/AGENTS.md rename to src/StellaOps.Concelier.Source.Acsc/AGENTS.md index c090d238..849d6d3f 100644 --- a/src/StellaOps.Feedser.Source.Acsc/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Acsc/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Bootstrap the ACSC (Australian Cyber Security Centre) advisories connector so the Feedser pipeline can ingest, normalise, and enrich ACSC security bulletins. +Bootstrap the ACSC (Australian Cyber Security Centre) advisories connector so the Concelier pipeline can ingest, normalise, and enrich ACSC security bulletins. ## Scope - Research the authoritative ACSC advisory feed (RSS/Atom, JSON API, or HTML). @@ -12,8 +12,8 @@ Bootstrap the ACSC (Australian Cyber Security Centre) advisories connector so th ## Participants - `Source.Common` for HTTP client creation, fetch service, and DTO persistence helpers. - `Storage.Mongo` for raw/document/DTO/advisory storage plus cursor management. -- `Feedser.Models` for canonical advisory structures and provenance utilities. -- `Feedser.Testing` for integration harnesses and snapshot helpers. +- `Concelier.Models` for canonical advisory structures and provenance utilities. +- `Concelier.Testing` for integration harnesses and snapshot helpers. ## Interfaces & Contracts - Job kinds should follow the pattern `acsc:fetch`, `acsc:parse`, `acsc:map`. @@ -35,6 +35,6 @@ Out of scope: - Handle transient fetch failures gracefully with exponential backoff and mark failures in source state. ## Tests -- Add integration-style tests under `StellaOps.Feedser.Source.Acsc.Tests` covering fetch/parse/map with canned fixtures. +- Add integration-style tests under `StellaOps.Concelier.Source.Acsc.Tests` covering fetch/parse/map with canned fixtures. - Snapshot canonical advisories; provide UPDATE flag flow for regeneration. - Validate determinism (ordering, casing, timestamps) to satisfy pipeline reproducibility requirements. diff --git a/src/StellaOps.Feedser.Source.Acsc/AcscConnector.cs b/src/StellaOps.Concelier.Source.Acsc/AcscConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Acsc/AcscConnector.cs rename to src/StellaOps.Concelier.Source.Acsc/AcscConnector.cs index 59b61f6f..2f3467e9 100644 --- a/src/StellaOps.Feedser.Source.Acsc/AcscConnector.cs +++ b/src/StellaOps.Concelier.Source.Acsc/AcscConnector.cs @@ -12,18 +12,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Source.Acsc.Configuration; -using StellaOps.Feedser.Source.Acsc.Internal; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.Advisories; +using StellaOps.Concelier.Source.Acsc.Configuration; +using StellaOps.Concelier.Source.Acsc.Internal; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.Advisories; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Acsc; +namespace StellaOps.Concelier.Source.Acsc; public sealed class AcscConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Acsc/AcscConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Acsc/AcscConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Acsc/AcscConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Acsc/AcscConnectorPlugin.cs index 7eb57d24..7fa46f3c 100644 --- a/src/StellaOps.Feedser.Source.Acsc/AcscConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Acsc/AcscConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Acsc; +namespace StellaOps.Concelier.Source.Acsc; public sealed class AcscConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Acsc/AcscDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Acsc/AcscDependencyInjectionRoutine.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Acsc/AcscDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Acsc/AcscDependencyInjectionRoutine.cs index bb99dfb5..fc8f9287 100644 --- a/src/StellaOps.Feedser.Source.Acsc/AcscDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Acsc/AcscDependencyInjectionRoutine.cs @@ -1,14 +1,14 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Acsc.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Acsc.Configuration; -namespace StellaOps.Feedser.Source.Acsc; +namespace StellaOps.Concelier.Source.Acsc; public sealed class AcscDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:acsc"; + private const string ConfigurationSection = "concelier:sources:acsc"; private const string FetchCron = "7,37 * * * *"; private const string ParseCron = "12,42 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Acsc/AcscServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Acsc/AcscServiceCollectionExtensions.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Acsc/AcscServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Acsc/AcscServiceCollectionExtensions.cs index 048e1d28..8845bb73 100644 --- a/src/StellaOps.Feedser.Source.Acsc/AcscServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Acsc/AcscServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Acsc.Configuration; -using StellaOps.Feedser.Source.Acsc.Internal; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.Acsc.Configuration; +using StellaOps.Concelier.Source.Acsc.Internal; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.Acsc; +namespace StellaOps.Concelier.Source.Acsc; public static class AcscServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Acsc/Configuration/AcscFeedOptions.cs b/src/StellaOps.Concelier.Source.Acsc/Configuration/AcscFeedOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Acsc/Configuration/AcscFeedOptions.cs rename to src/StellaOps.Concelier.Source.Acsc/Configuration/AcscFeedOptions.cs index f44e7380..919bedf9 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Configuration/AcscFeedOptions.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Configuration/AcscFeedOptions.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.Acsc.Configuration; +namespace StellaOps.Concelier.Source.Acsc.Configuration; /// /// Defines a single ACSC RSS feed endpoint. diff --git a/src/StellaOps.Feedser.Source.Acsc/Configuration/AcscOptions.cs b/src/StellaOps.Concelier.Source.Acsc/Configuration/AcscOptions.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Acsc/Configuration/AcscOptions.cs rename to src/StellaOps.Concelier.Source.Acsc/Configuration/AcscOptions.cs index d6ea8ba9..3e07f5bd 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Configuration/AcscOptions.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Configuration/AcscOptions.cs @@ -1,7 +1,7 @@ using System.Net; using System.Net.Http; -namespace StellaOps.Feedser.Source.Acsc.Configuration; +namespace StellaOps.Concelier.Source.Acsc.Configuration; /// /// Connector options governing ACSC feed access and retry behaviour. @@ -69,7 +69,7 @@ public sealed class AcscOptions /// /// User-agent header sent with outbound requests. /// - public string UserAgent { get; set; } = "StellaOps/Feedser (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps/Concelier (+https://stella-ops.org)"; /// /// RSS feeds requested during fetch. diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscCursor.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscCursor.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscCursor.cs index 29f3d196..56472c02 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscCursor.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscCursor.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; internal enum AcscEndpointPreference { diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDiagnostics.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDiagnostics.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscDiagnostics.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscDiagnostics.cs index e5bea7b2..50caef03 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; public sealed class AcscDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Acsc"; + private const string MeterName = "StellaOps.Concelier.Source.Acsc"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDocumentMetadata.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscDocumentMetadata.cs index bfb12acb..5a594637 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDocumentMetadata.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; internal readonly record struct AcscDocumentMetadata(string FeedSlug, string FetchMode) { diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDto.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDto.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscDto.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscDto.cs index 7ad11068..c4c92627 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscDto.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscDto.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; internal sealed record AcscFeedDto( [property: JsonPropertyName("feedSlug")] string FeedSlug, diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscFeedParser.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscFeedParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscFeedParser.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscFeedParser.cs index e813907e..428b3388 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscFeedParser.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscFeedParser.cs @@ -4,9 +4,9 @@ using System.Xml.Linq; using AngleSharp.Dom; using AngleSharp.Html.Parser; using System.Security.Cryptography; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; internal static class AcscFeedParser { diff --git a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscMapper.cs b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Acsc/Internal/AcscMapper.cs rename to src/StellaOps.Concelier.Source.Acsc/Internal/AcscMapper.cs index d8d36a68..cb65712f 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Internal/AcscMapper.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Internal/AcscMapper.cs @@ -1,11 +1,11 @@ using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.Acsc.Internal; +namespace StellaOps.Concelier.Source.Acsc.Internal; internal static class AcscMapper { diff --git a/src/StellaOps.Feedser.Source.Acsc/Jobs.cs b/src/StellaOps.Concelier.Source.Acsc/Jobs.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Acsc/Jobs.cs rename to src/StellaOps.Concelier.Source.Acsc/Jobs.cs index 8596b78d..ec6d472a 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Jobs.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Acsc; +namespace StellaOps.Concelier.Source.Acsc; internal static class AcscJobKinds { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Acsc/Properties/AssemblyInfo.cs similarity index 55% rename from src/StellaOps.Feedser.Source.Ghsa/Properties/AssemblyInfo.cs rename to src/StellaOps.Concelier.Source.Acsc/Properties/AssemblyInfo.cs index a2fc89fa..ee8e3585 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Properties/AssemblyInfo.cs +++ b/src/StellaOps.Concelier.Source.Acsc/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("FixtureUpdater")] -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Ghsa.Tests")] +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Acsc.Tests")] diff --git a/src/StellaOps.Feedser.Source.Acsc/README.md b/src/StellaOps.Concelier.Source.Acsc/README.md similarity index 83% rename from src/StellaOps.Feedser.Source.Acsc/README.md rename to src/StellaOps.Concelier.Source.Acsc/README.md index 5e2f02a3..765c9605 100644 --- a/src/StellaOps.Feedser.Source.Acsc/README.md +++ b/src/StellaOps.Concelier.Source.Acsc/README.md @@ -1,9 +1,9 @@ -## StellaOps.Feedser.Source.Acsc +## StellaOps.Concelier.Source.Acsc -Australian Cyber Security Centre (ACSC) connector that ingests RSS/Atom advisories, sanitises embedded HTML, and maps entries into canonical `Advisory` records for Feedser. +Australian Cyber Security Centre (ACSC) connector that ingests RSS/Atom advisories, sanitises embedded HTML, and maps entries into canonical `Advisory` records for Concelier. ### Configuration -Settings live under `feedser:sources:acsc` (see `AcscOptions`): +Settings live under `concelier:sources:acsc` (see `AcscOptions`): | Setting | Description | Default | | --- | --- | --- | @@ -16,7 +16,7 @@ Settings live under `feedser:sources:acsc` (see `AcscOptions`): | `requestTimeout` | Per-request timeout override. | 45 seconds | | `failureBackoff` | Backoff window when fetch fails. | 5 minutes | | `initialBackfill` | Sliding window used to seed published cursors. | 120 days | -| `userAgent` | Outbound `User-Agent` header. | `StellaOps/Feedser (+https://stella-ops.org)` | +| `userAgent` | Outbound `User-Agent` header. | `StellaOps/Concelier (+https://stella-ops.org)` | | `requestVersion`/`versionPolicy` | HTTP version negotiation knobs. | HTTP/2 with downgrade | The dependency injection routine registers the connector plus scheduled jobs: @@ -29,7 +29,7 @@ The dependency injection routine registers the connector plus scheduled jobs: | `source:acsc:probe` | `25,55 * * * *` | Verify direct endpoint health and adjust cursor preference. | ### Metrics -Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Feedser.Source.Acsc`): +Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Concelier.Source.Acsc`): | Instrument | Unit | Description | | --- | --- | --- | @@ -54,10 +54,10 @@ Key log messages include: Logs include feed slug metadata for troubleshooting parallel ingestion. ### Tests & fixtures -`StellaOps.Feedser.Source.Acsc.Tests` exercises the fetch→parse→map pipeline using canned RSS content. Deterministic snapshots live in `Acsc/Fixtures`. To refresh them after intentional behavioural changes: +`StellaOps.Concelier.Source.Acsc.Tests` exercises the fetch→parse→map pipeline using canned RSS content. Deterministic snapshots live in `Acsc/Fixtures`. To refresh them after intentional behavioural changes: ```bash -UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.Acsc.Tests/StellaOps.Feedser.Source.Acsc.Tests.csproj +UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj ``` Remember to review the generated `.actual.json` files when assertions fail without fixture updates. diff --git a/src/StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj b/src/StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj new file mode 100644 index 00000000..68054408 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj @@ -0,0 +1,18 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Acsc/TASKS.md b/src/StellaOps.Concelier.Source.Acsc/TASKS.md similarity index 81% rename from src/StellaOps.Feedser.Source.Acsc/TASKS.md rename to src/StellaOps.Concelier.Source.Acsc/TASKS.md index 3e70e703..5be3dffa 100644 --- a/src/StellaOps.Feedser.Source.Acsc/TASKS.md +++ b/src/StellaOps.Concelier.Source.Acsc/TASKS.md @@ -1,8 +1,8 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-ACSC-02-001 Source discovery & feed contract|BE-Conn-ACSC|Research|**DONE (2025-10-11)** – Catalogued feed slugs `/acsc/view-all-content/{alerts,advisories,news,publications,threats}/rss`; every endpoint currently negotiates HTTP/2 then aborts with `INTERNAL_ERROR` (curl exit 92) and hanging >600 s when forcing `--http1.1`. Documented traces + mitigations in `docs/feedser-connector-research-20251011.md` and opened `FEEDCONN-SHARED-HTTP2-001` for shared handler tweaks (force `RequestVersionOrLower`, jittered retries, relay option).| -|FEEDCONN-ACSC-02-002 Fetch pipeline & cursor persistence|BE-Conn-ACSC|Source.Common, Storage.Mongo|**DONE (2025-10-12)** – HTTP client now pins `HttpRequestMessage.VersionPolicy = RequestVersionOrLower`, forces `AutomaticDecompression = GZip | Deflate`, and sends `User-Agent: StellaOps/Feedser (+https://stella-ops.org)` via `AddAcscConnector`. Fetch pipeline implemented in `AcscConnector` with relay-aware fallback (`AcscProbeJob` seeds preference), deterministic cursor updates (`preferredEndpoint`, published timestamp per feed), and metadata-deduped documents. Unit tests `AcscConnectorFetchTests` + `AcscHttpClientConfigurationTests` cover direct/relay flows and client wiring.| +|FEEDCONN-ACSC-02-001 Source discovery & feed contract|BE-Conn-ACSC|Research|**DONE (2025-10-11)** – Catalogued feed slugs `/acsc/view-all-content/{alerts,advisories,news,publications,threats}/rss`; every endpoint currently negotiates HTTP/2 then aborts with `INTERNAL_ERROR` (curl exit 92) and hanging >600 s when forcing `--http1.1`. Documented traces + mitigations in `docs/concelier-connector-research-20251011.md` and opened `FEEDCONN-SHARED-HTTP2-001` for shared handler tweaks (force `RequestVersionOrLower`, jittered retries, relay option).| +|FEEDCONN-ACSC-02-002 Fetch pipeline & cursor persistence|BE-Conn-ACSC|Source.Common, Storage.Mongo|**DONE (2025-10-12)** – HTTP client now pins `HttpRequestMessage.VersionPolicy = RequestVersionOrLower`, forces `AutomaticDecompression = GZip | Deflate`, and sends `User-Agent: StellaOps/Concelier (+https://stella-ops.org)` via `AddAcscConnector`. Fetch pipeline implemented in `AcscConnector` with relay-aware fallback (`AcscProbeJob` seeds preference), deterministic cursor updates (`preferredEndpoint`, published timestamp per feed), and metadata-deduped documents. Unit tests `AcscConnectorFetchTests` + `AcscHttpClientConfigurationTests` cover direct/relay flows and client wiring.| |FEEDCONN-ACSC-02-003 Parser & DTO sanitiser|BE-Conn-ACSC|Source.Common|**DONE (2025-10-12)** – Added `AcscFeedParser` to sanitise RSS payloads, collapse multi-paragraph summaries, dedupe references, and surface `serialNumber`/`advisoryType` fields as structured metadata + alias candidates. `ParseAsync` now materialises `acsc.feed.v1` DTOs, promotes documents to `pending-map`, and advances cursor state. Covered by `AcscConnectorParseTests`.| |FEEDCONN-ACSC-02-004 Canonical mapper + range primitives|BE-Conn-ACSC|Models|**DONE (2025-10-12)** – Introduced `AcscMapper` and wired `MapAsync` to emit canonical advisories with normalized aliases, source-tagged references, and optional vendor `affectedPackages` derived from “Systems/Products affected” fields. Documents transition to `mapped`, advisories persist via `IAdvisoryStore`, and metrics/logging capture mapped counts. `AcscConnectorParseTests` exercise fetch→parse→map flow.| |FEEDCONN-ACSC-02-005 Deterministic fixtures & regression tests|QA|Testing|**DONE (2025-10-12)** – `AcscConnectorParseTests` now snapshots fetch→parse→map output via `Acsc/Fixtures/acsc-advisories.snapshot.json`; set `UPDATE_ACSC_FIXTURES=1` to regenerate. Tests assert DTO status transitions, advisory persistence, and state cleanup.| diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/CccsConnectorTests.cs b/src/StellaOps.Concelier.Source.Cccs.Tests/CccsConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Cccs.Tests/CccsConnectorTests.cs rename to src/StellaOps.Concelier.Source.Cccs.Tests/CccsConnectorTests.cs index 1a82676f..49edfb05 100644 --- a/src/StellaOps.Feedser.Source.Cccs.Tests/CccsConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Cccs.Tests/CccsConnectorTests.cs @@ -11,18 +11,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Cccs; -using StellaOps.Feedser.Source.Cccs.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Cccs; +using StellaOps.Concelier.Source.Cccs.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Cccs.Tests; +namespace StellaOps.Concelier.Source.Cccs.Tests; [Collection("mongo-fixture")] public sealed class CccsConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-feed-en.json b/src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-feed-en.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-feed-en.json rename to src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-feed-en.json diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-raw-advisory-fr.json b/src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-raw-advisory-fr.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-raw-advisory-fr.json rename to src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-raw-advisory-fr.json diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-raw-advisory.json b/src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-raw-advisory.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-raw-advisory.json rename to src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-raw-advisory.json diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-taxonomy-en.json b/src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-taxonomy-en.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Fixtures/cccs-taxonomy-en.json rename to src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures/cccs-taxonomy-en.json diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs b/src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs rename to src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs index 20e14885..005c9ff2 100644 --- a/src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs +++ b/src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsHtmlParserTests.cs @@ -3,12 +3,12 @@ using System.IO; using System.Linq; using System.Text.Json; using FluentAssertions; -using StellaOps.Feedser.Source.Cccs.Internal; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Cccs.Internal; +using StellaOps.Concelier.Source.Common.Html; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Cccs.Tests.Internal; +namespace StellaOps.Concelier.Source.Cccs.Tests.Internal; public sealed class CccsHtmlParserTests { diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsMapperTests.cs b/src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsMapperTests.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsMapperTests.cs rename to src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsMapperTests.cs index 54d5d898..632cb7af 100644 --- a/src/StellaOps.Feedser.Source.Cccs.Tests/Internal/CccsMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Cccs.Tests/Internal/CccsMapperTests.cs @@ -1,12 +1,12 @@ using System; using FluentAssertions; -using StellaOps.Feedser.Source.Cccs.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Cccs.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Storage.Mongo.Documents; using Xunit; -namespace StellaOps.Feedser.Source.Cccs.Tests.Internal; +namespace StellaOps.Concelier.Source.Cccs.Tests.Internal; public sealed class CccsMapperTests { diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/StellaOps.Feedser.Source.CertCc.Tests.csproj b/src/StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj similarity index 68% rename from src/StellaOps.Feedser.Source.CertCc.Tests/StellaOps.Feedser.Source.CertCc.Tests.csproj rename to src/StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj index f6da87b5..7c032179 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/StellaOps.Feedser.Source.CertCc.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj @@ -5,8 +5,8 @@ enable - - + + diff --git a/src/StellaOps.Feedser.Source.Cccs/AGENTS.md b/src/StellaOps.Concelier.Source.Cccs/AGENTS.md similarity index 84% rename from src/StellaOps.Feedser.Source.Cccs/AGENTS.md rename to src/StellaOps.Concelier.Source.Cccs/AGENTS.md index f64aaef7..ca2636f6 100644 --- a/src/StellaOps.Feedser.Source.Cccs/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Cccs/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Build the CCCS (Canadian Centre for Cyber Security) advisories connector so Feedser can ingest national cyber bulletins alongside other vendor/regional sources. +Build the CCCS (Canadian Centre for Cyber Security) advisories connector so Concelier can ingest national cyber bulletins alongside other vendor/regional sources. ## Scope - Research CCCS advisory feeds (RSS/Atom, JSON API, or HTML listings) and define the canonical fetch workflow. @@ -12,8 +12,8 @@ Build the CCCS (Canadian Centre for Cyber Security) advisories connector so Feed ## Participants - `Source.Common` (HTTP clients, fetch service, DTO storage helpers). - `Storage.Mongo` (raw/document/DTO/advisory stores + source state). -- `Feedser.Models` (canonical advisory data structures). -- `Feedser.Testing` (integration fixtures and snapshot utilities). +- `Concelier.Models` (canonical advisory data structures). +- `Concelier.Testing` (integration fixtures and snapshot utilities). ## Interfaces & Contracts - Job kinds: `cccs:fetch`, `cccs:parse`, `cccs:map`. @@ -35,6 +35,6 @@ Out of scope: - Respect upstream rate limits; mark failures in source state with backoff. ## Tests -- Add `StellaOps.Feedser.Source.Cccs.Tests` covering fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.Cccs.Tests` covering fetch/parse/map with canned fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Validate deterministic ordering and timestamps to maintain reproducibility. diff --git a/src/StellaOps.Feedser.Source.Cccs/CccsConnector.cs b/src/StellaOps.Concelier.Source.Cccs/CccsConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cccs/CccsConnector.cs rename to src/StellaOps.Concelier.Source.Cccs/CccsConnector.cs index 02595be9..3bc3246d 100644 --- a/src/StellaOps.Feedser.Source.Cccs/CccsConnector.cs +++ b/src/StellaOps.Concelier.Source.Cccs/CccsConnector.cs @@ -11,17 +11,17 @@ using System.Globalization; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Cccs.Configuration; -using StellaOps.Feedser.Source.Cccs.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.Cccs.Configuration; +using StellaOps.Concelier.Source.Cccs.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Cccs; +namespace StellaOps.Concelier.Source.Cccs; public sealed class CccsConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Cccs/CccsConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Cccs/CccsConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Cccs/CccsConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Cccs/CccsConnectorPlugin.cs index 2bba9dc4..7295acbc 100644 --- a/src/StellaOps.Feedser.Source.Cccs/CccsConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Cccs/CccsConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Cccs; +namespace StellaOps.Concelier.Source.Cccs; public sealed class CccsConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Cccs/CccsDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Cccs/CccsDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Cccs/CccsDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Cccs/CccsDependencyInjectionRoutine.cs index a6812e0f..c4b21202 100644 --- a/src/StellaOps.Feedser.Source.Cccs/CccsDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Cccs/CccsDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Cccs.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Cccs.Configuration; -namespace StellaOps.Feedser.Source.Cccs; +namespace StellaOps.Concelier.Source.Cccs; public sealed class CccsDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cccs"; + private const string ConfigurationSection = "concelier:sources:cccs"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Cccs/CccsServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Cccs/CccsServiceCollectionExtensions.cs similarity index 83% rename from src/StellaOps.Feedser.Source.Cccs/CccsServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Cccs/CccsServiceCollectionExtensions.cs index adb3c7d3..dff98d64 100644 --- a/src/StellaOps.Feedser.Source.Cccs/CccsServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Cccs/CccsServiceCollectionExtensions.cs @@ -3,12 +3,12 @@ using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Cccs.Configuration; -using StellaOps.Feedser.Source.Cccs.Internal; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Cccs.Configuration; +using StellaOps.Concelier.Source.Cccs.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Cccs; +namespace StellaOps.Concelier.Source.Cccs; public static class CccsServiceCollectionExtensions { @@ -24,7 +24,7 @@ public static class CccsServiceCollectionExtensions services.AddSourceHttpClient(CccsOptions.HttpClientName, static (sp, clientOptions) => { var options = sp.GetRequiredService>().Value; - clientOptions.UserAgent = "StellaOps.Feedser.Cccs/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Cccs/1.0"; clientOptions.Timeout = options.RequestTimeout; clientOptions.AllowedHosts.Clear(); diff --git a/src/StellaOps.Feedser.Source.Cccs/Configuration/CccsOptions.cs b/src/StellaOps.Concelier.Source.Cccs/Configuration/CccsOptions.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Cccs/Configuration/CccsOptions.cs rename to src/StellaOps.Concelier.Source.Cccs/Configuration/CccsOptions.cs index 16c2fa8f..851261b3 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Configuration/CccsOptions.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Configuration/CccsOptions.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Cccs.Configuration; +namespace StellaOps.Concelier.Source.Cccs.Configuration; public sealed class CccsOptions { - public const string HttpClientName = "feedser.source.cccs"; + public const string HttpClientName = "concelier.source.cccs"; private readonly List _feeds = new(); diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsAdvisoryDto.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsAdvisoryDto.cs index 2f31e3aa..b158c222 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsAdvisoryDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; internal sealed record CccsAdvisoryDto { diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsCursor.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsCursor.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsCursor.cs index 7e50faac..44630c64 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsCursor.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; internal sealed record CccsCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsDiagnostics.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsDiagnostics.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsDiagnostics.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsDiagnostics.cs index 0dc1ae4f..c46743f9 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; public sealed class CccsDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Cccs"; + private const string MeterName = "StellaOps.Concelier.Source.Cccs"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedClient.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedClient.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedClient.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedClient.cs index b6914cc6..305b9c60 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedClient.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedClient.cs @@ -6,10 +6,10 @@ using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Source.Cccs.Configuration; -using StellaOps.Feedser.Source.Common.Fetch; +using StellaOps.Concelier.Source.Cccs.Configuration; +using StellaOps.Concelier.Source.Common.Fetch; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; public sealed class CccsFeedClient { diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedModels.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedModels.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedModels.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedModels.cs index b3c44711..701e22b7 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsFeedModels.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsFeedModels.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; internal sealed class CccsFeedResponse { diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsHtmlParser.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsHtmlParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsHtmlParser.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsHtmlParser.cs index 6b7236be..d7cb892e 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsHtmlParser.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsHtmlParser.cs @@ -6,9 +6,9 @@ using System.Text.RegularExpressions; using AngleSharp.Dom; using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; public sealed class CccsHtmlParser { diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsMapper.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsMapper.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsMapper.cs index 779f841a..2cc36045 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsMapper.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsMapper.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; internal static class CccsMapper { diff --git a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs rename to src/StellaOps.Concelier.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs index c5111d93..03c153c6 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Internal/CccsRawAdvisoryDocument.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Cccs.Internal; +namespace StellaOps.Concelier.Source.Cccs.Internal; internal sealed record CccsRawAdvisoryDocument { diff --git a/src/StellaOps.Feedser.Source.Cccs/Jobs.cs b/src/StellaOps.Concelier.Source.Cccs/Jobs.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Cccs/Jobs.cs rename to src/StellaOps.Concelier.Source.Cccs/Jobs.cs index 8110431d..c8f7084b 100644 --- a/src/StellaOps.Feedser.Source.Cccs/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Cccs/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Cccs; +namespace StellaOps.Concelier.Source.Cccs; internal static class CccsJobKinds { diff --git a/src/StellaOps.Concelier.Source.Cccs/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Cccs/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..78e32705 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Cccs/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Cccs.Tests")] diff --git a/src/StellaOps.Concelier.Source.Cccs/StellaOps.Concelier.Source.Cccs.csproj b/src/StellaOps.Concelier.Source.Cccs/StellaOps.Concelier.Source.Cccs.csproj new file mode 100644 index 00000000..e9413385 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Cccs/StellaOps.Concelier.Source.Cccs.csproj @@ -0,0 +1,16 @@ + + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Cccs/TASKS.md b/src/StellaOps.Concelier.Source.Cccs/TASKS.md similarity index 83% rename from src/StellaOps.Feedser.Source.Cccs/TASKS.md rename to src/StellaOps.Concelier.Source.Cccs/TASKS.md index 36c25954..2b2b6fc7 100644 --- a/src/StellaOps.Feedser.Source.Cccs/TASKS.md +++ b/src/StellaOps.Concelier.Source.Cccs/TASKS.md @@ -1,11 +1,11 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-CCCS-02-001 Catalogue official CCCS advisory feeds|BE-Conn-CCCS|Research|**DONE (2025-10-11)** – Resolved RSS→Atom redirects (`/api/cccs/rss/v1/get?...` → `/api/cccs/atom/v1/get?...`), confirmed feed caps at 50 entries with inline HTML bodies, no `Last-Modified`/`ETag`, and `updated` timestamps in UTC. Findings and packet captures parked in `docs/feedser-connector-research-20251011.md`; retention sweep follow-up tracked in 02-007.| +|FEEDCONN-CCCS-02-001 Catalogue official CCCS advisory feeds|BE-Conn-CCCS|Research|**DONE (2025-10-11)** – Resolved RSS→Atom redirects (`/api/cccs/rss/v1/get?...` → `/api/cccs/atom/v1/get?...`), confirmed feed caps at 50 entries with inline HTML bodies, no `Last-Modified`/`ETag`, and `updated` timestamps in UTC. Findings and packet captures parked in `docs/concelier-connector-research-20251011.md`; retention sweep follow-up tracked in 02-007.| |FEEDCONN-CCCS-02-002 Implement fetch & source state handling|BE-Conn-CCCS|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – `CccsConnector.FetchAsync` now hydrates feeds via `CccsFeedClient`, persists per-entry JSON payloads with SHA256 dedupe and cursor state, throttles requests, and records taxonomy + language metadata in document state.| |FEEDCONN-CCCS-02-003 DTO/parser implementation|BE-Conn-CCCS|Source.Common|**DONE (2025-10-14)** – Added `CccsHtmlParser` to sanitize Atom body HTML, extract serial/date/product bullets, collapse whitespace, and emit normalized reference URLs; `ParseAsync` now persists DTO records under schema `cccs.dto.v1`.| |FEEDCONN-CCCS-02-004 Canonical mapping & range primitives|BE-Conn-CCCS|Models|**DONE (2025-10-14)** – `CccsMapper` now materializes canonical advisories (aliases from serial/source/CVEs, references incl. canonical URL, vendor package records) with provenance masks; `MapAsync` stores results in `AdvisoryStore`.| -|FEEDCONN-CCCS-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added English/French fixtures plus parser + connector end-to-end tests (`StellaOps.Feedser.Source.Cccs.Tests`). Canned HTTP handler + Mongo fixture enables fetch→parse→map regression; fixtures refresh via `UPDATE_CCCS_FIXTURES=1`.| -|FEEDCONN-CCCS-02-006 Observability & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CccsDiagnostics` meter (fetch/parse/map counters), enriched connector logs with document counts, and published `docs/ops/feedser-cccs-operations.md` covering config, telemetry, and sanitiser guidance.| +|FEEDCONN-CCCS-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added English/French fixtures plus parser + connector end-to-end tests (`StellaOps.Concelier.Source.Cccs.Tests`). Canned HTTP handler + Mongo fixture enables fetch→parse→map regression; fixtures refresh via `UPDATE_CCCS_FIXTURES=1`.| +|FEEDCONN-CCCS-02-006 Observability & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CccsDiagnostics` meter (fetch/parse/map counters), enriched connector logs with document counts, and published `docs/ops/concelier-cccs-operations.md` covering config, telemetry, and sanitiser guidance.| |FEEDCONN-CCCS-02-007 Historical advisory harvesting plan|BE-Conn-CCCS|Research|**DONE (2025-10-15)** – Measured `/api/cccs/threats/v1/get` inventory (~5.1k rows/lang; earliest 2018-06-08), documented backfill workflow + language split strategy, and linked the runbook for Offline Kit execution.| |FEEDCONN-CCCS-02-008 Raw DOM parsing refinement|BE-Conn-CCCS|Source.Common|**DONE (2025-10-15)** – Parser now walks unsanitised DOM (heading + nested list coverage), sanitizer keeps ``/`section` nodes, and regression fixtures/tests assert EN/FR list handling + preserved HTML structure.| diff --git a/src/StellaOps.Feedser.Source.CertBund.Tests/CertBundConnectorTests.cs b/src/StellaOps.Concelier.Source.CertBund.Tests/CertBundConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertBund.Tests/CertBundConnectorTests.cs rename to src/StellaOps.Concelier.Source.CertBund.Tests/CertBundConnectorTests.cs index 504fe6c9..f10f7187 100644 --- a/src/StellaOps.Feedser.Source.CertBund.Tests/CertBundConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.CertBund.Tests/CertBundConnectorTests.cs @@ -11,19 +11,19 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.CertBund.Configuration; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.CertBund.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.CertBund.Tests; +namespace StellaOps.Concelier.Source.CertBund.Tests; [Collection("mongo-fixture")] public sealed class CertBundConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertBund.Tests/Fixtures/certbund-detail.json b/src/StellaOps.Concelier.Source.CertBund.Tests/Fixtures/certbund-detail.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertBund.Tests/Fixtures/certbund-detail.json rename to src/StellaOps.Concelier.Source.CertBund.Tests/Fixtures/certbund-detail.json diff --git a/src/StellaOps.Feedser.Source.CertBund.Tests/Fixtures/certbund-feed.xml b/src/StellaOps.Concelier.Source.CertBund.Tests/Fixtures/certbund-feed.xml similarity index 100% rename from src/StellaOps.Feedser.Source.CertBund.Tests/Fixtures/certbund-feed.xml rename to src/StellaOps.Concelier.Source.CertBund.Tests/Fixtures/certbund-feed.xml diff --git a/src/StellaOps.Feedser.Source.CertBund.Tests/StellaOps.Feedser.Source.CertBund.Tests.csproj b/src/StellaOps.Concelier.Source.CertBund.Tests/StellaOps.Concelier.Source.CertBund.Tests.csproj similarity index 72% rename from src/StellaOps.Feedser.Source.CertBund.Tests/StellaOps.Feedser.Source.CertBund.Tests.csproj rename to src/StellaOps.Concelier.Source.CertBund.Tests/StellaOps.Concelier.Source.CertBund.Tests.csproj index d31cb11a..6ce29b3d 100644 --- a/src/StellaOps.Feedser.Source.CertBund.Tests/StellaOps.Feedser.Source.CertBund.Tests.csproj +++ b/src/StellaOps.Concelier.Source.CertBund.Tests/StellaOps.Concelier.Source.CertBund.Tests.csproj @@ -5,8 +5,8 @@ enable - - + + diff --git a/src/StellaOps.Feedser.Source.CertBund/AGENTS.md b/src/StellaOps.Concelier.Source.CertBund/AGENTS.md similarity index 80% rename from src/StellaOps.Feedser.Source.CertBund/AGENTS.md rename to src/StellaOps.Concelier.Source.CertBund/AGENTS.md index 724b2fd5..b84c06fb 100644 --- a/src/StellaOps.Feedser.Source.CertBund/AGENTS.md +++ b/src/StellaOps.Concelier.Source.CertBund/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Deliver a connector for Germany’s CERT-Bund advisories so Feedser can ingest, normalise, and enrich BSI alerts alongside other national feeds. +Deliver a connector for Germany’s CERT-Bund advisories so Concelier can ingest, normalise, and enrich BSI alerts alongside other national feeds. ## Scope - Identify the authoritative CERT-Bund advisory feed(s) (RSS/Atom, JSON, CSV, or HTML). @@ -12,8 +12,8 @@ Deliver a connector for Germany’s CERT-Bund advisories so Feedser can ingest, ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores, source state). -- `Feedser.Models` (canonical data model). -- `Feedser.Testing` (integration harness, snapshot utilities). +- `Concelier.Models` (canonical data model). +- `Concelier.Testing` (integration harness, snapshot utilities). ## Interfaces & Contracts - Job kinds: `certbund:fetch`, `certbund:parse`, `certbund:map`. @@ -35,6 +35,6 @@ Out of scope: - Handle transient failures gracefully with exponential backoff and failure records in source state. ## Tests -- Add `StellaOps.Feedser.Source.CertBund.Tests` covering fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.CertBund.Tests` covering fetch/parse/map with canned fixtures. - Snapshot canonical advisories; support regeneration via environment flag. - Ensure deterministic ordering, casing, and timestamps. diff --git a/src/StellaOps.Feedser.Source.CertBund/CertBundConnector.cs b/src/StellaOps.Concelier.Source.CertBund/CertBundConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertBund/CertBundConnector.cs rename to src/StellaOps.Concelier.Source.CertBund/CertBundConnector.cs index e56b6623..352a3ee9 100644 --- a/src/StellaOps.Feedser.Source.CertBund/CertBundConnector.cs +++ b/src/StellaOps.Concelier.Source.CertBund/CertBundConnector.cs @@ -7,18 +7,18 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.CertBund.Configuration; -using StellaOps.Feedser.Source.CertBund.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.CertBund.Configuration; +using StellaOps.Concelier.Source.CertBund.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertBund; +namespace StellaOps.Concelier.Source.CertBund; public sealed class CertBundConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.CertBund/CertBundConnectorPlugin.cs b/src/StellaOps.Concelier.Source.CertBund/CertBundConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.CertBund/CertBundConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.CertBund/CertBundConnectorPlugin.cs index 00b3be7f..0d0684a2 100644 --- a/src/StellaOps.Feedser.Source.CertBund/CertBundConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.CertBund/CertBundConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertBund; +namespace StellaOps.Concelier.Source.CertBund; public sealed class CertBundConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.CertBund/CertBundDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.CertBund/CertBundDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.CertBund/CertBundDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.CertBund/CertBundDependencyInjectionRoutine.cs index 7bba7602..a57083ce 100644 --- a/src/StellaOps.Feedser.Source.CertBund/CertBundDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.CertBund/CertBundDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.CertBund.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.CertBund.Configuration; -namespace StellaOps.Feedser.Source.CertBund; +namespace StellaOps.Concelier.Source.CertBund; public sealed class CertBundDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cert-bund"; + private const string ConfigurationSection = "concelier:sources:cert-bund"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.CertBund/CertBundServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.CertBund/CertBundServiceCollectionExtensions.cs similarity index 84% rename from src/StellaOps.Feedser.Source.CertBund/CertBundServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.CertBund/CertBundServiceCollectionExtensions.cs index 0385bfc4..1b8afd40 100644 --- a/src/StellaOps.Feedser.Source.CertBund/CertBundServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.CertBund/CertBundServiceCollectionExtensions.cs @@ -3,12 +3,12 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertBund.Configuration; -using StellaOps.Feedser.Source.CertBund.Internal; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.CertBund.Configuration; +using StellaOps.Concelier.Source.CertBund.Internal; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.CertBund; +namespace StellaOps.Concelier.Source.CertBund; public static class CertBundServiceCollectionExtensions { @@ -25,7 +25,7 @@ public static class CertBundServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.Timeout = options.RequestTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.CertBund/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.CertBund/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.FeedUri.Host); clientOptions.AllowedHosts.Add(options.DetailApiUri.Host); diff --git a/src/StellaOps.Feedser.Source.CertBund/Configuration/CertBundOptions.cs b/src/StellaOps.Concelier.Source.CertBund/Configuration/CertBundOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertBund/Configuration/CertBundOptions.cs rename to src/StellaOps.Concelier.Source.CertBund/Configuration/CertBundOptions.cs index 5a8c6fc8..75f2dc82 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Configuration/CertBundOptions.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Configuration/CertBundOptions.cs @@ -1,10 +1,10 @@ using System.Net; -namespace StellaOps.Feedser.Source.CertBund.Configuration; +namespace StellaOps.Concelier.Source.CertBund.Configuration; public sealed class CertBundOptions { - public const string HttpClientName = "feedser.source.certbund"; + public const string HttpClientName = "concelier.source.certbund"; /// /// RSS feed providing the latest CERT-Bund advisories. diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundAdvisoryDto.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundAdvisoryDto.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundAdvisoryDto.cs index 0c178bf7..f5d3c275 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundAdvisoryDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; public sealed record CertBundAdvisoryDto { diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundCursor.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundCursor.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundCursor.cs index 32326bb4..fc8bdca4 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundCursor.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundCursor.cs @@ -2,7 +2,7 @@ using System; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; internal sealed record CertBundCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailParser.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailParser.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailParser.cs index 946925f3..b8f62019 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailParser.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailParser.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; public sealed class CertBundDetailParser { diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailResponse.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailResponse.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailResponse.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailResponse.cs index 6b48697f..9b84df70 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDetailResponse.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDetailResponse.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; internal sealed record CertBundDetailResponse { diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDiagnostics.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDiagnostics.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDiagnostics.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDiagnostics.cs index dfc98bb3..4a666409 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDiagnostics.cs @@ -2,14 +2,14 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; /// /// Emits OpenTelemetry counters and histograms for the CERT-Bund connector. /// public sealed class CertBundDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.CertBund"; + private const string MeterName = "StellaOps.Concelier.Source.CertBund"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDocumentMetadata.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDocumentMetadata.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDocumentMetadata.cs index 818e1237..084fdbff 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundDocumentMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; internal static class CertBundDocumentMetadata { diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedClient.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedClient.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedClient.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedClient.cs index cbd1dbd5..08a26b01 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedClient.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedClient.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertBund.Configuration; +using StellaOps.Concelier.Source.CertBund.Configuration; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; public sealed class CertBundFeedClient { diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedItem.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedItem.cs similarity index 77% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedItem.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedItem.cs index a92374c9..8f197f2c 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundFeedItem.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundFeedItem.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; using System; diff --git a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundMapper.cs b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertBund/Internal/CertBundMapper.cs rename to src/StellaOps.Concelier.Source.CertBund/Internal/CertBundMapper.cs index ff168ce2..c9949fb3 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Internal/CertBundMapper.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Internal/CertBundMapper.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.CertBund.Internal; +namespace StellaOps.Concelier.Source.CertBund.Internal; internal static class CertBundMapper { diff --git a/src/StellaOps.Feedser.Source.CertBund/Jobs.cs b/src/StellaOps.Concelier.Source.CertBund/Jobs.cs similarity index 87% rename from src/StellaOps.Feedser.Source.CertBund/Jobs.cs rename to src/StellaOps.Concelier.Source.CertBund/Jobs.cs index cedb948c..8832b232 100644 --- a/src/StellaOps.Feedser.Source.CertBund/Jobs.cs +++ b/src/StellaOps.Concelier.Source.CertBund/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.CertBund; +namespace StellaOps.Concelier.Source.CertBund; internal static class CertBundJobKinds { diff --git a/src/StellaOps.Feedser.Source.CertBund/README.md b/src/StellaOps.Concelier.Source.CertBund/README.md similarity index 94% rename from src/StellaOps.Feedser.Source.CertBund/README.md rename to src/StellaOps.Concelier.Source.CertBund/README.md index faefeda6..6c1c57aa 100644 --- a/src/StellaOps.Feedser.Source.CertBund/README.md +++ b/src/StellaOps.Concelier.Source.CertBund/README.md @@ -6,7 +6,7 @@ - **Detail API** – `https://wid.cert-bund.de/portal/api/securityadvisory?name=`. The connector reuses the bootstrapped `SocketsHttpHandler` so cookies and headers match the Angular SPA. Manual reproduction requires the same cookie container; otherwise the endpoint responds with the shell HTML document. ## Telemetry -The OpenTelemetry meter is `StellaOps.Feedser.Source.CertBund`. Key instruments: +The OpenTelemetry meter is `StellaOps.Concelier.Source.CertBund`. Key instruments: | Metric | Type | Notes | | --- | --- | --- | @@ -32,7 +32,7 @@ Dashboards should chart coverage days and enqueued counts alongside fetch failur ## Locale & translation stance - CERT-Bund publishes advisory titles and summaries **only in German** (language tag `de`). The connector preserves original casing/content and sets `Advisory.Language = "de"`. - Operator guidance: - 1. Front-line analysts consuming Feedser data should maintain German literacy or rely on approved machine-translation pipelines. + 1. Front-line analysts consuming Concelier data should maintain German literacy or rely on approved machine-translation pipelines. 2. When mirroring advisories into English dashboards, store translations outside the canonical advisory payload to keep determinism. Suggested approach: create an auxiliary collection keyed by advisory ID with timestamped translated snippets. 3. Offline Kit bundles must document that CERT-Bund content is untranslated to avoid surprise during audits. diff --git a/src/StellaOps.Feedser.Source.CertBund/StellaOps.Feedser.Source.CertBund.csproj b/src/StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj similarity index 58% rename from src/StellaOps.Feedser.Source.CertBund/StellaOps.Feedser.Source.CertBund.csproj rename to src/StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj index f857e20d..c2c3e2fe 100644 --- a/src/StellaOps.Feedser.Source.CertBund/StellaOps.Feedser.Source.CertBund.csproj +++ b/src/StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj @@ -9,7 +9,7 @@ - - + + diff --git a/src/StellaOps.Feedser.Source.CertBund/TASKS.md b/src/StellaOps.Concelier.Source.CertBund/TASKS.md similarity index 80% rename from src/StellaOps.Feedser.Source.CertBund/TASKS.md rename to src/StellaOps.Concelier.Source.CertBund/TASKS.md index 48c152f6..1e446d34 100644 --- a/src/StellaOps.Feedser.Source.CertBund/TASKS.md +++ b/src/StellaOps.Concelier.Source.CertBund/TASKS.md @@ -5,8 +5,8 @@ |FEEDCONN-CERTBUND-02-002 Fetch job & state persistence|BE-Conn-CERTBUND|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – `CertBundConnector.FetchAsync` consumes RSS via session-bootstrapped client, stores per-advisory JSON documents with metadata + SHA, throttles detail requests, and maintains cursor state (pending docs/mappings, known advisory IDs, last published).| |FEEDCONN-CERTBUND-02-003 Parser/DTO implementation|BE-Conn-CERTBUND|Source.Common|**DONE (2025-10-14)** – Detail JSON piped through `CertBundDetailParser` (raw DOM sanitised to HTML), capturing severity, CVEs, product list, and references into DTO records (`cert-bund.detail.v1`).| |FEEDCONN-CERTBUND-02-004 Canonical mapping & range primitives|BE-Conn-CERTBUND|Models|**DONE (2025-10-14)** – `CertBundMapper` emits canonical advisories (aliases, references, vendor package ranges, provenance) with severity normalisation and deterministic ordering.| -|FEEDCONN-CERTBUND-02-005 Regression fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Feedser.Source.CertBund.Tests` covering fetch→parse→map against canned RSS/JSON fixtures; integration harness uses Mongo2Go + canned HTTP handler; fixtures regenerate via `UPDATE_CERTBUND_FIXTURES=1`.| -|FEEDCONN-CERTBUND-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CertBundDiagnostics` (meter `StellaOps.Feedser.Source.CertBund`) with fetch/parse/map counters + histograms, recorded coverage days, wired stage summary logs, and published the ops runbook (`docs/ops/feedser-certbund-operations.md`).| +|FEEDCONN-CERTBUND-02-005 Regression fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Concelier.Source.CertBund.Tests` covering fetch→parse→map against canned RSS/JSON fixtures; integration harness uses Mongo2Go + canned HTTP handler; fixtures regenerate via `UPDATE_CERTBUND_FIXTURES=1`.| +|FEEDCONN-CERTBUND-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CertBundDiagnostics` (meter `StellaOps.Concelier.Source.CertBund`) with fetch/parse/map counters + histograms, recorded coverage days, wired stage summary logs, and published the ops runbook (`docs/ops/concelier-certbund-operations.md`).| |FEEDCONN-CERTBUND-02-007 Feed history & locale assessment|BE-Conn-CERTBUND|Research|**DONE (2025-10-15)** – Measured RSS retention (~6 days/≈250 items), captured connector-driven backfill guidance in the runbook, and aligned locale guidance (preserve `language=de`, Docs glossary follow-up). **Next:** coordinate with Tools to land the state-seeding helper so scripted backfills replace manual Mongo tweaks.| |FEEDCONN-CERTBUND-02-008 Session bootstrap & cookie strategy|BE-Conn-CERTBUND|Source.Common|**DONE (2025-10-14)** – Feed client primes the portal session (cookie container via `SocketsHttpHandler`), shares cookies across detail requests, and documents bootstrap behaviour in options (`PortalBootstrapUri`).| -|FEEDCONN-CERTBUND-02-009 Offline Kit export packaging|BE-Conn-CERTBUND, Docs|Offline Kit|**DONE (2025-10-17)** – Added `tools/certbund_offline_snapshot.py` to capture search/export JSON, emit deterministic manifests + SHA files, and refreshed docs (`docs/ops/feedser-certbund-operations.md`, `docs/24_OFFLINE_KIT.md`) with offline-kit instructions and manifest layout guidance. Seed data README/ignore rules cover local snapshot hygiene.| +|FEEDCONN-CERTBUND-02-009 Offline Kit export packaging|BE-Conn-CERTBUND, Docs|Offline Kit|**DONE (2025-10-17)** – Added `tools/certbund_offline_snapshot.py` to capture search/export JSON, emit deterministic manifests + SHA files, and refreshed docs (`docs/ops/concelier-certbund-operations.md`, `docs/24_OFFLINE_KIT.md`) with offline-kit instructions and manifest layout guidance. Seed data README/ignore rules cover local snapshot hygiene.| diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs index aa6b2ade..6bc2d61c 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorFetchTests.cs @@ -10,19 +10,19 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Source.CertCc; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.CertCc.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Cursors; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.CertCc; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.CertCc.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.CertCc; +namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; [Collection("mongo-fixture")] public sealed class CertCcConnectorFetchTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs index b818314f..bb665ddf 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorSnapshotTests.cs @@ -15,20 +15,20 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.CertCc; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Cursors; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.CertCc; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.CertCc; +namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; [Collection("mongo-fixture")] public sealed class CertCcConnectorSnapshotTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs index 920da426..1fd06a0c 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/CertCc/CertCcConnectorTests.cs @@ -15,19 +15,19 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Source.CertCc; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Cursors; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.CertCc; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.CertCc; +namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc; [Collection("mongo-fixture")] public sealed class CertCcConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-09.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-09.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-09.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-09.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-10.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-10.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-10.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-10.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-11.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-11.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025-11.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025-11.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/summary-2025.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/summary-2025.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vendor-statuses-294418.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vendor-statuses-294418.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vendor-statuses-294418.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vendor-statuses-294418.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vendors-294418.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vendors-294418.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vendors-294418.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vendors-294418.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-257161.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-257161.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-257161.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-257161.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418-vendors.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418-vendors.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418-vendors.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418-vendors.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418-vuls.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418-vuls.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418-vuls.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418-vuls.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vu-294418.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vu-294418.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vulnerabilities-294418.json b/src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vulnerabilities-294418.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/vulnerabilities-294418.json rename to src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/vulnerabilities-294418.json diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcMapperTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcMapperTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcMapperTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcMapperTests.cs index c9304737..aa48284d 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcMapperTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcMapperTests.cs @@ -1,13 +1,13 @@ using System; using System.Globalization; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.CertCc.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.CertCc.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.Internal; +namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; public sealed class CertCcMapperTests { diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs index ddaf6213..91c6efac 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryParserTests.cs @@ -1,9 +1,9 @@ using System.Text; using System.Text.Json; -using StellaOps.Feedser.Source.CertCc.Internal; +using StellaOps.Concelier.Source.CertCc.Internal; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.Internal; +namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; public sealed class CertCcSummaryParserTests { diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs index 0e72c3f0..61daa0b3 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcSummaryPlannerTests.cs @@ -1,12 +1,12 @@ using System; using System.Linq; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.CertCc.Internal; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.CertCc.Internal; +using StellaOps.Concelier.Source.Common.Cursors; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.Internal; +namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; public sealed class CertCcSummaryPlannerTests { diff --git a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs similarity index 89% rename from src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs rename to src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs index 582a198a..98e2d283 100644 --- a/src/StellaOps.Feedser.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/Internal/CertCcVendorStatementParserTests.cs @@ -1,8 +1,8 @@ using System.Linq; -using StellaOps.Feedser.Source.CertCc.Internal; +using StellaOps.Concelier.Source.CertCc.Internal; using Xunit; -namespace StellaOps.Feedser.Source.CertCc.Tests.Internal; +namespace StellaOps.Concelier.Source.CertCc.Tests.Internal; public sealed class CertCcVendorStatementParserTests { diff --git a/src/StellaOps.Feedser.Source.Cccs.Tests/StellaOps.Feedser.Source.Cccs.Tests.csproj b/src/StellaOps.Concelier.Source.CertCc.Tests/StellaOps.Concelier.Source.CertCc.Tests.csproj similarity index 67% rename from src/StellaOps.Feedser.Source.Cccs.Tests/StellaOps.Feedser.Source.Cccs.Tests.csproj rename to src/StellaOps.Concelier.Source.CertCc.Tests/StellaOps.Concelier.Source.CertCc.Tests.csproj index 3985bbe0..d89a3bbc 100644 --- a/src/StellaOps.Feedser.Source.Cccs.Tests/StellaOps.Feedser.Source.Cccs.Tests.csproj +++ b/src/StellaOps.Concelier.Source.CertCc.Tests/StellaOps.Concelier.Source.CertCc.Tests.csproj @@ -5,8 +5,8 @@ enable - - + + diff --git a/src/StellaOps.Feedser.Source.CertCc/AGENTS.md b/src/StellaOps.Concelier.Source.CertCc/AGENTS.md similarity index 84% rename from src/StellaOps.Feedser.Source.CertCc/AGENTS.md rename to src/StellaOps.Concelier.Source.CertCc/AGENTS.md index 453f0c10..621f2fe7 100644 --- a/src/StellaOps.Feedser.Source.CertCc/AGENTS.md +++ b/src/StellaOps.Concelier.Source.CertCc/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Implement the CERT/CC (Carnegie Mellon CERT Coordination Center) advisory connector so Feedser can ingest US CERT coordination bulletins. +Implement the CERT/CC (Carnegie Mellon CERT Coordination Center) advisory connector so Concelier can ingest US CERT coordination bulletins. ## Scope - Identify CERT/CC advisory publication format (VU#, blog, RSS, JSON) and define fetch cadence/windowing. @@ -12,8 +12,8 @@ Implement the CERT/CC (Carnegie Mellon CERT Coordination Center) advisory connec ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores and state). -- `Feedser.Models` (canonical structures). -- `Feedser.Testing` (integration tests and snapshots). +- `Concelier.Models` (canonical structures). +- `Concelier.Testing` (integration tests and snapshots). ## Interfaces & Contracts - Job kinds: `certcc:fetch`, `certcc:parse`, `certcc:map`. @@ -33,6 +33,6 @@ Out of scope: - Respect upstream throttling via retry/backoff. ## Tests -- Add `StellaOps.Feedser.Source.CertCc.Tests` to cover fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.CertCc.Tests` to cover fetch/parse/map with canned fixtures. - Snapshot canonical advisories and support UPDATE flag for regeneration. - Ensure deterministic ordering and timestamp normalisation. diff --git a/src/StellaOps.Feedser.Source.CertCc/CertCcConnector.cs b/src/StellaOps.Concelier.Source.CertCc/CertCcConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertCc/CertCcConnector.cs rename to src/StellaOps.Concelier.Source.CertCc/CertCcConnector.cs index fc4255db..a6cd55a9 100644 --- a/src/StellaOps.Feedser.Source.CertCc/CertCcConnector.cs +++ b/src/StellaOps.Concelier.Source.CertCc/CertCcConnector.cs @@ -10,18 +10,18 @@ using System.Threading; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.CertCc.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.CertCc.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertCc; +namespace StellaOps.Concelier.Source.CertCc; public sealed class CertCcConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.CertCc/CertCcConnectorPlugin.cs b/src/StellaOps.Concelier.Source.CertCc/CertCcConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.CertCc/CertCcConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.CertCc/CertCcConnectorPlugin.cs index 468a1b20..bb229e6b 100644 --- a/src/StellaOps.Feedser.Source.CertCc/CertCcConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.CertCc/CertCcConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertCc; +namespace StellaOps.Concelier.Source.CertCc; public sealed class CertCcConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.CertCc/CertCcDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.CertCc/CertCcDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.CertCc/CertCcDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.CertCc/CertCcDependencyInjectionRoutine.cs index bf09ce4a..7a03ff72 100644 --- a/src/StellaOps.Feedser.Source.CertCc/CertCcDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.CertCc/CertCcDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.CertCc.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.CertCc.Configuration; -namespace StellaOps.Feedser.Source.CertCc; +namespace StellaOps.Concelier.Source.CertCc; public sealed class CertCcDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cert-cc"; + private const string ConfigurationSection = "concelier:sources:cert-cc"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.CertCc/CertCcServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.CertCc/CertCcServiceCollectionExtensions.cs similarity index 82% rename from src/StellaOps.Feedser.Source.CertCc/CertCcServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.CertCc/CertCcServiceCollectionExtensions.cs index 413aab63..32b4e5cb 100644 --- a/src/StellaOps.Feedser.Source.CertCc/CertCcServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.CertCc/CertCcServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.CertCc.Internal; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.CertCc.Internal; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.CertCc; +namespace StellaOps.Concelier.Source.CertCc; public static class CertCcServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class CertCcServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseApiUri; - clientOptions.UserAgent = "StellaOps.Feedser.CertCc/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.CertCc/1.0"; clientOptions.Timeout = TimeSpan.FromSeconds(20); clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseApiUri.Host); diff --git a/src/StellaOps.Feedser.Source.CertCc/Configuration/CertCcOptions.cs b/src/StellaOps.Concelier.Source.CertCc/Configuration/CertCcOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertCc/Configuration/CertCcOptions.cs rename to src/StellaOps.Concelier.Source.CertCc/Configuration/CertCcOptions.cs index c6226edd..e969d786 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Configuration/CertCcOptions.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Configuration/CertCcOptions.cs @@ -1,7 +1,7 @@ using System; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.CertCc.Configuration; +namespace StellaOps.Concelier.Source.CertCc.Configuration; /// /// Connector options governing CERT/CC fetch cadence and API endpoints. diff --git a/src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md b/src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md similarity index 74% rename from src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md rename to src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md index 16d5dd34..0e619fbd 100644 --- a/src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md +++ b/src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md @@ -2,12 +2,12 @@ - **Author:** BE-Conn-CERTCC (current on-call) - **Date:** 2025-10-11 -- **Scope:** Restore VINCE detail parsing and canonical mapping in Feedser without destabilising downstream Merge/Export pipelines. +- **Scope:** Restore VINCE detail parsing and canonical mapping in Concelier without destabilising downstream Merge/Export pipelines. ## 1. Current State Snapshot (2025-10-11) - ✅ Fetch pipeline, VINCE summary planner, and detail queue are live; documents land with `DocumentStatuses.PendingParse`. -- ✅ DTO aggregate (`CertCcNoteDto`) plus mapper emit vendor-centric `normalizedVersions` (`scheme=certcc.vendor`) and provenance aligned with `src/StellaOps.Feedser.Models/PROVENANCE_GUIDELINES.md`. +- ✅ DTO aggregate (`CertCcNoteDto`) plus mapper emit vendor-centric `normalizedVersions` (`scheme=certcc.vendor`) and provenance aligned with `src/StellaOps.Concelier.Models/PROVENANCE_GUIDELINES.md`. - ✅ Regression coverage exists for fetch/parse/map flows (`CertCcConnectorSnapshotTests`), but snapshot regeneration is gated on harness refresh (FEEDCONN-CERTCC-02-007) and QA handoff (FEEDCONN-CERTCC-02-008). - ⚠️ Parse/map jobs are not scheduled; production still operates in fetch-only mode. - ⚠️ Downstream Merge team is finalising normalized range ingestion per `src/FASTER_MODELING_AND_NORMALIZATION.md`; we must avoid publishing canonical records until they certify compatibility. @@ -25,21 +25,21 @@ | Phase | Window (UTC) | Actions | Success Signals | Rollback | |-------|--------------|---------|-----------------|----------| -| **0 – Pre-flight validation** | 2025-10-11 → 2025-10-12 | • Finish FEEDCONN-CERTCC-02-007 harness fixes and regenerate fixtures.
• Run `dotnet test src/StellaOps.Feedser.Source.CertCc.Tests` with `UPDATE_CERTCC_FIXTURES=0` to confirm deterministic baselines.
• Generate sample advisory batch (`dotnet test … --filter SnapshotSmoke`) and deliver JSON diff to Merge for schema verification (`normalizedVersions[].scheme == certcc.vendor`, provenance masks populated). | • Harness tests green locally and in CI.
• Merge sign-off that sample advisories conform to `FASTER_MODELING_AND_NORMALIZATION.md`. | N/A (no production enablement yet). | -| **1 – Shadow parse/map in staging** | Target start 2025-10-13 | • Register `source:cert-cc:parse` and `source:cert-cc:map` jobs, but gate them behind new config flag `feedser:sources:cert-cc:enableDetailMapping` (default `false`).
• Deploy (restart required for options rebinding), enable flag, and point connector at staging Mongo with isolated collection (`advisories_certcc_shadow`).
• Run connector for ≥2 cycles; compare advisory counts vs. fetch-only baseline and validate `feedser.range.primitives` metrics include `scheme=certcc.vendor`. | • No uncaught exceptions in staging logs.
• Shadow advisories match expected vendor counts (±5%).
• `certcc.summary.fetch.*` + new `certcc.map.duration.ms` metrics stable. | Disable flag; staging returns to fetch-only. No production impact. | +| **0 – Pre-flight validation** | 2025-10-11 → 2025-10-12 | • Finish FEEDCONN-CERTCC-02-007 harness fixes and regenerate fixtures.
• Run `dotnet test src/StellaOps.Concelier.Source.CertCc.Tests` with `UPDATE_CERTCC_FIXTURES=0` to confirm deterministic baselines.
• Generate sample advisory batch (`dotnet test … --filter SnapshotSmoke`) and deliver JSON diff to Merge for schema verification (`normalizedVersions[].scheme == certcc.vendor`, provenance masks populated). | • Harness tests green locally and in CI.
• Merge sign-off that sample advisories conform to `FASTER_MODELING_AND_NORMALIZATION.md`. | N/A (no production enablement yet). | +| **1 – Shadow parse/map in staging** | Target start 2025-10-13 | • Register `source:cert-cc:parse` and `source:cert-cc:map` jobs, but gate them behind new config flag `concelier:sources:cert-cc:enableDetailMapping` (default `false`).
• Deploy (restart required for options rebinding), enable flag, and point connector at staging Mongo with isolated collection (`advisories_certcc_shadow`).
• Run connector for ≥2 cycles; compare advisory counts vs. fetch-only baseline and validate `concelier.range.primitives` metrics include `scheme=certcc.vendor`. | • No uncaught exceptions in staging logs.
• Shadow advisories match expected vendor counts (±5%).
• `certcc.summary.fetch.*` + new `certcc.map.duration.ms` metrics stable. | Disable flag; staging returns to fetch-only. No production impact. | | **2 – Controlled production enablement** | Target start 2025-10-14 | • Redeploy production with flag enabled, start with job concurrency `1`, and reduce `MaxNotesPerFetch` to 5 for first 24 h.
• Observe metrics dashboards hourly (fetch/map latency, pending queues, Mongo write throughput).
• QA to replay latest snapshots and confirm no deterministic drift.
• Publish advisory sample (top 10 changed docs) to Merge Slack channel for validation. | • Pending parse/mapping queues drain within expected SLA (<30 min).
• No increase in merge dedupe anomalies.
• Mongo writes stay within 10% of baseline. | Toggle flag off, re-run fetch-only. Clear `pendingMappings` via connector cursor reset if stuck. | | **3 – Full production & cleanup** | Target start 2025-10-15 | • Restore `MaxNotesPerFetch` to configured default (20).
• Remove temporary throttles and leave flag enabled by default.
• Update `README.md` rollout notes; close FEEDCONN-CERTCC-02-009.
• Kick off post-merge audit with Merge to ensure new advisories dedupe with other sources. | • Stable operations for ≥48 h, no degradation alerts.
• Merge confirms conflict resolver behaviour unchanged. | If regression detected, revert to Phase 2 state or disable jobs; retain plan for reuse. | ## 4. Monitoring & Validation Checklist -- Dashboards: `certcc.*` meters (plan, summary fetch, detail fetch) plus `feedser.range.primitives` with tag `scheme=certcc.vendor`. +- Dashboards: `certcc.*` meters (plan, summary fetch, detail fetch) plus `concelier.range.primitives` with tag `scheme=certcc.vendor`. - Logs: ensure Parse/Map jobs emit `correlationId` aligned with fetch events for traceability. - Data QA: run `tools/dump_advisory` against two VINCE notes (one multi-vendor, one single-vendor) every phase to spot-check normalized versions ordering and provenance. - Storage: verify Mongo TTL/size for `raw_documents` and `dtos`—detail payload volume increases by ~3× when mapping resumes. ## 5. Rollback / Contingency Playbook -1. Disable `feedser:sources:cert-cc:enableDetailMapping` flag (and optionally set `MaxNotesPerFetch=0` for a single cycle) to halt new detail ingestion. +1. Disable `concelier:sources:cert-cc:enableDetailMapping` flag (and optionally set `MaxNotesPerFetch=0` for a single cycle) to halt new detail ingestion. 2. Run connector once to update cursor; verify `pendingMappings` drains. 3. If advisories already persisted, coordinate with Merge to soft-delete affected `certcc/*` advisories by advisory key hash (no schema rollback required). 4. Re-run Phase 1 shadow validation before retrying. @@ -47,7 +47,7 @@ ## 6. Communication Cadence - Daily check-in with Models/Merge leads (09:30 EDT) to surface normalizedVersions/provenance diffs. -- Post-phase reports in `#feedser-certcc` Slack channel summarising metrics, advisory counts, and outstanding issues. +- Post-phase reports in `#concelier-certcc` Slack channel summarising metrics, advisory counts, and outstanding issues. - Escalate blockers >12 h via Runbook SEV-3 path and annotate `TASKS.md`. ## 7. Open Questions / Next Actions @@ -56,4 +56,4 @@ - [ ] Decide if CSAF endpoint ingestion (optional) should piggyback on Phase 3 or stay deferred. - [ ] Validate that FEEDCONN-CERTCC-02-010 coverage handles mixed 200/404 VINCE endpoints during partial outages. -Once Dependencies (Section 2) are cleared and Phase 3 completes, update `src/StellaOps.Feedser.Source.CertCc/TASKS.md` and close FEEDCONN-CERTCC-02-009. +Once Dependencies (Section 2) are cleared and Phase 3 completes, update `src/StellaOps.Concelier.Source.CertCc/TASKS.md` and close FEEDCONN-CERTCC-02-009. diff --git a/src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md b/src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md new file mode 100644 index 00000000..c8ec45bc --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md @@ -0,0 +1,20 @@ +# FEEDCONN-CERTCC-02-012 – Schema Sync & Snapshot Regeneration + +## Summary +- Re-ran `StellaOps.Concelier.Source.CertCc.Tests` with `UPDATE_CERTCC_FIXTURES=1`; fixtures now capture SemVer-style normalized versions (`scheme=certcc.vendor`) and `provenance.decisionReason` values emitted by the mapper. +- Recorded HTTP request ordering is persisted in `certcc-requests.snapshot.json` to keep Merge aware of the deterministic fetch plan. +- Advisories snapshot (`certcc-advisories.snapshot.json`) reflects the dual-write storage changes (normalized versions + provenance) introduced by FEEDMODELS-SCHEMA-* and FEEDSTORAGE-DATA-*. + +## Artifacts +- `src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json` +- `src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json` +- `src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json` +- `src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json` + +## Validation steps +```bash +dotnet test src/StellaOps.Concelier.Source.CertCc.Tests +UPDATE_CERTCC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.CertCc.Tests +``` + +The first command verifies deterministic behavior; the second regenerates fixtures if a future schema change occurs. Share the four snapshot files above with Merge for their backfill diff. diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcCursor.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcCursor.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcCursor.cs index 6feca961..075a774c 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcCursor.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcCursor.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal sealed record CertCcCursor( TimeWindowCursorState SummaryState, diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcDiagnostics.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcDiagnostics.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcDiagnostics.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcDiagnostics.cs index 7ddaabf8..c11bc0bd 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcDiagnostics.cs @@ -1,16 +1,16 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; /// /// Emits CERT/CC-specific telemetry for summary planning and fetch activity. /// public sealed class CertCcDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.CertCc"; + private const string MeterName = "StellaOps.Concelier.Source.CertCc"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcMapper.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcMapper.cs similarity index 99% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcMapper.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcMapper.cs index d4dfc714..f971d190 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcMapper.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcMapper.cs @@ -4,11 +4,11 @@ using System.Globalization; using System.Linq; using System.Net; using System.Text.RegularExpressions; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal static class CertCcMapper { diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteDto.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteDto.cs similarity index 97% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteDto.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteDto.cs index 1e8913cb..52aaa117 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteDto.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal sealed record CertCcNoteDto( CertCcNoteMetadata Metadata, diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteParser.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteParser.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteParser.cs index 41d5212e..5f807189 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcNoteParser.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcNoteParser.cs @@ -8,10 +8,10 @@ using System.Text; using System.Text.Json; using System.Text.RegularExpressions; using Markdig; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Source.Common.Url; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Url; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal static class CertCcNoteParser { diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryParser.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryParser.cs similarity index 98% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryParser.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryParser.cs index 00510ac6..77867790 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryParser.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryParser.cs @@ -4,7 +4,7 @@ using System.Globalization; using System.Linq; using System.Text.Json; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal static class CertCcSummaryParser { diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlan.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlan.cs similarity index 78% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlan.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlan.cs index affaff82..ee149c14 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlan.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlan.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; public sealed record CertCcSummaryPlan( TimeWindow Window, diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlanner.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlanner.cs similarity index 95% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlanner.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlanner.cs index c7ba920e..b2398f28 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcSummaryPlanner.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcSummaryPlanner.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertCc.Configuration; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.CertCc.Configuration; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; /// /// Computes which CERT/CC summary endpoints should be fetched for the next export window. diff --git a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcVendorStatementParser.cs b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcVendorStatementParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.CertCc/Internal/CertCcVendorStatementParser.cs rename to src/StellaOps.Concelier.Source.CertCc/Internal/CertCcVendorStatementParser.cs index 72bcdb15..ec11ffa8 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Internal/CertCcVendorStatementParser.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Internal/CertCcVendorStatementParser.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.CertCc.Internal; +namespace StellaOps.Concelier.Source.CertCc.Internal; internal static class CertCcVendorStatementParser { diff --git a/src/StellaOps.Feedser.Source.CertCc/Jobs.cs b/src/StellaOps.Concelier.Source.CertCc/Jobs.cs similarity index 87% rename from src/StellaOps.Feedser.Source.CertCc/Jobs.cs rename to src/StellaOps.Concelier.Source.CertCc/Jobs.cs index eef41998..7e58c189 100644 --- a/src/StellaOps.Feedser.Source.CertCc/Jobs.cs +++ b/src/StellaOps.Concelier.Source.CertCc/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.CertCc; +namespace StellaOps.Concelier.Source.CertCc; internal static class CertCcJobKinds { diff --git a/src/StellaOps.Concelier.Source.CertCc/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.CertCc/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..3f9192ea --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertCc/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.CertCc.Tests")] diff --git a/src/StellaOps.Feedser.Source.CertCc/README.md b/src/StellaOps.Concelier.Source.CertCc/README.md similarity index 90% rename from src/StellaOps.Feedser.Source.CertCc/README.md rename to src/StellaOps.Concelier.Source.CertCc/README.md index 7a1b716d..6e98afbf 100644 --- a/src/StellaOps.Feedser.Source.CertCc/README.md +++ b/src/StellaOps.Concelier.Source.CertCc/README.md @@ -29,7 +29,7 @@ Operational considerations: ## Telemetry & monitoring -The connector exposes an OpenTelemetry meter named `StellaOps.Feedser.Source.CertCc`. Key instruments include: +The connector exposes an OpenTelemetry meter named `StellaOps.Concelier.Source.CertCc`. Key instruments include: - Planning: `certcc.plan.windows`, `certcc.plan.requests`, and `certcc.plan.window_days`. - Summary fetch: `certcc.summary.fetch.attempts`, `.success`, `.not_modified`, `.failures`. @@ -47,8 +47,8 @@ CERT/CC publishes a Vulnerability Data Archive (JSON exports plus tooling) for d The connector ships deterministic fixtures so QA and Merge teams can replay fetch→parse→map without live calls. Use the following flow when validating changes or refreshing snapshots: -1. `dotnet test src/StellaOps.Feedser.Source.CertCc.Tests` – runs the connector snapshot suite against canned VINCE responses. -2. `UPDATE_CERTCC_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.CertCc.Tests` – regenerates fixtures under `src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/*.snapshot.json` and mirrors them in the test output directory (`bin/Debug/net10.0/Source/CertCc/Fixtures`). +1. `dotnet test src/StellaOps.Concelier.Source.CertCc.Tests` – runs the connector snapshot suite against canned VINCE responses. +2. `UPDATE_CERTCC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.CertCc.Tests` – regenerates fixtures under `src/StellaOps.Concelier.Source.CertCc.Tests/Fixtures/*.snapshot.json` and mirrors them in the test output directory (`bin/Debug/net10.0/Source/CertCc/Fixtures`). - The harness now records every HTTP request; `certcc-requests.snapshot.json` must list summaries/months in canonical order. - Expect `certcc-advisories.snapshot.json` to include normalized versions (`scheme=certcc.vendor`) and provenance decision reasons. 3. Review diffs and attach `certcc-*.snapshot.json` plus test logs when handing off to Merge. diff --git a/src/StellaOps.Feedser.Source.CertCc/StellaOps.Feedser.Source.CertCc.csproj b/src/StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj similarity index 53% rename from src/StellaOps.Feedser.Source.CertCc/StellaOps.Feedser.Source.CertCc.csproj rename to src/StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj index f5aeb10f..9cc5e5e0 100644 --- a/src/StellaOps.Feedser.Source.CertCc/StellaOps.Feedser.Source.CertCc.csproj +++ b/src/StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj @@ -11,8 +11,8 @@ - - - + + + diff --git a/src/StellaOps.Feedser.Source.CertCc/TASKS.md b/src/StellaOps.Concelier.Source.CertCc/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.CertCc/TASKS.md rename to src/StellaOps.Concelier.Source.CertCc/TASKS.md diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs rename to src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs index 92ccb065..e3feb043 100644 --- a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/CertFrConnectorTests.cs @@ -15,19 +15,19 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Source.CertFr; -using StellaOps.Feedser.Source.CertFr.Configuration; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Source.CertFr; +using StellaOps.Concelier.Source.CertFr.Configuration; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Source.CertFr.Tests; +namespace StellaOps.Concelier.Source.CertFr.Tests; [Collection("mongo-fixture")] public sealed class CertFrConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-advisories.snapshot.json b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-001.html b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-001.html similarity index 100% rename from src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-001.html rename to src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-001.html diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-002.html b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-002.html similarity index 100% rename from src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-002.html rename to src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-detail-AV-2024-002.html diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-feed.xml b/src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-feed.xml similarity index 100% rename from src/StellaOps.Feedser.Source.CertFr.Tests/CertFr/Fixtures/certfr-feed.xml rename to src/StellaOps.Concelier.Source.CertFr.Tests/CertFr/Fixtures/certfr-feed.xml diff --git a/src/StellaOps.Concelier.Source.CertFr.Tests/StellaOps.Concelier.Source.CertFr.Tests.csproj b/src/StellaOps.Concelier.Source.CertFr.Tests/StellaOps.Concelier.Source.CertFr.Tests.csproj new file mode 100644 index 00000000..e9d83b70 --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertFr.Tests/StellaOps.Concelier.Source.CertFr.Tests.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.CertFr/AGENTS.md b/src/StellaOps.Concelier.Source.CertFr/AGENTS.md similarity index 81% rename from src/StellaOps.Feedser.Source.CertFr/AGENTS.md rename to src/StellaOps.Concelier.Source.CertFr/AGENTS.md index 5e5cf3e2..6913254f 100644 --- a/src/StellaOps.Feedser.Source.CertFr/AGENTS.md +++ b/src/StellaOps.Concelier.Source.CertFr/AGENTS.md @@ -19,9 +19,9 @@ ANSSI CERT-FR advisories connector (avis/alertes) providing national enrichment: In: advisory metadata extraction, references, severity text, watermarking. Out: OVAL or package-level authority. ## Observability & security expectations -- Metrics: SourceDiagnostics emits shared `feedser.source.http.*` counters/histograms tagged `feedser.source=certfr`, covering fetch counts, parse failures, and map activity. +- Metrics: SourceDiagnostics emits shared `concelier.source.http.*` counters/histograms tagged `concelier.source=certfr`, covering fetch counts, parse failures, and map activity. - Logs: feed URL(s), item ids/urls, extraction durations; no PII; allowlist hostnames. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.CertFr.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.CertFr.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.CertFr/CertFrConnector.cs b/src/StellaOps.Concelier.Source.CertFr/CertFrConnector.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertFr/CertFrConnector.cs rename to src/StellaOps.Concelier.Source.CertFr/CertFrConnector.cs index 264be9e2..87c422cc 100644 --- a/src/StellaOps.Feedser.Source.CertFr/CertFrConnector.cs +++ b/src/StellaOps.Concelier.Source.CertFr/CertFrConnector.cs @@ -5,17 +5,17 @@ using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.CertFr.Configuration; -using StellaOps.Feedser.Source.CertFr.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.CertFr.Configuration; +using StellaOps.Concelier.Source.CertFr.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertFr; +namespace StellaOps.Concelier.Source.CertFr; public sealed class CertFrConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.CertFr/CertFrConnectorPlugin.cs b/src/StellaOps.Concelier.Source.CertFr/CertFrConnectorPlugin.cs similarity index 89% rename from src/StellaOps.Feedser.Source.CertFr/CertFrConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.CertFr/CertFrConnectorPlugin.cs index fb2357aa..ee4ad7cc 100644 --- a/src/StellaOps.Feedser.Source.CertFr/CertFrConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.CertFr/CertFrConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertFr; +namespace StellaOps.Concelier.Source.CertFr; public sealed class CertFrConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.CertFr/CertFrDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.CertFr/CertFrDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.CertFr/CertFrDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.CertFr/CertFrDependencyInjectionRoutine.cs index 9effd14d..ba2bbb39 100644 --- a/src/StellaOps.Feedser.Source.CertFr/CertFrDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.CertFr/CertFrDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.CertFr.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.CertFr.Configuration; -namespace StellaOps.Feedser.Source.CertFr; +namespace StellaOps.Concelier.Source.CertFr; public sealed class CertFrDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cert-fr"; + private const string ConfigurationSection = "concelier:sources:cert-fr"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.CertFr/CertFrServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.CertFr/CertFrServiceCollectionExtensions.cs similarity index 79% rename from src/StellaOps.Feedser.Source.CertFr/CertFrServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.CertFr/CertFrServiceCollectionExtensions.cs index 80446c97..5568522e 100644 --- a/src/StellaOps.Feedser.Source.CertFr/CertFrServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.CertFr/CertFrServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertFr.Configuration; -using StellaOps.Feedser.Source.CertFr.Internal; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.CertFr.Configuration; +using StellaOps.Concelier.Source.CertFr.Internal; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.CertFr; +namespace StellaOps.Concelier.Source.CertFr; public static class CertFrServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class CertFrServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.FeedUri; - clientOptions.UserAgent = "StellaOps.Feedser.CertFr/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.CertFr/1.0"; clientOptions.Timeout = TimeSpan.FromSeconds(20); clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.FeedUri.Host); diff --git a/src/StellaOps.Feedser.Source.CertFr/Configuration/CertFrOptions.cs b/src/StellaOps.Concelier.Source.CertFr/Configuration/CertFrOptions.cs similarity index 92% rename from src/StellaOps.Feedser.Source.CertFr/Configuration/CertFrOptions.cs rename to src/StellaOps.Concelier.Source.CertFr/Configuration/CertFrOptions.cs index 0593204f..f8591f66 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Configuration/CertFrOptions.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Configuration/CertFrOptions.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.CertFr.Configuration; +namespace StellaOps.Concelier.Source.CertFr.Configuration; public sealed class CertFrOptions { diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrCursor.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrCursor.cs similarity index 95% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrCursor.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrCursor.cs index 434ce028..43546599 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrCursor.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; internal sealed record CertFrCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDocumentMetadata.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDocumentMetadata.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDocumentMetadata.cs index d8bd1d35..752e2dfb 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDocumentMetadata.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; internal sealed record CertFrDocumentMetadata( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDto.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDto.cs similarity index 89% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDto.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDto.cs index 9b25fea1..016d06ce 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrDto.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; internal sealed record CertFrDto( [property: JsonPropertyName("advisoryId")] string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedClient.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedClient.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedClient.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedClient.cs index b160f11b..c22676a7 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedClient.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedClient.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertFr.Configuration; +using StellaOps.Concelier.Source.CertFr.Configuration; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; public sealed class CertFrFeedClient { diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedItem.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedItem.cs similarity index 72% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedItem.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedItem.cs index 3e222528..492e2d56 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrFeedItem.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrFeedItem.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; public sealed record CertFrFeedItem( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrMapper.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrMapper.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrMapper.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrMapper.cs index eb72ccd8..c7b869e8 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrMapper.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrMapper.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; internal static class CertFrMapper { diff --git a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrParser.cs b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrParser.cs similarity index 95% rename from src/StellaOps.Feedser.Source.CertFr/Internal/CertFrParser.cs rename to src/StellaOps.Concelier.Source.CertFr/Internal/CertFrParser.cs index 48a87520..b91bc645 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Internal/CertFrParser.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Internal/CertFrParser.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.CertFr.Internal; +namespace StellaOps.Concelier.Source.CertFr.Internal; internal static class CertFrParser { diff --git a/src/StellaOps.Feedser.Source.CertFr/Jobs.cs b/src/StellaOps.Concelier.Source.CertFr/Jobs.cs similarity index 92% rename from src/StellaOps.Feedser.Source.CertFr/Jobs.cs rename to src/StellaOps.Concelier.Source.CertFr/Jobs.cs index 6994fe84..225083cd 100644 --- a/src/StellaOps.Feedser.Source.CertFr/Jobs.cs +++ b/src/StellaOps.Concelier.Source.CertFr/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.CertFr; +namespace StellaOps.Concelier.Source.CertFr; internal static class CertFrJobKinds { diff --git a/src/StellaOps.Concelier.Source.CertFr/StellaOps.Concelier.Source.CertFr.csproj b/src/StellaOps.Concelier.Source.CertFr/StellaOps.Concelier.Source.CertFr.csproj new file mode 100644 index 00000000..e6cec2e9 --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertFr/StellaOps.Concelier.Source.CertFr.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.CertFr/TASKS.md b/src/StellaOps.Concelier.Source.CertFr/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.CertFr/TASKS.md rename to src/StellaOps.Concelier.Source.CertFr/TASKS.md diff --git a/src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs b/src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs rename to src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs index 56dcabc1..33c8de4c 100644 --- a/src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/CertInConnectorTests.cs @@ -14,21 +14,21 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.CertIn; -using StellaOps.Feedser.Source.CertIn.Configuration; -using StellaOps.Feedser.Source.CertIn.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.CertIn; +using StellaOps.Concelier.Source.CertIn.Configuration; +using StellaOps.Concelier.Source.CertIn.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.CertIn.Tests; +namespace StellaOps.Concelier.Source.CertIn.Tests; [Collection("mongo-fixture")] public sealed class CertInConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/alerts-page1.json b/src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/alerts-page1.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/alerts-page1.json rename to src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/alerts-page1.json diff --git a/src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/detail-CIAD-2024-0005.html b/src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/detail-CIAD-2024-0005.html similarity index 100% rename from src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/detail-CIAD-2024-0005.html rename to src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/detail-CIAD-2024-0005.html diff --git a/src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/expected-advisory.json b/src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/expected-advisory.json similarity index 100% rename from src/StellaOps.Feedser.Source.CertIn.Tests/CertIn/Fixtures/expected-advisory.json rename to src/StellaOps.Concelier.Source.CertIn.Tests/CertIn/Fixtures/expected-advisory.json diff --git a/src/StellaOps.Concelier.Source.CertIn.Tests/StellaOps.Concelier.Source.CertIn.Tests.csproj b/src/StellaOps.Concelier.Source.CertIn.Tests/StellaOps.Concelier.Source.CertIn.Tests.csproj new file mode 100644 index 00000000..efc31563 --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertIn.Tests/StellaOps.Concelier.Source.CertIn.Tests.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.CertIn/AGENTS.md b/src/StellaOps.Concelier.Source.CertIn/AGENTS.md similarity index 83% rename from src/StellaOps.Feedser.Source.CertIn/AGENTS.md rename to src/StellaOps.Concelier.Source.CertIn/AGENTS.md index e8e4dc8f..388e7475 100644 --- a/src/StellaOps.Feedser.Source.CertIn/AGENTS.md +++ b/src/StellaOps.Concelier.Source.CertIn/AGENTS.md @@ -20,9 +20,9 @@ CERT-In national CERT connector; enrichment advisories for India; maps CVE lists In: enrichment, aliasing where stable, references, mitigation text. Out: package range authority; scraping behind auth walls. ## Observability & security expectations -- Metrics: shared `feedser.source.http.*` counters/histograms from SourceDiagnostics tagged `feedser.source=certin` capture fetch volume, parse failures, and map enrich counts. +- Metrics: shared `concelier.source.http.*` counters/histograms from SourceDiagnostics tagged `concelier.source=certin` capture fetch volume, parse failures, and map enrich counts. - Logs: advisory codes, CVE counts per advisory, timing; allowlist host; redact personal data if present. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.CertIn.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.CertIn.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.CertIn/CertInConnector.cs b/src/StellaOps.Concelier.Source.CertIn/CertInConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.CertIn/CertInConnector.cs rename to src/StellaOps.Concelier.Source.CertIn/CertInConnector.cs index e6e53534..f7373d31 100644 --- a/src/StellaOps.Feedser.Source.CertIn/CertInConnector.cs +++ b/src/StellaOps.Concelier.Source.CertIn/CertInConnector.cs @@ -7,18 +7,18 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.CertIn.Configuration; -using StellaOps.Feedser.Source.CertIn.Internal; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.CertIn.Configuration; +using StellaOps.Concelier.Source.CertIn.Internal; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertIn; +namespace StellaOps.Concelier.Source.CertIn; public sealed class CertInConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.CertIn/CertInConnectorPlugin.cs b/src/StellaOps.Concelier.Source.CertIn/CertInConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.CertIn/CertInConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.CertIn/CertInConnectorPlugin.cs index a25ae81d..7571b94d 100644 --- a/src/StellaOps.Feedser.Source.CertIn/CertInConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.CertIn/CertInConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.CertIn; +namespace StellaOps.Concelier.Source.CertIn; public sealed class CertInConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.CertIn/CertInDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.CertIn/CertInDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.CertIn/CertInDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.CertIn/CertInDependencyInjectionRoutine.cs index 662d1411..8ad26c0a 100644 --- a/src/StellaOps.Feedser.Source.CertIn/CertInDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.CertIn/CertInDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.CertIn.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.CertIn.Configuration; -namespace StellaOps.Feedser.Source.CertIn; +namespace StellaOps.Concelier.Source.CertIn; public sealed class CertInDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cert-in"; + private const string ConfigurationSection = "concelier:sources:cert-in"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.CertIn/CertInServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.CertIn/CertInServiceCollectionExtensions.cs similarity index 79% rename from src/StellaOps.Feedser.Source.CertIn/CertInServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.CertIn/CertInServiceCollectionExtensions.cs index 8b1feb47..fcc4b329 100644 --- a/src/StellaOps.Feedser.Source.CertIn/CertInServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.CertIn/CertInServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertIn.Configuration; -using StellaOps.Feedser.Source.CertIn.Internal; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.CertIn.Configuration; +using StellaOps.Concelier.Source.CertIn.Internal; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.CertIn; +namespace StellaOps.Concelier.Source.CertIn; public static class CertInServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class CertInServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.AlertsEndpoint; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.CertIn/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.CertIn/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.AlertsEndpoint.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/json"; diff --git a/src/StellaOps.Feedser.Source.CertIn/Configuration/CertInOptions.cs b/src/StellaOps.Concelier.Source.CertIn/Configuration/CertInOptions.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertIn/Configuration/CertInOptions.cs rename to src/StellaOps.Concelier.Source.CertIn/Configuration/CertInOptions.cs index 88a69095..67464a55 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Configuration/CertInOptions.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Configuration/CertInOptions.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.CertIn.Configuration; +namespace StellaOps.Concelier.Source.CertIn.Configuration; public sealed class CertInOptions { diff --git a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInAdvisoryDto.cs b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInAdvisoryDto.cs similarity index 83% rename from src/StellaOps.Feedser.Source.CertIn/Internal/CertInAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.CertIn/Internal/CertInAdvisoryDto.cs index 3bf3cbbf..7cd46995 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Immutable; -namespace StellaOps.Feedser.Source.CertIn.Internal; +namespace StellaOps.Concelier.Source.CertIn.Internal; internal sealed record CertInAdvisoryDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInClient.cs b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInClient.cs similarity index 94% rename from src/StellaOps.Feedser.Source.CertIn/Internal/CertInClient.cs rename to src/StellaOps.Concelier.Source.CertIn/Internal/CertInClient.cs index 6e3119f5..7538e623 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInClient.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInClient.cs @@ -9,9 +9,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.CertIn.Configuration; +using StellaOps.Concelier.Source.CertIn.Configuration; -namespace StellaOps.Feedser.Source.CertIn.Internal; +namespace StellaOps.Concelier.Source.CertIn.Internal; public sealed class CertInClient { diff --git a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInCursor.cs b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInCursor.cs similarity index 95% rename from src/StellaOps.Feedser.Source.CertIn/Internal/CertInCursor.cs rename to src/StellaOps.Concelier.Source.CertIn/Internal/CertInCursor.cs index 835a7194..cc5784d7 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInCursor.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.CertIn.Internal; +namespace StellaOps.Concelier.Source.CertIn.Internal; internal sealed record CertInCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInDetailParser.cs b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInDetailParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.CertIn/Internal/CertInDetailParser.cs rename to src/StellaOps.Concelier.Source.CertIn/Internal/CertInDetailParser.cs index 24da33ee..f3d9d304 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInDetailParser.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInDetailParser.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.CertIn.Internal; +namespace StellaOps.Concelier.Source.CertIn.Internal; internal static class CertInDetailParser { diff --git a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInListingItem.cs b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInListingItem.cs similarity index 72% rename from src/StellaOps.Feedser.Source.CertIn/Internal/CertInListingItem.cs rename to src/StellaOps.Concelier.Source.CertIn/Internal/CertInListingItem.cs index 3da8a3f3..3b4dd0af 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Internal/CertInListingItem.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Internal/CertInListingItem.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.CertIn.Internal; +namespace StellaOps.Concelier.Source.CertIn.Internal; public sealed record CertInListingItem( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.CertIn/Jobs.cs b/src/StellaOps.Concelier.Source.CertIn/Jobs.cs similarity index 92% rename from src/StellaOps.Feedser.Source.CertIn/Jobs.cs rename to src/StellaOps.Concelier.Source.CertIn/Jobs.cs index 01b35089..fcba42dc 100644 --- a/src/StellaOps.Feedser.Source.CertIn/Jobs.cs +++ b/src/StellaOps.Concelier.Source.CertIn/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.CertIn; +namespace StellaOps.Concelier.Source.CertIn; internal static class CertInJobKinds { diff --git a/src/StellaOps.Concelier.Source.CertIn/StellaOps.Concelier.Source.CertIn.csproj b/src/StellaOps.Concelier.Source.CertIn/StellaOps.Concelier.Source.CertIn.csproj new file mode 100644 index 00000000..832b35b4 --- /dev/null +++ b/src/StellaOps.Concelier.Source.CertIn/StellaOps.Concelier.Source.CertIn.csproj @@ -0,0 +1,16 @@ + + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.CertIn/TASKS.md b/src/StellaOps.Concelier.Source.CertIn/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.CertIn/TASKS.md rename to src/StellaOps.Concelier.Source.CertIn/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs index ad0be9f5..95af9e46 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/CannedHttpMessageHandlerTests.cs @@ -1,8 +1,8 @@ using System.Net; using System.Net.Http; -using StellaOps.Feedser.Source.Common.Testing; +using StellaOps.Concelier.Source.Common.Testing; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class CannedHttpMessageHandlerTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs index 2d1eee3b..91adb52b 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/HtmlContentSanitizerTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class HtmlContentSanitizerTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs index 3668af6e..8858b9e2 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/PackageCoordinateHelperTests.cs @@ -1,7 +1,7 @@ using NuGet.Versioning; -using StellaOps.Feedser.Source.Common.Packages; +using StellaOps.Concelier.Source.Common.Packages; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class PackageCoordinateHelperTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/PdfTextExtractorTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/PdfTextExtractorTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/PdfTextExtractorTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/PdfTextExtractorTests.cs index b2da19a9..10e95ebc 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/PdfTextExtractorTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/PdfTextExtractorTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Source.Common.Pdf; +using StellaOps.Concelier.Source.Common.Pdf; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class PdfTextExtractorTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/SourceFetchServiceTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/SourceFetchServiceTests.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/SourceFetchServiceTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/SourceFetchServiceTests.cs index ad2c3713..b234d1a6 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/SourceFetchServiceTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/SourceFetchServiceTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Fetch; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class SourceFetchServiceTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs index 188c1db7..b99a698f 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/SourceHttpClientBuilderTests.cs @@ -10,9 +10,9 @@ using System.Text; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class SourceHttpClientBuilderTests { @@ -62,13 +62,13 @@ public sealed class SourceHttpClientBuilderTests var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyAddressKey}"] = "http://proxy.local:8080", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyBypassOnLocalKey}"] = "false", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyBypassListKey}:0"] = "localhost", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyBypassListKey}:1"] = "127.0.0.1", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyUseDefaultCredentialsKey}"] = "false", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyUsernameKey}"] = "svc-feedser", - [$"feedser:httpClients:source.icscisa:{ProxySection}:{ProxyPasswordKey}"] = "s3cr3t!", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyAddressKey}"] = "http://proxy.local:8080", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyBypassOnLocalKey}"] = "false", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyBypassListKey}:0"] = "localhost", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyBypassListKey}:1"] = "127.0.0.1", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyUseDefaultCredentialsKey}"] = "false", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyUsernameKey}"] = "svc-concelier", + [$"concelier:httpClients:source.icscisa:{ProxySection}:{ProxyPasswordKey}"] = "s3cr3t!", }) .Build(); @@ -85,7 +85,7 @@ public sealed class SourceHttpClientBuilderTests var resolvedConfiguration = provider.GetRequiredService(); var proxySection = resolvedConfiguration - .GetSection("feedser") + .GetSection("concelier") .GetSection("httpClients") .GetSection("source.icscisa") .GetSection("proxy"); @@ -99,7 +99,7 @@ public sealed class SourceHttpClientBuilderTests Assert.Contains("localhost", configuredOptions.ProxyBypassList, StringComparer.OrdinalIgnoreCase); Assert.Contains("127.0.0.1", configuredOptions.ProxyBypassList); Assert.False(configuredOptions.ProxyUseDefaultCredentials); - Assert.Equal("svc-feedser", configuredOptions.ProxyUsername); + Assert.Equal("svc-concelier", configuredOptions.ProxyUsername); Assert.Equal("s3cr3t!", configuredOptions.ProxyPassword); } @@ -115,8 +115,8 @@ public sealed class SourceHttpClientBuilderTests var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { - [$"feedser:httpClients:source.acsc:{AllowInvalidKey}"] = "true", - [$"feedser:httpClients:source.acsc:{TrustedRootPathsKey}:0"] = pemPath, + [$"concelier:httpClients:source.acsc:{AllowInvalidKey}"] = "true", + [$"concelier:httpClients:source.acsc:{TrustedRootPathsKey}:0"] = pemPath, }) .Build(); @@ -173,8 +173,8 @@ public sealed class SourceHttpClientBuilderTests var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { - [$"feedser:{OfflineRootKey}"] = offlineRoot.FullName, - [$"feedser:httpClients:source.nkcki:{TrustedRootPathsKey}:0"] = relativePath, + [$"concelier:{OfflineRootKey}"] = offlineRoot.FullName, + [$"concelier:httpClients:source.nkcki:{TrustedRootPathsKey}:0"] = relativePath, }) .Build(); @@ -227,8 +227,8 @@ public sealed class SourceHttpClientBuilderTests var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { - [$"feedser:{OfflineRootKey}"] = offlineRoot.FullName, - [$"feedser:sources:nkcki:http:{TrustedRootPathsKey}:0"] = relativePath, + [$"concelier:{OfflineRootKey}"] = offlineRoot.FullName, + [$"concelier:sources:nkcki:http:{TrustedRootPathsKey}:0"] = relativePath, }) .Build(); diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs index 9e6afb1e..247ba633 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/TimeWindowCursorPlannerTests.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class TimeWindowCursorPlannerTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Common/UrlNormalizerTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Common/UrlNormalizerTests.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Common.Tests/Common/UrlNormalizerTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Common/UrlNormalizerTests.cs index 3eeeef49..78e6a857 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Common/UrlNormalizerTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Common/UrlNormalizerTests.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Source.Common.Url; +using StellaOps.Concelier.Source.Common.Url; -namespace StellaOps.Feedser.Source.Common.Tests; +namespace StellaOps.Concelier.Source.Common.Tests; public sealed class UrlNormalizerTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs index f676b87c..f4e0350f 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Json/JsonSchemaValidatorTests.cs @@ -2,9 +2,9 @@ using System; using System.Text.Json; using Json.Schema; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Source.Common.Json; +using StellaOps.Concelier.Source.Common.Json; -namespace StellaOps.Feedser.Source.Common.Tests.Json; +namespace StellaOps.Concelier.Source.Common.Tests.Json; public sealed class JsonSchemaValidatorTests { diff --git a/src/StellaOps.Feedser.Source.Common.Tests/StellaOps.Feedser.Source.Common.Tests.csproj b/src/StellaOps.Concelier.Source.Common.Tests/StellaOps.Concelier.Source.Common.Tests.csproj similarity index 65% rename from src/StellaOps.Feedser.Source.Common.Tests/StellaOps.Feedser.Source.Common.Tests.csproj rename to src/StellaOps.Concelier.Source.Common.Tests/StellaOps.Concelier.Source.Common.Tests.csproj index 43dcfcd7..5692be0a 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/StellaOps.Feedser.Source.Common.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Common.Tests/StellaOps.Concelier.Source.Common.Tests.csproj @@ -5,6 +5,6 @@ enable - + diff --git a/src/StellaOps.Feedser.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs b/src/StellaOps.Concelier.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs similarity index 71% rename from src/StellaOps.Feedser.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs rename to src/StellaOps.Concelier.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs index 5a2ab89f..bea93021 100644 --- a/src/StellaOps.Feedser.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs +++ b/src/StellaOps.Concelier.Source.Common.Tests/Xml/XmlSchemaValidatorTests.cs @@ -3,10 +3,10 @@ using System.Xml; using System.Xml.Linq; using System.Xml.Schema; using Microsoft.Extensions.Logging.Abstractions; -using FeedserXmlSchemaValidator = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidator; -using FeedserXmlSchemaValidationException = StellaOps.Feedser.Source.Common.Xml.XmlSchemaValidationException; +using ConcelierXmlSchemaValidator = StellaOps.Concelier.Source.Common.Xml.XmlSchemaValidator; +using ConcelierXmlSchemaValidationException = StellaOps.Concelier.Source.Common.Xml.XmlSchemaValidationException; -namespace StellaOps.Feedser.Source.Common.Tests.Xml; +namespace StellaOps.Concelier.Source.Common.Tests.Xml; public sealed class XmlSchemaValidatorTests { @@ -35,7 +35,7 @@ public sealed class XmlSchemaValidatorTests { var schemaSet = CreateSchema(); var document = XDocument.Parse("abc3"); - var validator = new FeedserXmlSchemaValidator(NullLogger.Instance); + var validator = new ConcelierXmlSchemaValidator(NullLogger.Instance); var exception = Record.Exception(() => validator.Validate(document, schemaSet, "valid.xml")); @@ -47,9 +47,9 @@ public sealed class XmlSchemaValidatorTests { var schemaSet = CreateSchema(); var document = XDocument.Parse("missing-count"); - var validator = new FeedserXmlSchemaValidator(NullLogger.Instance); + var validator = new ConcelierXmlSchemaValidator(NullLogger.Instance); - var ex = Assert.Throws(() => validator.Validate(document, schemaSet, "invalid.xml")); + var ex = Assert.Throws(() => validator.Validate(document, schemaSet, "invalid.xml")); Assert.Equal("invalid.xml", ex.DocumentName); Assert.NotEmpty(ex.Errors); diff --git a/src/StellaOps.Feedser.Source.Common/AGENTS.md b/src/StellaOps.Concelier.Source.Common/AGENTS.md similarity index 83% rename from src/StellaOps.Feedser.Source.Common/AGENTS.md rename to src/StellaOps.Concelier.Source.Common/AGENTS.md index 582d2bc2..bd58523e 100644 --- a/src/StellaOps.Feedser.Source.Common/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Common/AGENTS.md @@ -22,10 +22,10 @@ Shared connector toolkit. Provides HTTP clients, retry/backoff, conditional GET In: HTTP plumbing, validators, cursor/backoff utilities, hashing. Out: connector-specific schemas/mapping rules, merge precedence. ## Observability & security expectations -- Metrics: SourceDiagnostics publishes `feedser.source.http.*` counters/histograms tagged with `feedser.source=` plus retries/failures; connector dashboards slice on that tag instead of bespoke metric names. +- Metrics: SourceDiagnostics publishes `concelier.source.http.*` counters/histograms tagged with `concelier.source=` plus retries/failures; connector dashboards slice on that tag instead of bespoke metric names. - Logs include uri, status, retries, etag; redact tokens and auth headers. - Distributed tracing hooks and per-connector counters should be wired centrally for consistent observability. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Common.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Common.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Common/Cursors/PaginationPlanner.cs b/src/StellaOps.Concelier.Source.Common/Cursors/PaginationPlanner.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Common/Cursors/PaginationPlanner.cs rename to src/StellaOps.Concelier.Source.Common/Cursors/PaginationPlanner.cs index b1eec949..cb3fffe3 100644 --- a/src/StellaOps.Feedser.Source.Common/Cursors/PaginationPlanner.cs +++ b/src/StellaOps.Concelier.Source.Common/Cursors/PaginationPlanner.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Cursors; +namespace StellaOps.Concelier.Source.Common.Cursors; /// /// Provides helpers for computing pagination start indices for sources that expose total result counts. diff --git a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorOptions.cs b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorOptions.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorOptions.cs rename to src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorOptions.cs index a33c7216..dbd380ac 100644 --- a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorOptions.cs +++ b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorOptions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Cursors; +namespace StellaOps.Concelier.Source.Common.Cursors; /// /// Configuration applied when advancing sliding time-window cursors. diff --git a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorPlanner.cs b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorPlanner.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorPlanner.cs rename to src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorPlanner.cs index 10b1b357..3616c8b5 100644 --- a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorPlanner.cs +++ b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorPlanner.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Cursors; +namespace StellaOps.Concelier.Source.Common.Cursors; /// /// Utility methods for computing sliding time-window ranges used by connectors. diff --git a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorState.cs b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorState.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorState.cs rename to src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorState.cs index 5c835eb0..5343e578 100644 --- a/src/StellaOps.Feedser.Source.Common/Cursors/TimeWindowCursorState.cs +++ b/src/StellaOps.Concelier.Source.Common/Cursors/TimeWindowCursorState.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Common.Cursors; +namespace StellaOps.Concelier.Source.Common.Cursors; /// /// Represents the persisted state of a sliding time-window cursor. diff --git a/src/StellaOps.Feedser.Source.Common/DocumentStatuses.cs b/src/StellaOps.Concelier.Source.Common/DocumentStatuses.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Common/DocumentStatuses.cs rename to src/StellaOps.Concelier.Source.Common/DocumentStatuses.cs index 6d265643..d76d28e1 100644 --- a/src/StellaOps.Feedser.Source.Common/DocumentStatuses.cs +++ b/src/StellaOps.Concelier.Source.Common/DocumentStatuses.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common; +namespace StellaOps.Concelier.Source.Common; /// /// Well-known lifecycle statuses for raw source documents as they move through fetch/parse/map stages. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/CryptoJitterSource.cs b/src/StellaOps.Concelier.Source.Common/Fetch/CryptoJitterSource.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Common/Fetch/CryptoJitterSource.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/CryptoJitterSource.cs index 1c798550..2eca2ea2 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/CryptoJitterSource.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/CryptoJitterSource.cs @@ -1,6 +1,6 @@ using System.Security.Cryptography; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Jitter source backed by for thread-safe, high-entropy delays. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/IJitterSource.cs b/src/StellaOps.Concelier.Source.Common/Fetch/IJitterSource.cs similarity index 76% rename from src/StellaOps.Feedser.Source.Common/Fetch/IJitterSource.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/IJitterSource.cs index 6284e1b2..fbb73dba 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/IJitterSource.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/IJitterSource.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Produces random jitter durations used to decorrelate retries. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/RawDocumentStorage.cs b/src/StellaOps.Concelier.Source.Common/Fetch/RawDocumentStorage.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Common/Fetch/RawDocumentStorage.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/RawDocumentStorage.cs index a87d4dc2..55ec6f93 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/RawDocumentStorage.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/RawDocumentStorage.cs @@ -2,7 +2,7 @@ using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.GridFS; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Handles persistence of raw upstream documents in GridFS buckets for later parsing. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchContentResult.cs b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchContentResult.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchContentResult.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchContentResult.cs index d4106131..96762c12 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchContentResult.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchContentResult.cs @@ -1,6 +1,6 @@ using System.Net; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Result of fetching raw response content without persisting a document. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchRequest.cs b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchRequest.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchRequest.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchRequest.cs index 1fed7047..9c27cda4 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchRequest.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchRequest.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Net.Http; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Parameters describing a fetch operation for a source connector. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchResult.cs b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchResult.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchResult.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchResult.cs index a1114097..e09ada4e 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchResult.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchResult.cs @@ -1,7 +1,7 @@ using System.Net; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Outcome of fetching a raw document from an upstream source. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchService.cs b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchService.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchService.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchService.cs index c0217c54..ed7564bd 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/SourceFetchService.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/SourceFetchService.cs @@ -9,12 +9,12 @@ using System.Text; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Telemetry; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Telemetry; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Executes HTTP fetches for connectors, capturing raw responses with metadata for downstream stages. diff --git a/src/StellaOps.Feedser.Source.Common/Fetch/SourceRetryPolicy.cs b/src/StellaOps.Concelier.Source.Common/Fetch/SourceRetryPolicy.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Common/Fetch/SourceRetryPolicy.cs rename to src/StellaOps.Concelier.Source.Common/Fetch/SourceRetryPolicy.cs index d8105785..24a1d77a 100644 --- a/src/StellaOps.Feedser.Source.Common/Fetch/SourceRetryPolicy.cs +++ b/src/StellaOps.Concelier.Source.Common/Fetch/SourceRetryPolicy.cs @@ -1,7 +1,7 @@ using System.Globalization; using System.Net; -namespace StellaOps.Feedser.Source.Common.Fetch; +namespace StellaOps.Concelier.Source.Common.Fetch; /// /// Provides retry/backoff behavior for source HTTP fetches. diff --git a/src/StellaOps.Feedser.Source.Common/Html/HtmlContentSanitizer.cs b/src/StellaOps.Concelier.Source.Common/Html/HtmlContentSanitizer.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Common/Html/HtmlContentSanitizer.cs rename to src/StellaOps.Concelier.Source.Common/Html/HtmlContentSanitizer.cs index 15d5a8e2..010dc26b 100644 --- a/src/StellaOps.Feedser.Source.Common/Html/HtmlContentSanitizer.cs +++ b/src/StellaOps.Concelier.Source.Common/Html/HtmlContentSanitizer.cs @@ -1,9 +1,9 @@ using System.Linq; using AngleSharp.Dom; using AngleSharp.Html.Parser; -using StellaOps.Feedser.Source.Common.Url; +using StellaOps.Concelier.Source.Common.Url; -namespace StellaOps.Feedser.Source.Common.Html; +namespace StellaOps.Concelier.Source.Common.Html; /// /// Sanitizes untrusted HTML fragments produced by upstream advisories. diff --git a/src/StellaOps.Feedser.Source.Common/Http/AllowlistedHttpMessageHandler.cs b/src/StellaOps.Concelier.Source.Common/Http/AllowlistedHttpMessageHandler.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Common/Http/AllowlistedHttpMessageHandler.cs rename to src/StellaOps.Concelier.Source.Common/Http/AllowlistedHttpMessageHandler.cs index 327cab59..c1597f9f 100644 --- a/src/StellaOps.Feedser.Source.Common/Http/AllowlistedHttpMessageHandler.cs +++ b/src/StellaOps.Concelier.Source.Common/Http/AllowlistedHttpMessageHandler.cs @@ -1,6 +1,6 @@ using System.Net.Http.Headers; -namespace StellaOps.Feedser.Source.Common.Http; +namespace StellaOps.Concelier.Source.Common.Http; /// /// Delegating handler that enforces an allowlist of destination hosts for outbound requests. diff --git a/src/StellaOps.Feedser.Source.Common/Http/ServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Common/Http/ServiceCollectionExtensions.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Common/Http/ServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Common/Http/ServiceCollectionExtensions.cs index eea1eb7f..6ef25fca 100644 --- a/src/StellaOps.Feedser.Source.Common/Http/ServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Common/Http/ServiceCollectionExtensions.cs @@ -4,9 +4,9 @@ using System.Net.Security; using System.Security.Cryptography.X509Certificates; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Xml; +using StellaOps.Concelier.Source.Common.Xml; -namespace StellaOps.Feedser.Source.Common.Http; +namespace StellaOps.Concelier.Source.Common.Http; public static class ServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientConfigurationBinder.cs b/src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientConfigurationBinder.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientConfigurationBinder.cs rename to src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientConfigurationBinder.cs index f4258832..72013453 100644 --- a/src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientConfigurationBinder.cs +++ b/src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientConfigurationBinder.cs @@ -9,11 +9,11 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Source.Common.Http; +namespace StellaOps.Concelier.Source.Common.Http; internal static class SourceHttpClientConfigurationBinder { - private const string FeedserSection = "feedser"; + private const string ConcelierSection = "concelier"; private const string HttpClientsSection = "httpClients"; private const string SourcesSection = "sources"; private const string HttpSection = "http"; @@ -27,7 +27,7 @@ internal static class SourceHttpClientConfigurationBinder private const string ProxyUsernameKey = "username"; private const string ProxyPasswordKey = "password"; private const string OfflineRootKey = "offlineRoot"; - private const string OfflineRootEnvironmentVariable = "FEEDSER_OFFLINE_ROOT"; + private const string OfflineRootEnvironmentVariable = "CONCELIER_OFFLINE_ROOT"; public static void Apply(IServiceProvider services, string clientName, SourceHttpClientOptions options) { @@ -59,13 +59,13 @@ internal static class SourceHttpClientConfigurationBinder var names = BuildCandidateNames(clientName); foreach (var name in names) { - var httpClientSection = GetSection(configuration, FeedserSection, HttpClientsSection, name); + var httpClientSection = GetSection(configuration, ConcelierSection, HttpClientsSection, name); if (httpClientSection is not null && httpClientSection.Exists()) { yield return httpClientSection; } - var sourceHttpSection = GetSection(configuration, FeedserSection, SourcesSection, name, HttpSection); + var sourceHttpSection = GetSection(configuration, ConcelierSection, SourcesSection, name, HttpSection); if (sourceHttpSection is not null && sourceHttpSection.Exists()) { yield return sourceHttpSection; @@ -134,7 +134,7 @@ internal static class SourceHttpClientConfigurationBinder } var offlineRoot = section.GetValue(OfflineRootKey) - ?? rootConfiguration.GetSection(FeedserSection).GetValue(OfflineRootKey) + ?? rootConfiguration.GetSection(ConcelierSection).GetValue(OfflineRootKey) ?? Environment.GetEnvironmentVariable(OfflineRootEnvironmentVariable); ApplyTrustedRoots(section, offlineRoot, hostEnvironment, clientName, options, logger); diff --git a/src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientOptions.cs b/src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientOptions.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientOptions.cs rename to src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientOptions.cs index b9297d04..cb76578f 100644 --- a/src/StellaOps.Feedser.Source.Common/Http/SourceHttpClientOptions.cs +++ b/src/StellaOps.Concelier.Source.Common/Http/SourceHttpClientOptions.cs @@ -4,7 +4,7 @@ using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; -namespace StellaOps.Feedser.Source.Common.Http; +namespace StellaOps.Concelier.Source.Common.Http; /// /// Configuration applied to named HTTP clients used by connectors. @@ -27,7 +27,7 @@ public sealed class SourceHttpClientOptions /// /// Gets or sets the user-agent string applied to outgoing requests. /// - public string UserAgent { get; set; } = "StellaOps.Feedser/1.0"; + public string UserAgent { get; set; } = "StellaOps.Concelier/1.0"; /// /// Gets or sets whether redirects are allowed. Defaults to true. diff --git a/src/StellaOps.Feedser.Source.Common/Json/IJsonSchemaValidator.cs b/src/StellaOps.Concelier.Source.Common/Json/IJsonSchemaValidator.cs similarity index 74% rename from src/StellaOps.Feedser.Source.Common/Json/IJsonSchemaValidator.cs rename to src/StellaOps.Concelier.Source.Common/Json/IJsonSchemaValidator.cs index 47317d91..251a2d01 100644 --- a/src/StellaOps.Feedser.Source.Common/Json/IJsonSchemaValidator.cs +++ b/src/StellaOps.Concelier.Source.Common/Json/IJsonSchemaValidator.cs @@ -1,7 +1,7 @@ using System.Text.Json; using Json.Schema; -namespace StellaOps.Feedser.Source.Common.Json; +namespace StellaOps.Concelier.Source.Common.Json; public interface IJsonSchemaValidator { diff --git a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationError.cs b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationError.cs similarity index 71% rename from src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationError.cs rename to src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationError.cs index f0de47f2..af498f18 100644 --- a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationError.cs +++ b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationError.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Json; +namespace StellaOps.Concelier.Source.Common.Json; public sealed record JsonSchemaValidationError( string InstanceLocation, diff --git a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationException.cs b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationException.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationException.cs rename to src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationException.cs index c3ee6b2e..5fca53b4 100644 --- a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidationException.cs +++ b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidationException.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Json; +namespace StellaOps.Concelier.Source.Common.Json; public sealed class JsonSchemaValidationException : Exception { diff --git a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidator.cs b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidator.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidator.cs rename to src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidator.cs index 98408bf5..0e561b1d 100644 --- a/src/StellaOps.Feedser.Source.Common/Json/JsonSchemaValidator.cs +++ b/src/StellaOps.Concelier.Source.Common/Json/JsonSchemaValidator.cs @@ -4,7 +4,7 @@ using System.Text.Json; using Json.Schema; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Source.Common.Json; +namespace StellaOps.Concelier.Source.Common.Json; public sealed class JsonSchemaValidator : IJsonSchemaValidator { private readonly ILogger _logger; diff --git a/src/StellaOps.Feedser.Source.Common/Packages/PackageCoordinateHelper.cs b/src/StellaOps.Concelier.Source.Common/Packages/PackageCoordinateHelper.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Common/Packages/PackageCoordinateHelper.cs rename to src/StellaOps.Concelier.Source.Common/Packages/PackageCoordinateHelper.cs index 7505f55d..1447c86e 100644 --- a/src/StellaOps.Feedser.Source.Common/Packages/PackageCoordinateHelper.cs +++ b/src/StellaOps.Concelier.Source.Common/Packages/PackageCoordinateHelper.cs @@ -1,9 +1,9 @@ using System.Linq; using System.Text; using NuGet.Versioning; -using StellaOps.Feedser.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Identifiers; -namespace StellaOps.Feedser.Source.Common.Packages; +namespace StellaOps.Concelier.Source.Common.Packages; /// /// Shared helpers for working with Package URLs and SemVer coordinates inside connectors. diff --git a/src/StellaOps.Feedser.Source.Common/Pdf/PdfTextExtractor.cs b/src/StellaOps.Concelier.Source.Common/Pdf/PdfTextExtractor.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Common/Pdf/PdfTextExtractor.cs rename to src/StellaOps.Concelier.Source.Common/Pdf/PdfTextExtractor.cs index a36d98de..a9e9d5c6 100644 --- a/src/StellaOps.Feedser.Source.Common/Pdf/PdfTextExtractor.cs +++ b/src/StellaOps.Concelier.Source.Common/Pdf/PdfTextExtractor.cs @@ -6,7 +6,7 @@ using System.Text; using UglyToad.PdfPig; using UglyToad.PdfPig.Content; -namespace StellaOps.Feedser.Source.Common.Pdf; +namespace StellaOps.Concelier.Source.Common.Pdf; /// /// Extracts text from PDF advisories using UglyToad.PdfPig without requiring native dependencies. diff --git a/src/StellaOps.Concelier.Source.Common/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Common/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b138a0e9 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Common.Tests")] diff --git a/src/StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj b/src/StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj similarity index 77% rename from src/StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj rename to src/StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj index 5ec42c47..92600a8d 100644 --- a/src/StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj +++ b/src/StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/StellaOps.Feedser.Source.Common/TASKS.md b/src/StellaOps.Concelier.Source.Common/TASKS.md similarity index 92% rename from src/StellaOps.Feedser.Source.Common/TASKS.md rename to src/StellaOps.Concelier.Source.Common/TASKS.md index 5ce78e95..08e52db4 100644 --- a/src/StellaOps.Feedser.Source.Common/TASKS.md +++ b/src/StellaOps.Concelier.Source.Common/TASKS.md @@ -15,5 +15,5 @@ |Shared jitter source in retry policy|BE-Conn-Shared|Source.Common|**DONE** – `SourceRetryPolicy` now consumes injected `CryptoJitterSource` for thread-safe jitter.| |Allow per-request Accept header overrides|BE-Conn-Shared|Source.Common|**DONE** – `SourceFetchRequest.AcceptHeaders` honored by `SourceFetchService` plus unit tests for overrides.| |FEEDCONN-SHARED-HTTP2-001 HTTP version fallback policy|BE-Conn-Shared, Source.Common|Source.Common|**DONE (2025-10-11)** – `AddSourceHttpClient` now honours per-connector HTTP version/ policy, exposes handler customisation, and defaults to downgrade-friendly settings; unit tests cover handler configuration hook.| -|FEEDCONN-SHARED-TLS-001 Sovereign trust store support|BE-Conn-Shared, Ops|Source.Common|**DONE (2025-10-11)** – `SourceHttpClientOptions` now exposes `TrustedRootCertificates`, `ServerCertificateCustomValidation`, and `AllowInvalidServerCertificates`, and `AddSourceHttpClient` runs the shared configuration binder so connectors can pull `feedser:httpClients|sources::http` settings (incl. Offline Kit relative PEM paths via `feedser:offline:root`). Tests cover handler wiring. Ops follow-up: package RU trust roots for Offline Kit distribution.| +|FEEDCONN-SHARED-TLS-001 Sovereign trust store support|BE-Conn-Shared, Ops|Source.Common|**DONE (2025-10-11)** – `SourceHttpClientOptions` now exposes `TrustedRootCertificates`, `ServerCertificateCustomValidation`, and `AllowInvalidServerCertificates`, and `AddSourceHttpClient` runs the shared configuration binder so connectors can pull `concelier:httpClients|sources::http` settings (incl. Offline Kit relative PEM paths via `concelier:offline:root`). Tests cover handler wiring. Ops follow-up: package RU trust roots for Offline Kit distribution.| |FEEDCONN-SHARED-STATE-003 Source state seeding helper|Tools Guild, BE-Conn-MSRC|Tools|**TODO (2025-10-15)** – Provide a reusable CLI/utility to seed `pendingDocuments`/`pendingMappings` for connectors (MSRC backfills require scripted CVRF + detail injection). Coordinate with MSRC team for expected JSON schema and handoff once prototype lands.| diff --git a/src/StellaOps.Feedser.Source.Common/Telemetry/SourceDiagnostics.cs b/src/StellaOps.Concelier.Source.Common/Telemetry/SourceDiagnostics.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Common/Telemetry/SourceDiagnostics.cs rename to src/StellaOps.Concelier.Source.Common/Telemetry/SourceDiagnostics.cs index 1f3a520c..1afb0b1b 100644 --- a/src/StellaOps.Feedser.Source.Common/Telemetry/SourceDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Common/Telemetry/SourceDiagnostics.cs @@ -2,31 +2,31 @@ using System.Diagnostics; using System.Diagnostics.Metrics; using System.Net; -namespace StellaOps.Feedser.Source.Common.Telemetry; +namespace StellaOps.Concelier.Source.Common.Telemetry; /// /// Central telemetry instrumentation for connector HTTP operations. /// public static class SourceDiagnostics { - public const string ActivitySourceName = "StellaOps.Feedser.Source"; - public const string MeterName = "StellaOps.Feedser.Source"; + public const string ActivitySourceName = "StellaOps.Concelier.Source"; + public const string MeterName = "StellaOps.Concelier.Source"; private static readonly ActivitySource ActivitySource = new(ActivitySourceName); private static readonly Meter Meter = new(MeterName); - private static readonly Counter HttpRequestCounter = Meter.CreateCounter("feedser.source.http.requests"); - private static readonly Counter HttpRetryCounter = Meter.CreateCounter("feedser.source.http.retries"); - private static readonly Counter HttpFailureCounter = Meter.CreateCounter("feedser.source.http.failures"); - private static readonly Counter HttpNotModifiedCounter = Meter.CreateCounter("feedser.source.http.not_modified"); - private static readonly Histogram HttpDuration = Meter.CreateHistogram("feedser.source.http.duration", unit: "ms"); - private static readonly Histogram HttpPayloadBytes = Meter.CreateHistogram("feedser.source.http.payload_bytes", unit: "byte"); + private static readonly Counter HttpRequestCounter = Meter.CreateCounter("concelier.source.http.requests"); + private static readonly Counter HttpRetryCounter = Meter.CreateCounter("concelier.source.http.retries"); + private static readonly Counter HttpFailureCounter = Meter.CreateCounter("concelier.source.http.failures"); + private static readonly Counter HttpNotModifiedCounter = Meter.CreateCounter("concelier.source.http.not_modified"); + private static readonly Histogram HttpDuration = Meter.CreateHistogram("concelier.source.http.duration", unit: "ms"); + private static readonly Histogram HttpPayloadBytes = Meter.CreateHistogram("concelier.source.http.payload_bytes", unit: "byte"); public static Activity? StartFetch(string sourceName, Uri requestUri, string httpMethod, string? clientName) { var tags = new ActivityTagsCollection { - { "feedser.source", sourceName }, + { "concelier.source", sourceName }, { "http.method", httpMethod }, { "http.url", requestUri.ToString() }, }; @@ -70,7 +70,7 @@ public static class SourceDiagnostics { var tags = new TagList { - { "feedser.source", sourceName }, + { "concelier.source", sourceName }, { "http.retry_attempt", attempt }, { "http.retry_delay_ms", delay.TotalMilliseconds }, }; @@ -92,7 +92,7 @@ public static class SourceDiagnostics { var tags = new TagList { - { "feedser.source", sourceName }, + { "concelier.source", sourceName }, { "http.status_code", (int)statusCode }, { "http.attempts", attemptCount }, }; diff --git a/src/StellaOps.Feedser.Source.Common/Testing/CannedHttpMessageHandler.cs b/src/StellaOps.Concelier.Source.Common/Testing/CannedHttpMessageHandler.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Common/Testing/CannedHttpMessageHandler.cs rename to src/StellaOps.Concelier.Source.Common/Testing/CannedHttpMessageHandler.cs index 76c65f7e..d60e27ac 100644 --- a/src/StellaOps.Feedser.Source.Common/Testing/CannedHttpMessageHandler.cs +++ b/src/StellaOps.Concelier.Source.Common/Testing/CannedHttpMessageHandler.cs @@ -3,7 +3,7 @@ using System.Net; using System.Net.Http; using System.Text; -namespace StellaOps.Feedser.Source.Common.Testing; +namespace StellaOps.Concelier.Source.Common.Testing; /// /// Deterministic HTTP handler used by tests to supply canned responses keyed by request URI and method. diff --git a/src/StellaOps.Feedser.Source.Common/Url/UrlNormalizer.cs b/src/StellaOps.Concelier.Source.Common/Url/UrlNormalizer.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Common/Url/UrlNormalizer.cs rename to src/StellaOps.Concelier.Source.Common/Url/UrlNormalizer.cs index a9c85cf2..2630ebcf 100644 --- a/src/StellaOps.Feedser.Source.Common/Url/UrlNormalizer.cs +++ b/src/StellaOps.Concelier.Source.Common/Url/UrlNormalizer.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Common.Url; +namespace StellaOps.Concelier.Source.Common.Url; /// /// Utilities for normalizing URLs from upstream feeds. diff --git a/src/StellaOps.Feedser.Source.Common/Xml/IXmlSchemaValidator.cs b/src/StellaOps.Concelier.Source.Common/Xml/IXmlSchemaValidator.cs similarity index 75% rename from src/StellaOps.Feedser.Source.Common/Xml/IXmlSchemaValidator.cs rename to src/StellaOps.Concelier.Source.Common/Xml/IXmlSchemaValidator.cs index cb340779..06d970e1 100644 --- a/src/StellaOps.Feedser.Source.Common/Xml/IXmlSchemaValidator.cs +++ b/src/StellaOps.Concelier.Source.Common/Xml/IXmlSchemaValidator.cs @@ -1,7 +1,7 @@ using System.Xml.Linq; using System.Xml.Schema; -namespace StellaOps.Feedser.Source.Common.Xml; +namespace StellaOps.Concelier.Source.Common.Xml; public interface IXmlSchemaValidator { diff --git a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationError.cs b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationError.cs similarity index 61% rename from src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationError.cs rename to src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationError.cs index 34ee3b2e..e2c062c2 100644 --- a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationError.cs +++ b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationError.cs @@ -1,3 +1,3 @@ -namespace StellaOps.Feedser.Source.Common.Xml; +namespace StellaOps.Concelier.Source.Common.Xml; public sealed record XmlSchemaValidationError(string Message, string? Location); diff --git a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationException.cs b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationException.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationException.cs rename to src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationException.cs index a8b8cb3a..5c483f39 100644 --- a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidationException.cs +++ b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidationException.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Common.Xml; +namespace StellaOps.Concelier.Source.Common.Xml; public sealed class XmlSchemaValidationException : Exception { diff --git a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidator.cs b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidator.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidator.cs rename to src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidator.cs index 5ea71951..1203e501 100644 --- a/src/StellaOps.Feedser.Source.Common/Xml/XmlSchemaValidator.cs +++ b/src/StellaOps.Concelier.Source.Common/Xml/XmlSchemaValidator.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; using System.Xml.Schema; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Source.Common.Xml; +namespace StellaOps.Concelier.Source.Common.Xml; public sealed class XmlSchemaValidator : IXmlSchemaValidator { diff --git a/src/StellaOps.Feedser.Source.Cve.Tests/Cve/CveConnectorTests.cs b/src/StellaOps.Concelier.Source.Cve.Tests/Cve/CveConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Cve.Tests/Cve/CveConnectorTests.cs rename to src/StellaOps.Concelier.Source.Cve.Tests/Cve/CveConnectorTests.cs index 6736d027..bb5757ee 100644 --- a/src/StellaOps.Feedser.Source.Cve.Tests/Cve/CveConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Cve.Tests/Cve/CveConnectorTests.cs @@ -9,19 +9,19 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Cve.Configuration; -using StellaOps.Feedser.Source.Cve.Internal; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Cve.Configuration; +using StellaOps.Concelier.Source.Cve.Internal; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Cve.Tests; +namespace StellaOps.Concelier.Source.Cve.Tests; [Collection("mongo-fixture")] public sealed class CveConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/cve-CVE-2024-0001.json b/src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/cve-CVE-2024-0001.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/cve-CVE-2024-0001.json rename to src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/cve-CVE-2024-0001.json diff --git a/src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/cve-list.json b/src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/cve-list.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/cve-list.json rename to src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/cve-list.json diff --git a/src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/expected-CVE-2024-0001.json b/src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/expected-CVE-2024-0001.json similarity index 100% rename from src/StellaOps.Feedser.Source.Cve.Tests/Fixtures/expected-CVE-2024-0001.json rename to src/StellaOps.Concelier.Source.Cve.Tests/Fixtures/expected-CVE-2024-0001.json diff --git a/src/StellaOps.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj b/src/StellaOps.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj new file mode 100644 index 00000000..99902bbe --- /dev/null +++ b/src/StellaOps.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj @@ -0,0 +1,17 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Cve/AGENTS.md b/src/StellaOps.Concelier.Source.Cve/AGENTS.md similarity index 88% rename from src/StellaOps.Feedser.Source.Cve/AGENTS.md rename to src/StellaOps.Concelier.Source.Cve/AGENTS.md index 2d7c464a..d29264e6 100644 --- a/src/StellaOps.Feedser.Source.Cve/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Cve/AGENTS.md @@ -12,8 +12,8 @@ Create a dedicated CVE connector when we need raw CVE stream ingestion outside o ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores & source state). -- `Feedser.Models` (canonical data model). -- `Feedser.Testing` (integration fixtures, snapshot helpers). +- `Concelier.Models` (canonical data model). +- `Concelier.Testing` (integration fixtures, snapshot helpers). ## Interfaces & Contracts - Job kinds: `cve:fetch`, `cve:parse`, `cve:map`. @@ -33,6 +33,6 @@ Out of scope: - Sanitize and validate payloads before persistence. ## Tests -- Add `StellaOps.Feedser.Source.Cve.Tests` with canned CVE JSON fixtures covering fetch/parse/map. +- Add `StellaOps.Concelier.Source.Cve.Tests` with canned CVE JSON fixtures covering fetch/parse/map. - Snapshot canonical advisories; include env flag for fixture regeneration. - Ensure deterministic ordering and timestamp handling. diff --git a/src/StellaOps.Feedser.Source.Cve/Configuration/CveOptions.cs b/src/StellaOps.Concelier.Source.Cve/Configuration/CveOptions.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cve/Configuration/CveOptions.cs rename to src/StellaOps.Concelier.Source.Cve/Configuration/CveOptions.cs index 3a48f133..5d4348f2 100644 --- a/src/StellaOps.Feedser.Source.Cve/Configuration/CveOptions.cs +++ b/src/StellaOps.Concelier.Source.Cve/Configuration/CveOptions.cs @@ -2,7 +2,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.IO; -namespace StellaOps.Feedser.Source.Cve.Configuration; +namespace StellaOps.Concelier.Source.Cve.Configuration; public sealed class CveOptions { diff --git a/src/StellaOps.Feedser.Source.Cve/CveConnector.cs b/src/StellaOps.Concelier.Source.Cve/CveConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Cve/CveConnector.cs rename to src/StellaOps.Concelier.Source.Cve/CveConnector.cs index f9785a44..e1b9874e 100644 --- a/src/StellaOps.Feedser.Source.Cve/CveConnector.cs +++ b/src/StellaOps.Concelier.Source.Cve/CveConnector.cs @@ -9,19 +9,19 @@ using System.Security.Cryptography; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Text; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Cve.Configuration; -using StellaOps.Feedser.Source.Cve.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Text; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Cve.Configuration; +using StellaOps.Concelier.Source.Cve.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Cve; +namespace StellaOps.Concelier.Source.Cve; public sealed class CveConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Cve/CveConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Cve/CveConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Cve/CveConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Cve/CveConnectorPlugin.cs index 1e534726..4824d4f0 100644 --- a/src/StellaOps.Feedser.Source.Cve/CveConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Cve/CveConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Cve; +namespace StellaOps.Concelier.Source.Cve; public sealed class CveConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Cve/CveDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Cve/CveDependencyInjectionRoutine.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Cve/CveDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Cve/CveDependencyInjectionRoutine.cs index 519bf529..2ad0d994 100644 --- a/src/StellaOps.Feedser.Source.Cve/CveDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Cve/CveDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Cve.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Cve.Configuration; -namespace StellaOps.Feedser.Source.Cve; +namespace StellaOps.Concelier.Source.Cve; public sealed class CveDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cve"; + private const string ConfigurationSection = "concelier:sources:cve"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Cve/CveServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Cve/CveServiceCollectionExtensions.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Cve/CveServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Cve/CveServiceCollectionExtensions.cs index 55105ebb..cd761685 100644 --- a/src/StellaOps.Feedser.Source.Cve/CveServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Cve/CveServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Cve.Configuration; -using StellaOps.Feedser.Source.Cve.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Cve.Configuration; +using StellaOps.Concelier.Source.Cve.Internal; -namespace StellaOps.Feedser.Source.Cve; +namespace StellaOps.Concelier.Source.Cve; public static class CveServiceCollectionExtensions { @@ -22,7 +22,7 @@ public static class CveServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseEndpoint; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Cve/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Cve/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseEndpoint.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/json"; diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveCursor.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveCursor.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveCursor.cs index b1a3136d..9b6c19e8 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveCursor.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveCursor.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; internal sealed record CveCursor( DateTimeOffset? LastModifiedExclusive, diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveDiagnostics.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveDiagnostics.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveDiagnostics.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveDiagnostics.cs index 570af127..26477bdc 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; public sealed class CveDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Cve"; + public const string MeterName = "StellaOps.Concelier.Source.Cve"; public const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveListParser.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveListParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveListParser.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveListParser.cs index 93c3141e..7843ba7d 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveListParser.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveListParser.cs @@ -1,7 +1,7 @@ using System.Globalization; using System.Text.Json; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; internal static class CveListParser { diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveMapper.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveMapper.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveMapper.cs index 83fbcc1a..ef0f4626 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveMapper.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveMapper.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Storage.Mongo.Documents; using NuGet.Versioning; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; internal static class CveMapper { diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveRecordDto.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveRecordDto.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveRecordDto.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveRecordDto.cs index 8dbe9d54..ceda5444 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveRecordDto.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveRecordDto.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; internal sealed record CveRecordDto { diff --git a/src/StellaOps.Feedser.Source.Cve/Internal/CveRecordParser.cs b/src/StellaOps.Concelier.Source.Cve/Internal/CveRecordParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Cve/Internal/CveRecordParser.cs rename to src/StellaOps.Concelier.Source.Cve/Internal/CveRecordParser.cs index d9fc89d7..f6247ac6 100644 --- a/src/StellaOps.Feedser.Source.Cve/Internal/CveRecordParser.cs +++ b/src/StellaOps.Concelier.Source.Cve/Internal/CveRecordParser.cs @@ -1,9 +1,9 @@ using System.Globalization; using System.Linq; using System.Text.Json; -using StellaOps.Feedser.Normalization.Text; +using StellaOps.Concelier.Normalization.Text; -namespace StellaOps.Feedser.Source.Cve.Internal; +namespace StellaOps.Concelier.Source.Cve.Internal; internal static class CveRecordParser { diff --git a/src/StellaOps.Feedser.Source.Cve/Jobs.cs b/src/StellaOps.Concelier.Source.Cve/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Cve/Jobs.cs rename to src/StellaOps.Concelier.Source.Cve/Jobs.cs index b413a27f..34714a3b 100644 --- a/src/StellaOps.Feedser.Source.Cve/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Cve/Jobs.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Cve; +namespace StellaOps.Concelier.Source.Cve; internal static class CveJobKinds { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/StellaOps.Feedser.Source.Vndr.Msrc.csproj b/src/StellaOps.Concelier.Source.Cve/StellaOps.Concelier.Source.Cve.csproj similarity index 58% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/StellaOps.Feedser.Source.Vndr.Msrc.csproj rename to src/StellaOps.Concelier.Source.Cve/StellaOps.Concelier.Source.Cve.csproj index f7f2c154..7066145d 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/StellaOps.Feedser.Source.Vndr.Msrc.csproj +++ b/src/StellaOps.Concelier.Source.Cve/StellaOps.Concelier.Source.Cve.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/StellaOps.Feedser.Source.Cve/TASKS.md b/src/StellaOps.Concelier.Source.Cve/TASKS.md similarity index 80% rename from src/StellaOps.Feedser.Source.Cve/TASKS.md rename to src/StellaOps.Concelier.Source.Cve/TASKS.md index 2a4751ee..3c385609 100644 --- a/src/StellaOps.Feedser.Source.Cve/TASKS.md +++ b/src/StellaOps.Concelier.Source.Cve/TASKS.md @@ -5,8 +5,8 @@ |Fetch/cursor implementation|BE-Conn-CVE|Source.Common, Storage.Mongo|**DONE (2025-10-10)** – Time-window + page-aware cursor with SourceFetchService fetching list/detail pairs, resumable state persisted via `CveCursor`.| |DTOs & parser|BE-Conn-CVE|Source.Common|**DONE (2025-10-10)** – `CveRecordParser` and DTOs capture aliases, references, metrics, vendor ranges; sanitises text and timestamps.| |Canonical mapping & range primitives|BE-Conn-CVE|Models|**DONE (2025-10-10)** – `CveMapper` emits canonical advisories, vendor range primitives, SemVer/range statuses, references, CVSS normalization.
2025-10-11 research trail: confirm subsequent MR adds `NormalizedVersions` shaped like `[{"scheme":"semver","type":"range","min":"","minInclusive":true,"max":"","maxInclusive":false,"notes":"nvd:CVE-2025-XXXX"}]` so storage provenance joins continue to work.| -|Deterministic tests & fixtures|QA|Testing|**DONE (2025-10-10)** – Added `StellaOps.Feedser.Source.Cve.Tests` harness with canned fixtures + snapshot regression covering fetch/parse/map.| +|Deterministic tests & fixtures|QA|Testing|**DONE (2025-10-10)** – Added `StellaOps.Concelier.Source.Cve.Tests` harness with canned fixtures + snapshot regression covering fetch/parse/map.| |Observability & docs|DevEx|Docs|**DONE (2025-10-10)** – Diagnostics meter (`cve.fetch.*`, etc.) wired; options/usage documented via `CveServiceCollectionExtensions`.| -|Operator rollout playbook|BE-Conn-CVE, Ops|Docs|**DONE (2025-10-12)** – Refreshed `docs/ops/feedser-cve-kev-operations.md` with credential checklist, smoke book, PromQL guardrails, and linked Grafana pack (`docs/ops/feedser-cve-kev-grafana-dashboard.json`).| -|Live smoke & monitoring|QA, BE-Conn-CVE|WebService, Observability|**DONE (2025-10-15)** – Executed connector harness smoke using CVE Services sample window (CVE-2024-0001), confirmed fetch/parse/map telemetry (`cve.fetch.*`, `cve.map.success`) all incremented once, and archived the summary log + Grafana import guidance in `docs/ops/feedser-cve-kev-operations.md` (“Staging smoke 2025-10-15”).| -|FEEDCONN-CVE-02-003 Normalized versions rollout|BE-Conn-CVE|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-12)** – Confirmed SemVer primitives map to normalized rules with `cve:{cveId}:{identifier}` notes and refreshed snapshots; `dotnet test src/StellaOps.Feedser.Source.Cve.Tests` passes on net10 preview.| +|Operator rollout playbook|BE-Conn-CVE, Ops|Docs|**DONE (2025-10-12)** – Refreshed `docs/ops/concelier-cve-kev-operations.md` with credential checklist, smoke book, PromQL guardrails, and linked Grafana pack (`docs/ops/concelier-cve-kev-grafana-dashboard.json`).| +|Live smoke & monitoring|QA, BE-Conn-CVE|WebService, Observability|**DONE (2025-10-15)** – Executed connector harness smoke using CVE Services sample window (CVE-2024-0001), confirmed fetch/parse/map telemetry (`cve.fetch.*`, `cve.map.success`) all incremented once, and archived the summary log + Grafana import guidance in `docs/ops/concelier-cve-kev-operations.md` (“Staging smoke 2025-10-15”).| +|FEEDCONN-CVE-02-003 Normalized versions rollout|BE-Conn-CVE|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-12)** – Confirmed SemVer primitives map to normalized rules with `cve:{cveId}:{identifier}` notes and refreshed snapshots; `dotnet test src/StellaOps.Concelier.Source.Cve.Tests` passes on net10 preview.| diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianConnectorTests.cs b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianConnectorTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianConnectorTests.cs rename to src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianConnectorTests.cs index bbec302a..444e5c00 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianConnectorTests.cs @@ -15,20 +15,20 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Distro.Debian.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Distro.Debian.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Distro.Debian.Tests; +namespace StellaOps.Concelier.Source.Distro.Debian.Tests; [Collection("mongo-fixture")] public sealed class DebianConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianMapperTests.cs b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianMapperTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianMapperTests.cs rename to src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianMapperTests.cs index 03f8d5fb..65b0c30c 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/DebianMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/DebianMapperTests.cs @@ -1,11 +1,11 @@ using System; using Xunit; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Distro.Debian; -using StellaOps.Feedser.Source.Distro.Debian.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Distro.Debian; +using StellaOps.Concelier.Source.Distro.Debian.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Distro.Debian.Tests; +namespace StellaOps.Concelier.Source.Distro.Debian.Tests; public sealed class DebianMapperTests { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-123.html b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-123.html similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-123.html rename to src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-123.html diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-124.html b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-124.html similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-124.html rename to src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-detail-dsa-2024-124.html diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-list.txt b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-list.txt similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-list.txt rename to src/StellaOps.Concelier.Source.Distro.Debian.Tests/Source/Distro/Debian/Fixtures/debian-list.txt diff --git a/src/StellaOps.Concelier.Source.Distro.Debian.Tests/StellaOps.Concelier.Source.Distro.Debian.Tests.csproj b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/StellaOps.Concelier.Source.Distro.Debian.Tests.csproj new file mode 100644 index 00000000..eee68959 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Debian.Tests/StellaOps.Concelier.Source.Distro.Debian.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Concelier.Source.Distro.Debian/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Distro.Debian/AssemblyInfo.cs new file mode 100644 index 00000000..ea9029c1 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Debian/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Distro.Debian.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Configuration/DebianOptions.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Configuration/DebianOptions.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Distro.Debian/Configuration/DebianOptions.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Configuration/DebianOptions.cs index c5c82e4a..7157b6ff 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Configuration/DebianOptions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Configuration/DebianOptions.cs @@ -1,10 +1,10 @@ using System; -namespace StellaOps.Feedser.Source.Distro.Debian.Configuration; +namespace StellaOps.Concelier.Source.Distro.Debian.Configuration; public sealed class DebianOptions { - public const string HttpClientName = "feedser.debian"; + public const string HttpClientName = "concelier.debian"; /// /// Raw advisory list published by the Debian security tracker team. @@ -45,7 +45,7 @@ public sealed class DebianOptions /// /// Custom user-agent for Debian tracker courtesy. /// - public string UserAgent { get; set; } = "StellaOps.Feedser.Debian/0.1 (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps.Concelier.Debian/0.1 (+https://stella-ops.org)"; public void Validate() { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/DebianConnector.cs b/src/StellaOps.Concelier.Source.Distro.Debian/DebianConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Debian/DebianConnector.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/DebianConnector.cs index ddd1c1de..31bbc0ac 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/DebianConnector.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/DebianConnector.cs @@ -9,18 +9,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Distro.Debian.Configuration; -using StellaOps.Feedser.Source.Distro.Debian.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Distro.Debian.Configuration; +using StellaOps.Concelier.Source.Distro.Debian.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Debian; +namespace StellaOps.Concelier.Source.Distro.Debian; public sealed class DebianConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/DebianConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Distro.Debian/DebianConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Debian/DebianConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/DebianConnectorPlugin.cs index 5f4aced7..7e78d15d 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/DebianConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/DebianConnectorPlugin.cs @@ -4,7 +4,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Debian; +namespace StellaOps.Concelier.Source.Distro.Debian; public sealed class DebianConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs index 562ded3d..718fbb24 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/DebianDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Distro.Debian.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Distro.Debian.Configuration; -namespace StellaOps.Feedser.Source.Distro.Debian; +namespace StellaOps.Concelier.Source.Distro.Debian; public sealed class DebianDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:debian"; + private const string ConfigurationSection = "concelier:sources:debian"; private const string FetchSchedule = "*/30 * * * *"; private const string ParseSchedule = "7,37 * * * *"; private const string MapSchedule = "12,42 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/DebianServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Distro.Debian/DebianServiceCollectionExtensions.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Debian/DebianServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/DebianServiceCollectionExtensions.cs index 5df031df..595384b7 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/DebianServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/DebianServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Distro.Debian.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Distro.Debian.Configuration; -namespace StellaOps.Feedser.Source.Distro.Debian; +namespace StellaOps.Concelier.Source.Distro.Debian; public static class DebianServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs index b1a88845..a2d10450 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal sealed record DebianAdvisoryDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianCursor.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianCursor.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianCursor.cs index 1b0d6bff..cb1d7c1b 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianCursor.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal sealed record DebianCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianDetailMetadata.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianDetailMetadata.cs similarity index 77% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianDetailMetadata.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianDetailMetadata.cs index 56e95339..067bd0db 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianDetailMetadata.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianDetailMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal sealed record DebianDetailMetadata( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs index 3be35b6b..db66b96e 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianFetchCacheEntry.cs @@ -1,13 +1,13 @@ using System; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal sealed record DebianFetchCacheEntry(string? ETag, DateTimeOffset? LastModified) { public static DebianFetchCacheEntry Empty { get; } = new(null, null); - public static DebianFetchCacheEntry FromDocument(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public static DebianFetchCacheEntry FromDocument(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) => new(document.Etag, document.LastModified); public static DebianFetchCacheEntry FromBson(BsonDocument document) @@ -54,7 +54,7 @@ internal sealed record DebianFetchCacheEntry(string? ETag, DateTimeOffset? LastM return document; } - public bool Matches(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public bool Matches(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) { if (document is null) { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianHtmlParser.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianHtmlParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianHtmlParser.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianHtmlParser.cs index 34b22a25..cc407884 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianHtmlParser.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianHtmlParser.cs @@ -5,7 +5,7 @@ using System.Linq; using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal static class DebianHtmlParser { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListEntry.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListEntry.cs similarity index 75% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListEntry.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListEntry.cs index 81e708fa..f87e5124 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListEntry.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListEntry.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal sealed record DebianListEntry( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListParser.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListParser.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListParser.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListParser.cs index 3e22e4b0..a4648ee0 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianListParser.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianListParser.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal static class DebianListParser { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianMapper.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianMapper.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianMapper.cs index 0c6d89e1..231d54cb 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Internal/DebianMapper.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Internal/DebianMapper.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Distro; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Distro; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Distro.Debian.Internal; +namespace StellaOps.Concelier.Source.Distro.Debian.Internal; internal static class DebianMapper { diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/Jobs.cs b/src/StellaOps.Concelier.Source.Distro.Debian/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.Debian/Jobs.cs rename to src/StellaOps.Concelier.Source.Distro.Debian/Jobs.cs index 0c770787..07046411 100644 --- a/src/StellaOps.Feedser.Source.Distro.Debian/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Distro.Debian/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Distro.Debian; +namespace StellaOps.Concelier.Source.Distro.Debian; internal static class DebianJobKinds { diff --git a/src/StellaOps.Concelier.Source.Distro.Debian/StellaOps.Concelier.Source.Distro.Debian.csproj b/src/StellaOps.Concelier.Source.Distro.Debian/StellaOps.Concelier.Source.Distro.Debian.csproj new file mode 100644 index 00000000..51f2b1a6 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Debian/StellaOps.Concelier.Source.Distro.Debian.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0001.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0001.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0001.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0001.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0002.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0002.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0002.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0002.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0003.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0003.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0003.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/csaf-rhsa-2025-0003.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1-repeat.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1-repeat.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1-repeat.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1-repeat.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page1.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page2.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page2.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page2.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page2.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page3.json b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page3.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page3.json rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/summary-page3.json diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs index 463f513c..00ae9baf 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorHarnessTests.cs @@ -3,15 +3,15 @@ using System.IO; using System.Linq; using Microsoft.Extensions.DependencyInjection; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Distro.RedHat; -using StellaOps.Feedser.Source.Distro.RedHat.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Distro.RedHat; +using StellaOps.Concelier.Source.Distro.RedHat.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Distro.RedHat.Tests; +namespace StellaOps.Concelier.Source.Distro.RedHat.Tests; [Collection("mongo-fixture")] public sealed class RedHatConnectorHarnessTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs index 873980c5..d98c7c48 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/RedHatConnectorTests.cs @@ -14,25 +14,25 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Distro.RedHat; -using StellaOps.Feedser.Source.Distro.RedHat.Configuration; -using StellaOps.Feedser.Source.Distro.RedHat.Internal; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Distro.RedHat; +using StellaOps.Concelier.Source.Distro.RedHat.Configuration; +using StellaOps.Concelier.Source.Distro.RedHat.Internal; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using StellaOps.Plugin; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Distro.RedHat.Tests; +namespace StellaOps.Concelier.Source.Distro.RedHat.Tests; [Collection("mongo-fixture")] public sealed class RedHatConnectorTests : IAsyncLifetime @@ -567,9 +567,9 @@ public sealed class RedHatConnectorTests : IAsyncLifetime services.Configure(schedulerOptions => { - var fetchType = Type.GetType("StellaOps.Feedser.Source.Distro.RedHat.RedHatFetchJob, StellaOps.Feedser.Source.Distro.RedHat", throwOnError: true)!; - var parseType = Type.GetType("StellaOps.Feedser.Source.Distro.RedHat.RedHatParseJob, StellaOps.Feedser.Source.Distro.RedHat", throwOnError: true)!; - var mapType = Type.GetType("StellaOps.Feedser.Source.Distro.RedHat.RedHatMapJob, StellaOps.Feedser.Source.Distro.RedHat", throwOnError: true)!; + var fetchType = Type.GetType("StellaOps.Concelier.Source.Distro.RedHat.RedHatFetchJob, StellaOps.Concelier.Source.Distro.RedHat", throwOnError: true)!; + var parseType = Type.GetType("StellaOps.Concelier.Source.Distro.RedHat.RedHatParseJob, StellaOps.Concelier.Source.Distro.RedHat", throwOnError: true)!; + var mapType = Type.GetType("StellaOps.Concelier.Source.Distro.RedHat.RedHatMapJob, StellaOps.Concelier.Source.Distro.RedHat", throwOnError: true)!; schedulerOptions.Definitions["source:redhat:fetch"] = new JobDefinition("source:redhat:fetch", fetchType, TimeSpan.FromMinutes(12), TimeSpan.FromMinutes(6), "0,15,30,45 * * * *", true); schedulerOptions.Definitions["source:redhat:parse"] = new JobDefinition("source:redhat:parse", parseType, TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(6), "5,20,35,50 * * * *", true); diff --git a/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj new file mode 100644 index 00000000..fbcba581 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.RedHat.Tests/StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/AGENTS.md b/src/StellaOps.Concelier.Source.Distro.RedHat/AGENTS.md similarity index 81% rename from src/StellaOps.Feedser.Source.Distro.RedHat/AGENTS.md rename to src/StellaOps.Concelier.Source.Distro.RedHat/AGENTS.md index 89956ea5..81c82880 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/AGENTS.md @@ -19,9 +19,9 @@ Red Hat distro connector (Security Data API and OVAL) providing authoritative OS In: authoritative rpm ranges, RHSA mapping, OVAL interpretation, watermarking. Out: building RPM artifacts; cross-distro reconciliation beyond Red Hat. ## Observability & security expectations -- Metrics: SourceDiagnostics publishes `feedser.source.http.*` counters/histograms tagged `feedser.source=redhat`, capturing fetch volumes, parse/OVAL failures, and map affected counts without bespoke metric names. +- Metrics: SourceDiagnostics publishes `concelier.source.http.*` counters/histograms tagged `concelier.source=redhat`, capturing fetch volumes, parse/OVAL failures, and map affected counts without bespoke metric names. - Logs: cursor bounds, advisory ids, NEVRA counts; allowlist Red Hat endpoints. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Distro.RedHat.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Distro.RedHat.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md b/src/StellaOps.Concelier.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md similarity index 84% rename from src/StellaOps.Feedser.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md rename to src/StellaOps.Concelier.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md index 55298baf..ea4f3623 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/CONFLICT_RESOLVER_NOTES.md @@ -18,8 +18,8 @@ The Red Hat connector fixtures were re-baselined after the model helper rollout ## Updated goldens -- `src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json` -- `src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json` -- `src/StellaOps.Feedser.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json` +- `src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0001.snapshot.json` +- `src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0002.snapshot.json` +- `src/StellaOps.Concelier.Source.Distro.RedHat.Tests/RedHat/Fixtures/rhsa-2025-0003.snapshot.json` Keep these notes in sync with any future provenance or normalized-rule updates so the conflict resolver team can reason about fixture-driven regressions. diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Configuration/RedHatOptions.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Configuration/RedHatOptions.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Configuration/RedHatOptions.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Configuration/RedHatOptions.cs index 81739d7a..7523d365 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Configuration/RedHatOptions.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Configuration/RedHatOptions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Distro.RedHat.Configuration; +namespace StellaOps.Concelier.Source.Distro.RedHat.Configuration; public sealed class RedHatOptions { @@ -50,7 +50,7 @@ public sealed class RedHatOptions /// /// Custom user-agent presented to Red Hat endpoints (kept short to satisfy Jetty header limits). /// - public string UserAgent { get; set; } = "StellaOps.Feedser.RedHat/1.0"; + public string UserAgent { get; set; } = "StellaOps.Concelier.RedHat/1.0"; public void Validate() { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs index 3fc6375e..349959fc 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/Models/RedHatCsafModels.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Distro.RedHat.Internal.Models; +namespace StellaOps.Concelier.Source.Distro.RedHat.Internal.Models; internal sealed class RedHatCsafEnvelope { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatCursor.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatCursor.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatCursor.cs index cbb807d1..e2a2a5da 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatCursor.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.RedHat.Internal; +namespace StellaOps.Concelier.Source.Distro.RedHat.Internal; internal sealed record RedHatCursor( DateTimeOffset? LastReleasedOn, diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatMapper.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatMapper.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatMapper.cs index e9d8a7ad..f14ba468 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatMapper.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatMapper.cs @@ -3,16 +3,16 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Distro.RedHat.Internal.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.Distro; -using StellaOps.Feedser.Normalization.Identifiers; -using StellaOps.Feedser.Normalization.Text; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Distro.RedHat.Internal.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.Distro; +using StellaOps.Concelier.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Text; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.Distro.RedHat.Internal; +namespace StellaOps.Concelier.Source.Distro.RedHat.Internal; internal static class RedHatMapper { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs index 0e63349d..9712d5d9 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Internal/RedHatSummaryItem.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json; -namespace StellaOps.Feedser.Source.Distro.RedHat.Internal; +namespace StellaOps.Concelier.Source.Distro.RedHat.Internal; internal readonly record struct RedHatSummaryItem(string AdvisoryId, DateTimeOffset ReleasedOn, Uri ResourceUri) { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Jobs.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.RedHat/Jobs.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/Jobs.cs index 86d93841..d9477bd5 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Distro.RedHat; +namespace StellaOps.Concelier.Source.Distro.RedHat; internal static class RedHatJobKinds { diff --git a/src/StellaOps.Concelier.Source.Distro.RedHat/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c81748a0 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Distro.RedHat.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnector.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnector.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnector.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnector.cs index f59381bd..2b352119 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnector.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnector.cs @@ -7,18 +7,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Distro.RedHat.Configuration; -using StellaOps.Feedser.Source.Distro.RedHat.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Distro.RedHat.Configuration; +using StellaOps.Concelier.Source.Distro.RedHat.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.RedHat; +namespace StellaOps.Concelier.Source.Distro.RedHat; public sealed class RedHatConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnectorPlugin.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnectorPlugin.cs index 6b2a03ae..40105a8a 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.RedHat; +namespace StellaOps.Concelier.Source.Distro.RedHat; public sealed class RedHatConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs index 39574db0..1fae4b2e 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Distro.RedHat.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Distro.RedHat.Configuration; -namespace StellaOps.Feedser.Source.Distro.RedHat; +namespace StellaOps.Concelier.Source.Distro.RedHat; public sealed class RedHatDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:redhat"; + private const string ConfigurationSection = "concelier:sources:redhat"; private const string FetchCron = "0,15,30,45 * * * *"; private const string ParseCron = "5,20,35,50 * * * *"; private const string MapCron = "10,25,40,55 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs index 5cf81f46..b494a2c4 100644 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/RedHatServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Distro.RedHat.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Distro.RedHat.Configuration; -namespace StellaOps.Feedser.Source.Distro.RedHat; +namespace StellaOps.Concelier.Source.Distro.RedHat; public static class RedHatServiceCollectionExtensions { diff --git a/src/StellaOps.Concelier.Source.Distro.RedHat/StellaOps.Concelier.Source.Distro.RedHat.csproj b/src/StellaOps.Concelier.Source.Distro.RedHat/StellaOps.Concelier.Source.Distro.RedHat.csproj new file mode 100644 index 00000000..88efa00b --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.RedHat/StellaOps.Concelier.Source.Distro.RedHat.csproj @@ -0,0 +1,15 @@ + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/TASKS.md b/src/StellaOps.Concelier.Source.Distro.RedHat/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.RedHat/TASKS.md rename to src/StellaOps.Concelier.Source.Distro.RedHat/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-changes.csv b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-changes.csv similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-changes.csv rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-changes.csv diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0001-1.json b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0001-1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0001-1.json rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0001-1.json diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0002-1.json b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0002-1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0002-1.json rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/Source/Distro/Suse/Fixtures/suse-su-2025_0002-1.json diff --git a/src/StellaOps.Concelier.Source.Distro.Suse.Tests/StellaOps.Concelier.Source.Distro.Suse.Tests.csproj b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/StellaOps.Concelier.Source.Distro.Suse.Tests.csproj new file mode 100644 index 00000000..cb1a3b4a --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/StellaOps.Concelier.Source.Distro.Suse.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + PreserveNewest + + + diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseConnectorTests.cs b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseConnectorTests.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseConnectorTests.cs rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseConnectorTests.cs index a1a2c403..74f2ea44 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseConnectorTests.cs @@ -12,21 +12,21 @@ using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Distro.Suse; -using StellaOps.Feedser.Source.Distro.Suse.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Distro.Suse; +using StellaOps.Concelier.Source.Distro.Suse.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Distro.Suse.Tests; +namespace StellaOps.Concelier.Source.Distro.Suse.Tests; [Collection("mongo-fixture")] public sealed class SuseConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseCsafParserTests.cs b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseCsafParserTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseCsafParserTests.cs rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseCsafParserTests.cs index fdde44fc..3e2a3340 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseCsafParserTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseCsafParserTests.cs @@ -2,10 +2,10 @@ using System; using System.IO; using System.Linq; using System.Text.Json; -using StellaOps.Feedser.Source.Distro.Suse.Internal; +using StellaOps.Concelier.Source.Distro.Suse.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Distro.Suse.Tests; +namespace StellaOps.Concelier.Source.Distro.Suse.Tests; public sealed class SuseCsafParserTests { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseMapperTests.cs b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseMapperTests.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseMapperTests.cs rename to src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseMapperTests.cs index f5faf065..2ba1c739 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/SuseMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse.Tests/SuseMapperTests.cs @@ -2,14 +2,14 @@ using System; using System.Collections.Generic; using System.IO; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Distro.Suse; -using StellaOps.Feedser.Source.Distro.Suse.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Distro.Suse; +using StellaOps.Concelier.Source.Distro.Suse.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; using Xunit; -namespace StellaOps.Feedser.Source.Distro.Suse.Tests; +namespace StellaOps.Concelier.Source.Distro.Suse.Tests; public sealed class SuseMapperTests { diff --git a/src/StellaOps.Concelier.Source.Distro.Suse/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Distro.Suse/AssemblyInfo.cs new file mode 100644 index 00000000..f08b2de7 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Suse/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Distro.Suse.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Configuration/SuseOptions.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Configuration/SuseOptions.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Distro.Suse/Configuration/SuseOptions.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Configuration/SuseOptions.cs index b1849d96..6f3ff71b 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Configuration/SuseOptions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Configuration/SuseOptions.cs @@ -1,10 +1,10 @@ using System; -namespace StellaOps.Feedser.Source.Distro.Suse.Configuration; +namespace StellaOps.Concelier.Source.Distro.Suse.Configuration; public sealed class SuseOptions { - public const string HttpClientName = "feedser.suse"; + public const string HttpClientName = "concelier.suse"; /// /// CSV index enumerating CSAF advisories with their last modification timestamps. @@ -39,7 +39,7 @@ public sealed class SuseOptions /// /// Custom user agent presented to SUSE endpoints. /// - public string UserAgent { get; set; } = "StellaOps.Feedser.Suse/0.1 (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps.Concelier.Suse/0.1 (+https://stella-ops.org)"; /// /// Timeout override applied to HTTP requests (defaults to 60 seconds when unset). diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs index a79b35b8..146f7af6 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal sealed record SuseAdvisoryDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangeRecord.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangeRecord.cs similarity index 61% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangeRecord.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangeRecord.cs index 99c8833f..455320af 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangeRecord.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangeRecord.cs @@ -1,5 +1,5 @@ using System; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal sealed record SuseChangeRecord(string FileName, DateTimeOffset ModifiedAt); diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangesParser.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangesParser.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangesParser.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangesParser.cs index 4c61b48b..566603ad 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseChangesParser.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseChangesParser.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal static class SuseChangesParser { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCsafParser.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCsafParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCsafParser.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCsafParser.cs index 3aebaec6..023e4d50 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCsafParser.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCsafParser.cs @@ -3,9 +3,9 @@ using System.Buffers.Text; using System.Collections.Generic; using System.Globalization; using System.Text.Json; -using StellaOps.Feedser.Normalization.Distro; +using StellaOps.Concelier.Normalization.Distro; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal static class SuseCsafParser { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCursor.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCursor.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCursor.cs index 8ac220ad..b3d8986b 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseCursor.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal sealed record SuseCursor( DateTimeOffset? LastModified, diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs index 2d70dcb5..1007d426 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseFetchCacheEntry.cs @@ -1,13 +1,13 @@ using System; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal sealed record SuseFetchCacheEntry(string? ETag, DateTimeOffset? LastModified) { public static SuseFetchCacheEntry Empty { get; } = new(null, null); - public static SuseFetchCacheEntry FromDocument(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public static SuseFetchCacheEntry FromDocument(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) => new(document.Etag, document.LastModified); public static SuseFetchCacheEntry FromBson(BsonDocument document) @@ -54,7 +54,7 @@ internal sealed record SuseFetchCacheEntry(string? ETag, DateTimeOffset? LastMod return document; } - public bool Matches(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public bool Matches(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) { if (document is null) { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseMapper.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseMapper.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseMapper.cs index 6135c08a..8c1ff1b6 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Internal/SuseMapper.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Internal/SuseMapper.cs @@ -2,11 +2,11 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Distro; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Distro; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Distro.Suse.Internal; +namespace StellaOps.Concelier.Source.Distro.Suse.Internal; internal static class SuseMapper { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/Jobs.cs b/src/StellaOps.Concelier.Source.Distro.Suse/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.Suse/Jobs.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/Jobs.cs index d2fcd2fa..6537de6e 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Distro.Suse; +namespace StellaOps.Concelier.Source.Distro.Suse; internal static class SuseJobKinds { diff --git a/src/StellaOps.Concelier.Source.Distro.Suse/StellaOps.Concelier.Source.Distro.Suse.csproj b/src/StellaOps.Concelier.Source.Distro.Suse/StellaOps.Concelier.Source.Distro.Suse.csproj new file mode 100644 index 00000000..51f2b1a6 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Suse/StellaOps.Concelier.Source.Distro.Suse.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/SuseConnector.cs b/src/StellaOps.Concelier.Source.Distro.Suse/SuseConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Suse/SuseConnector.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/SuseConnector.cs index c21b19d8..19f860e9 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/SuseConnector.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/SuseConnector.cs @@ -11,18 +11,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Distro.Suse.Configuration; -using StellaOps.Feedser.Source.Distro.Suse.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Distro.Suse.Configuration; +using StellaOps.Concelier.Source.Distro.Suse.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Suse; +namespace StellaOps.Concelier.Source.Distro.Suse; public sealed class SuseConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/SuseConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Distro.Suse/SuseConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Suse/SuseConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/SuseConnectorPlugin.cs index 00be404e..a3a112d9 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/SuseConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/SuseConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Suse; +namespace StellaOps.Concelier.Source.Distro.Suse; public sealed class SuseConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs index 60da18e7..d9874877 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/SuseDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Distro.Suse.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Distro.Suse.Configuration; -namespace StellaOps.Feedser.Source.Distro.Suse; +namespace StellaOps.Concelier.Source.Distro.Suse; public sealed class SuseDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:suse"; + private const string ConfigurationSection = "concelier:sources:suse"; private const string FetchCron = "*/30 * * * *"; private const string ParseCron = "5,35 * * * *"; private const string MapCron = "10,40 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/SuseServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Distro.Suse/SuseServiceCollectionExtensions.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Distro.Suse/SuseServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Distro.Suse/SuseServiceCollectionExtensions.cs index 51aff135..8587953a 100644 --- a/src/StellaOps.Feedser.Source.Distro.Suse/SuseServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Suse/SuseServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Distro.Suse.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Distro.Suse.Configuration; -namespace StellaOps.Feedser.Source.Distro.Suse; +namespace StellaOps.Concelier.Source.Distro.Suse; public static class SuseServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page0.json b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page0.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page0.json rename to src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page0.json diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page1.json b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page1.json rename to src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/Fixtures/ubuntu-notices-page1.json diff --git a/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/StellaOps.Concelier.Source.Distro.Ubuntu.Tests.csproj b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/StellaOps.Concelier.Source.Distro.Ubuntu.Tests.csproj new file mode 100644 index 00000000..48d05291 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/StellaOps.Concelier.Source.Distro.Ubuntu.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + PreserveNewest + + + diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs index 4db488bd..081ad244 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu.Tests/UbuntuConnectorTests.cs @@ -12,18 +12,18 @@ using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Distro.Ubuntu; -using StellaOps.Feedser.Source.Distro.Ubuntu.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Distro.Ubuntu; +using StellaOps.Concelier.Source.Distro.Ubuntu.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Tests; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Tests; [Collection("mongo-fixture")] public sealed class UbuntuConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs index 97596c2f..6e6a3fbe 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Configuration/UbuntuOptions.cs @@ -1,10 +1,10 @@ using System; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Configuration; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Configuration; public sealed class UbuntuOptions { - public const string HttpClientName = "feedser.ubuntu"; + public const string HttpClientName = "concelier.ubuntu"; public const int MaxPageSize = 20; /// @@ -27,7 +27,7 @@ public sealed class UbuntuOptions public int IndexPageSize { get; set; } = 20; - public string UserAgent { get; set; } = "StellaOps.Feedser.Ubuntu/0.1 (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps.Concelier.Ubuntu/0.1 (+https://stella-ops.org)"; public void Validate() { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs index 56d3bb63..9e00a8b8 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Internal; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Internal; internal sealed record UbuntuCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs index 29d739af..373dd98d 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuFetchCacheEntry.cs @@ -1,13 +1,13 @@ using System; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Internal; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Internal; internal sealed record UbuntuFetchCacheEntry(string? ETag, DateTimeOffset? LastModified) { public static UbuntuFetchCacheEntry Empty { get; } = new(null, null); - public static UbuntuFetchCacheEntry FromDocument(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public static UbuntuFetchCacheEntry FromDocument(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) => new(document.Etag, document.LastModified); public static UbuntuFetchCacheEntry FromBson(BsonDocument document) @@ -54,7 +54,7 @@ internal sealed record UbuntuFetchCacheEntry(string? ETag, DateTimeOffset? LastM return doc; } - public bool Matches(StellaOps.Feedser.Storage.Mongo.Documents.DocumentRecord document) + public bool Matches(StellaOps.Concelier.Storage.Mongo.Documents.DocumentRecord document) { if (document is null) { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs index 8176235b..a437aafb 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuMapper.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Distro; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Distro; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Internal; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Internal; internal static class UbuntuMapper { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs index 18b8afa7..ff740eab 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Internal; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Internal; internal sealed record UbuntuNoticeDto( string NoticeId, diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs index 3a175e44..dcf11570 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Internal/UbuntuNoticeParser.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text.Json; -namespace StellaOps.Feedser.Source.Distro.Ubuntu.Internal; +namespace StellaOps.Concelier.Source.Distro.Ubuntu.Internal; internal static class UbuntuNoticeParser { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Jobs.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/Jobs.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/Jobs.cs index 5fd98027..a3bd578e 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Distro.Ubuntu; +namespace StellaOps.Concelier.Source.Distro.Ubuntu; internal static class UbuntuJobKinds { diff --git a/src/StellaOps.Concelier.Source.Distro.Ubuntu/StellaOps.Concelier.Source.Distro.Ubuntu.csproj b/src/StellaOps.Concelier.Source.Distro.Ubuntu/StellaOps.Concelier.Source.Distro.Ubuntu.csproj new file mode 100644 index 00000000..51f2b1a6 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/StellaOps.Concelier.Source.Distro.Ubuntu.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/TASKS.md b/src/StellaOps.Concelier.Source.Distro.Ubuntu/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/TASKS.md rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnector.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnector.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnector.cs index 150e4458..62102240 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnector.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnector.cs @@ -7,18 +7,18 @@ using System.Security.Cryptography; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Distro.Ubuntu.Configuration; -using StellaOps.Feedser.Source.Distro.Ubuntu.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Distro.Ubuntu.Configuration; +using StellaOps.Concelier.Source.Distro.Ubuntu.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Ubuntu; +namespace StellaOps.Concelier.Source.Distro.Ubuntu; public sealed class UbuntuConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs index 12a80e6c..c125fb73 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Distro.Ubuntu; +namespace StellaOps.Concelier.Source.Distro.Ubuntu; public sealed class UbuntuConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs index 07a4b704..c7d2c4a0 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Distro.Ubuntu.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Distro.Ubuntu.Configuration; -namespace StellaOps.Feedser.Source.Distro.Ubuntu; +namespace StellaOps.Concelier.Source.Distro.Ubuntu; public sealed class UbuntuDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ubuntu"; + private const string ConfigurationSection = "concelier:sources:ubuntu"; private const string FetchCron = "*/20 * * * *"; private const string ParseCron = "7,27,47 * * * *"; private const string MapCron = "10,30,50 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs index ff362f3d..a0c50847 100644 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Distro.Ubuntu/UbuntuServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Distro.Ubuntu.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Distro.Ubuntu.Configuration; -namespace StellaOps.Feedser.Source.Distro.Ubuntu; +namespace StellaOps.Concelier.Source.Distro.Ubuntu; public static class UbuntuServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.ghsa.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.ghsa.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.ghsa.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.ghsa.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.nvd.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.nvd.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.nvd.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.nvd.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.osv.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.osv.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/credit-parity.osv.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.osv.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/expected-GHSA-xxxx-yyyy-zzzz.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/expected-GHSA-xxxx-yyyy-zzzz.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/expected-GHSA-xxxx-yyyy-zzzz.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/expected-GHSA-xxxx-yyyy-zzzz.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/ghsa-GHSA-xxxx-yyyy-zzzz.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/ghsa-list.json b/src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/ghsa-list.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Fixtures/ghsa-list.json rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/ghsa-list.json diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs index b954bfbf..dec3e25c 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConflictFixtureTests.cs @@ -1,8 +1,8 @@ -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Ghsa.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Ghsa.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Ghsa.Tests; +namespace StellaOps.Concelier.Source.Ghsa.Tests; public sealed class GhsaConflictFixtureTests { diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs index 1afcaf6d..df84ddef 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaConnectorTests.cs @@ -5,15 +5,15 @@ using MongoDB.Bson; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Ghsa.Configuration; -using StellaOps.Feedser.Source.Ghsa.Internal; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Ghsa.Configuration; +using StellaOps.Concelier.Source.Ghsa.Internal; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; -namespace StellaOps.Feedser.Source.Ghsa.Tests; +namespace StellaOps.Concelier.Source.Ghsa.Tests; [Collection("mongo-fixture")] public sealed class GhsaConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs index 6fc87bcf..da953cc1 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaCreditParityRegressionTests.cs @@ -1,10 +1,10 @@ using System.Collections.Immutable; using System.Linq; using System.Text.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Source.Ghsa.Tests.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa.Tests.Ghsa; public sealed class GhsaCreditParityRegressionTests { diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs index b60c86de..09839943 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDependencyInjectionRoutineTests.cs @@ -5,13 +5,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ghsa; -using StellaOps.Feedser.Source.Ghsa.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ghsa; +using StellaOps.Concelier.Source.Ghsa.Configuration; using Xunit; -namespace StellaOps.Feedser.Source.Ghsa.Tests.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa.Tests.Ghsa; public sealed class GhsaDependencyInjectionRoutineTests { @@ -26,10 +26,10 @@ public sealed class GhsaDependencyInjectionRoutineTests var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { - ["feedser:sources:ghsa:apiToken"] = "test-token", - ["feedser:sources:ghsa:pageSize"] = "25", - ["feedser:sources:ghsa:maxPagesPerFetch"] = "3", - ["feedser:sources:ghsa:initialBackfill"] = "1.00:00:00", + ["concelier:sources:ghsa:apiToken"] = "test-token", + ["concelier:sources:ghsa:pageSize"] = "25", + ["concelier:sources:ghsa:maxPagesPerFetch"] = "3", + ["concelier:sources:ghsa:initialBackfill"] = "1.00:00:00", }) .Build(); diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs index 5f7e7584..bfd5d927 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaDiagnosticsTests.cs @@ -1,8 +1,8 @@ using System; -using StellaOps.Feedser.Source.Ghsa.Internal; +using StellaOps.Concelier.Source.Ghsa.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ghsa.Tests.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa.Tests.Ghsa; public class GhsaDiagnosticsTests : IDisposable { diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs index f93923fa..21f1e1da 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaMapperTests.cs @@ -1,7 +1,7 @@ -using StellaOps.Feedser.Source.Ghsa.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Ghsa.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Ghsa.Tests; +namespace StellaOps.Concelier.Source.Ghsa.Tests; public sealed class GhsaMapperTests { diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs rename to src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs index a54b737e..e12bc1d9 100644 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/Ghsa/GhsaRateLimitParserTests.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.Globalization; -using StellaOps.Feedser.Source.Ghsa.Internal; +using StellaOps.Concelier.Source.Ghsa.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ghsa.Tests.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa.Tests.Ghsa; public class GhsaRateLimitParserTests { diff --git a/src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj b/src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj new file mode 100644 index 00000000..662bd40a --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj @@ -0,0 +1,17 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ghsa/AGENTS.md b/src/StellaOps.Concelier.Source.Ghsa/AGENTS.md similarity index 89% rename from src/StellaOps.Feedser.Source.Ghsa/AGENTS.md rename to src/StellaOps.Concelier.Source.Ghsa/AGENTS.md index e80bd4c5..cb6cf033 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Ghsa/AGENTS.md @@ -12,8 +12,8 @@ Implement a connector for GitHub Security Advisories (GHSA) when we need to inge ## Participants - `Source.Common` (HTTP clients, fetch service, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores and source state). -- `Feedser.Models` (canonical advisory types). -- `Feedser.Testing` (integration harness, snapshot helpers). +- `Concelier.Models` (canonical advisory types). +- `Concelier.Testing` (integration harness, snapshot helpers). ## Interfaces & Contracts - Job kinds: `ghsa:fetch`, `ghsa:parse`, `ghsa:map`. @@ -34,6 +34,6 @@ Out of scope: - Sanitize/validate payloads before persistence. ## Tests -- Add `StellaOps.Feedser.Source.Ghsa.Tests` with canned GraphQL/REST fixtures. +- Add `StellaOps.Concelier.Source.Ghsa.Tests` with canned GraphQL/REST fixtures. - Snapshot canonical advisories; enable fixture regeneration with env flag. - Confirm deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Ghsa/Configuration/GhsaOptions.cs b/src/StellaOps.Concelier.Source.Ghsa/Configuration/GhsaOptions.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ghsa/Configuration/GhsaOptions.cs rename to src/StellaOps.Concelier.Source.Ghsa/Configuration/GhsaOptions.cs index 3020caf0..16915db6 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Configuration/GhsaOptions.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Configuration/GhsaOptions.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Ghsa.Configuration; +namespace StellaOps.Concelier.Source.Ghsa.Configuration; public sealed class GhsaOptions { diff --git a/src/StellaOps.Feedser.Source.Ghsa/GhsaConnector.cs b/src/StellaOps.Concelier.Source.Ghsa/GhsaConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ghsa/GhsaConnector.cs rename to src/StellaOps.Concelier.Source.Ghsa/GhsaConnector.cs index c5eaaf0e..01c5b8e5 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/GhsaConnector.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/GhsaConnector.cs @@ -6,18 +6,18 @@ using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Ghsa.Configuration; -using StellaOps.Feedser.Source.Ghsa.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Ghsa.Configuration; +using StellaOps.Concelier.Source.Ghsa.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa; public sealed class GhsaConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Ghsa/GhsaConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Ghsa/GhsaConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Ghsa/GhsaConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Ghsa/GhsaConnectorPlugin.cs index 7f95dd9f..fbe9b500 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/GhsaConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/GhsaConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa; public sealed class GhsaConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Ghsa/GhsaDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Ghsa/GhsaDependencyInjectionRoutine.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Ghsa/GhsaDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Ghsa/GhsaDependencyInjectionRoutine.cs index d727460d..0418c72e 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/GhsaDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/GhsaDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Ghsa.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Ghsa.Configuration; -namespace StellaOps.Feedser.Source.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa; public sealed class GhsaDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ghsa"; + private const string ConfigurationSection = "concelier:sources:ghsa"; private const string FetchCron = "1,11,21,31,41,51 * * * *"; private const string ParseCron = "3,13,23,33,43,53 * * * *"; private const string MapCron = "5,15,25,35,45,55 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Ghsa/GhsaServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Ghsa/GhsaServiceCollectionExtensions.cs similarity index 83% rename from src/StellaOps.Feedser.Source.Ghsa/GhsaServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Ghsa/GhsaServiceCollectionExtensions.cs index 7777b355..9e86e59e 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/GhsaServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/GhsaServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ghsa.Configuration; -using StellaOps.Feedser.Source.Ghsa.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ghsa.Configuration; +using StellaOps.Concelier.Source.Ghsa.Internal; -namespace StellaOps.Feedser.Source.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa; public static class GhsaServiceCollectionExtensions { @@ -22,7 +22,7 @@ public static class GhsaServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseEndpoint; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Ghsa/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Ghsa/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseEndpoint.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/vnd.github+json"; diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaCursor.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaCursor.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaCursor.cs index 09f3069a..9d3e62d7 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaCursor.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaCursor.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal sealed record GhsaCursor( DateTimeOffset? LastUpdatedExclusive, diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaDiagnostics.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaDiagnostics.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaDiagnostics.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaDiagnostics.cs index 7ded3f38..31ffd771 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaDiagnostics.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; public sealed class GhsaDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Ghsa"; + private const string MeterName = "StellaOps.Concelier.Source.Ghsa"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaListParser.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaListParser.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaListParser.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaListParser.cs index 034e9b5e..e1a19e86 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaListParser.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaListParser.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text.Json; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal static class GhsaListParser { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaMapper.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaMapper.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaMapper.cs index 330b048a..63ec6d57 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaMapper.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaMapper.cs @@ -2,12 +2,12 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Text; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.SemVer; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.SemVer; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal static class GhsaMapper { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitParser.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitParser.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitParser.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitParser.cs index 18c825e9..3d89434c 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitParser.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitParser.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal static class GhsaRateLimitParser { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs index 42db39bc..eaa3bfab 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRateLimitSnapshot.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal readonly record struct GhsaRateLimitSnapshot( string Phase, diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordDto.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordDto.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordDto.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordDto.cs index b3b3e3c9..50e5fece 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordDto.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordDto.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal sealed record GhsaRecordDto { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordParser.cs b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordParser.cs rename to src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordParser.cs index 99937985..a17fa744 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Internal/GhsaRecordParser.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Internal/GhsaRecordParser.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text.Json; -namespace StellaOps.Feedser.Source.Ghsa.Internal; +namespace StellaOps.Concelier.Source.Ghsa.Internal; internal static class GhsaRecordParser { diff --git a/src/StellaOps.Feedser.Source.Ghsa/Jobs.cs b/src/StellaOps.Concelier.Source.Ghsa/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ghsa/Jobs.cs rename to src/StellaOps.Concelier.Source.Ghsa/Jobs.cs index 67759407..b4f8d569 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Jobs.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Ghsa; +namespace StellaOps.Concelier.Source.Ghsa; internal static class GhsaJobKinds { diff --git a/src/StellaOps.Feedser.Source.Nvd/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Ghsa/Properties/AssemblyInfo.cs similarity index 55% rename from src/StellaOps.Feedser.Source.Nvd/Properties/AssemblyInfo.cs rename to src/StellaOps.Concelier.Source.Ghsa/Properties/AssemblyInfo.cs index 9a1bdc8f..337530ff 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Properties/AssemblyInfo.cs +++ b/src/StellaOps.Concelier.Source.Ghsa/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Nvd.Tests")] [assembly: InternalsVisibleTo("FixtureUpdater")] +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Ghsa.Tests")] diff --git a/src/StellaOps.Concelier.Source.Ghsa/StellaOps.Concelier.Source.Ghsa.csproj b/src/StellaOps.Concelier.Source.Ghsa/StellaOps.Concelier.Source.Ghsa.csproj new file mode 100644 index 00000000..eea76fdd --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ghsa/StellaOps.Concelier.Source.Ghsa.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ghsa/TASKS.md b/src/StellaOps.Concelier.Source.Ghsa/TASKS.md similarity index 91% rename from src/StellaOps.Feedser.Source.Ghsa/TASKS.md rename to src/StellaOps.Concelier.Source.Ghsa/TASKS.md index da091701..f886c73c 100644 --- a/src/StellaOps.Feedser.Source.Ghsa/TASKS.md +++ b/src/StellaOps.Concelier.Source.Ghsa/TASKS.md @@ -5,15 +5,15 @@ |Fetch pipeline & state management|BE-Conn-GHSA|Source.Common, Storage.Mongo|**DONE (2025-10-10)** – Implemented list/detail fetch using `GhsaCursor` (time window + page), resumable SourceState and backoff controls.| |DTO & parser implementation|BE-Conn-GHSA|Source.Common|**DONE (2025-10-10)** – Added `GhsaRecordParser`/DTOs extracting aliases, references, severity, vulnerable ranges, patched versions.| |Canonical mapping & range primitives|BE-Conn-GHSA|Models|**DONE (2025-10-10)** – `GhsaMapper` emits GHSA advisories with SemVer packages, vendor extensions (ecosystem/package) and deterministic references.
2025-10-11 research trail: upcoming normalized array should follow `[{"scheme":"semver","type":"range","min":"","minInclusive":true,"max":"","maxInclusive":false,"notes":"ghsa:GHSA-xxxx"}]`; include patched-only advisories as `lt`/`lte` when no explicit floor.| -|Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-10)** – New `StellaOps.Feedser.Source.Ghsa.Tests` regression covers fetch/parse/map via canned GHSA fixtures and snapshot assertions.| +|Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-10)** – New `StellaOps.Concelier.Source.Ghsa.Tests` regression covers fetch/parse/map via canned GHSA fixtures and snapshot assertions.| |Telemetry & documentation|DevEx|Docs|**DONE (2025-10-10)** – Diagnostics meter (`ghsa.fetch.*`) wired; DI extension documents token/headers and job registrations.| |GitHub quota monitoring & retries|BE-Conn-GHSA, Observability|Source.Common|**DONE (2025-10-12)** – Rate-limit metrics/logs added, retry/backoff handles 403 secondary limits, and ops runbook documents dashboards + mitigation steps.| -|Production credential & scheduler rollout|Ops, BE-Conn-GHSA|Docs, WebService|**DONE (2025-10-12)** – Scheduler defaults registered via `JobSchedulerBuilder`, credential provisioning documented (Compose/Helm samples), and staged backfill guidance captured in `docs/ops/feedser-ghsa-operations.md`.| -|FEEDCONN-GHSA-04-002 Conflict regression fixtures|BE-Conn-GHSA, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Added `conflict-ghsa.canonical.json` + `GhsaConflictFixtureTests`; SemVer ranges and credits align with merge precedence triple and shareable with QA. Validation: `dotnet test src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj --filter GhsaConflictFixtureTests`.| +|Production credential & scheduler rollout|Ops, BE-Conn-GHSA|Docs, WebService|**DONE (2025-10-12)** – Scheduler defaults registered via `JobSchedulerBuilder`, credential provisioning documented (Compose/Helm samples), and staged backfill guidance captured in `docs/ops/concelier-ghsa-operations.md`.| +|FEEDCONN-GHSA-04-002 Conflict regression fixtures|BE-Conn-GHSA, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Added `conflict-ghsa.canonical.json` + `GhsaConflictFixtureTests`; SemVer ranges and credits align with merge precedence triple and shareable with QA. Validation: `dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj --filter GhsaConflictFixtureTests`.| |FEEDCONN-GHSA-02-004 GHSA credits & ecosystem severity mapping|BE-Conn-GHSA|Models `FEEDMODELS-SCHEMA-01-002`|**DONE (2025-10-11)** – Mapper emits advisory credits with provenance masks, fixtures assert role/contact ordering, and severity normalization remains unchanged.| |FEEDCONN-GHSA-02-007 Credit parity regression fixtures|BE-Conn-GHSA, QA|Source.Nvd, Source.Osv|**DONE (2025-10-12)** – Parity fixtures regenerated via `tools/FixtureUpdater`, normalized SemVer notes verified against GHSA/NVD/OSV snapshots, and the fixtures guide now documents the headroom checks.| |FEEDCONN-GHSA-02-001 Normalized versions rollout|BE-Conn-GHSA|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-11)** – GHSA mapper now emits SemVer primitives + normalized ranges, fixtures refreshed, connector tests passing; report logged via FEEDMERGE-COORD-02-900.| |FEEDCONN-GHSA-02-005 Quota monitoring hardening|BE-Conn-GHSA, Observability|Source.Common metrics|**DONE (2025-10-12)** – Diagnostics expose headroom histograms/gauges, warning logs dedupe below the configured threshold, and the ops runbook gained alerting and mitigation guidance.| |FEEDCONN-GHSA-02-006 Scheduler rollout integration|BE-Conn-GHSA, Ops|Job scheduler|**DONE (2025-10-12)** – Dependency routine tests assert cron/timeouts, and the runbook highlights cron overrides plus backoff toggles for staged rollouts.| |FEEDCONN-GHSA-04-003 Description/CWE/metric parity rollout|BE-Conn-GHSA|Models, Core|**DONE (2025-10-15)** – Mapper emits advisory description, CWE weaknesses, and canonical CVSS metric id with updated fixtures (`osv-ghsa.osv.json` parity suite) and connector regression covers the new fields. Reported completion to Merge coordination.| -|FEEDCONN-GHSA-04-004 Canonical metric fallback coverage|BE-Conn-GHSA|Models, Merge|**DONE (2025-10-16)** – Ensure canonical metric ids remain populated when GitHub omits CVSS vectors/scores; add fixtures capturing severity-only advisories, document precedence with Merge, and emit analytics to track fallback usage.
2025-10-16: Mapper now emits `ghsa:severity/` canonical ids when vectors are missing, diagnostics expose `ghsa.map.canonical_metric_fallbacks`, conflict/mapper fixtures updated, and runbook documents Merge precedence. Tests: `dotnet test src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj`.| +|FEEDCONN-GHSA-04-004 Canonical metric fallback coverage|BE-Conn-GHSA|Models, Merge|**DONE (2025-10-16)** – Ensure canonical metric ids remain populated when GitHub omits CVSS vectors/scores; add fixtures capturing severity-only advisories, document precedence with Merge, and emit analytics to track fallback usage.
2025-10-16: Mapper now emits `ghsa:severity/` canonical ids when vectors are missing, diagnostics expose `ghsa.map.canonical_metric_fallbacks`, conflict/mapper fixtures updated, and runbook documents Merge precedence. Tests: `dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj`.| diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsa-25-123-01.html b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsa-25-123-01.html similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsa-25-123-01.html rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsa-25-123-01.html diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsma-25-045-01.html b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsma-25-045-01.html similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsma-25-045-01.html rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/icsma-25-045-01.html diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/sample-feed.xml b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/sample-feed.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/sample-feed.xml rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/Fixtures/sample-feed.xml diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs index 5300fe64..6f7fa286 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaConnectorMappingTests.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Ics.Cisa; -using StellaOps.Feedser.Source.Ics.Cisa.Internal; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Ics.Cisa; +using StellaOps.Concelier.Source.Ics.Cisa.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ics.Cisa.Tests.IcsCisa; +namespace StellaOps.Concelier.Source.Ics.Cisa.Tests.IcsCisa; public class IcsCisaConnectorMappingTests { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs index c280017f..3455e6c9 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisa/IcsCisaFeedParserTests.cs @@ -2,10 +2,10 @@ using System; using System.IO; using System.Linq; using System.Threading.Tasks; -using StellaOps.Feedser.Source.Ics.Cisa.Internal; +using StellaOps.Concelier.Source.Ics.Cisa.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ics.Cisa.Tests.IcsCisa; +namespace StellaOps.Concelier.Source.Ics.Cisa.Tests.IcsCisa; public class IcsCisaFeedParserTests { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs index 1d928560..528c746e 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/IcsCisaConnectorTests.cs @@ -10,16 +10,16 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ics.Cisa; -using StellaOps.Feedser.Source.Ics.Cisa.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ics.Cisa; +using StellaOps.Concelier.Source.Ics.Cisa.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Ics.Cisa.Tests; +namespace StellaOps.Concelier.Source.Ics.Cisa.Tests; [Collection("mongo-fixture")] public sealed class IcsCisaConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj new file mode 100644 index 00000000..55963613 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/AGENTS.md b/src/StellaOps.Concelier.Source.Ics.Cisa/AGENTS.md similarity index 87% rename from src/StellaOps.Feedser.Source.Ics.Cisa/AGENTS.md rename to src/StellaOps.Concelier.Source.Ics.Cisa/AGENTS.md index 01ca3f43..467e6b2f 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/AGENTS.md @@ -12,8 +12,8 @@ Implement the CISA ICS advisory connector to ingest US CISA Industrial Control S ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores + source state). -- `Feedser.Models` (canonical advisory structures). -- `Feedser.Testing` (integration fixtures and snapshots). +- `Concelier.Models` (canonical advisory structures). +- `Concelier.Testing` (integration fixtures and snapshots). ## Interfaces & Contracts - Job kinds: `ics-cisa:fetch`, `ics-cisa:parse`, `ics-cisa:map`. @@ -34,6 +34,6 @@ Out of scope: - Honour upstream rate limits with exponential backoff. ## Tests -- Add `StellaOps.Feedser.Source.Ics.Cisa.Tests` to cover fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.Ics.Cisa.Tests` to cover fetch/parse/map with canned fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs index eee231d0..2d0afd5a 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Configuration/IcsCisaOptions.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Net; using System.Net.Http; -namespace StellaOps.Feedser.Source.Ics.Cisa.Configuration; +namespace StellaOps.Concelier.Source.Ics.Cisa.Configuration; public sealed class IcsCisaOptions { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/HANDOVER.md b/src/StellaOps.Concelier.Source.Ics.Cisa/HANDOVER.md similarity index 73% rename from src/StellaOps.Feedser.Source.Ics.Cisa/HANDOVER.md rename to src/StellaOps.Concelier.Source.Ics.Cisa/HANDOVER.md index 6f5ed806..9bf7bfd4 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/HANDOVER.md +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/HANDOVER.md @@ -10,12 +10,12 @@ - SemVer primitive deserialisation now restores `exactValue` (e.g., `"4.2"` → `"4.2.0"`), keeping connector snapshots deterministic. - Console debugging noise was removed from connector/parser code. - Ops runbook documents attachment + SemVer validation steps for dry runs. -- `dotnet test src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj` passes (2025-10-16). +- `dotnet test src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj` passes (2025-10-16). ## Outstanding Items - None. Continue monitoring Akamai access decisions and proxy requirements via Ops feedback. ## Verification Checklist -- ✅ `dotnet test src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj` -- ☐ `dotnet test src/StellaOps.Feedser.Source.Common.Tests/StellaOps.Feedser.Source.Common.Tests.csproj` (proxy support) — rerun when Source.Common changes land. +- ✅ `dotnet test src/StellaOps.Concelier.Source.Ics.Cisa.Tests/StellaOps.Concelier.Source.Ics.Cisa.Tests.csproj` +- ☐ `dotnet test src/StellaOps.Concelier.Source.Common.Tests/StellaOps.Concelier.Source.Common.Tests.csproj` (proxy support) — rerun when Source.Common changes land. - Keep this summary aligned with `TASKS.md` as further work emerges. diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnector.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnector.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnector.cs index e00825cd..08efae93 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnector.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnector.cs @@ -17,19 +17,19 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Source.Ics.Cisa.Configuration; -using StellaOps.Feedser.Source.Ics.Cisa.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Source.Ics.Cisa.Configuration; +using StellaOps.Concelier.Source.Ics.Cisa.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ics.Cisa; +namespace StellaOps.Concelier.Source.Ics.Cisa; public sealed class IcsCisaConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs index bf13cb9d..3579ee61 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ics.Cisa; +namespace StellaOps.Concelier.Source.Ics.Cisa; public sealed class IcsCisaConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs index 3b84d7b7..f8f43c76 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Ics.Cisa.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Ics.Cisa.Configuration; -namespace StellaOps.Feedser.Source.Ics.Cisa; +namespace StellaOps.Concelier.Source.Ics.Cisa; public sealed class IcsCisaDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ics-cisa"; + private const string ConfigurationSection = "concelier:sources:ics-cisa"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs index c7b87a93..f0e2e398 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/IcsCisaServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System; using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ics.Cisa.Configuration; -using StellaOps.Feedser.Source.Ics.Cisa.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ics.Cisa.Configuration; +using StellaOps.Concelier.Source.Ics.Cisa.Internal; -namespace StellaOps.Feedser.Source.Ics.Cisa; +namespace StellaOps.Concelier.Source.Ics.Cisa; public static class IcsCisaServiceCollectionExtensions { @@ -24,7 +24,7 @@ public static class IcsCisaServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = new Uri(options.TopicsEndpoint.GetLeftPart(UriPartial.Authority)); clientOptions.Timeout = TimeSpan.FromSeconds(45); - clientOptions.UserAgent = "StellaOps.Feedser.IcsCisa/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.IcsCisa/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.TopicsEndpoint.Host); clientOptions.AllowedHosts.Add(options.DetailBaseUri.Host); diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs index fd3d86c5..cda69445 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAdvisoryDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; public sealed record IcsCisaAdvisoryDto { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs similarity index 80% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs index 0518d058..53e94b1f 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaAttachmentDto.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; public sealed record IcsCisaAttachmentDto { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaCursor.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaCursor.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaCursor.cs index 88bd1ce4..9fa28ca1 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaCursor.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; internal sealed record IcsCisaCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs index c81cde4a..9d00236e 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaDiagnostics.cs @@ -2,11 +2,11 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; public sealed class IcsCisaDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Ics.Cisa"; + private const string MeterName = "StellaOps.Concelier.Source.Ics.Cisa"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; @@ -153,14 +153,14 @@ public sealed class IcsCisaDiagnostics : IDisposable private static KeyValuePair[] BuildTopicTags(string? topicId) => new[] { - new KeyValuePair("feedser.source", IcsCisaConnectorPlugin.SourceName), + new KeyValuePair("concelier.source", IcsCisaConnectorPlugin.SourceName), new KeyValuePair("icscisa.topic", string.IsNullOrWhiteSpace(topicId) ? "unknown" : topicId) }; private static KeyValuePair[] BuildAdvisoryTags(string? advisoryId) => new[] { - new KeyValuePair("feedser.source", IcsCisaConnectorPlugin.SourceName), + new KeyValuePair("concelier.source", IcsCisaConnectorPlugin.SourceName), new KeyValuePair("icscisa.advisory", string.IsNullOrWhiteSpace(advisoryId) ? "unknown" : advisoryId) }; diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs index 6c2c82af..f9fa67a0 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedDto.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; public sealed record IcsCisaFeedDto { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs index 2bef37d6..e5004a59 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Internal/IcsCisaFeedParser.cs @@ -8,9 +8,9 @@ using System.Text.RegularExpressions; using System.Xml; using AngleSharp.Html.Parser; using AngleSharp.Html.Dom; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Ics.Cisa.Internal; +namespace StellaOps.Concelier.Source.Ics.Cisa.Internal; public sealed class IcsCisaFeedParser { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/Jobs.cs b/src/StellaOps.Concelier.Source.Ics.Cisa/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ics.Cisa/Jobs.cs rename to src/StellaOps.Concelier.Source.Ics.Cisa/Jobs.cs index 44a1f005..f0fee34b 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Ics.Cisa; +namespace StellaOps.Concelier.Source.Ics.Cisa; internal static class IcsCisaJobKinds { diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/StellaOps.Feedser.Source.Ics.Cisa.csproj b/src/StellaOps.Concelier.Source.Ics.Cisa/StellaOps.Concelier.Source.Ics.Cisa.csproj similarity index 53% rename from src/StellaOps.Feedser.Source.Ics.Cisa/StellaOps.Feedser.Source.Ics.Cisa.csproj rename to src/StellaOps.Concelier.Source.Ics.Cisa/StellaOps.Concelier.Source.Ics.Cisa.csproj index 8da045aa..c91eb5ee 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/StellaOps.Feedser.Source.Ics.Cisa.csproj +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/StellaOps.Concelier.Source.Ics.Cisa.csproj @@ -9,10 +9,10 @@ - - - - + + + + @@ -21,7 +21,7 @@ - <_Parameter1>StellaOps.Feedser.Source.Ics.Cisa.Tests + <_Parameter1>StellaOps.Concelier.Source.Ics.Cisa.Tests diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa/TASKS.md b/src/StellaOps.Concelier.Source.Ics.Cisa/TASKS.md similarity index 86% rename from src/StellaOps.Feedser.Source.Ics.Cisa/TASKS.md rename to src/StellaOps.Concelier.Source.Ics.Cisa/TASKS.md index 747a6169..bf38c96e 100644 --- a/src/StellaOps.Feedser.Source.Ics.Cisa/TASKS.md +++ b/src/StellaOps.Concelier.Source.Ics.Cisa/TASKS.md @@ -1,14 +1,14 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-ICSCISA-02-001 Document CISA ICS feed contract|BE-Conn-ICS-CISA|Research|**DONE (2025-10-11)** – `https://www.cisa.gov/cybersecurity-advisories/ics-advisories.xml` and legacy `/sites/default/files/feeds/...` return Akamai 403 even with browser UA; HTML landing page blocked as well. Logged full headers (x-reference-error, AkamaiGHost) in `docs/feedser-connector-research-20251011.md` and initiated GovDelivery access request.| +|FEEDCONN-ICSCISA-02-001 Document CISA ICS feed contract|BE-Conn-ICS-CISA|Research|**DONE (2025-10-11)** – `https://www.cisa.gov/cybersecurity-advisories/ics-advisories.xml` and legacy `/sites/default/files/feeds/...` return Akamai 403 even with browser UA; HTML landing page blocked as well. Logged full headers (x-reference-error, AkamaiGHost) in `docs/concelier-connector-research-20251011.md` and initiated GovDelivery access request.| |FEEDCONN-ICSCISA-02-002 Fetch pipeline & cursor storage|BE-Conn-ICS-CISA|Source.Common, Storage.Mongo|**DONE (2025-10-16)** – Confirmed proxy knobs + cursor state behave with the refreshed fixtures; ops runbook now captures proxy usage/validation so the fetch stage is production-ready.| |FEEDCONN-ICSCISA-02-003 DTO/parser implementation|BE-Conn-ICS-CISA|Source.Common|**DONE (2025-10-16)** – Feed parser fixtures updated to retain vendor PDFs as attachments while maintaining reference coverage; console diagnostics removed.| |FEEDCONN-ICSCISA-02-004 Canonical mapping & range primitives|BE-Conn-ICS-CISA|Models|**DONE (2025-10-16)** – `TryCreateSemVerPrimitive` flow + Mongo deserialiser now persist `exactValue` (`4.2` → `4.2.0`), unblocking canonical snapshots.| -|FEEDCONN-ICSCISA-02-005 Deterministic fixtures/tests|QA|Testing|**DONE (2025-10-16)** – `dotnet test src/StellaOps.Feedser.Source.Ics.Cisa.Tests/...` passes; fixtures assert attachment handling + SemVer semantics.| +|FEEDCONN-ICSCISA-02-005 Deterministic fixtures/tests|QA|Testing|**DONE (2025-10-16)** – `dotnet test src/StellaOps.Concelier.Source.Ics.Cisa.Tests/...` passes; fixtures assert attachment handling + SemVer semantics.| |FEEDCONN-ICSCISA-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-16)** – Ops guide documents attachment checks, SemVer exact values, and proxy guidance; diagnostics remain unchanged.| |FEEDCONN-ICSCISA-02-007 Detail document inventory|BE-Conn-ICS-CISA|Research|**DONE (2025-10-16)** – Validated canned detail pages vs feed output so attachment inventories stay aligned; archived expectations noted in `HANDOVER.md`.| |FEEDCONN-ICSCISA-02-008 Distribution fallback strategy|BE-Conn-ICS-CISA|Research|**DONE (2025-10-11)** – Outlined GovDelivery token request, HTML scrape + email digest fallback, and dependency on Ops for credential workflow; awaiting decision before fetch implementation.| -|FEEDCONN-ICSCISA-02-009 GovDelivery credential onboarding|Ops, BE-Conn-ICS-CISA|Ops|**DONE (2025-10-14)** – GovDelivery onboarding runbook captured in `docs/ops/feedser-icscisa-operations.md`; secret vault path and Offline Kit handling documented.| +|FEEDCONN-ICSCISA-02-009 GovDelivery credential onboarding|Ops, BE-Conn-ICS-CISA|Ops|**DONE (2025-10-14)** – GovDelivery onboarding runbook captured in `docs/ops/concelier-icscisa-operations.md`; secret vault path and Offline Kit handling documented.| |FEEDCONN-ICSCISA-02-010 Mitigation & SemVer polish|BE-Conn-ICS-CISA|02-003, 02-004|**DONE (2025-10-16)** – Attachment + mitigation references now land as expected and SemVer primitives carry exact values; end-to-end suite green (see `HANDOVER.md`).| |FEEDCONN-ICSCISA-02-011 Docs & telemetry refresh|DevEx|02-006|**DONE (2025-10-16)** – Ops documentation refreshed (attachments, SemVer validation, proxy knobs) and telemetry notes verified.| diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/detail-acme-controller-2024.html b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/detail-acme-controller-2024.html similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/detail-acme-controller-2024.html rename to src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/detail-acme-controller-2024.html diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/expected-advisory.json b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/expected-advisory.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/expected-advisory.json rename to src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/expected-advisory.json diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/feed-page1.xml b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/feed-page1.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/feed-page1.xml rename to src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/Fixtures/feed-page1.xml diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs index 9b72d06a..80afafa0 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/Kaspersky/KasperskyConnectorTests.cs @@ -12,20 +12,20 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Ics.Kaspersky; -using StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Ics.Kaspersky; +using StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Tests; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Tests; [Collection("mongo-fixture")] public sealed class KasperskyConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj new file mode 100644 index 00000000..9638d8df --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky.Tests/StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/AGENTS.md b/src/StellaOps.Concelier.Source.Ics.Kaspersky/AGENTS.md similarity index 82% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/AGENTS.md rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/AGENTS.md index f76285ff..076ae99d 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/AGENTS.md @@ -20,9 +20,9 @@ Kaspersky ICS-CERT connector; authoritative for OT/ICS vendor advisories covered In: ICS advisory mapping, affected vendor products, mitigation references. Out: firmware downloads; reverse-engineering artifacts. ## Observability & security expectations -- Metrics: SourceDiagnostics publishes `feedser.source.http.*` counters/histograms with `feedser.source=ics-kaspersky` to track fetch totals, parse failures, and mapped affected counts. +- Metrics: SourceDiagnostics publishes `concelier.source.http.*` counters/histograms with `concelier.source=ics-kaspersky` to track fetch totals, parse failures, and mapped affected counts. - Logs: slugs, vendor/product counts, timing; allowlist host. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Ics.Kaspersky.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Ics.Kaspersky.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs index 06fccede..e103f386 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Configuration/KasperskyOptions.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; public sealed class KasperskyOptions { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs similarity index 80% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs index db2f6ae4..b3fed2d7 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Immutable; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Internal; internal sealed record KasperskyAdvisoryDto( string AdvisoryKey, diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs index 0a3d5419..34568b90 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyAdvisoryParser.cs @@ -6,7 +6,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Internal; internal static class KasperskyAdvisoryParser { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs index 74ff6fad..50557e86 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Internal; internal sealed record KasperskyCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs index efe11249..55e0c35a 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedClient.cs @@ -10,9 +10,9 @@ using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; +using StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Internal; public sealed class KasperskyFeedClient { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs similarity index 66% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs index eaa552d2..1033465f 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Internal/KasperskyFeedItem.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +namespace StellaOps.Concelier.Source.Ics.Kaspersky.Internal; public sealed record KasperskyFeedItem( string Title, diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Jobs.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/Jobs.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/Jobs.cs index 2d752305..e8750edb 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Ics.Kaspersky; +namespace StellaOps.Concelier.Source.Ics.Kaspersky; internal static class KasperskyJobKinds { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnector.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnector.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnector.cs index 727e6821..7e82bd54 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnector.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnector.cs @@ -7,18 +7,18 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; -using StellaOps.Feedser.Source.Ics.Kaspersky.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; +using StellaOps.Concelier.Source.Ics.Kaspersky.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ics.Kaspersky; +namespace StellaOps.Concelier.Source.Ics.Kaspersky; public sealed class KasperskyConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs index 45a05b99..98dd6db0 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ics.Kaspersky; +namespace StellaOps.Concelier.Source.Ics.Kaspersky; public sealed class KasperskyConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs index a3559421..96cf5e94 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; -namespace StellaOps.Feedser.Source.Ics.Kaspersky; +namespace StellaOps.Concelier.Source.Ics.Kaspersky; public sealed class KasperskyDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ics-kaspersky"; + private const string ConfigurationSection = "concelier:sources:ics-kaspersky"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs similarity index 78% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs index 216fbfaf..aecbc0c3 100644 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/KasperskyServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ics.Kaspersky.Configuration; -using StellaOps.Feedser.Source.Ics.Kaspersky.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ics.Kaspersky.Configuration; +using StellaOps.Concelier.Source.Ics.Kaspersky.Internal; -namespace StellaOps.Feedser.Source.Ics.Kaspersky; +namespace StellaOps.Concelier.Source.Ics.Kaspersky; public static class KasperskyServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class KasperskyServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.FeedUri; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.IcsKaspersky/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.IcsKaspersky/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.FeedUri.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/rss+xml"; diff --git a/src/StellaOps.Concelier.Source.Ics.Kaspersky/StellaOps.Concelier.Source.Ics.Kaspersky.csproj b/src/StellaOps.Concelier.Source.Ics.Kaspersky/StellaOps.Concelier.Source.Ics.Kaspersky.csproj new file mode 100644 index 00000000..832b35b4 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ics.Kaspersky/StellaOps.Concelier.Source.Ics.Kaspersky.csproj @@ -0,0 +1,16 @@ + + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/TASKS.md b/src/StellaOps.Concelier.Source.Ics.Kaspersky/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Ics.Kaspersky/TASKS.md rename to src/StellaOps.Concelier.Source.Ics.Kaspersky/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/expected-advisory.json b/src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/expected-advisory.json similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/expected-advisory.json rename to src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/expected-advisory.json diff --git a/src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/jvnrss-window1.xml b/src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/jvnrss-window1.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/jvnrss-window1.xml rename to src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/jvnrss-window1.xml diff --git a/src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml b/src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml rename to src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/Fixtures/vuldef-JVNDB-2024-123456.xml diff --git a/src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs b/src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs rename to src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs index eafb6cc2..fab0c427 100644 --- a/src/StellaOps.Feedser.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Jvn.Tests/Jvn/JvnConnectorTests.cs @@ -12,22 +12,22 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Jvn; -using StellaOps.Feedser.Source.Jvn.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.JpFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Jvn; +using StellaOps.Concelier.Source.Jvn.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.JpFlags; using Xunit.Abstractions; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Jvn.Tests; +namespace StellaOps.Concelier.Source.Jvn.Tests; [Collection("mongo-fixture")] public sealed class JvnConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Concelier.Source.Jvn.Tests/StellaOps.Concelier.Source.Jvn.Tests.csproj b/src/StellaOps.Concelier.Source.Jvn.Tests/StellaOps.Concelier.Source.Jvn.Tests.csproj new file mode 100644 index 00000000..876f04e7 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Jvn.Tests/StellaOps.Concelier.Source.Jvn.Tests.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Jvn/AGENTS.md b/src/StellaOps.Concelier.Source.Jvn/AGENTS.md similarity index 82% rename from src/StellaOps.Feedser.Source.Jvn/AGENTS.md rename to src/StellaOps.Concelier.Source.Jvn/AGENTS.md index 8c2234d1..da22e652 100644 --- a/src/StellaOps.Feedser.Source.Jvn/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Jvn/AGENTS.md @@ -21,9 +21,9 @@ Japan JVN/MyJVN connector; national CERT enrichment with strong identifiers (JVN In: JVN/MyJVN ingestion, aliases, jp_flags, enrichment mapping, watermarking. Out: overriding distro or PSIRT ranges without concrete evidence; scraping unofficial mirrors. ## Observability & security expectations -- Metrics: SourceDiagnostics emits `feedser.source.http.*` counters/histograms tagged `feedser.source=jvn`, enabling dashboards to track fetch requests, item counts, parse failures, and enrichment/map activity (including jp_flags) via tag filters. +- Metrics: SourceDiagnostics emits `concelier.source.http.*` counters/histograms tagged `concelier.source=jvn`, enabling dashboards to track fetch requests, item counts, parse failures, and enrichment/map activity (including jp_flags) via tag filters. - Logs: window bounds, jvndb ids processed, vendor_status distribution; redact API keys. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Jvn.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Jvn.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Jvn/Configuration/JvnOptions.cs b/src/StellaOps.Concelier.Source.Jvn/Configuration/JvnOptions.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Jvn/Configuration/JvnOptions.cs rename to src/StellaOps.Concelier.Source.Jvn/Configuration/JvnOptions.cs index 56a3fa81..74245769 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Configuration/JvnOptions.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Configuration/JvnOptions.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Jvn.Configuration; +namespace StellaOps.Concelier.Source.Jvn.Configuration; /// /// Options controlling the JVN connector fetch cadence and HTTP client configuration. diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnAdvisoryMapper.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnAdvisoryMapper.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnAdvisoryMapper.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnAdvisoryMapper.cs index b6544e86..4c08f4fc 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnAdvisoryMapper.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnAdvisoryMapper.cs @@ -1,16 +1,16 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.Identifiers; -using StellaOps.Feedser.Normalization.Text; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.JpFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Text; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.JpFlags; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal static class JvnAdvisoryMapper { diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnConstants.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnConstants.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnConstants.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnConstants.cs index a3f3fb43..117beb39 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnConstants.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnConstants.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal static class JvnConstants { diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnCursor.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnCursor.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnCursor.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnCursor.cs index 25be9887..499ef75c 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnCursor.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnCursor.cs @@ -1,7 +1,7 @@ using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal sealed record JvnCursor( DateTimeOffset? WindowStart, diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailDto.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailDto.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailDto.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailDto.cs index 9e3449bb..745928c6 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailDto.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailDto.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal sealed record JvnDetailDto( string VulnerabilityId, diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailParser.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailParser.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailParser.cs index 24faacb9..58d7c416 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnDetailParser.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnDetailParser.cs @@ -8,7 +8,7 @@ using System.Xml; using System.Xml.Linq; using System.Xml.Schema; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal static class JvnDetailParser { diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewItem.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewItem.cs similarity index 75% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewItem.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewItem.cs index cb421e0c..b47ef5c6 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewItem.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewItem.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal sealed record JvnOverviewItem( string VulnerabilityId, diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewPage.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewPage.cs similarity index 72% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewPage.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewPage.cs index f63779ba..fac48e66 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnOverviewPage.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnOverviewPage.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal sealed record JvnOverviewPage( IReadOnlyList Items, diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaProvider.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaProvider.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaProvider.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaProvider.cs index 075ce424..f77380e0 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaProvider.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaProvider.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Xml; using System.Xml.Schema; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal static class JvnSchemaProvider { @@ -47,7 +47,7 @@ internal static class JvnSchemaProvider private static Dictionary CreateResourceMap() { - var baseNamespace = typeof(JvnSchemaProvider).Namespace ?? "StellaOps.Feedser.Source.Jvn.Internal"; + var baseNamespace = typeof(JvnSchemaProvider).Namespace ?? "StellaOps.Concelier.Source.Jvn.Internal"; var prefix = baseNamespace.Replace(".Internal", string.Empty, StringComparison.Ordinal); return new Dictionary(StringComparer.OrdinalIgnoreCase) diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaValidationException.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaValidationException.cs similarity index 82% rename from src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaValidationException.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaValidationException.cs index 0015fa5f..480e270b 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/JvnSchemaValidationException.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/JvnSchemaValidationException.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; internal sealed class JvnSchemaValidationException : Exception { diff --git a/src/StellaOps.Feedser.Source.Jvn/Internal/MyJvnClient.cs b/src/StellaOps.Concelier.Source.Jvn/Internal/MyJvnClient.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Jvn/Internal/MyJvnClient.cs rename to src/StellaOps.Concelier.Source.Jvn/Internal/MyJvnClient.cs index 319358cc..4efd5016 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Internal/MyJvnClient.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Internal/MyJvnClient.cs @@ -9,9 +9,9 @@ using System.Xml; using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Jvn.Configuration; +using StellaOps.Concelier.Source.Jvn.Configuration; -namespace StellaOps.Feedser.Source.Jvn.Internal; +namespace StellaOps.Concelier.Source.Jvn.Internal; public sealed class MyJvnClient { diff --git a/src/StellaOps.Feedser.Source.Jvn/Jobs.cs b/src/StellaOps.Concelier.Source.Jvn/Jobs.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Jvn/Jobs.cs rename to src/StellaOps.Concelier.Source.Jvn/Jobs.cs index e56571d1..b0a59088 100644 --- a/src/StellaOps.Feedser.Source.Jvn/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Jvn/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Jvn; +namespace StellaOps.Concelier.Source.Jvn; internal static class JvnJobKinds { diff --git a/src/StellaOps.Feedser.Source.Jvn/JvnConnector.cs b/src/StellaOps.Concelier.Source.Jvn/JvnConnector.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Jvn/JvnConnector.cs rename to src/StellaOps.Concelier.Source.Jvn/JvnConnector.cs index 0be9aadf..ec5d313f 100644 --- a/src/StellaOps.Feedser.Source.Jvn/JvnConnector.cs +++ b/src/StellaOps.Concelier.Source.Jvn/JvnConnector.cs @@ -4,19 +4,19 @@ using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Jvn.Configuration; -using StellaOps.Feedser.Source.Jvn.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.JpFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Jvn.Configuration; +using StellaOps.Concelier.Source.Jvn.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.JpFlags; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Jvn; +namespace StellaOps.Concelier.Source.Jvn; public sealed class JvnConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Jvn/JvnConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Jvn/JvnConnectorPlugin.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Jvn/JvnConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Jvn/JvnConnectorPlugin.cs index 406c4cb2..70050a66 100644 --- a/src/StellaOps.Feedser.Source.Jvn/JvnConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Jvn/JvnConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Jvn; +namespace StellaOps.Concelier.Source.Jvn; public sealed class JvnConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Jvn/JvnDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Jvn/JvnDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Jvn/JvnDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Jvn/JvnDependencyInjectionRoutine.cs index 1b7accd1..26224047 100644 --- a/src/StellaOps.Feedser.Source.Jvn/JvnDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Jvn/JvnDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Jvn.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Jvn.Configuration; -namespace StellaOps.Feedser.Source.Jvn; +namespace StellaOps.Concelier.Source.Jvn; public sealed class JvnDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:jvn"; + private const string ConfigurationSection = "concelier:sources:jvn"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Jvn/JvnServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Jvn/JvnServiceCollectionExtensions.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Jvn/JvnServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Jvn/JvnServiceCollectionExtensions.cs index 2ce8d662..20e034ee 100644 --- a/src/StellaOps.Feedser.Source.Jvn/JvnServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Jvn/JvnServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Jvn.Configuration; -using StellaOps.Feedser.Source.Jvn.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Jvn.Configuration; +using StellaOps.Concelier.Source.Jvn.Internal; -namespace StellaOps.Feedser.Source.Jvn; +namespace StellaOps.Concelier.Source.Jvn; public static class JvnServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class JvnServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseEndpoint; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Jvn/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Jvn/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseEndpoint.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/xml"; diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/data_marking.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/data_marking.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/data_marking.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/data_marking.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/jvnrss_3.2.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/jvnrss_3.2.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/jvnrss_3.2.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/jvnrss_3.2.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/mod_sec_3.0.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/mod_sec_3.0.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/mod_sec_3.0.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/mod_sec_3.0.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/status_3.3.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/status_3.3.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/status_3.3.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/status_3.3.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/tlp_marking.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/tlp_marking.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/tlp_marking.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/tlp_marking.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/vuldef_3.2.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/vuldef_3.2.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/vuldef_3.2.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/vuldef_3.2.xsd diff --git a/src/StellaOps.Feedser.Source.Jvn/Schemas/xml.xsd b/src/StellaOps.Concelier.Source.Jvn/Schemas/xml.xsd similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/Schemas/xml.xsd rename to src/StellaOps.Concelier.Source.Jvn/Schemas/xml.xsd diff --git a/src/StellaOps.Concelier.Source.Jvn/StellaOps.Concelier.Source.Jvn.csproj b/src/StellaOps.Concelier.Source.Jvn/StellaOps.Concelier.Source.Jvn.csproj new file mode 100644 index 00000000..b7b573e7 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Jvn/StellaOps.Concelier.Source.Jvn.csproj @@ -0,0 +1,15 @@ + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Jvn/TASKS.md b/src/StellaOps.Concelier.Source.Jvn/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Jvn/TASKS.md rename to src/StellaOps.Concelier.Source.Jvn/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/Fixtures/kev-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/Fixtures/kev-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Kev.Tests/Kev/Fixtures/kev-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Kev.Tests/Kev/Fixtures/kev-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/Fixtures/kev-catalog.json b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/Fixtures/kev-catalog.json similarity index 100% rename from src/StellaOps.Feedser.Source.Kev.Tests/Kev/Fixtures/kev-catalog.json rename to src/StellaOps.Concelier.Source.Kev.Tests/Kev/Fixtures/kev-catalog.json diff --git a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevConnectorTests.cs b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevConnectorTests.cs rename to src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevConnectorTests.cs index d681011c..91ac564c 100644 --- a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevConnectorTests.cs @@ -8,19 +8,19 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Kev; -using StellaOps.Feedser.Source.Kev.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Kev; +using StellaOps.Concelier.Source.Kev.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Kev.Tests; +namespace StellaOps.Concelier.Source.Kev.Tests; [Collection("mongo-fixture")] public sealed class KevConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevMapperTests.cs b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevMapperTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevMapperTests.cs rename to src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevMapperTests.cs index 50032c5c..50e8ea3f 100644 --- a/src/StellaOps.Feedser.Source.Kev.Tests/Kev/KevMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Kev.Tests/Kev/KevMapperTests.cs @@ -1,11 +1,11 @@ using System; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Kev; -using StellaOps.Feedser.Source.Kev.Internal; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Kev; +using StellaOps.Concelier.Source.Kev.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Kev.Tests; +namespace StellaOps.Concelier.Source.Kev.Tests; public sealed class KevMapperTests { diff --git a/src/StellaOps.Concelier.Source.Kev.Tests/StellaOps.Concelier.Source.Kev.Tests.csproj b/src/StellaOps.Concelier.Source.Kev.Tests/StellaOps.Concelier.Source.Kev.Tests.csproj new file mode 100644 index 00000000..801b3ca4 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Kev.Tests/StellaOps.Concelier.Source.Kev.Tests.csproj @@ -0,0 +1,19 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Kev/AGENTS.md b/src/StellaOps.Concelier.Source.Kev/AGENTS.md similarity index 90% rename from src/StellaOps.Feedser.Source.Kev/AGENTS.md rename to src/StellaOps.Concelier.Source.Kev/AGENTS.md index 9665f59e..eafda2b1 100644 --- a/src/StellaOps.Feedser.Source.Kev/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Kev/AGENTS.md @@ -12,8 +12,8 @@ Implement the CISA Known Exploited Vulnerabilities (KEV) catalogue connector to ## Participants - `Source.Common` (HTTP client, fetch service, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores, source state). -- `Feedser.Models` (advisory + range primitive types). -- `Feedser.Testing` (integration fixtures & snapshots). +- `Concelier.Models` (advisory + range primitive types). +- `Concelier.Testing` (integration fixtures & snapshots). ## Interfaces & Contracts - Job kinds: `kev:fetch`, `kev:parse`, `kev:map`. @@ -39,6 +39,6 @@ Out of scope: - CISA publishes KEV updates daily (catalogVersion follows `yyyy.MM.dd`). Expect releases near 16:30–17:00 UTC and retain overlap when scheduling fetches. ## Tests -- Add `StellaOps.Feedser.Source.Kev.Tests` covering fetch/parse/map with KEV JSON fixtures. +- Add `StellaOps.Concelier.Source.Kev.Tests` covering fetch/parse/map with KEV JSON fixtures. - Snapshot canonical output; allow fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Kev/Configuration/KevOptions.cs b/src/StellaOps.Concelier.Source.Kev/Configuration/KevOptions.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Kev/Configuration/KevOptions.cs rename to src/StellaOps.Concelier.Source.Kev/Configuration/KevOptions.cs index c8de4041..f461d3e9 100644 --- a/src/StellaOps.Feedser.Source.Kev/Configuration/KevOptions.cs +++ b/src/StellaOps.Concelier.Source.Kev/Configuration/KevOptions.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Kev.Configuration; +namespace StellaOps.Concelier.Source.Kev.Configuration; public sealed class KevOptions { diff --git a/src/StellaOps.Feedser.Source.Kev/Internal/KevCatalogDto.cs b/src/StellaOps.Concelier.Source.Kev/Internal/KevCatalogDto.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Kev/Internal/KevCatalogDto.cs rename to src/StellaOps.Concelier.Source.Kev/Internal/KevCatalogDto.cs index f786cc82..1c5bfa76 100644 --- a/src/StellaOps.Feedser.Source.Kev/Internal/KevCatalogDto.cs +++ b/src/StellaOps.Concelier.Source.Kev/Internal/KevCatalogDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Kev.Internal; +namespace StellaOps.Concelier.Source.Kev.Internal; internal sealed record KevCatalogDto { diff --git a/src/StellaOps.Feedser.Source.Kev/Internal/KevCursor.cs b/src/StellaOps.Concelier.Source.Kev/Internal/KevCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Kev/Internal/KevCursor.cs rename to src/StellaOps.Concelier.Source.Kev/Internal/KevCursor.cs index 7a1028dd..cef1c445 100644 --- a/src/StellaOps.Feedser.Source.Kev/Internal/KevCursor.cs +++ b/src/StellaOps.Concelier.Source.Kev/Internal/KevCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Kev.Internal; +namespace StellaOps.Concelier.Source.Kev.Internal; internal sealed record KevCursor( string? CatalogVersion, diff --git a/src/StellaOps.Feedser.Source.Kev/Internal/KevDiagnostics.cs b/src/StellaOps.Concelier.Source.Kev/Internal/KevDiagnostics.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kev/Internal/KevDiagnostics.cs rename to src/StellaOps.Concelier.Source.Kev/Internal/KevDiagnostics.cs index 8602dd7d..508f43a8 100644 --- a/src/StellaOps.Feedser.Source.Kev/Internal/KevDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Kev/Internal/KevDiagnostics.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Kev.Internal; +namespace StellaOps.Concelier.Source.Kev.Internal; public sealed class KevDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Kev"; + public const string MeterName = "StellaOps.Concelier.Source.Kev"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Kev/Internal/KevMapper.cs b/src/StellaOps.Concelier.Source.Kev/Internal/KevMapper.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Kev/Internal/KevMapper.cs rename to src/StellaOps.Concelier.Source.Kev/Internal/KevMapper.cs index 635144d6..e7d5a07b 100644 --- a/src/StellaOps.Feedser.Source.Kev/Internal/KevMapper.cs +++ b/src/StellaOps.Concelier.Source.Kev/Internal/KevMapper.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Source.Kev.Internal; +namespace StellaOps.Concelier.Source.Kev.Internal; internal static class KevMapper { diff --git a/src/StellaOps.Feedser.Source.Kev/Internal/KevSchemaProvider.cs b/src/StellaOps.Concelier.Source.Kev/Internal/KevSchemaProvider.cs similarity index 83% rename from src/StellaOps.Feedser.Source.Kev/Internal/KevSchemaProvider.cs rename to src/StellaOps.Concelier.Source.Kev/Internal/KevSchemaProvider.cs index 53f1287b..7635c623 100644 --- a/src/StellaOps.Feedser.Source.Kev/Internal/KevSchemaProvider.cs +++ b/src/StellaOps.Concelier.Source.Kev/Internal/KevSchemaProvider.cs @@ -3,11 +3,11 @@ using System.Reflection; using System.Threading; using Json.Schema; -namespace StellaOps.Feedser.Source.Kev.Internal; +namespace StellaOps.Concelier.Source.Kev.Internal; internal static class KevSchemaProvider { - private const string ResourceName = "StellaOps.Feedser.Source.Kev.Schemas.kev-catalog.schema.json"; + private const string ResourceName = "StellaOps.Concelier.Source.Kev.Schemas.kev-catalog.schema.json"; private static readonly Lazy CachedSchema = new(LoadSchema, LazyThreadSafetyMode.ExecutionAndPublication); diff --git a/src/StellaOps.Feedser.Source.Kev/Jobs.cs b/src/StellaOps.Concelier.Source.Kev/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Kev/Jobs.cs rename to src/StellaOps.Concelier.Source.Kev/Jobs.cs index f9323c9d..0b2ae6b0 100644 --- a/src/StellaOps.Feedser.Source.Kev/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Kev/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Kev; +namespace StellaOps.Concelier.Source.Kev; internal static class KevJobKinds { diff --git a/src/StellaOps.Feedser.Source.Kev/KevConnector.cs b/src/StellaOps.Concelier.Source.Kev/KevConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kev/KevConnector.cs rename to src/StellaOps.Concelier.Source.Kev/KevConnector.cs index a970d6d3..c7aaadfa 100644 --- a/src/StellaOps.Feedser.Source.Kev/KevConnector.cs +++ b/src/StellaOps.Concelier.Source.Kev/KevConnector.cs @@ -8,19 +8,19 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Json; -using StellaOps.Feedser.Source.Kev.Configuration; -using StellaOps.Feedser.Source.Kev.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Json; +using StellaOps.Concelier.Source.Kev.Configuration; +using StellaOps.Concelier.Source.Kev.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Kev; +namespace StellaOps.Concelier.Source.Kev; public sealed class KevConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Kev/KevConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Kev/KevConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Kev/KevConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Kev/KevConnectorPlugin.cs index 0905f025..16f20679 100644 --- a/src/StellaOps.Feedser.Source.Kev/KevConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Kev/KevConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Kev; +namespace StellaOps.Concelier.Source.Kev; public sealed class KevConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Kev/KevDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Kev/KevDependencyInjectionRoutine.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Kev/KevDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Kev/KevDependencyInjectionRoutine.cs index 27e4274e..1f0fb063 100644 --- a/src/StellaOps.Feedser.Source.Kev/KevDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Kev/KevDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Kev.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Kev.Configuration; -namespace StellaOps.Feedser.Source.Kev; +namespace StellaOps.Concelier.Source.Kev; public sealed class KevDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:kev"; + private const string ConfigurationSection = "concelier:sources:kev"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Kev/KevServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Kev/KevServiceCollectionExtensions.cs similarity index 82% rename from src/StellaOps.Feedser.Source.Kev/KevServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Kev/KevServiceCollectionExtensions.cs index 5f0c0366..35e900d9 100644 --- a/src/StellaOps.Feedser.Source.Kev/KevServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Kev/KevServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Kev.Configuration; -using StellaOps.Feedser.Source.Kev.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Kev.Configuration; +using StellaOps.Concelier.Source.Kev.Internal; -namespace StellaOps.Feedser.Source.Kev; +namespace StellaOps.Concelier.Source.Kev; public static class KevServiceCollectionExtensions { @@ -24,7 +24,7 @@ public static class KevServiceCollectionExtensions var opts = provider.GetRequiredService>().Value; clientOptions.BaseAddress = opts.FeedUri; clientOptions.Timeout = opts.RequestTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.Kev/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Kev/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(opts.FeedUri.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/json"; diff --git a/src/StellaOps.Feedser.Source.Kev/Schemas/kev-catalog.schema.json b/src/StellaOps.Concelier.Source.Kev/Schemas/kev-catalog.schema.json similarity index 100% rename from src/StellaOps.Feedser.Source.Kev/Schemas/kev-catalog.schema.json rename to src/StellaOps.Concelier.Source.Kev/Schemas/kev-catalog.schema.json diff --git a/src/StellaOps.Feedser.Source.Kev/StellaOps.Feedser.Source.Kev.csproj b/src/StellaOps.Concelier.Source.Kev/StellaOps.Concelier.Source.Kev.csproj similarity index 57% rename from src/StellaOps.Feedser.Source.Kev/StellaOps.Feedser.Source.Kev.csproj rename to src/StellaOps.Concelier.Source.Kev/StellaOps.Concelier.Source.Kev.csproj index 84e63f07..2eca0f05 100644 --- a/src/StellaOps.Feedser.Source.Kev/StellaOps.Feedser.Source.Kev.csproj +++ b/src/StellaOps.Concelier.Source.Kev/StellaOps.Concelier.Source.Kev.csproj @@ -9,14 +9,14 @@ - - - + + + - <_Parameter1>StellaOps.Feedser.Source.Kev.Tests + <_Parameter1>StellaOps.Concelier.Source.Kev.Tests diff --git a/src/StellaOps.Feedser.Source.Kev/TASKS.md b/src/StellaOps.Concelier.Source.Kev/TASKS.md similarity index 86% rename from src/StellaOps.Feedser.Source.Kev/TASKS.md rename to src/StellaOps.Concelier.Source.Kev/TASKS.md index 039870c0..4901f74c 100644 --- a/src/StellaOps.Feedser.Source.Kev/TASKS.md +++ b/src/StellaOps.Concelier.Source.Kev/TASKS.md @@ -7,6 +7,6 @@ |Canonical mapping & range primitives|BE-Conn-KEV|Models|**DONE** – Mapper produces vendor RangePrimitives (due dates, CWE list, ransomware flag, catalog metadata) and deduplicated references.| |Deterministic fixtures/tests|QA|Testing|**DONE** – End-to-end fetch→parse→map test with canned catalog + snapshot (`UPDATE_KEV_FIXTURES=1`) guards determinism.| |Telemetry & docs|DevEx|Docs|**DONE** – Connector emits structured logs + meters for catalog entries/advisories and AGENTS docs cover cadence/allowlist guidance.| -|Schema validation & anomaly surfacing|BE-Conn-KEV, QA|Source.Common|**DONE (2025-10-12)** – Wired `IJsonSchemaValidator` + embedded schema, added failure reasons (`schema`, `download`, `invalidJson`, etc.), anomaly counters (`missingCveId`, `countMismatch`, `nullEntry`), and kept `dotnet test src/StellaOps.Feedser.Source.Kev.Tests` passing.| -|Metrics export wiring|DevOps, DevEx|Observability|**DONE (2025-10-12)** – Added `kev.fetch.*` counters, parse failure/anomaly tags, refreshed ops runbook + Grafana dashboard (`docs/ops/feedser-cve-kev-grafana-dashboard.json`) with PromQL guidance.| -|FEEDCONN-KEV-02-003 Normalized versions propagation|BE-Conn-KEV|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-12)** – Validated catalog/date/due normalized rules emission + ordering; fixtures assert rule set and `dotnet test src/StellaOps.Feedser.Source.Kev.Tests` remains green.| +|Schema validation & anomaly surfacing|BE-Conn-KEV, QA|Source.Common|**DONE (2025-10-12)** – Wired `IJsonSchemaValidator` + embedded schema, added failure reasons (`schema`, `download`, `invalidJson`, etc.), anomaly counters (`missingCveId`, `countMismatch`, `nullEntry`), and kept `dotnet test src/StellaOps.Concelier.Source.Kev.Tests` passing.| +|Metrics export wiring|DevOps, DevEx|Observability|**DONE (2025-10-12)** – Added `kev.fetch.*` counters, parse failure/anomaly tags, refreshed ops runbook + Grafana dashboard (`docs/ops/concelier-cve-kev-grafana-dashboard.json`) with PromQL guidance.| +|FEEDCONN-KEV-02-003 Normalized versions propagation|BE-Conn-KEV|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-12)** – Validated catalog/date/due normalized rules emission + ordering; fixtures assert rule set and `dotnet test src/StellaOps.Concelier.Source.Kev.Tests` remains green.| diff --git a/src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-detail.json b/src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-detail.json similarity index 100% rename from src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-detail.json rename to src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-detail.json diff --git a/src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-feed.xml b/src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-feed.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Kisa.Tests/Fixtures/kisa-feed.xml rename to src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-feed.xml diff --git a/src/StellaOps.Feedser.Source.Kisa.Tests/KisaConnectorTests.cs b/src/StellaOps.Concelier.Source.Kisa.Tests/KisaConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Kisa.Tests/KisaConnectorTests.cs rename to src/StellaOps.Concelier.Source.Kisa.Tests/KisaConnectorTests.cs index 5683ef86..741955d1 100644 --- a/src/StellaOps.Feedser.Source.Kisa.Tests/KisaConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Kisa.Tests/KisaConnectorTests.cs @@ -13,20 +13,20 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Kisa.Configuration; -using StellaOps.Feedser.Source.Kisa.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Kisa.Configuration; +using StellaOps.Concelier.Source.Kisa.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; using System.Linq; -namespace StellaOps.Feedser.Source.Kisa.Tests; +namespace StellaOps.Concelier.Source.Kisa.Tests; [Collection("mongo-fixture")] public sealed class KisaConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj b/src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj similarity index 56% rename from src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj rename to src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj index 9bbb9390..c72f2e04 100644 --- a/src/StellaOps.Feedser.Source.Kisa.Tests/StellaOps.Feedser.Source.Kisa.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj @@ -5,10 +5,10 @@ enable - - - - + + + + diff --git a/src/StellaOps.Feedser.Source.Kisa/AGENTS.md b/src/StellaOps.Concelier.Source.Kisa/AGENTS.md similarity index 84% rename from src/StellaOps.Feedser.Source.Kisa/AGENTS.md rename to src/StellaOps.Concelier.Source.Kisa/AGENTS.md index 8efa4065..3f67f9f3 100644 --- a/src/StellaOps.Feedser.Source.Kisa/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Kisa/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Deliver the KISA (Korea Internet & Security Agency) advisory connector to ingest Korean vulnerability alerts for Feedser’s regional coverage. +Deliver the KISA (Korea Internet & Security Agency) advisory connector to ingest Korean vulnerability alerts for Concelier’s regional coverage. ## Scope - Identify KISA’s advisory feeds (RSS/Atom, JSON, HTML) and determine localisation requirements (Korean language parsing). @@ -12,8 +12,8 @@ Deliver the KISA (Korea Internet & Security Agency) advisory connector to ingest ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores, source state). -- `Feedser.Models` (canonical data structures). -- `Feedser.Testing` (integration fixtures and snapshots). +- `Concelier.Models` (canonical data structures). +- `Concelier.Testing` (integration fixtures and snapshots). ## Interfaces & Contracts - Job kinds: `kisa:fetch`, `kisa:parse`, `kisa:map`. @@ -33,6 +33,6 @@ Out of scope: - Handle character encoding (UTF-8/Korean) correctly. ## Tests -- Add `StellaOps.Feedser.Source.Kisa.Tests` covering fetch/parse/map with Korean-language fixtures. +- Add `StellaOps.Concelier.Source.Kisa.Tests` covering fetch/parse/map with Korean-language fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Kisa/Configuration/KisaOptions.cs b/src/StellaOps.Concelier.Source.Kisa/Configuration/KisaOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Kisa/Configuration/KisaOptions.cs rename to src/StellaOps.Concelier.Source.Kisa/Configuration/KisaOptions.cs index c2da1e3a..66765437 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Configuration/KisaOptions.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Configuration/KisaOptions.cs @@ -1,10 +1,10 @@ using System; -namespace StellaOps.Feedser.Source.Kisa.Configuration; +namespace StellaOps.Concelier.Source.Kisa.Configuration; public sealed class KisaOptions { - public const string HttpClientName = "feedser.source.kisa"; + public const string HttpClientName = "concelier.source.kisa"; /// /// Primary RSS feed for security advisories. diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaCursor.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaCursor.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaCursor.cs index 30c31adb..ecaabd51 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaCursor.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; internal sealed record KisaCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailParser.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailParser.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailParser.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailParser.cs index 61b0ba23..79264b3b 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailParser.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailParser.cs @@ -4,9 +4,9 @@ using System.Linq; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using StellaOps.Feedser.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Html; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; public sealed class KisaDetailParser { diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailResponse.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailResponse.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailResponse.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailResponse.cs index f6f392f9..d7890c65 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDetailResponse.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDetailResponse.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; internal sealed class KisaDetailResponse { diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDiagnostics.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDiagnostics.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaDiagnostics.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaDiagnostics.cs index ea165857..69e9f254 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; public sealed class KisaDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Kisa"; + public const string MeterName = "StellaOps.Concelier.Source.Kisa"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDocumentMetadata.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaDocumentMetadata.cs index 8ac285d3..c6ccfe75 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaDocumentMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; internal static class KisaDocumentMetadata { diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedClient.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedClient.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedClient.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedClient.cs index 413b1983..cfb14611 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedClient.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedClient.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Kisa.Configuration; +using StellaOps.Concelier.Source.Kisa.Configuration; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; public sealed class KisaFeedClient { diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedItem.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedItem.cs similarity index 78% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedItem.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedItem.cs index 3cc74e91..3fc433b5 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaFeedItem.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaFeedItem.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; public sealed record KisaFeedItem( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaMapper.cs b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kisa/Internal/KisaMapper.cs rename to src/StellaOps.Concelier.Source.Kisa/Internal/KisaMapper.cs index 0fb1592a..b50bf7f6 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Internal/KisaMapper.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Internal/KisaMapper.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Kisa.Internal; +namespace StellaOps.Concelier.Source.Kisa.Internal; internal static class KisaMapper { diff --git a/src/StellaOps.Feedser.Source.Kisa/Jobs.cs b/src/StellaOps.Concelier.Source.Kisa/Jobs.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Kisa/Jobs.cs rename to src/StellaOps.Concelier.Source.Kisa/Jobs.cs index 99e2cacc..e43326ff 100644 --- a/src/StellaOps.Feedser.Source.Kisa/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Kisa/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Kisa; +namespace StellaOps.Concelier.Source.Kisa; internal static class KisaJobKinds { diff --git a/src/StellaOps.Feedser.Source.Kisa/KisaConnector.cs b/src/StellaOps.Concelier.Source.Kisa/KisaConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Kisa/KisaConnector.cs rename to src/StellaOps.Concelier.Source.Kisa/KisaConnector.cs index 2cd61d53..16eda06d 100644 --- a/src/StellaOps.Feedser.Source.Kisa/KisaConnector.cs +++ b/src/StellaOps.Concelier.Source.Kisa/KisaConnector.cs @@ -7,17 +7,17 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Kisa.Configuration; -using StellaOps.Feedser.Source.Kisa.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Kisa.Configuration; +using StellaOps.Concelier.Source.Kisa.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Kisa; +namespace StellaOps.Concelier.Source.Kisa; public sealed class KisaConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Kisa/KisaConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Kisa/KisaConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Kisa/KisaConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Kisa/KisaConnectorPlugin.cs index cd7f8882..75de1e58 100644 --- a/src/StellaOps.Feedser.Source.Kisa/KisaConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Kisa/KisaConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Kisa; +namespace StellaOps.Concelier.Source.Kisa; public sealed class KisaConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Kisa/KisaDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Kisa/KisaDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Kisa/KisaDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Kisa/KisaDependencyInjectionRoutine.cs index ad805e69..ba947539 100644 --- a/src/StellaOps.Feedser.Source.Kisa/KisaDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Kisa/KisaDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Kisa.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Kisa.Configuration; -namespace StellaOps.Feedser.Source.Kisa; +namespace StellaOps.Concelier.Source.Kisa; public sealed class KisaDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:kisa"; + private const string ConfigurationSection = "concelier:sources:kisa"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Kisa/KisaServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Kisa/KisaServiceCollectionExtensions.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Kisa/KisaServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Kisa/KisaServiceCollectionExtensions.cs index 06fc6106..317c213a 100644 --- a/src/StellaOps.Feedser.Source.Kisa/KisaServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Kisa/KisaServiceCollectionExtensions.cs @@ -3,12 +3,12 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Html; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Kisa.Configuration; -using StellaOps.Feedser.Source.Kisa.Internal; +using StellaOps.Concelier.Source.Common.Html; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Kisa.Configuration; +using StellaOps.Concelier.Source.Kisa.Internal; -namespace StellaOps.Feedser.Source.Kisa; +namespace StellaOps.Concelier.Source.Kisa; public static class KisaServiceCollectionExtensions { @@ -25,7 +25,7 @@ public static class KisaServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.Timeout = options.RequestTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.Kisa/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Kisa/1.0"; clientOptions.DefaultRequestHeaders["Accept-Language"] = "ko-KR"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.FeedUri.Host); diff --git a/src/StellaOps.Concelier.Source.Kisa/StellaOps.Concelier.Source.Kisa.csproj b/src/StellaOps.Concelier.Source.Kisa/StellaOps.Concelier.Source.Kisa.csproj new file mode 100644 index 00000000..a187c54c --- /dev/null +++ b/src/StellaOps.Concelier.Source.Kisa/StellaOps.Concelier.Source.Kisa.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Kisa/TASKS.md b/src/StellaOps.Concelier.Source.Kisa/TASKS.md similarity index 86% rename from src/StellaOps.Feedser.Source.Kisa/TASKS.md rename to src/StellaOps.Concelier.Source.Kisa/TASKS.md index bb67ce07..d3f8f809 100644 --- a/src/StellaOps.Feedser.Source.Kisa/TASKS.md +++ b/src/StellaOps.Concelier.Source.Kisa/TASKS.md @@ -1,10 +1,10 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-KISA-02-001 Research KISA advisory feeds|BE-Conn-KISA|Research|**DONE (2025-10-11)** – Located public RSS endpoints (`https://knvd.krcert.or.kr/rss/securityInfo.do`, `.../securityNotice.do`) returning UTF-8 XML with 10-item windows and canonical `detailDos.do?IDX=` links. Logged output structure + header profile in `docs/feedser-connector-research-20251011.md`; outstanding work is parsing the SPA detail payload.| +|FEEDCONN-KISA-02-001 Research KISA advisory feeds|BE-Conn-KISA|Research|**DONE (2025-10-11)** – Located public RSS endpoints (`https://knvd.krcert.or.kr/rss/securityInfo.do`, `.../securityNotice.do`) returning UTF-8 XML with 10-item windows and canonical `detailDos.do?IDX=` links. Logged output structure + header profile in `docs/concelier-connector-research-20251011.md`; outstanding work is parsing the SPA detail payload.| |FEEDCONN-KISA-02-002 Fetch pipeline & source state|BE-Conn-KISA|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – `KisaConnector.FetchAsync` pulls RSS, sets `Accept-Language: ko-KR`, persists detail JSON with IDX metadata, throttles requests, and tracks cursor state (pending docs/mappings, known IDs, published timestamp).| |FEEDCONN-KISA-02-003 Parser & DTO implementation|BE-Conn-KISA|Source.Common|**DONE (2025-10-14)** – Detail API parsed via `KisaDetailParser` (Hangul NFC normalisation, sanitised HTML, CVE extraction, references/products captured into DTO `kisa.detail.v1`).| |FEEDCONN-KISA-02-004 Canonical mapping & range primitives|BE-Conn-KISA|Models|**DONE (2025-10-14)** – `KisaMapper` emits vendor packages with range strings, aliases (IDX/CVEs), references, and provenance; advisories default to `ko` language and normalised severity.| -|FEEDCONN-KISA-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Feedser.Source.Kisa.Tests` with Korean fixtures and fetch→parse→map regression; fixtures regenerate via `UPDATE_KISA_FIXTURES=1`.| +|FEEDCONN-KISA-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Concelier.Source.Kisa.Tests` with Korean fixtures and fetch→parse→map regression; fixtures regenerate via `UPDATE_KISA_FIXTURES=1`.| |FEEDCONN-KISA-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-14)** – Added diagnostics-backed telemetry, structured logs, regression coverage, and published localisation notes in `docs/dev/kisa_connector_notes.md` + fixture guidance for Docs/QA.| |FEEDCONN-KISA-02-007 RSS contract & localisation brief|BE-Conn-KISA|Research|**DONE (2025-10-11)** – Documented RSS URLs, confirmed UTF-8 payload (no additional cookies required), and drafted localisation plan (Hangul glossary + optional MT plugin). Remaining open item: capture SPA detail API contract for full-text translations.| diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.ghsa.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.ghsa.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.ghsa.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.ghsa.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.nvd.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.nvd.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.nvd.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.nvd.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.osv.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.osv.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.osv.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/credit-parity.osv.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-invalid-schema.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-invalid-schema.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-invalid-schema.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-invalid-schema.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-1.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-1.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-1.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-2.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-2.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-2.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-2.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-3.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-3.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-3.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-multipage-3.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-1.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-1.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-1.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-1.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-2.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-2.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-2.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-2.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-update.json b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-update.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-update.json rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/Fixtures/nvd-window-update.json diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs index 68383899..0df565cc 100644 --- a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs +++ b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConflictFixtureTests.cs @@ -1,9 +1,9 @@ using System.Text.Json; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Nvd.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Nvd.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Nvd.Tests; +namespace StellaOps.Concelier.Source.Nvd.Tests; public sealed class NvdConflictFixtureTests { diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs index 66ded4b4..a83d325a 100644 --- a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs +++ b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorHarnessTests.cs @@ -5,17 +5,17 @@ using System.IO; using System.Linq; using Microsoft.Extensions.DependencyInjection; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Nvd; -using StellaOps.Feedser.Source.Nvd.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Nvd; +using StellaOps.Concelier.Source.Nvd.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Testing; using System.Net; -namespace StellaOps.Feedser.Source.Nvd.Tests; +namespace StellaOps.Concelier.Source.Nvd.Tests; [Collection("mongo-fixture")] public sealed class NvdConnectorHarnessTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs index 14554ef3..59a938ea 100644 --- a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdConnectorTests.cs @@ -12,22 +12,22 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Nvd; -using StellaOps.Feedser.Source.Nvd.Configuration; -using StellaOps.Feedser.Source.Nvd.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.ChangeHistory; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Nvd; +using StellaOps.Concelier.Source.Nvd.Configuration; +using StellaOps.Concelier.Source.Nvd.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.ChangeHistory; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Nvd.Tests; +namespace StellaOps.Concelier.Source.Nvd.Tests; [Collection("mongo-fixture")] public sealed class NvdConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs rename to src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs index 1e5c9944..3ff56d4e 100644 --- a/src/StellaOps.Feedser.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs +++ b/src/StellaOps.Concelier.Source.Nvd.Tests/Nvd/NvdMergeExportParityTests.cs @@ -3,12 +3,12 @@ using System.IO; using System.Linq; using System.Text.Json; using System.Threading.Tasks; -using StellaOps.Feedser.Core; -using StellaOps.Feedser.Exporter.Json; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Core; +using StellaOps.Concelier.Exporter.Json; +using StellaOps.Concelier.Models; using Xunit; -namespace StellaOps.Feedser.Source.Nvd.Tests.Nvd; +namespace StellaOps.Concelier.Source.Nvd.Tests.Nvd; public sealed class NvdMergeExportParityTests { diff --git a/src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj b/src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj new file mode 100644 index 00000000..bbad6650 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Nvd/AGENTS.md b/src/StellaOps.Concelier.Source.Nvd/AGENTS.md similarity index 73% rename from src/StellaOps.Feedser.Source.Nvd/AGENTS.md rename to src/StellaOps.Concelier.Source.Nvd/AGENTS.md index a22b7a18..8fe49404 100644 --- a/src/StellaOps.Feedser.Source.Nvd/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Nvd/AGENTS.md @@ -13,14 +13,14 @@ Connector for NVD API v2: fetch, validate, map CVE items to canonical advisories - Exporters consume canonical advisories. ## Interfaces & contracts - Job kinds: nvd:fetch, nvd:parse, nvd:map. -- Input params: windowHours, since, until; safe defaults in FeedserOptions. +- Input params: windowHours, since, until; safe defaults in ConcelierOptions. - Output: raw documents, sanitized DTOs, mapped advisories + provenance (document, parser). ## In/Out of scope In: registry-level data, references, generic CPEs. Out: authoritative distro package ranges; vendor patch states. ## Observability & security expectations -- Metrics: SourceDiagnostics publishes `feedser.source.http.*` counters/histograms tagged `feedser.source=nvd`; dashboards slice on the tag to track page counts, schema failures, map throughput, and window advancement. Structured logs include window bounds and etag hits. +- Metrics: SourceDiagnostics publishes `concelier.source.http.*` counters/histograms tagged `concelier.source=nvd`; dashboards slice on the tag to track page counts, schema failures, map throughput, and window advancement. Structured logs include window bounds and etag hits. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Nvd.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Nvd.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Nvd/Configuration/NvdOptions.cs b/src/StellaOps.Concelier.Source.Nvd/Configuration/NvdOptions.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Nvd/Configuration/NvdOptions.cs rename to src/StellaOps.Concelier.Source.Nvd/Configuration/NvdOptions.cs index 6d26c6df..50af58ea 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Configuration/NvdOptions.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Configuration/NvdOptions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Nvd.Configuration; +namespace StellaOps.Concelier.Source.Nvd.Configuration; public sealed class NvdOptions { diff --git a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdCursor.cs b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdCursor.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Nvd/Internal/NvdCursor.cs rename to src/StellaOps.Concelier.Source.Nvd/Internal/NvdCursor.cs index 01cb5e6c..77daa857 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdCursor.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdCursor.cs @@ -1,8 +1,8 @@ using System.Linq; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Cursors; +using StellaOps.Concelier.Source.Common.Cursors; -namespace StellaOps.Feedser.Source.Nvd.Internal; +namespace StellaOps.Concelier.Source.Nvd.Internal; internal sealed record NvdCursor( TimeWindowCursorState Window, diff --git a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdDiagnostics.cs b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdDiagnostics.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Nvd/Internal/NvdDiagnostics.cs rename to src/StellaOps.Concelier.Source.Nvd/Internal/NvdDiagnostics.cs index 1487b3ab..06d76a2c 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Nvd.Internal; +namespace StellaOps.Concelier.Source.Nvd.Internal; public sealed class NvdDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Nvd"; + public const string MeterName = "StellaOps.Concelier.Source.Nvd"; public const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdMapper.cs b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Nvd/Internal/NvdMapper.cs rename to src/StellaOps.Concelier.Source.Nvd/Internal/NvdMapper.cs index 9f127854..c8c1d4b2 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdMapper.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdMapper.cs @@ -4,13 +4,13 @@ using System.Linq; using System.Text; using System.Text.Json; using NuGet.Versioning; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Identifiers; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.Text; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.Text; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Nvd.Internal; +namespace StellaOps.Concelier.Source.Nvd.Internal; internal static class NvdMapper { diff --git a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdSchemaProvider.cs b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdSchemaProvider.cs similarity index 80% rename from src/StellaOps.Feedser.Source.Nvd/Internal/NvdSchemaProvider.cs rename to src/StellaOps.Concelier.Source.Nvd/Internal/NvdSchemaProvider.cs index e7e9e54f..b209c786 100644 --- a/src/StellaOps.Feedser.Source.Nvd/Internal/NvdSchemaProvider.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Internal/NvdSchemaProvider.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Threading; using Json.Schema; -namespace StellaOps.Feedser.Source.Nvd.Internal; +namespace StellaOps.Concelier.Source.Nvd.Internal; internal static class NvdSchemaProvider { @@ -14,7 +14,7 @@ internal static class NvdSchemaProvider private static JsonSchema LoadSchema() { var assembly = typeof(NvdSchemaProvider).GetTypeInfo().Assembly; - const string resourceName = "StellaOps.Feedser.Source.Nvd.Schemas.nvd-vulnerability.schema.json"; + const string resourceName = "StellaOps.Concelier.Source.Nvd.Schemas.nvd-vulnerability.schema.json"; using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new InvalidOperationException($"Embedded schema '{resourceName}' not found."); diff --git a/src/StellaOps.Feedser.Source.Nvd/NvdConnector.cs b/src/StellaOps.Concelier.Source.Nvd/NvdConnector.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Nvd/NvdConnector.cs rename to src/StellaOps.Concelier.Source.Nvd/NvdConnector.cs index f315b3ef..ebfa9ed9 100644 --- a/src/StellaOps.Feedser.Source.Nvd/NvdConnector.cs +++ b/src/StellaOps.Concelier.Source.Nvd/NvdConnector.cs @@ -5,22 +5,22 @@ using System.Text.Json; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Json; -using StellaOps.Feedser.Source.Common.Cursors; -using StellaOps.Feedser.Source.Nvd.Configuration; -using StellaOps.Feedser.Source.Nvd.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.ChangeHistory; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Json; +using StellaOps.Concelier.Source.Common.Cursors; +using StellaOps.Concelier.Source.Nvd.Configuration; +using StellaOps.Concelier.Source.Nvd.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.ChangeHistory; using StellaOps.Plugin; using Json.Schema; -namespace StellaOps.Feedser.Source.Nvd; +namespace StellaOps.Concelier.Source.Nvd; public sealed class NvdConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Nvd/NvdConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Nvd/NvdConnectorPlugin.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Nvd/NvdConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Nvd/NvdConnectorPlugin.cs index 27be1e07..65e169de 100644 --- a/src/StellaOps.Feedser.Source.Nvd/NvdConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Nvd/NvdConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Nvd; +namespace StellaOps.Concelier.Source.Nvd; public sealed class NvdConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Nvd/NvdServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Nvd/NvdServiceCollectionExtensions.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Nvd/NvdServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Nvd/NvdServiceCollectionExtensions.cs index f6d1620e..a1197651 100644 --- a/src/StellaOps.Feedser.Source.Nvd/NvdServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Nvd/NvdServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Nvd.Configuration; -using StellaOps.Feedser.Source.Nvd.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Nvd.Configuration; +using StellaOps.Concelier.Source.Nvd.Internal; -namespace StellaOps.Feedser.Source.Nvd; +namespace StellaOps.Concelier.Source.Nvd; public static class NvdServiceCollectionExtensions { @@ -22,7 +22,7 @@ public static class NvdServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseEndpoint; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Nvd/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Nvd/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseEndpoint.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/json"; diff --git a/src/StellaOps.Feedser.Source.Acsc/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Nvd/Properties/AssemblyInfo.cs similarity index 55% rename from src/StellaOps.Feedser.Source.Acsc/Properties/AssemblyInfo.cs rename to src/StellaOps.Concelier.Source.Nvd/Properties/AssemblyInfo.cs index b495b842..600970a4 100644 --- a/src/StellaOps.Feedser.Source.Acsc/Properties/AssemblyInfo.cs +++ b/src/StellaOps.Concelier.Source.Nvd/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Nvd.Tests")] [assembly: InternalsVisibleTo("FixtureUpdater")] -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Acsc.Tests")] diff --git a/src/StellaOps.Feedser.Source.Nvd/Schemas/nvd-vulnerability.schema.json b/src/StellaOps.Concelier.Source.Nvd/Schemas/nvd-vulnerability.schema.json similarity index 100% rename from src/StellaOps.Feedser.Source.Nvd/Schemas/nvd-vulnerability.schema.json rename to src/StellaOps.Concelier.Source.Nvd/Schemas/nvd-vulnerability.schema.json diff --git a/src/StellaOps.Concelier.Source.Nvd/StellaOps.Concelier.Source.Nvd.csproj b/src/StellaOps.Concelier.Source.Nvd/StellaOps.Concelier.Source.Nvd.csproj new file mode 100644 index 00000000..8bb863d2 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Nvd/StellaOps.Concelier.Source.Nvd.csproj @@ -0,0 +1,17 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Nvd/TASKS.md b/src/StellaOps.Concelier.Source.Nvd/TASKS.md similarity index 94% rename from src/StellaOps.Feedser.Source.Nvd/TASKS.md rename to src/StellaOps.Concelier.Source.Nvd/TASKS.md index 9caff6c4..8cdbb365 100644 --- a/src/StellaOps.Feedser.Source.Nvd/TASKS.md +++ b/src/StellaOps.Concelier.Source.Nvd/TASKS.md @@ -11,7 +11,7 @@ |Change history snapshotting|BE-Conn-Nvd|Storage.Mongo|DONE – connector now records per-CVE snapshots with top-level diff metadata whenever canonical advisories change.| |Pagination for windows over page limit|BE-Conn-Nvd|Source.Common|**DONE** – additional page fetcher honors `startIndex`; covered by multipage tests.| |Schema validation quarantine path|BE-Conn-Nvd|Storage.Mongo|**DONE** – schema failures mark documents failed and metrics assert quarantine.| -|FEEDCONN-NVD-04-002 Conflict regression fixtures|BE-Conn-Nvd, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Published `conflict-nvd.canonical.json` + mapper test; includes CVSS 3.1 + CWE reference and normalized CPE range feeding the conflict triple. Validation: `dotnet test src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj --filter NvdConflictFixtureTests`.| +|FEEDCONN-NVD-04-002 Conflict regression fixtures|BE-Conn-Nvd, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Published `conflict-nvd.canonical.json` + mapper test; includes CVSS 3.1 + CWE reference and normalized CPE range feeding the conflict triple. Validation: `dotnet test src/StellaOps.Concelier.Source.Nvd.Tests/StellaOps.Concelier.Source.Nvd.Tests.csproj --filter NvdConflictFixtureTests`.| |FEEDCONN-NVD-02-004 NVD CVSS & CWE precedence payloads|BE-Conn-Nvd|Models `FEEDMODELS-SCHEMA-01-002`|**DONE (2025-10-11)** – CVSS metrics now carry provenance masks, CWE weaknesses emit normalized references, and fixtures cover the additional precedence data.| |FEEDCONN-NVD-02-005 NVD merge/export parity regression|BE-Conn-Nvd, BE-Merge|Merge `FEEDMERGE-ENGINE-04-003`|**DONE (2025-10-12)** – Canonical merge parity fixtures captured, regression test validates credit/reference union, and exporter snapshot check guarantees parity through JSON exports.| |FEEDCONN-NVD-02-002 Normalized versions rollout|BE-Conn-Nvd|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-11)** – SemVer primitives + normalized rules emitting for parseable ranges, fixtures/tests refreshed, coordination pinged via FEEDMERGE-COORD-02-900.| diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/conflict-osv.canonical.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.ghsa.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.ghsa.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.ghsa.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.ghsa.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.osv.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.osv.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.osv.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.osv.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.raw-ghsa.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.raw-ghsa.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.raw-ghsa.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.raw-ghsa.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.raw-osv.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.raw-osv.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-ghsa.raw-osv.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.raw-osv.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-npm.snapshot.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-npm.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-npm.snapshot.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-npm.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-pypi.snapshot.json b/src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-pypi.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Osv.Tests/Fixtures/osv-pypi.snapshot.json rename to src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-pypi.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs rename to src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs index c0570590..42dacccb 100644 --- a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs +++ b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvConflictFixtureTests.cs @@ -1,11 +1,11 @@ using System.Text.Json; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.Osv.Tests; +namespace StellaOps.Concelier.Source.Osv.Tests; public sealed class OsvConflictFixtureTests { diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs rename to src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs index b47ae735..025acd8a 100644 --- a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs +++ b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvGhsaParityRegressionTests.cs @@ -10,15 +10,15 @@ using System.Security.Cryptography; using System.Text.Json; using System.Text.RegularExpressions; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Osv; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Osv; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit; -namespace StellaOps.Feedser.Source.Osv.Tests; +namespace StellaOps.Concelier.Source.Osv.Tests; public sealed class OsvGhsaParityRegressionTests { @@ -70,11 +70,11 @@ public sealed class OsvGhsaParityRegressionTests OsvGhsaParityDiagnostics.RecordReport(report, "fixtures"); listener.Dispose(); - var total = Assert.Single(measurements, entry => string.Equals(entry.Instrument, "feedser.osv_ghsa.total", StringComparison.Ordinal)); + var total = Assert.Single(measurements, entry => string.Equals(entry.Instrument, "concelier.osv_ghsa.total", StringComparison.Ordinal)); Assert.Equal(GhsaIds.Length, total.Value); Assert.Equal("fixtures", Assert.IsType(total.Tags["dataset"])); - Assert.DoesNotContain(measurements, entry => string.Equals(entry.Instrument, "feedser.osv_ghsa.issues", StringComparison.Ordinal)); + Assert.DoesNotContain(measurements, entry => string.Equals(entry.Instrument, "concelier.osv_ghsa.issues", StringComparison.Ordinal)); } private static MeterListener CreateListener(List buffer) @@ -83,7 +83,7 @@ public sealed class OsvGhsaParityRegressionTests { InstrumentPublished = (instrument, l) => { - if (instrument.Meter.Name.StartsWith("StellaOps.Feedser.Models.OsvGhsaParity", StringComparison.Ordinal)) + if (instrument.Meter.Name.StartsWith("StellaOps.Concelier.Models.OsvGhsaParity", StringComparison.Ordinal)) { l.EnableMeasurementEvents(instrument); } diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvMapperTests.cs b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvMapperTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvMapperTests.cs rename to src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvMapperTests.cs index e479579b..0c44cb3b 100644 --- a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvMapperTests.cs @@ -4,16 +4,16 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Reflection; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Osv; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Normalization.Identifiers; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Osv; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Normalization.Identifiers; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit; -namespace StellaOps.Feedser.Source.Osv.Tests; +namespace StellaOps.Concelier.Source.Osv.Tests; public sealed class OsvMapperTests { diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvSnapshotTests.cs b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvSnapshotTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvSnapshotTests.cs rename to src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvSnapshotTests.cs index 6ddfcd47..076eb9e7 100644 --- a/src/StellaOps.Feedser.Source.Osv.Tests/Osv/OsvSnapshotTests.cs +++ b/src/StellaOps.Concelier.Source.Osv.Tests/Osv/OsvSnapshotTests.cs @@ -3,16 +3,16 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Osv; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Source.Common; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Osv; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.Common; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Osv.Tests; +namespace StellaOps.Concelier.Source.Osv.Tests; public sealed class OsvSnapshotTests { diff --git a/src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj b/src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj new file mode 100644 index 00000000..e59484a6 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + PreserveNewest + + + diff --git a/src/StellaOps.Feedser.Source.Osv/AGENTS.md b/src/StellaOps.Concelier.Source.Osv/AGENTS.md similarity index 76% rename from src/StellaOps.Feedser.Source.Osv/AGENTS.md rename to src/StellaOps.Concelier.Source.Osv/AGENTS.md index 40f0ddf0..48a4df2b 100644 --- a/src/StellaOps.Feedser.Source.Osv/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Osv/AGENTS.md @@ -19,8 +19,8 @@ Connector for OSV.dev across ecosystems; authoritative SemVer/PURL ranges for OS In: SemVer+PURL accuracy for OSS ecosystems. Out: vendor PSIRT and distro OVAL specifics. ## Observability & security expectations -- Metrics: SourceDiagnostics exposes the shared `feedser.source.http.*` counters/histograms tagged `feedser.source=osv`; observability dashboards slice on the tag to monitor item volume, schema failures, range counts, and ecosystem coverage. Logs include ecosystem and cursor values. +- Metrics: SourceDiagnostics exposes the shared `concelier.source.http.*` counters/histograms tagged `concelier.source=osv`; observability dashboards slice on the tag to monitor item volume, schema failures, range counts, and ecosystem coverage. Logs include ecosystem and cursor values. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Osv.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Osv.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Osv/Configuration/OsvOptions.cs b/src/StellaOps.Concelier.Source.Osv/Configuration/OsvOptions.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Osv/Configuration/OsvOptions.cs rename to src/StellaOps.Concelier.Source.Osv/Configuration/OsvOptions.cs index c6d5f333..1cceffb5 100644 --- a/src/StellaOps.Feedser.Source.Osv/Configuration/OsvOptions.cs +++ b/src/StellaOps.Concelier.Source.Osv/Configuration/OsvOptions.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Osv.Configuration; +namespace StellaOps.Concelier.Source.Osv.Configuration; public sealed class OsvOptions { diff --git a/src/StellaOps.Feedser.Source.Osv/Internal/OsvCursor.cs b/src/StellaOps.Concelier.Source.Osv/Internal/OsvCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Osv/Internal/OsvCursor.cs rename to src/StellaOps.Concelier.Source.Osv/Internal/OsvCursor.cs index a11cf28a..f7a39662 100644 --- a/src/StellaOps.Feedser.Source.Osv/Internal/OsvCursor.cs +++ b/src/StellaOps.Concelier.Source.Osv/Internal/OsvCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Osv.Internal; +namespace StellaOps.Concelier.Source.Osv.Internal; internal sealed record OsvCursor( IReadOnlyDictionary LastModifiedByEcosystem, diff --git a/src/StellaOps.Feedser.Source.Osv/Internal/OsvDiagnostics.cs b/src/StellaOps.Concelier.Source.Osv/Internal/OsvDiagnostics.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Osv/Internal/OsvDiagnostics.cs rename to src/StellaOps.Concelier.Source.Osv/Internal/OsvDiagnostics.cs index 28bfa958..5a5122ff 100644 --- a/src/StellaOps.Feedser.Source.Osv/Internal/OsvDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Osv/Internal/OsvDiagnostics.cs @@ -2,14 +2,14 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Osv.Internal; +namespace StellaOps.Concelier.Source.Osv.Internal; /// /// Connector-specific diagnostics for OSV mapping. /// public sealed class OsvDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Osv"; + private const string MeterName = "StellaOps.Concelier.Source.Osv"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Osv/Internal/OsvMapper.cs b/src/StellaOps.Concelier.Source.Osv/Internal/OsvMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Osv/Internal/OsvMapper.cs rename to src/StellaOps.Concelier.Source.Osv/Internal/OsvMapper.cs index 88625b0d..3c22d123 100644 --- a/src/StellaOps.Feedser.Source.Osv/Internal/OsvMapper.cs +++ b/src/StellaOps.Concelier.Source.Osv/Internal/OsvMapper.cs @@ -4,15 +4,15 @@ using System.Collections.Immutable; using System.Linq; using System.Text; using System.Text.Json; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.Identifiers; -using StellaOps.Feedser.Normalization.Text; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.Identifiers; +using StellaOps.Concelier.Normalization.Text; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.Osv.Internal; +namespace StellaOps.Concelier.Source.Osv.Internal; internal static class OsvMapper { diff --git a/src/StellaOps.Feedser.Source.Osv/Internal/OsvVulnerabilityDto.cs b/src/StellaOps.Concelier.Source.Osv/Internal/OsvVulnerabilityDto.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Osv/Internal/OsvVulnerabilityDto.cs rename to src/StellaOps.Concelier.Source.Osv/Internal/OsvVulnerabilityDto.cs index 26f4ce12..b591166a 100644 --- a/src/StellaOps.Feedser.Source.Osv/Internal/OsvVulnerabilityDto.cs +++ b/src/StellaOps.Concelier.Source.Osv/Internal/OsvVulnerabilityDto.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Osv.Internal; +namespace StellaOps.Concelier.Source.Osv.Internal; internal sealed record OsvVulnerabilityDto { diff --git a/src/StellaOps.Feedser.Source.Osv/Jobs.cs b/src/StellaOps.Concelier.Source.Osv/Jobs.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Osv/Jobs.cs rename to src/StellaOps.Concelier.Source.Osv/Jobs.cs index 14e395d4..ebd8348c 100644 --- a/src/StellaOps.Feedser.Source.Osv/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Osv/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Osv; +namespace StellaOps.Concelier.Source.Osv; internal static class OsvJobKinds { diff --git a/src/StellaOps.Feedser.Source.Osv/OsvConnector.cs b/src/StellaOps.Concelier.Source.Osv/OsvConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Osv/OsvConnector.cs rename to src/StellaOps.Concelier.Source.Osv/OsvConnector.cs index 7690b135..0bff947e 100644 --- a/src/StellaOps.Feedser.Source.Osv/OsvConnector.cs +++ b/src/StellaOps.Concelier.Source.Osv/OsvConnector.cs @@ -14,18 +14,18 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Osv.Configuration; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Osv.Configuration; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Osv; +namespace StellaOps.Concelier.Source.Osv; public sealed class OsvConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Osv/OsvConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Osv/OsvConnectorPlugin.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Osv/OsvConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Osv/OsvConnectorPlugin.cs index a5beba0f..8a1603e5 100644 --- a/src/StellaOps.Feedser.Source.Osv/OsvConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Osv/OsvConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Osv; +namespace StellaOps.Concelier.Source.Osv; public sealed class OsvConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Osv/OsvDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Osv/OsvDependencyInjectionRoutine.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Osv/OsvDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Osv/OsvDependencyInjectionRoutine.cs index c401aaa2..5c18fc2c 100644 --- a/src/StellaOps.Feedser.Source.Osv/OsvDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Osv/OsvDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Osv.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Osv.Configuration; -namespace StellaOps.Feedser.Source.Osv; +namespace StellaOps.Concelier.Source.Osv; public sealed class OsvDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:osv"; + private const string ConfigurationSection = "concelier:sources:osv"; private const string FetchCron = "0,20,40 * * * *"; private const string ParseCron = "5,25,45 * * * *"; private const string MapCron = "10,30,50 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Osv/OsvServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Osv/OsvServiceCollectionExtensions.cs similarity index 82% rename from src/StellaOps.Feedser.Source.Osv/OsvServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Osv/OsvServiceCollectionExtensions.cs index 34740db5..90490375 100644 --- a/src/StellaOps.Feedser.Source.Osv/OsvServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Osv/OsvServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Osv.Configuration; -using StellaOps.Feedser.Source.Osv.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Osv.Configuration; +using StellaOps.Concelier.Source.Osv.Internal; -namespace StellaOps.Feedser.Source.Osv; +namespace StellaOps.Concelier.Source.Osv; public static class OsvServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class OsvServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = options.BaseUri; clientOptions.Timeout = options.HttpTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.OSV/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.OSV/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseUri.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/zip"; diff --git a/src/StellaOps.Feedser.Source.Osv/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Osv/Properties/AssemblyInfo.cs similarity index 100% rename from src/StellaOps.Feedser.Source.Osv/Properties/AssemblyInfo.cs rename to src/StellaOps.Concelier.Source.Osv/Properties/AssemblyInfo.cs diff --git a/src/StellaOps.Concelier.Source.Osv/StellaOps.Concelier.Source.Osv.csproj b/src/StellaOps.Concelier.Source.Osv/StellaOps.Concelier.Source.Osv.csproj new file mode 100644 index 00000000..d0d8ec80 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Osv/StellaOps.Concelier.Source.Osv.csproj @@ -0,0 +1,23 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + <_Parameter1>StellaOps.Concelier.Tests + + + <_Parameter1>StellaOps.Concelier.Source.Osv.Tests + + + diff --git a/src/StellaOps.Feedser.Source.Osv/TASKS.md b/src/StellaOps.Concelier.Source.Osv/TASKS.md similarity index 90% rename from src/StellaOps.Feedser.Source.Osv/TASKS.md rename to src/StellaOps.Concelier.Source.Osv/TASKS.md index 1d35c28a..05b67d91 100644 --- a/src/StellaOps.Feedser.Source.Osv/TASKS.md +++ b/src/StellaOps.Concelier.Source.Osv/TASKS.md @@ -14,7 +14,7 @@ |FEEDCONN-OSV-02-004 OSV references & credits alignment|BE-Conn-OSV|Models `FEEDMODELS-SCHEMA-01-002`|**DONE (2025-10-11)** – Mapper normalizes references with provenance masks, emits advisory credits, and regression fixtures/assertions cover the new fields.| |FEEDCONN-OSV-02-005 Fixture updater workflow|BE-Conn-OSV, QA|Docs|**DONE (2025-10-12)** – Canonical PURL derivation now covers Go + scoped npm advisories without upstream `purl`; legacy invalid npm names still fall back to `ecosystem:name`. OSV/GHSA/NVD suites and normalization/storage tests rerun clean.| |FEEDCONN-OSV-02-003 Normalized versions rollout|BE-Conn-OSV|Models `FEEDMODELS-SCHEMA-01-003`, Normalization playbook|**DONE (2025-10-11)** – `OsvMapper` now emits SemVer primitives + normalized rules with `osv:{ecosystem}:{advisoryId}:{identifier}` notes; npm/PyPI/Parity fixtures refreshed; merge coordination pinged (OSV handoff).| -|FEEDCONN-OSV-04-003 Parity fixture refresh|QA, BE-Conn-OSV|Normalized versions rollout, GHSA parity tests|**DONE (2025-10-12)** – Parity fixtures include normalizedVersions notes (`osv:::`); regression math rerun via `dotnet test src/StellaOps.Feedser.Source.Osv.Tests` and docs flagged for workflow sync.| -|FEEDCONN-OSV-04-002 Conflict regression fixtures|BE-Conn-OSV, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Added `conflict-osv.canonical.json` + regression asserting SemVer range + CVSS medium severity; dataset matches GHSA/NVD fixtures for merge tests. Validation: `dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj --filter OsvConflictFixtureTests`.| +|FEEDCONN-OSV-04-003 Parity fixture refresh|QA, BE-Conn-OSV|Normalized versions rollout, GHSA parity tests|**DONE (2025-10-12)** – Parity fixtures include normalizedVersions notes (`osv:::`); regression math rerun via `dotnet test src/StellaOps.Concelier.Source.Osv.Tests` and docs flagged for workflow sync.| +|FEEDCONN-OSV-04-002 Conflict regression fixtures|BE-Conn-OSV, QA|Merge `FEEDMERGE-ENGINE-04-001`|**DONE (2025-10-12)** – Added `conflict-osv.canonical.json` + regression asserting SemVer range + CVSS medium severity; dataset matches GHSA/NVD fixtures for merge tests. Validation: `dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj --filter OsvConflictFixtureTests`.| |FEEDCONN-OSV-04-004 Description/CWE/metric parity rollout|BE-Conn-OSV|Models, Core|**DONE (2025-10-15)** – OSV mapper writes advisory descriptions, `database_specific.cwe_ids` weaknesses, and canonical CVSS metric id. Parity fixtures (`osv-ghsa.*`, `osv-npm.snapshot.json`, `osv-pypi.snapshot.json`) refreshed and status communicated to Merge coordination.| -|FEEDCONN-OSV-04-005 Canonical metric fallbacks & CWE notes|BE-Conn-OSV|Models, Merge|**DONE (2025-10-16)** – Add fallback logic and metrics for advisories lacking CVSS vectors, enrich CWE provenance notes, and document merge/export expectations; refresh parity fixtures accordingly.
2025-10-16: Mapper now emits `osv:severity/` canonical ids for severity-only advisories, weakness provenance carries `database_specific.cwe_ids`, diagnostics expose `osv.map.canonical_metric_fallbacks`, parity fixtures regenerated, and ops notes added in `docs/ops/feedser-osv-operations.md`. Tests: `dotnet test src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj`.| +|FEEDCONN-OSV-04-005 Canonical metric fallbacks & CWE notes|BE-Conn-OSV|Models, Merge|**DONE (2025-10-16)** – Add fallback logic and metrics for advisories lacking CVSS vectors, enrich CWE provenance notes, and document merge/export expectations; refresh parity fixtures accordingly.
2025-10-16: Mapper now emits `osv:severity/` canonical ids for severity-only advisories, weakness provenance carries `database_specific.cwe_ids`, diagnostics expose `osv.map.canonical_metric_fallbacks`, parity fixtures regenerated, and ops notes added in `docs/ops/concelier-osv-operations.md`. Tests: `dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj`.| diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/export-sample.xml b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/export-sample.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/export-sample.xml rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/export-sample.xml diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-documents.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-documents.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-documents.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-documents.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-dtos.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-dtos.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-dtos.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-dtos.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json similarity index 77% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json index b9882642..aa6f9c3b 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json +++ b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-requests.snapshot.json @@ -3,7 +3,7 @@ "headers": { "accept": "application/zip,application/octet-stream,application/x-zip-compressed", "accept-Language": "ru-RU,ru; q=0.9,en-US; q=0.6,en; q=0.4", - "user-Agent": "StellaOps/Feedser,(+https://stella-ops.org)" + "user-Agent": "StellaOps/Concelier,(+https://stella-ops.org)" }, "method": "GET", "uri": "https://bdu.fstec.ru/files/documents/vulxml.zip" diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-state.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-state.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-state.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures/ru-bdu-state.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs index 618bf863..b3fc0753 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduConnectorSnapshotTests.cs @@ -16,20 +16,20 @@ using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Ru.Bdu; -using StellaOps.Feedser.Source.Ru.Bdu.Configuration; -using StellaOps.Feedser.Source.Ru.Bdu.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Ru.Bdu; +using StellaOps.Concelier.Source.Ru.Bdu.Configuration; +using StellaOps.Concelier.Source.Ru.Bdu.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; using Xunit.Sdk; -namespace StellaOps.Feedser.Source.Ru.Bdu.Tests; +namespace StellaOps.Concelier.Source.Ru.Bdu.Tests; [Collection("mongo-fixture")] public sealed class RuBduConnectorSnapshotTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduMapperTests.cs b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduMapperTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduMapperTests.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduMapperTests.cs index d10ae342..9343bdb1 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduMapperTests.cs @@ -1,12 +1,12 @@ using System.Collections.Immutable; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Ru.Bdu.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Ru.Bdu.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; using Xunit; -namespace StellaOps.Feedser.Source.Ru.Bdu.Tests; +namespace StellaOps.Concelier.Source.Ru.Bdu.Tests; public sealed class RuBduMapperTests { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs index 903ef628..d02dad95 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/RuBduXmlParserTests.cs @@ -1,9 +1,9 @@ using System.IO; using System.Xml.Linq; -using StellaOps.Feedser.Source.Ru.Bdu.Internal; +using StellaOps.Concelier.Source.Ru.Bdu.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ru.Bdu.Tests; +namespace StellaOps.Concelier.Source.Ru.Bdu.Tests; public sealed class RuBduXmlParserTests { diff --git a/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/StellaOps.Concelier.Source.Ru.Bdu.Tests.csproj b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/StellaOps.Concelier.Source.Ru.Bdu.Tests.csproj new file mode 100644 index 00000000..ff2d01bd --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Bdu.Tests/StellaOps.Concelier.Source.Ru.Bdu.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/AGENTS.md b/src/StellaOps.Concelier.Source.Ru.Bdu/AGENTS.md similarity index 88% rename from src/StellaOps.Feedser.Source.Ru.Bdu/AGENTS.md rename to src/StellaOps.Concelier.Source.Ru.Bdu/AGENTS.md index 17a9d357..6a68d795 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/AGENTS.md @@ -12,8 +12,8 @@ Implement the Russian BDU (Vulnerability Database) connector to ingest advisorie ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores + source state). -- `Feedser.Models` (canonical data structures). -- `Feedser.Testing` (integration harness, snapshot utilities). +- `Concelier.Models` (canonical data structures). +- `Concelier.Testing` (integration harness, snapshot utilities). ## Interfaces & Contracts - Job kinds: `bdu:fetch`, `bdu:parse`, `bdu:map`. @@ -33,6 +33,6 @@ Out of scope: - Respect upstream rate limits and mark failures with backoff. ## Tests -- Add `StellaOps.Feedser.Source.Ru.Bdu.Tests` covering fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.Ru.Bdu.Tests` covering fetch/parse/map with canned fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Configuration/RuBduOptions.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Configuration/RuBduOptions.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Configuration/RuBduOptions.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Configuration/RuBduOptions.cs index 6c93d189..2a278527 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Configuration/RuBduOptions.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Configuration/RuBduOptions.cs @@ -1,6 +1,6 @@ using System.Net; -namespace StellaOps.Feedser.Source.Ru.Bdu.Configuration; +namespace StellaOps.Concelier.Source.Ru.Bdu.Configuration; /// /// Connector options for the Russian BDU archive ingestion pipeline. @@ -35,7 +35,7 @@ public sealed class RuBduOptions /// /// User-Agent header used for outbound requests. /// - public string UserAgent { get; set; } = "StellaOps/Feedser (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps/Concelier (+https://stella-ops.org)"; /// /// Accept-Language preference sent with outbound requests. diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduCursor.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduCursor.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduCursor.cs index fea10cb8..8dfb6df5 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduCursor.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduCursor.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Ru.Bdu.Internal; +namespace StellaOps.Concelier.Source.Ru.Bdu.Internal; internal sealed record RuBduCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs index c39d8963..67fb0320 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduDiagnostics.cs @@ -1,15 +1,15 @@ using System; using System.Diagnostics.Metrics; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Source.Ru.Bdu.Internal; +namespace StellaOps.Concelier.Source.Ru.Bdu.Internal; /// /// Emits RU-BDU specific OpenTelemetry metrics for fetch/parse/map stages. /// public sealed class RuBduDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Ru.Bdu"; + private const string MeterName = "StellaOps.Concelier.Source.Ru.Bdu"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduMapper.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduMapper.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduMapper.cs index eacb61c8..b2f0780e 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduMapper.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduMapper.cs @@ -4,11 +4,11 @@ using System.Collections.Immutable; using System.Globalization; using System.Linq; using System.Text; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Ru.Bdu.Internal; +namespace StellaOps.Concelier.Source.Ru.Bdu.Internal; internal static class RuBduMapper { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs index 104ab1c4..59a76820 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduVulnerabilityDto.cs @@ -1,7 +1,7 @@ using System.Collections.Immutable; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Ru.Bdu.Internal; +namespace StellaOps.Concelier.Source.Ru.Bdu.Internal; internal sealed record RuBduVulnerabilityDto( string Identifier, diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduXmlParser.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduXmlParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduXmlParser.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduXmlParser.cs index 424b1185..7d53368a 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Internal/RuBduXmlParser.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Internal/RuBduXmlParser.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Globalization; using System.Xml.Linq; -namespace StellaOps.Feedser.Source.Ru.Bdu.Internal; +namespace StellaOps.Concelier.Source.Ru.Bdu.Internal; internal static class RuBduXmlParser { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Jobs.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ru.Bdu/Jobs.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/Jobs.cs index 934b2155..c6ad2556 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Jobs.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Ru.Bdu; +namespace StellaOps.Concelier.Source.Ru.Bdu; internal static class RuBduJobKinds { diff --git a/src/StellaOps.Concelier.Source.Ru.Bdu/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..051f6563 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Ru.Bdu.Tests")] diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/README.md b/src/StellaOps.Concelier.Source.Ru.Bdu/README.md similarity index 81% rename from src/StellaOps.Feedser.Source.Ru.Bdu/README.md rename to src/StellaOps.Concelier.Source.Ru.Bdu/README.md index 2edf64b6..29c53fa1 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/README.md +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/README.md @@ -6,7 +6,7 @@ - **TLS trust**: the endpoint presents certificates chained to the Russian Trusted Root/Sub CAs. Bundle the official PEMs inside the deployment (`certificates/russian_trusted_root_ca.pem`, `certificates/russian_trusted_sub_ca.pem`, or the combined `certificates/russian_trusted_bundle.pem`) and point the connector at them, e.g.: ```yaml - feedser: + concelier: httpClients: source.bdu: trustedRootPaths: @@ -15,13 +15,13 @@ timeout: 00:02:00 ``` -- **Offline Kit**: copy the PEM bundle above into the Offline Kit artefacts and set `feedser:offline:root` (or `FEEDSER_OFFLINE_ROOT`) so air‑gapped installs can resolve relative certificate paths. Package the most recent `vulxml.zip` alongside cached exports when preparing air-gap refreshes. +- **Offline Kit**: copy the PEM bundle above into the Offline Kit artefacts and set `concelier:offline:root` (or `CONCELIER_OFFLINE_ROOT`) so air‑gapped installs can resolve relative certificate paths. Package the most recent `vulxml.zip` alongside cached exports when preparing air-gap refreshes. The connector keeps a local cache (`cache/ru-bdu/vulxml.zip`) so transient fetch failures can fall back to the last successful archive without blocking the cursor. ## Telemetry -The connector publishes an OpenTelemetry meter named `StellaOps.Feedser.Source.Ru.Bdu`. Instruments include: +The connector publishes an OpenTelemetry meter named `StellaOps.Concelier.Source.Ru.Bdu`. Instruments include: - `ru.bdu.fetch.*` – `attempts`, `success`, `failures`, `not_modified`, `cache_fallbacks`, and histogram `ru.bdu.fetch.documents`. - `ru.bdu.parse.*` – counters for success/failures plus histograms tracking vulnerable software, external identifiers, and source reference counts per DTO. @@ -31,10 +31,10 @@ Use these metrics to alert on repeated cache fallbacks, sustained parse failures ## Regression fixtures -Deterministic fixtures live under `src/StellaOps.Feedser.Source.Ru.Bdu.Tests/Fixtures`. Run +Deterministic fixtures live under `src/StellaOps.Concelier.Source.Ru.Bdu.Tests/Fixtures`. Run ```bash -dotnet test src/StellaOps.Feedser.Source.Ru.Bdu.Tests +dotnet test src/StellaOps.Concelier.Source.Ru.Bdu.Tests ``` to execute the RU BDU snapshot suite, and set `UPDATE_BDU_FIXTURES=1` to refresh stored snapshots when ingest logic changes. The harness records the fetch requests, documents, DTOs, advisories, and state cursor to guarantee reproducible pipelines across machines. diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnector.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnector.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnector.cs index ba709d13..4bbc2166 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnector.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnector.cs @@ -11,18 +11,18 @@ using System.Xml.Linq; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Ru.Bdu.Configuration; -using StellaOps.Feedser.Source.Ru.Bdu.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Ru.Bdu.Configuration; +using StellaOps.Concelier.Source.Ru.Bdu.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ru.Bdu; +namespace StellaOps.Concelier.Source.Ru.Bdu; public sealed class RuBduConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnectorPlugin.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnectorPlugin.cs index 1b38a5f7..346facce 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ru.Bdu; +namespace StellaOps.Concelier.Source.Ru.Bdu; public sealed class RuBduConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs index 1d914e32..e8d85c78 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduDependencyInjectionRoutine.cs @@ -1,14 +1,14 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Ru.Bdu.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Ru.Bdu.Configuration; -namespace StellaOps.Feedser.Source.Ru.Bdu; +namespace StellaOps.Concelier.Source.Ru.Bdu; public sealed class RuBduDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ru-bdu"; + private const string ConfigurationSection = "concelier:sources:ru-bdu"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs index c35b843c..2afafa3e 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/RuBduServiceCollectionExtensions.cs @@ -1,11 +1,11 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ru.Bdu.Configuration; -using StellaOps.Feedser.Source.Ru.Bdu.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ru.Bdu.Configuration; +using StellaOps.Concelier.Source.Ru.Bdu.Internal; -namespace StellaOps.Feedser.Source.Ru.Bdu; +namespace StellaOps.Concelier.Source.Ru.Bdu; public static class RuBduServiceCollectionExtensions { diff --git a/src/StellaOps.Concelier.Source.Ru.Bdu/StellaOps.Concelier.Source.Ru.Bdu.csproj b/src/StellaOps.Concelier.Source.Ru.Bdu/StellaOps.Concelier.Source.Ru.Bdu.csproj new file mode 100644 index 00000000..f89c8e1c --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/StellaOps.Concelier.Source.Ru.Bdu.csproj @@ -0,0 +1,18 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/TASKS.md b/src/StellaOps.Concelier.Source.Ru.Bdu/TASKS.md similarity index 84% rename from src/StellaOps.Feedser.Source.Ru.Bdu/TASKS.md rename to src/StellaOps.Concelier.Source.Ru.Bdu/TASKS.md index 36119b42..84c664eb 100644 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/TASKS.md +++ b/src/StellaOps.Concelier.Source.Ru.Bdu/TASKS.md @@ -1,11 +1,11 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-RUBDU-02-001 Identify BDU data source & schema|BE-Conn-BDU|Research|**DONE (2025-10-11)** – Candidate endpoints (`https://bdu.fstec.ru/component/rsform/form/7-bdu?format=xml`, `...?format=json`) return 403/404 even with `--insecure` because TLS chain requires Russian Trusted Sub CA and WAF expects referer/session headers. Documented request/response samples in `docs/feedser-connector-research-20251011.md`; blocked until trusted root + access strategy from Ops.| +|FEEDCONN-RUBDU-02-001 Identify BDU data source & schema|BE-Conn-BDU|Research|**DONE (2025-10-11)** – Candidate endpoints (`https://bdu.fstec.ru/component/rsform/form/7-bdu?format=xml`, `...?format=json`) return 403/404 even with `--insecure` because TLS chain requires Russian Trusted Sub CA and WAF expects referer/session headers. Documented request/response samples in `docs/concelier-connector-research-20251011.md`; blocked until trusted root + access strategy from Ops.| |FEEDCONN-RUBDU-02-002 Fetch pipeline & cursor handling|BE-Conn-BDU|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – Connector streams `vulxml.zip` through cached fetches, persists JSON payloads via `RawDocumentStorage`, and tracks cursor pending sets. Added cache fallback + deterministic SHA logging and state updates tied to `TimeProvider`.| |FEEDCONN-RUBDU-02-003 DTO/parser implementation|BE-Conn-BDU|Source.Common|**DONE (2025-10-14)** – `RuBduXmlParser` now captures identifiers, source links, CVSS 2/3 metrics, CWE arrays, and environment/software metadata with coverage for multi-entry fixtures.| |FEEDCONN-RUBDU-02-004 Canonical mapping & range primitives|BE-Conn-BDU|Models|**DONE (2025-10-14)** – `RuBduMapper` emits vendor/ICS packages with normalized `ru-bdu.raw` rules, dual status provenance, alias/reference hydration (CVE, external, source), and CVSS severity normalisation.| |FEEDCONN-RUBDU-02-005 Deterministic fixtures & regression tests|QA|Testing|**DONE (2025-10-14)** – Added connector harness snapshot suite with canned archive, state/documents/dtos/advisories snapshots under `Fixtures/`, gated by `UPDATE_BDU_FIXTURES`.| |FEEDCONN-RUBDU-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-14)** – Introduced `RuBduDiagnostics` meter (fetch/parse/map counters & histograms) and authored connector README covering configuration, trusted roots, telemetry, and offline behaviour.| -|FEEDCONN-RUBDU-02-007 Access & export options assessment|BE-Conn-BDU|Research|**DONE (2025-10-14)** – Documented archive access constraints, offline mirroring expectations, and export packaging in `src/StellaOps.Feedser.Source.Ru.Bdu/README.md` + flagged Offline Kit bundling requirements.| -|FEEDCONN-RUBDU-02-008 Trusted root onboarding plan|BE-Conn-BDU|Source.Common|**DONE (2025-10-14)** – Validated Russian Trusted Root/Sub CA bundle wiring (`certificates/russian_trusted_bundle.pem`), updated Offline Kit guidance, and surfaced `feedser:httpClients:source.bdu:trustedRootPaths` sample configuration.| +|FEEDCONN-RUBDU-02-007 Access & export options assessment|BE-Conn-BDU|Research|**DONE (2025-10-14)** – Documented archive access constraints, offline mirroring expectations, and export packaging in `src/StellaOps.Concelier.Source.Ru.Bdu/README.md` + flagged Offline Kit bundling requirements.| +|FEEDCONN-RUBDU-02-008 Trusted root onboarding plan|BE-Conn-BDU|Source.Common|**DONE (2025-10-14)** – Validated Russian Trusted Root/Sub CA bundle wiring (`certificates/russian_trusted_bundle.pem`), updated Offline Kit guidance, and surfaced `concelier:httpClients:source.bdu:trustedRootPaths` sample configuration.| diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/bulletin-legacy.json.zip b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/bulletin-legacy.json.zip similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/bulletin-legacy.json.zip rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/bulletin-legacy.json.zip diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/bulletin-sample.json.zip b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/bulletin-sample.json.zip similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/bulletin-sample.json.zip rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/bulletin-sample.json.zip diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/listing-page2.html b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/listing-page2.html similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/listing-page2.html rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/listing-page2.html diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/listing.html b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/listing.html similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/listing.html rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/listing.html diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/nkcki-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/nkcki-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/Fixtures/nkcki-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/Fixtures/nkcki-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs index d4d4eae2..3ddee660 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiConnectorTests.cs @@ -14,20 +14,20 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Ru.Nkcki; -using StellaOps.Feedser.Source.Ru.Nkcki.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Testing; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Ru.Nkcki; +using StellaOps.Concelier.Source.Ru.Nkcki.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Testing; +using StellaOps.Concelier.Models; using MongoDB.Driver; using Xunit; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Tests; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Tests; [Collection("mongo-fixture")] public sealed class RuNkckiConnectorTests : IAsyncLifetime @@ -272,7 +272,7 @@ public sealed class RuNkckiConnectorTests : IAsyncLifetime var current = AppContext.BaseDirectory; while (!string.IsNullOrEmpty(current)) { - var candidate = Path.Combine(current, "StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj"); + var candidate = Path.Combine(current, "StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj"); if (File.Exists(candidate)) { return current; diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs index 1f9f18cb..d81f6c5c 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiJsonParserTests.cs @@ -1,8 +1,8 @@ using System.Text.Json; -using StellaOps.Feedser.Source.Ru.Nkcki.Internal; +using StellaOps.Concelier.Source.Ru.Nkcki.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Tests; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Tests; public sealed class RuNkckiJsonParserTests { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs index acb44e79..389e3080 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/RuNkckiMapperTests.cs @@ -1,13 +1,13 @@ using System.Collections.Immutable; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Ru.Nkcki.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Ru.Nkcki.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; using Xunit; using System.Reflection; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Tests; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Tests; public sealed class RuNkckiMapperTests { diff --git a/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj new file mode 100644 index 00000000..b9c786ac --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki.Tests/StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/AGENTS.md b/src/StellaOps.Concelier.Source.Ru.Nkcki/AGENTS.md similarity index 83% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/AGENTS.md rename to src/StellaOps.Concelier.Source.Ru.Nkcki/AGENTS.md index 00b65152..a6d6ad40 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Implement the Russian NKTsKI (formerly NKCKI) advisories connector to ingest NKTsKI vulnerability bulletins for Feedser’s regional coverage. +Implement the Russian NKTsKI (formerly NKCKI) advisories connector to ingest NKTsKI vulnerability bulletins for Concelier’s regional coverage. ## Scope - Identify NKTsKI advisory feeds/APIs (HTML, RSS, CSV) and access/authentication requirements. @@ -12,8 +12,8 @@ Implement the Russian NKTsKI (formerly NKCKI) advisories connector to ingest NKT ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores, source state). -- `Feedser.Models` (canonical data structures). -- `Feedser.Testing` (integration fixtures, snapshots). +- `Concelier.Models` (canonical data structures). +- `Concelier.Testing` (integration fixtures, snapshots). ## Interfaces & Contracts - Job kinds: `nkcki:fetch`, `nkcki:parse`, `nkcki:map`. @@ -33,6 +33,6 @@ Out of scope: - Respect upstream rate limiting/politeness. ## Tests -- Add `StellaOps.Feedser.Source.Ru.Nkcki.Tests` for fetch/parse/map with canned fixtures. +- Add `StellaOps.Concelier.Source.Ru.Nkcki.Tests` for fetch/parse/map with canned fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs index cf3a1f66..0a1adde8 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Configuration/RuNkckiOptions.cs @@ -1,6 +1,6 @@ using System.Net; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Configuration; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Configuration; /// /// Connector options for the Russian NKTsKI bulletin ingestion pipeline. @@ -63,7 +63,7 @@ public sealed class RuNkckiOptions /// public TimeSpan ListingCacheDuration { get; set; } = DefaultListingCache; - public string UserAgent { get; set; } = "StellaOps/Feedser (+https://stella-ops.org)"; + public string UserAgent { get; set; } = "StellaOps/Concelier (+https://stella-ops.org)"; public string AcceptLanguage { get; set; } = "ru-RU,ru;q=0.9,en-US;q=0.6,en;q=0.4"; diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs index 98714af8..1cffddcf 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiCursor.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Internal; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Internal; internal sealed record RuNkckiCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs index 9c4fa9ba..95c83efb 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiDiagnostics.cs @@ -2,14 +2,14 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Internal; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Internal; /// /// Emits telemetry counters for the NKCKI connector lifecycle. /// public sealed class RuNkckiDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Ru.Nkcki"; + private const string MeterName = "StellaOps.Concelier.Source.Ru.Nkcki"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs index aa706f83..fe1eec36 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiJsonParser.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text.Json; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Internal; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Internal; internal static class RuNkckiJsonParser { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs index 51a57b85..a15527e5 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiMapper.cs @@ -2,12 +2,12 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Normalization.Cvss; -using StellaOps.Feedser.Normalization.SemVer; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Normalization.Cvss; +using StellaOps.Concelier.Normalization.SemVer; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Internal; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Internal; internal static class RuNkckiMapper { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs index a4e006f1..a8499164 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Internal/RuNkckiVulnerabilityDto.cs @@ -1,7 +1,7 @@ using System.Collections.Immutable; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Ru.Nkcki.Internal; +namespace StellaOps.Concelier.Source.Ru.Nkcki.Internal; internal sealed record RuNkckiVulnerabilityDto( string? FstecId, diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Jobs.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/Jobs.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/Jobs.cs index 283c711a..56eeb7b8 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Jobs.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Ru.Nkcki; +namespace StellaOps.Concelier.Source.Ru.Nkcki; internal static class RuNkckiJobKinds { diff --git a/src/StellaOps.Concelier.Source.Ru.Nkcki/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c95a01fe --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Ru.Nkcki.Tests")] diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnector.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnector.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnector.cs index 21be40c6..30660a34 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnector.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnector.cs @@ -12,17 +12,17 @@ using AngleSharp.Html.Parser; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Ru.Nkcki.Configuration; -using StellaOps.Feedser.Source.Ru.Nkcki.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Ru.Nkcki.Configuration; +using StellaOps.Concelier.Source.Ru.Nkcki.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ru.Nkcki; +namespace StellaOps.Concelier.Source.Ru.Nkcki; public sealed class RuNkckiConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs index 525f7d4e..f7a3a7fb 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiConnectorPlugin.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Ru.Nkcki; +namespace StellaOps.Concelier.Source.Ru.Nkcki; public sealed class RuNkckiConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs index c198e204..f3f641ab 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiDependencyInjectionRoutine.cs @@ -1,14 +1,14 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Ru.Nkcki.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Ru.Nkcki.Configuration; -namespace StellaOps.Feedser.Source.Ru.Nkcki; +namespace StellaOps.Concelier.Source.Ru.Nkcki; public sealed class RuNkckiDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:ru-nkcki"; + private const string ConfigurationSection = "concelier:sources:ru-nkcki"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs index 4c7d58d8..f45530c9 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/RuNkckiServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Ru.Nkcki.Configuration; -using StellaOps.Feedser.Source.Ru.Nkcki.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Ru.Nkcki.Configuration; +using StellaOps.Concelier.Source.Ru.Nkcki.Internal; -namespace StellaOps.Feedser.Source.Ru.Nkcki; +namespace StellaOps.Concelier.Source.Ru.Nkcki; public static class RuNkckiServiceCollectionExtensions { diff --git a/src/StellaOps.Concelier.Source.Ru.Nkcki/StellaOps.Concelier.Source.Ru.Nkcki.csproj b/src/StellaOps.Concelier.Source.Ru.Nkcki/StellaOps.Concelier.Source.Ru.Nkcki.csproj new file mode 100644 index 00000000..fafc198f --- /dev/null +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/StellaOps.Concelier.Source.Ru.Nkcki.csproj @@ -0,0 +1,22 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md b/src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md similarity index 88% rename from src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md rename to src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md index 976bd795..f37eb679 100644 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/TASKS.md +++ b/src/StellaOps.Concelier.Source.Ru.Nkcki/TASKS.md @@ -1,11 +1,11 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-NKCKI-02-001 Research NKTsKI advisory feeds|BE-Conn-Nkcki|Research|**DONE (2025-10-11)** – Candidate RSS locations (`https://cert.gov.ru/rss/advisories.xml`, `https://www.cert.gov.ru/...`) return 403/404 even with `Accept-Language: ru-RU` and `--insecure`; site is Bitrix-backed and expects Russian Trusted Sub CA plus session cookies. Logged packet captures + needed cert list in `docs/feedser-connector-research-20251011.md`; waiting on Ops for sanctioned trust bundle.| +|FEEDCONN-NKCKI-02-001 Research NKTsKI advisory feeds|BE-Conn-Nkcki|Research|**DONE (2025-10-11)** – Candidate RSS locations (`https://cert.gov.ru/rss/advisories.xml`, `https://www.cert.gov.ru/...`) return 403/404 even with `Accept-Language: ru-RU` and `--insecure`; site is Bitrix-backed and expects Russian Trusted Sub CA plus session cookies. Logged packet captures + needed cert list in `docs/concelier-connector-research-20251011.md`; waiting on Ops for sanctioned trust bundle.| |FEEDCONN-NKCKI-02-002 Fetch pipeline & state persistence|BE-Conn-Nkcki|Source.Common, Storage.Mongo|**DONE (2025-10-13)** – Listing fetch now honours `maxListingPagesPerFetch`, persists cache hits when listing access fails, and records telemetry via `RuNkckiDiagnostics`. Cursor tracking covers pending documents/mappings and the known bulletin ring buffer.| |FEEDCONN-NKCKI-02-003 DTO & parser implementation|BE-Conn-Nkcki|Source.Common|**DONE (2025-10-13)** – Parser normalises nested arrays (ICS categories, vulnerable software lists, optional tags), flattens multiline `software_text`, and guarantees deterministic ordering for URLs and tags.| |FEEDCONN-NKCKI-02-004 Canonical mapping & range primitives|BE-Conn-Nkcki|Models|**DONE (2025-10-13)** – Mapper splits structured software entries, emits SemVer range primitives + normalized rules, deduplicates references, and surfaces CVSS v4 metadata alongside existing metrics.| |FEEDCONN-NKCKI-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-13)** – Fixtures refreshed with multi-page pagination + multi-entry bulletins. Tests exercise cache replay and rely on bundled OpenSSL 1.1 libs in `tools/openssl/linux-x64` to keep Mongo2Go green on modern distros.| -|FEEDCONN-NKCKI-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-13)** – Added connector-specific metrics (`nkcki.*`) and documented configuration/operational guidance in `docs/ops/feedser-nkcki-operations.md`.| -|FEEDCONN-NKCKI-02-007 Archive ingestion strategy|BE-Conn-Nkcki|Research|**DONE (2025-10-13)** – Documented Bitrix pagination/backfill plan (cache-first, offline replay, HTML/PDF capture) in `docs/ops/feedser-nkcki-operations.md`.| -|FEEDCONN-NKCKI-02-008 Access enablement plan|BE-Conn-Nkcki|Source.Common|**DONE (2025-10-11)** – Documented trust-store requirement, optional SOCKS proxy fallback, and monitoring plan; shared TLS support now available via `SourceHttpClientOptions.TrustedRootCertificates` (`feedser:httpClients:source.nkcki:*`), awaiting Ops-sourced cert bundle before fetch implementation.| +|FEEDCONN-NKCKI-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-13)** – Added connector-specific metrics (`nkcki.*`) and documented configuration/operational guidance in `docs/ops/concelier-nkcki-operations.md`.| +|FEEDCONN-NKCKI-02-007 Archive ingestion strategy|BE-Conn-Nkcki|Research|**DONE (2025-10-13)** – Documented Bitrix pagination/backfill plan (cache-first, offline replay, HTML/PDF capture) in `docs/ops/concelier-nkcki-operations.md`.| +|FEEDCONN-NKCKI-02-008 Access enablement plan|BE-Conn-Nkcki|Source.Common|**DONE (2025-10-11)** – Documented trust-store requirement, optional SOCKS proxy fallback, and monitoring plan; shared TLS support now available via `SourceHttpClientOptions.TrustedRootCertificates` (`concelier:httpClients:source.nkcki:*`), awaiting Ops-sourced cert bundle before fetch implementation.| diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs index d3f798b1..249ce9e2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/AdobeConnectorFetchTests.cs @@ -16,20 +16,20 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Vndr.Adobe; -using StellaOps.Feedser.Source.Vndr.Adobe.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Vndr.Adobe; +using StellaOps.Concelier.Source.Vndr.Adobe.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Tests; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Tests; [Collection("mongo-fixture")] public sealed class AdobeConnectorFetchTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-85.html b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-85.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-85.html rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-85.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-87.html b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-87.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-87.html rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-detail-apsb25-87.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-index.html b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-index.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-index.html rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/Adobe/Fixtures/adobe-index.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj similarity index 53% rename from src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj rename to src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj index 2446f91a..21bbb168 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe.Tests/StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe.Tests/StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj @@ -5,10 +5,10 @@ enable - - - - + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Adobe/AGENTS.md similarity index 81% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Adobe/AGENTS.md index 227fc8b1..4025641c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/AGENTS.md @@ -20,9 +20,9 @@ Adobe PSIRT connector ingesting APSB/APA advisories; authoritative for Adobe pro In: PSIRT ingestion, aliases, affected plus fixedBy, psirt_flags, watermark/resume. Out: signing, package artifact downloads, non-Adobe product truth. ## Observability & security expectations -- Metrics: SourceDiagnostics produces `feedser.source.http.*` counters/histograms tagged `feedser.source=adobe`; operators filter on that tag to monitor fetch counts, parse failures, map affected counts, and cursor movement without bespoke metric names. +- Metrics: SourceDiagnostics produces `concelier.source.http.*` counters/histograms tagged `concelier.source=adobe`; operators filter on that tag to monitor fetch counts, parse failures, map affected counts, and cursor movement without bespoke metric names. - Logs: advisory ids, product counts, extraction timings; hosts allowlisted; no secret logging. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Vndr.Adobe.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Vndr.Adobe.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnector.cs index e684a057..4e4cc9f5 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnector.cs @@ -9,21 +9,21 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Json.Schema; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Json; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Source.Vndr.Adobe.Configuration; -using StellaOps.Feedser.Source.Vndr.Adobe.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Json; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Source.Vndr.Adobe.Configuration; +using StellaOps.Concelier.Source.Vndr.Adobe.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Adobe; +namespace StellaOps.Concelier.Source.Vndr.Adobe; public sealed class AdobeConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnectorPlugin.cs index 5f3fe442..b10b8872 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Adobe; +namespace StellaOps.Concelier.Source.Vndr.Adobe; public sealed class VndrAdobeConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeDiagnostics.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeDiagnostics.cs index a6bcdacf..7403f0d0 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeDiagnostics.cs @@ -1,11 +1,11 @@ using System; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Adobe; +namespace StellaOps.Concelier.Source.Vndr.Adobe; public sealed class AdobeDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Vndr.Adobe"; + public const string MeterName = "StellaOps.Concelier.Source.Vndr.Adobe"; private static readonly string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs similarity index 83% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs index 77f3f581..54ef4ffe 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/AdobeServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Adobe.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Adobe.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Adobe; +namespace StellaOps.Concelier.Source.Vndr.Adobe; public static class AdobeServiceCollectionExtensions { @@ -21,7 +21,7 @@ public static class AdobeServiceCollectionExtensions { var adobeOptions = sp.GetRequiredService>().Value; options.BaseAddress = adobeOptions.IndexUri; - options.UserAgent = "StellaOps.Feedser.VndrAdobe/1.0"; + options.UserAgent = "StellaOps.Concelier.VndrAdobe/1.0"; options.Timeout = TimeSpan.FromSeconds(20); options.AllowedHosts.Clear(); options.AllowedHosts.Add(adobeOptions.IndexUri.Host); diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Configuration/AdobeOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Configuration/AdobeOptions.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Configuration/AdobeOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Configuration/AdobeOptions.cs index d92a02ee..b9448ed8 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Configuration/AdobeOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Configuration/AdobeOptions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Configuration; public sealed class AdobeOptions { diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs index 6afd0658..f7024aed 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeBulletinDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal sealed record AdobeBulletinDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeCursor.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeCursor.cs index e24f17ab..16406144 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal sealed record AdobeCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs index fdc83bec..423ecec6 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDetailParser.cs @@ -7,7 +7,7 @@ using AngleSharp.Dom; using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal static class AdobeDetailParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs index 616afe37..38d8af9c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeDocumentMetadata.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal sealed record AdobeDocumentMetadata( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs similarity index 68% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs index baebbff7..9b20da71 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexEntry.cs @@ -1,5 +1,5 @@ using System; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal sealed record AdobeIndexEntry(string AdvisoryId, Uri DetailUri, DateTimeOffset PublishedUtc, string? Title); diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs index 738e1044..be7c37c9 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeIndexParser.cs @@ -6,7 +6,7 @@ using System.Text.RegularExpressions; using AngleSharp.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal static class AdobeIndexParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs index 6f599163..0ef76d3e 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/Internal/AdobeSchemaProvider.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Threading; using Json.Schema; -namespace StellaOps.Feedser.Source.Vndr.Adobe.Internal; +namespace StellaOps.Concelier.Source.Vndr.Adobe.Internal; internal static class AdobeSchemaProvider { @@ -14,7 +14,7 @@ internal static class AdobeSchemaProvider private static JsonSchema Load() { var assembly = typeof(AdobeSchemaProvider).GetTypeInfo().Assembly; - const string resourceName = "StellaOps.Feedser.Source.Vndr.Adobe.Schemas.adobe-bulletin.schema.json"; + const string resourceName = "StellaOps.Concelier.Source.Vndr.Adobe.Schemas.adobe-bulletin.schema.json"; using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new InvalidOperationException($"Embedded schema '{resourceName}' not found."); diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/Schemas/adobe-bulletin.schema.json b/src/StellaOps.Concelier.Source.Vndr.Adobe/Schemas/adobe-bulletin.schema.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/Schemas/adobe-bulletin.schema.json rename to src/StellaOps.Concelier.Source.Vndr.Adobe/Schemas/adobe-bulletin.schema.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/StellaOps.Feedser.Source.Vndr.Adobe.csproj b/src/StellaOps.Concelier.Source.Vndr.Adobe/StellaOps.Concelier.Source.Vndr.Adobe.csproj similarity index 59% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/StellaOps.Feedser.Source.Vndr.Adobe.csproj rename to src/StellaOps.Concelier.Source.Vndr.Adobe/StellaOps.Concelier.Source.Vndr.Adobe.csproj index 5304f8a0..2661a201 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Adobe/StellaOps.Feedser.Source.Vndr.Adobe.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Adobe/StellaOps.Concelier.Source.Vndr.Adobe.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Adobe/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Adobe/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Adobe/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Adobe/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs index fd8b0eb6..c8abac16 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleConnectorTests.cs @@ -8,20 +8,20 @@ using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Source.Vndr.Apple; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Source.Vndr.Apple; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Testing; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Apple.Tests; +namespace StellaOps.Concelier.Source.Vndr.Apple.Tests; [Collection("mongo-fixture")] public sealed class AppleConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs index 87e580ea..44994947 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleFixtureManager.cs @@ -11,9 +11,9 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Source.Vndr.Apple.Internal; +using StellaOps.Concelier.Source.Vndr.Apple.Internal; -namespace StellaOps.Feedser.Source.Vndr.Apple.Tests.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple.Tests.Apple; internal static class AppleFixtureManager { @@ -315,7 +315,7 @@ internal static class AppleFixtureManager var baseDir = AppContext.BaseDirectory; // bin/Debug/net10.0/ -> project -> src -> repo root var root = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); - return Path.Combine(root, "src", "StellaOps.Feedser.Source.Vndr.Apple.Tests", "Apple", "Fixtures"); + return Path.Combine(root, "src", "StellaOps.Concelier.Source.Vndr.Apple.Tests", "Apple", "Fixtures"); } private static string NormalizeLineEndings(string value) diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs index 53026658..e82de7d7 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/AppleLiveRegressionTests.cs @@ -4,11 +4,11 @@ using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; -using StellaOps.Feedser.Source.Vndr.Apple.Internal; -using StellaOps.Feedser.Source.Vndr.Apple.Tests.Apple; +using StellaOps.Concelier.Source.Vndr.Apple.Internal; +using StellaOps.Concelier.Source.Vndr.Apple.Tests.Apple; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Apple.Tests; +namespace StellaOps.Concelier.Source.Vndr.Apple.Tests; public sealed class AppleLiveRegressionTests { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.expected.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.expected.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.expected.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.expected.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.html b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.html rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/106355.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.expected.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.expected.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.expected.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.expected.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.html b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.html rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125326.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.expected.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.expected.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.expected.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.expected.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.html b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.html rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/125328.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/HT214108.expected.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/HT214108.expected.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/HT214108.expected.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/HT214108.expected.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/HT215500.expected.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/HT215500.expected.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/HT215500.expected.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/HT215500.expected.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/ht214108.html b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/ht214108.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/ht214108.html rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/ht214108.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/ht215500.html b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/ht215500.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/ht215500.html rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/ht215500.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/index.json b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/index.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures/index.json rename to src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/index.json diff --git a/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj new file mode 100644 index 00000000..5d103134 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Apple/AGENTS.md similarity index 87% rename from src/StellaOps.Feedser.Source.Vndr.Apple/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Apple/AGENTS.md index 9bb992e0..285e2ced 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/AGENTS.md @@ -12,8 +12,8 @@ Implement the Apple security advisories connector to ingest Apple HT/HT2 securit ## Participants - `Source.Common` (HTTP/fetch utilities, DTO storage). - `Storage.Mongo` (raw/document/DTO/advisory stores, source state). -- `Feedser.Models` (canonical structures + range primitives). -- `Feedser.Testing` (integration fixtures/snapshots). +- `Concelier.Models` (canonical structures + range primitives). +- `Concelier.Testing` (integration fixtures/snapshots). ## Interfaces & Contracts - Job kinds: `apple:fetch`, `apple:parse`, `apple:map`. @@ -34,6 +34,6 @@ Out of scope: - Respect upstream rate limits; record failures with backoff. ## Tests -- Add `StellaOps.Feedser.Source.Vndr.Apple.Tests` covering fetch/parse/map with fixtures. +- Add `StellaOps.Concelier.Source.Vndr.Apple.Tests` covering fetch/parse/map with fixtures. - Snapshot canonical advisories; support fixture regeneration via env flag. - Ensure deterministic ordering/time normalisation. diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Apple/AppleConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/AppleConnector.cs index 01828324..f92b86c2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleConnector.cs @@ -9,17 +9,17 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Apple.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Apple.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; public sealed class AppleConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs index 35924cf6..ec6440d4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleDependencyInjectionRoutine.cs @@ -2,13 +2,13 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; public sealed class AppleDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:apple"; + private const string ConfigurationSection = "concelier:sources:apple"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleOptions.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Apple/AppleOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/AppleOptions.cs index 558188d0..9c6fba0b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleOptions.cs @@ -2,11 +2,11 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; public sealed class AppleOptions : IValidatableObject { - public const string HttpClientName = "feedser-vndr-apple"; + public const string HttpClientName = "concelier-vndr-apple"; /// /// Gets or sets the JSON endpoint that lists software metadata (defaults to Apple Software Lookup Service). diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs index 7807b3f5..bbab2a83 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/AppleServiceCollectionExtensions.cs @@ -2,10 +2,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Apple.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Apple.Internal; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; public static class AppleServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class AppleServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Apple/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Apple/1.0"; clientOptions.AllowedHosts.Clear(); if (options.SoftwareLookupUri is not null) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleCursor.cs index 839b0a44..e55a8e9c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; internal sealed record AppleCursor( DateTimeOffset? LastPosted, diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailDto.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailDto.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailDto.cs index 50bc23a9..028a8dc0 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; internal sealed record AppleDetailDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailParser.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailParser.cs similarity index 99% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailParser.cs index eb44ecd3..e44ab06c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDetailParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDetailParser.cs @@ -6,7 +6,7 @@ using AngleSharp.Dom; using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; internal static class AppleDetailParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDiagnostics.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDiagnostics.cs index caa94508..ec24412b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleDiagnostics.cs @@ -1,11 +1,11 @@ using System; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; public sealed class AppleDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Vndr.Apple"; + public const string MeterName = "StellaOps.Concelier.Source.Vndr.Apple"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleIndexEntry.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleIndexEntry.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleIndexEntry.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleIndexEntry.cs index 387769f1..c005cf19 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleIndexEntry.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleIndexEntry.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; internal sealed record AppleIndexEntry( string UpdateId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleMapper.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleMapper.cs index 240b05bd..9455d3e4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Internal/AppleMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Internal/AppleMapper.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; -namespace StellaOps.Feedser.Source.Vndr.Apple.Internal; +namespace StellaOps.Concelier.Source.Vndr.Apple.Internal; internal static class AppleMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Jobs.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Apple/Jobs.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/Jobs.cs index 92381260..311218fa 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; internal static class AppleJobKinds { diff --git a/src/StellaOps.Concelier.Source.Vndr.Apple/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ac52715e --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Vndr.Apple.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/README.md b/src/StellaOps.Concelier.Source.Vndr.Apple/README.md similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Apple/README.md rename to src/StellaOps.Concelier.Source.Vndr.Apple/README.md index 5a61da3f..c14f1016 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/README.md +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/README.md @@ -40,10 +40,10 @@ Unofficial Apple documentation warns that the Software Lookup Service rate-limit ## Fixture maintenance -Deterministic regression coverage lives in `src/StellaOps.Feedser.Source.Vndr.Apple.Tests/Apple/Fixtures`. When Apple publishes new advisories the fixtures must be refreshed using the provided helper scripts: +Deterministic regression coverage lives in `src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures`. When Apple publishes new advisories the fixtures must be refreshed using the provided helper scripts: - Bash: `./scripts/update-apple-fixtures.sh` - PowerShell: `./scripts/update-apple-fixtures.ps1` -Both scripts set `UPDATE_APPLE_FIXTURES=1`, touch a `.update-apple-fixtures` sentinel so test runs inside WSL propagate the flag, fetch the live HT articles referenced in `AppleFixtureManager`, sanitise the HTML, and rewrite the paired `.expected.json` DTO snapshots. Always inspect the resulting diff and re-run `dotnet test src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj` without the environment variable to ensure deterministic output before committing. +Both scripts set `UPDATE_APPLE_FIXTURES=1`, touch a `.update-apple-fixtures` sentinel so test runs inside WSL propagate the flag, fetch the live HT articles referenced in `AppleFixtureManager`, sanitise the HTML, and rewrite the paired `.expected.json` DTO snapshots. Always inspect the resulting diff and re-run `dotnet test src/StellaOps.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj` without the environment variable to ensure deterministic output before committing. diff --git a/src/StellaOps.Concelier.Source.Vndr.Apple/StellaOps.Concelier.Source.Vndr.Apple.csproj b/src/StellaOps.Concelier.Source.Vndr.Apple/StellaOps.Concelier.Source.Vndr.Apple.csproj new file mode 100644 index 00000000..c34f357b --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/StellaOps.Concelier.Source.Vndr.Apple.csproj @@ -0,0 +1,18 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md index 44002d20..a424a4f2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/TASKS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/TASKS.md @@ -6,6 +6,6 @@ |Parser & DTO implementation|BE-Conn-Apple|Source.Common|**DONE** – AngleSharp detail parser produces canonical DTO payloads (CVE list, timestamps, affected tables) persisted via DTO store.| |Canonical mapping & range primitives|BE-Conn-Apple|Models|**DONE** – Mapper now emits SemVer-derived normalizedVersions with `apple::` notes; fixtures updated to assert canonical rules while we continue tracking multi-device coverage in follow-up tasks.
2025-10-11 research trail: confirmed payload aligns with `[{"scheme":"semver","type":"range","min":"","minInclusive":true,"max":"","maxInclusive":false,"notes":"apple:ios:17.1"}]`; continue using `notes` to surface build identifiers for storage provenance.| |Deterministic fixtures/tests|QA|Testing|**DONE (2025-10-12)** – Parser now scopes references to article content, sorts affected rows deterministically, and regenerated fixtures (125326/125328/106355/HT214108/HT215500) produce stable JSON + sanitizer HTML in English.| -|Telemetry & documentation|DevEx|Docs|**DONE (2025-10-12)** – OpenTelemetry pipeline exports `StellaOps.Feedser.Source.Vndr.Apple`; runbook `docs/ops/feedser-apple-operations.md` added with metrics + monitoring guidance.| +|Telemetry & documentation|DevEx|Docs|**DONE (2025-10-12)** – OpenTelemetry pipeline exports `StellaOps.Concelier.Source.Vndr.Apple`; runbook `docs/ops/concelier-apple-operations.md` added with metrics + monitoring guidance.| |Live HTML regression sweep|QA|Source.Common|**DONE (2025-10-12)** – Captured latest support.apple.com articles for 125326/125328/106355/HT214108/HT215500, trimmed nav noise, and committed sanitized HTML + expected DTOs with invariant timestamps.| |Fixture regeneration tooling|DevEx|Testing|**DONE (2025-10-12)** – `scripts/update-apple-fixtures.(sh|ps1)` set the env flag + sentinel, forward through WSLENV, and clean up after regeneration; README references updated usage.| diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs index afa445f1..3710d477 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Apple/VndrAppleConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Apple; +namespace StellaOps.Concelier.Source.Vndr.Apple; public sealed class VndrAppleConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs index 89fc0504..1a31f8f4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumConnectorTests.cs @@ -10,20 +10,20 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Json; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Vndr.Chromium; -using StellaOps.Feedser.Source.Vndr.Chromium.Configuration; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Json; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Vndr.Chromium; +using StellaOps.Concelier.Source.Vndr.Chromium.Configuration; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Tests; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Tests; [Collection("mongo-fixture")] public sealed class ChromiumConnectorTests : IAsyncLifetime @@ -56,7 +56,7 @@ public sealed class ChromiumConnectorTests : IAsyncLifetime { await connector.ParseAsync(provider, CancellationToken.None); } - catch (StellaOps.Feedser.Source.Common.Json.JsonSchemaValidationException) + catch (StellaOps.Concelier.Source.Common.Json.JsonSchemaValidationException) { // Parsing should flag document as failed even when schema validation rejects payloads. } diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs index ca26fa24..55bd031a 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/ChromiumMapperTests.cs @@ -1,10 +1,10 @@ using System; using System.Linq; -using StellaOps.Feedser.Source.Vndr.Chromium; -using StellaOps.Feedser.Source.Vndr.Chromium.Internal; +using StellaOps.Concelier.Source.Vndr.Chromium; +using StellaOps.Concelier.Source.Vndr.Chromium.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Tests; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Tests; public sealed class ChromiumMapperTests { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-advisory.snapshot.json b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-advisory.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-advisory.snapshot.json rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-advisory.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-detail.html b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-detail.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-detail.html rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-detail.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-feed.xml b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-feed.xml similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-feed.xml rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/Chromium/Fixtures/chromium-feed.xml diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj similarity index 51% rename from src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj rename to src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj index 887bec82..b5ae6a51 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium.Tests/StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium.Tests/StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj @@ -5,10 +5,10 @@ enable - - - - + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Chromium/AGENTS.md similarity index 81% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Chromium/AGENTS.md index a87e00fb..9215ed81 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/AGENTS.md @@ -20,9 +20,9 @@ Chromium/Chrome vendor feed connector parsing Stable Channel Update posts; autho In: vendor advisory mapping, fixed version emission per platform, psirt_flags vendor context. Out: OS distro packaging semantics; bug bounty details beyond references. ## Observability & security expectations -- Metrics: SourceDiagnostics exports the shared `feedser.source.http.*` counters/histograms tagged `feedser.source=chromium`, enabling dashboards to observe fetch volumes, parse failures, and map affected counts via tag filters. +- Metrics: SourceDiagnostics exports the shared `concelier.source.http.*` counters/histograms tagged `concelier.source=chromium`, enabling dashboards to observe fetch volumes, parse failures, and map affected counts via tag filters. - Logs: post slugs, version extracted, platform coverage, timing; allowlist blog host. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Vndr.Chromium.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Vndr.Chromium.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnector.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnector.cs index 2e432fc3..14c27cc6 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnector.cs @@ -6,21 +6,21 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Json; -using StellaOps.Feedser.Source.Vndr.Chromium.Configuration; -using StellaOps.Feedser.Source.Vndr.Chromium.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Json; +using StellaOps.Concelier.Source.Vndr.Chromium.Configuration; +using StellaOps.Concelier.Source.Vndr.Chromium.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; using StellaOps.Plugin; using Json.Schema; -namespace StellaOps.Feedser.Source.Vndr.Chromium; +namespace StellaOps.Concelier.Source.Vndr.Chromium; public sealed class ChromiumConnector : IFeedConnector { @@ -247,7 +247,7 @@ public sealed class ChromiumConnector : IFeedConnector { _schemaValidator.Validate(jsonDocument, Schema, dto.PostId); } - catch (StellaOps.Feedser.Source.Common.Json.JsonSchemaValidationException ex) + catch (StellaOps.Concelier.Source.Common.Json.JsonSchemaValidationException ex) { _logger.LogError(ex, "Chromium schema validation failed for {DocumentId}", document.Id); await _documentStore.UpdateStatusAsync(document.Id, DocumentStatuses.Failed, cancellationToken).ConfigureAwait(false); diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs index 8cb72d05..44b6945b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Chromium; +namespace StellaOps.Concelier.Source.Vndr.Chromium; public sealed class VndrChromiumConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumDiagnostics.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumDiagnostics.cs index cf5c1de6..62606272 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Chromium; +namespace StellaOps.Concelier.Source.Vndr.Chromium; public sealed class ChromiumDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Vndr.Chromium"; + public const string MeterName = "StellaOps.Concelier.Source.Vndr.Chromium"; public const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs index 16f7351d..714d32fb 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/ChromiumServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Chromium.Configuration; -using StellaOps.Feedser.Source.Vndr.Chromium.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Chromium.Configuration; +using StellaOps.Concelier.Source.Vndr.Chromium.Internal; -namespace StellaOps.Feedser.Source.Vndr.Chromium; +namespace StellaOps.Concelier.Source.Vndr.Chromium; public static class ChromiumServiceCollectionExtensions { @@ -24,7 +24,7 @@ public static class ChromiumServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = new Uri(options.FeedUri.GetLeftPart(UriPartial.Authority)); clientOptions.Timeout = TimeSpan.FromSeconds(20); - clientOptions.UserAgent = "StellaOps.Feedser.VndrChromium/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.VndrChromium/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.FeedUri.Host); }); diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs index 08619672..26646982 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Configuration/ChromiumOptions.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Vndr.Chromium.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Configuration; public sealed class ChromiumOptions { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumCursor.cs index 622ae605..4364e7f4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumCursor.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal sealed record ChromiumCursor( DateTimeOffset? LastPublished, diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs index c1c8cd36..b24a48e2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDocumentMetadata.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal sealed record ChromiumDocumentMetadata( string PostId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDto.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDto.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDto.cs index 6dacc7a7..c5533ecb 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumDto.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal sealed record ChromiumDto( [property: JsonPropertyName("postId")] string PostId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs similarity index 89% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs index 81017793..fb9c379e 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedEntry.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; public sealed record ChromiumFeedEntry( string EntryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs index 84888297..407d5e3c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumFeedLoader.cs @@ -2,9 +2,9 @@ using System.ServiceModel.Syndication; using System.Xml; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Vndr.Chromium.Configuration; +using StellaOps.Concelier.Source.Vndr.Chromium.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; public sealed class ChromiumFeedLoader { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumMapper.cs index a534c38d..9d736b66 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumMapper.cs @@ -2,10 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; using System.Globalization; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal static class ChromiumMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumParser.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumParser.cs index cd5f70ec..eea74743 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumParser.cs @@ -2,7 +2,7 @@ using System.Text.RegularExpressions; using AngleSharp.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal static class ChromiumParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs similarity index 78% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs index 33854ffb..9060d632 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Internal/ChromiumSchemaProvider.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Threading; using Json.Schema; -namespace StellaOps.Feedser.Source.Vndr.Chromium.Internal; +namespace StellaOps.Concelier.Source.Vndr.Chromium.Internal; internal static class ChromiumSchemaProvider { @@ -14,7 +14,7 @@ internal static class ChromiumSchemaProvider private static JsonSchema Load() { var assembly = typeof(ChromiumSchemaProvider).GetTypeInfo().Assembly; - const string resourceName = "StellaOps.Feedser.Source.Vndr.Chromium.Schemas.chromium-post.schema.json"; + const string resourceName = "StellaOps.Concelier.Source.Vndr.Chromium.Schemas.chromium-post.schema.json"; using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new InvalidOperationException($"Embedded schema '{resourceName}' not found."); diff --git a/src/StellaOps.Concelier.Source.Vndr.Chromium/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Vndr.Chromium/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8967eba8 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Vndr.Chromium.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Schemas/chromium-post.schema.json b/src/StellaOps.Concelier.Source.Vndr.Chromium/Schemas/chromium-post.schema.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/Schemas/chromium-post.schema.json rename to src/StellaOps.Concelier.Source.Vndr.Chromium/Schemas/chromium-post.schema.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/StellaOps.Feedser.Source.Vndr.Chromium.csproj b/src/StellaOps.Concelier.Source.Vndr.Chromium/StellaOps.Concelier.Source.Vndr.Chromium.csproj similarity index 62% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/StellaOps.Feedser.Source.Vndr.Chromium.csproj rename to src/StellaOps.Concelier.Source.Vndr.Chromium/StellaOps.Concelier.Source.Vndr.Chromium.csproj index 31406c32..afc3e727 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/StellaOps.Feedser.Source.Vndr.Chromium.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Chromium/StellaOps.Concelier.Source.Vndr.Chromium.csproj @@ -18,14 +18,14 @@ - - - + + + - <_Parameter1>StellaOps.Feedser.Source.Vndr.Chromium.Tests + <_Parameter1>StellaOps.Concelier.Source.Vndr.Chromium.Tests diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Chromium/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Chromium/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Chromium/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs index e0384e04..2d43b4b3 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoDtoFactoryTests.cs @@ -3,10 +3,10 @@ using System.Threading; using System.Threading.Tasks; using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Source.Vndr.Cisco.Internal; +using StellaOps.Concelier.Source.Vndr.Cisco.Internal; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Tests; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Tests; public sealed class CiscoDtoFactoryTests { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs index b117ce25..79ce66ea 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/CiscoMapperTests.cs @@ -2,15 +2,15 @@ using System; using System.Collections.Generic; using FluentAssertions; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Vndr.Cisco; -using StellaOps.Feedser.Source.Vndr.Cisco.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Vndr.Cisco; +using StellaOps.Concelier.Source.Vndr.Cisco.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Tests; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Tests; public sealed class CiscoMapperTests { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/StellaOps.Feedser.Source.Vndr.Cisco.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/StellaOps.Concelier.Source.Vndr.Cisco.Tests.csproj similarity index 50% rename from src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/StellaOps.Feedser.Source.Vndr.Cisco.Tests.csproj rename to src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/StellaOps.Concelier.Source.Vndr.Cisco.Tests.csproj index eaaa91d9..1a9cc947 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco.Tests/StellaOps.Feedser.Source.Vndr.Cisco.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco.Tests/StellaOps.Concelier.Source.Vndr.Cisco.Tests.csproj @@ -6,9 +6,9 @@ - - - + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Cisco/AGENTS.md similarity index 85% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Cisco/AGENTS.md index 08334c1d..930126a3 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS ## Role -Implement the Cisco security advisory connector to ingest Cisco PSIRT bulletins for Feedser. +Implement the Cisco security advisory connector to ingest Cisco PSIRT bulletins for Concelier. ## Scope - Identify Cisco advisory feeds/APIs (XML, HTML, JSON) and define incremental fetch strategy. @@ -10,7 +10,7 @@ Implement the Cisco security advisory connector to ingest Cisco PSIRT bulletins - Provide deterministic fixtures and regression tests. ## Participants -- `Source.Common`, `Storage.Mongo`, `Feedser.Models`, `Feedser.Testing`. +- `Source.Common`, `Storage.Mongo`, `Concelier.Models`, `Concelier.Testing`. ## Interfaces & Contracts - Job kinds: `cisco:fetch`, `cisco:parse`, `cisco:map`. @@ -26,5 +26,5 @@ Out of scope: Non-security Cisco release notes. - Handle authentication tokens if API requires them. ## Tests -- Add `StellaOps.Feedser.Source.Vndr.Cisco.Tests` with canned fixtures for fetch/parse/map. +- Add `StellaOps.Concelier.Source.Vndr.Cisco.Tests` with canned fixtures for fetch/parse/map. - Snapshot canonical advisories and support fixture regeneration. diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoConnector.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoConnector.cs index 52b800db..0c25b73b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoConnector.cs @@ -7,17 +7,17 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Cisco.Configuration; -using StellaOps.Feedser.Source.Vndr.Cisco.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Cisco.Configuration; +using StellaOps.Concelier.Source.Vndr.Cisco.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Cisco; +namespace StellaOps.Concelier.Source.Vndr.Cisco; public sealed class CiscoConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs index e532a40d..b395d4d7 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoDependencyInjectionRoutine.cs @@ -2,13 +2,13 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Cisco; +namespace StellaOps.Concelier.Source.Vndr.Cisco; public sealed class CiscoDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:cisco"; + private const string ConfigurationSection = "concelier:sources:cisco"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs index d38e2b06..18259f3b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/CiscoServiceCollectionExtensions.cs @@ -2,12 +2,12 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Cisco.Configuration; -using StellaOps.Feedser.Source.Vndr.Cisco.Internal; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Cisco.Configuration; +using StellaOps.Concelier.Source.Vndr.Cisco.Internal; -namespace StellaOps.Feedser.Source.Vndr.Cisco; +namespace StellaOps.Concelier.Source.Vndr.Cisco; public static class CiscoServiceCollectionExtensions { @@ -31,7 +31,7 @@ public static class CiscoServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; client.Timeout = options.RequestTimeout; - client.DefaultRequestHeaders.UserAgent.ParseAdd("StellaOps.Feedser.Cisco/1.0"); + client.DefaultRequestHeaders.UserAgent.ParseAdd("StellaOps.Concelier.Cisco/1.0"); client.DefaultRequestHeaders.Accept.ParseAdd("application/json"); if (options.TokenEndpoint is not null) { @@ -43,7 +43,7 @@ public static class CiscoServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.Timeout = options.RequestTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.Cisco/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Cisco/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.BaseUri.Host); clientOptions.AllowedHosts.Add("sec.cloudapps.cisco.com"); diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Configuration/CiscoOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Configuration/CiscoOptions.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Configuration/CiscoOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Configuration/CiscoOptions.cs index 9b28458b..0a744f88 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Configuration/CiscoOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Configuration/CiscoOptions.cs @@ -1,11 +1,11 @@ using System.Globalization; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Configuration; public sealed class CiscoOptions { - public const string HttpClientName = "feedser.source.vndr.cisco"; - public const string AuthHttpClientName = "feedser.source.vndr.cisco.auth"; + public const string HttpClientName = "concelier.source.vndr.cisco"; + public const string AuthHttpClientName = "concelier.source.vndr.cisco.auth"; public Uri BaseUri { get; set; } = new("https://api.cisco.com/security/advisories/v2/", UriKind.Absolute); diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs index dbf670e2..2b5ae721 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAccessTokenProvider.cs @@ -3,9 +3,9 @@ using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Vndr.Cisco.Configuration; +using StellaOps.Concelier.Source.Vndr.Cisco.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; internal sealed class CiscoAccessTokenProvider : IDisposable { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs index 6f99b138..f4be646b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public sealed record CiscoAdvisoryDto( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs index 623bbb9d..2d6719e6 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafClient.cs @@ -3,10 +3,10 @@ using System.IO; using System.Net.Http; using System.Text; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Cisco.Configuration; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Cisco.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public interface ICiscoCsafClient { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafData.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafData.cs similarity index 83% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafData.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafData.cs index 5c57caa5..27c4f60d 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafData.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafData.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; internal sealed record CiscoCsafData( IReadOnlyDictionary Products, diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs index 9f0b5636..b036a1a4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCsafParser.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; internal static class CiscoCsafParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCursor.cs index 58801d17..b8acb650 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoCursor.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; internal sealed record CiscoCursor( DateTimeOffset? LastModified, diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs index 7941f2e0..c83708b2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDiagnostics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public sealed class CiscoDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Vndr.Cisco"; + public const string MeterName = "StellaOps.Concelier.Source.Vndr.Cisco"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs index 61a4b17d..e7e2c6f7 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoDtoFactory.cs @@ -3,9 +3,9 @@ using System.Globalization; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Logging; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public class CiscoDtoFactory { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoMapper.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoMapper.cs index 204b849f..4d66fef0 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoMapper.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public static class CiscoMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs index 1d166753..67d5152f 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOAuthMessageHandler.cs @@ -3,7 +3,7 @@ using System.Net; using System.Net.Http.Headers; using Microsoft.Extensions.Logging; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; internal sealed class CiscoOAuthMessageHandler : DelegatingHandler { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs index 8331bcf0..2556fae6 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoOpenVulnClient.cs @@ -4,10 +4,10 @@ using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Cisco.Configuration; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Cisco.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public sealed class CiscoOpenVulnClient { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs index 37a745d6..adc9ebca 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Internal/CiscoRawAdvisory.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Cisco.Internal; +namespace StellaOps.Concelier.Source.Vndr.Cisco.Internal; public class CiscoRawAdvisory { diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/Jobs.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/Jobs.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/Jobs.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/Jobs.cs index ddaa298e..62b857dd 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Cisco; +namespace StellaOps.Concelier.Source.Vndr.Cisco; internal static class CiscoJobKinds { diff --git a/src/StellaOps.Concelier.Source.Vndr.Cisco/StellaOps.Concelier.Source.Vndr.Cisco.csproj b/src/StellaOps.Concelier.Source.Vndr.Cisco/StellaOps.Concelier.Source.Vndr.Cisco.csproj new file mode 100644 index 00000000..47812b59 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/StellaOps.Concelier.Source.Vndr.Cisco.csproj @@ -0,0 +1,16 @@ + + + + net10.0 + enable + enable + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Cisco/TASKS.md similarity index 80% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Cisco/TASKS.md index 3df21054..f314f4d1 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/TASKS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/TASKS.md @@ -1,11 +1,11 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-CISCO-02-001 Confirm Cisco PSIRT data source|BE-Conn-Cisco|Research|**DONE (2025-10-11)** – Selected openVuln REST API (`https://apix.cisco.com/security/advisories/v2/…`) as primary (structured JSON, CSAF/CVRF links) with RSS as fallback. Documented OAuth2 client-credentials flow (`cloudsso.cisco.com/as/token.oauth2`), baseline quotas (5 req/s, 30 req/min, 5 000 req/day), and pagination contract (`pageIndex`, `pageSize≤100`) in `docs/feedser-connector-research-20251011.md`.| +|FEEDCONN-CISCO-02-001 Confirm Cisco PSIRT data source|BE-Conn-Cisco|Research|**DONE (2025-10-11)** – Selected openVuln REST API (`https://apix.cisco.com/security/advisories/v2/…`) as primary (structured JSON, CSAF/CVRF links) with RSS as fallback. Documented OAuth2 client-credentials flow (`cloudsso.cisco.com/as/token.oauth2`), baseline quotas (5 req/s, 30 req/min, 5 000 req/day), and pagination contract (`pageIndex`, `pageSize≤100`) in `docs/concelier-connector-research-20251011.md`.| |FEEDCONN-CISCO-02-002 Fetch pipeline & state persistence|BE-Conn-Cisco|Source.Common, Storage.Mongo|**DONE (2025-10-14)** – Fetch job now streams openVuln pages with OAuth bearer handler, honours 429 `Retry-After`, persists per-advisory JSON + metadata into GridFS, and updates cursor (`lastModified`, advisory ID, pending docs).| |FEEDCONN-CISCO-02-003 Parser & DTO implementation|BE-Conn-Cisco|Source.Common|**DONE (2025-10-14)** – DTO factory normalizes SIR, folds CSAF product statuses, and persists `cisco.dto.v1` payloads (see `CiscoDtoFactory`).| |FEEDCONN-CISCO-02-004 Canonical mapping & range primitives|BE-Conn-Cisco|Models|**DONE (2025-10-14)** – `CiscoMapper` emits canonical advisories with vendor + SemVer primitives, provenance, and status tags.| -|FEEDCONN-CISCO-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added unit tests (`StellaOps.Feedser.Source.Vndr.Cisco.Tests`) exercising DTO/mapper pipelines; `dotnet test` validated.| -|FEEDCONN-CISCO-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-14)** – Cisco diagnostics counters exposed and ops runbook updated with telemetry guidance (`docs/ops/feedser-cisco-operations.md`).| +|FEEDCONN-CISCO-02-005 Deterministic fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added unit tests (`StellaOps.Concelier.Source.Vndr.Cisco.Tests`) exercising DTO/mapper pipelines; `dotnet test` validated.| +|FEEDCONN-CISCO-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-14)** – Cisco diagnostics counters exposed and ops runbook updated with telemetry guidance (`docs/ops/concelier-cisco-operations.md`).| |FEEDCONN-CISCO-02-007 API selection decision memo|BE-Conn-Cisco|Research|**DONE (2025-10-11)** – Drafted decision matrix: openVuln (structured/delta filters, OAuth throttle) vs RSS (delayed/minimal metadata). Pending OAuth onboarding (`FEEDCONN-CISCO-02-008`) before final recommendation circulated.| -|FEEDCONN-CISCO-02-008 OAuth client provisioning|Ops, BE-Conn-Cisco|Ops|**DONE (2025-10-14)** – `docs/ops/feedser-cisco-operations.md` documents OAuth provisioning/rotation, quotas, and Offline Kit distribution guidance.| +|FEEDCONN-CISCO-02-008 OAuth client provisioning|Ops, BE-Conn-Cisco|Ops|**DONE (2025-10-14)** – `docs/ops/concelier-cisco-operations.md` documents OAuth provisioning/rotation, quotas, and Offline Kit distribution guidance.| diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs index 204da255..7c80366a 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Cisco/VndrCiscoConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Cisco; +namespace StellaOps.Concelier.Source.Vndr.Cisco; public sealed class VndrCiscoConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/Fixtures/msrc-detail.json b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/Fixtures/msrc-detail.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/Fixtures/msrc-detail.json rename to src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/Fixtures/msrc-detail.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/Fixtures/msrc-summary.json b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/Fixtures/msrc-summary.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/Fixtures/msrc-summary.json rename to src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/Fixtures/msrc-summary.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs index 134d0261..f1056393 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/MsrcConnectorTests.cs @@ -11,20 +11,20 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; -using StellaOps.Feedser.Source.Vndr.Msrc.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Source.Vndr.Msrc.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Http; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Tests; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Tests; [Collection("mongo-fixture")] public sealed class MsrcConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/StellaOps.Feedser.Source.Vndr.Msrc.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/StellaOps.Concelier.Source.Vndr.Msrc.Tests.csproj similarity index 51% rename from src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/StellaOps.Feedser.Source.Vndr.Msrc.Tests.csproj rename to src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/StellaOps.Concelier.Source.Vndr.Msrc.Tests.csproj index f3e0a677..5f07c518 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc.Tests/StellaOps.Feedser.Source.Vndr.Msrc.Tests.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc.Tests/StellaOps.Concelier.Source.Vndr.Msrc.Tests.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Msrc/AGENTS.md similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Msrc/AGENTS.md index 289819ad..673c8b9a 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/AGENTS.md @@ -10,7 +10,7 @@ Implement the Microsoft Security Response Center (MSRC) connector to ingest Micr - Provide deterministic fixtures and regression tests. ## Participants -- `Source.Common`, `Storage.Mongo`, `Feedser.Models`, `Feedser.Testing`. +- `Source.Common`, `Storage.Mongo`, `Concelier.Models`, `Concelier.Testing`. ## Interfaces & Contracts - Job kinds: `msrc:fetch`, `msrc:parse`, `msrc:map`. @@ -26,5 +26,5 @@ Out of scope: Non-security Microsoft release notes. - Sanitize payloads; validate JSON/CVRF before persistence. ## Tests -- Add `StellaOps.Feedser.Source.Vndr.Msrc.Tests` with fixtures covering fetch/parse/map. +- Add `StellaOps.Concelier.Source.Vndr.Msrc.Tests` with fixtures covering fetch/parse/map. - Snapshot canonical advisories; support fixture regeneration. diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Configuration/MsrcOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Configuration/MsrcOptions.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Configuration/MsrcOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Configuration/MsrcOptions.cs index 3e23fdf6..0d3cef30 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Configuration/MsrcOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Configuration/MsrcOptions.cs @@ -1,11 +1,11 @@ using System.Globalization; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Configuration; public sealed class MsrcOptions { - public const string HttpClientName = "feedser.source.vndr.msrc"; - public const string TokenClientName = "feedser.source.vndr.msrc.token"; + public const string HttpClientName = "concelier.source.vndr.msrc"; + public const string TokenClientName = "concelier.source.vndr.msrc.token"; public Uri BaseUri { get; set; } = new("https://api.msrc.microsoft.com/sug/v2.0/", UriKind.Absolute); diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs index a5b0b61b..7759e3bf 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcAdvisoryDto.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed record MsrcAdvisoryDto { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcApiClient.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcApiClient.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcApiClient.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcApiClient.cs index 9a4fa7e6..befeb7f2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcApiClient.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcApiClient.cs @@ -8,9 +8,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed class MsrcApiClient { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcCursor.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcCursor.cs index cc1e0763..7a3391b8 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; internal sealed record MsrcCursor( IReadOnlyCollection PendingDocuments, diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs index 7526e232..397242e8 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed record MsrcVulnerabilityDetailDto { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs index a684599d..e64f6be9 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDetailParser.cs @@ -1,7 +1,7 @@ using System; using System.Linq; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed class MsrcDetailParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs index 00ada34d..0525adcd 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDiagnostics.cs @@ -2,11 +2,11 @@ using System; using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed class MsrcDiagnostics : IDisposable { - private const string MeterName = "StellaOps.Feedser.Source.Vndr.Msrc"; + private const string MeterName = "StellaOps.Concelier.Source.Vndr.Msrc"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs index 26d0528d..8afe465e 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcDocumentMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; internal static class MsrcDocumentMetadata { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcMapper.cs similarity index 98% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcMapper.cs index ff507360..bd684223 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcMapper.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; internal static class MsrcMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs index a8fadee1..636999a0 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcSummaryResponse.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public sealed record MsrcSummaryResponse { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs index 8511a3c8..c68ceb99 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Internal/MsrcTokenProvider.cs @@ -7,9 +7,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Msrc.Internal; +namespace StellaOps.Concelier.Source.Vndr.Msrc.Internal; public interface IMsrcTokenProvider { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/Jobs.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/Jobs.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/Jobs.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/Jobs.cs index 9e618b6c..8666a524 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Msrc; +namespace StellaOps.Concelier.Source.Vndr.Msrc; internal static class MsrcJobKinds { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnector.cs similarity index 97% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnector.cs index 33114ff5..1420cc09 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnector.cs @@ -9,18 +9,18 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; -using StellaOps.Feedser.Source.Vndr.Msrc.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Source.Vndr.Msrc.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Msrc; +namespace StellaOps.Concelier.Source.Vndr.Msrc; public sealed class MsrcConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnectorPlugin.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnectorPlugin.cs index 61176fd9..9996db02 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Msrc; +namespace StellaOps.Concelier.Source.Vndr.Msrc; public sealed class MsrcConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs index 685941e8..2cbf4343 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Msrc; +namespace StellaOps.Concelier.Source.Vndr.Msrc; public sealed class MsrcDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:vndr:msrc"; + private const string ConfigurationSection = "concelier:sources:vndr:msrc"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs similarity index 90% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs index d02b321b..e23d425a 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/MsrcServiceCollectionExtensions.cs @@ -3,11 +3,11 @@ using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Msrc.Configuration; -using StellaOps.Feedser.Source.Vndr.Msrc.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Msrc.Configuration; +using StellaOps.Concelier.Source.Vndr.Msrc.Internal; -namespace StellaOps.Feedser.Source.Vndr.Msrc; +namespace StellaOps.Concelier.Source.Vndr.Msrc; public static class MsrcServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/README.md b/src/StellaOps.Concelier.Source.Vndr.Msrc/README.md similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/README.md rename to src/StellaOps.Concelier.Source.Vndr.Msrc/README.md index 6b45656e..45e65e81 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/README.md +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/README.md @@ -12,7 +12,7 @@ ## Authentication - Uses Azure AD client credential flow against `https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token` with scope `api://api.msrc.microsoft.com/.default`. - Token refresh happens lazily and is cached until 60 seconds before expiry. -- Configuration values (`tenantId`, `clientId`, `clientSecret`) must be supplied via `feedser:sources:vndr:msrc`. +- Configuration values (`tenantId`, `clientId`, `clientSecret`) must be supplied via `concelier:sources:vndr:msrc`. ## CVRF handling - Detail payload is persisted with the `cvrfUrl` in metadata (`msrc.cvrfUrl`). diff --git a/src/StellaOps.Feedser.Source.Cve/StellaOps.Feedser.Source.Cve.csproj b/src/StellaOps.Concelier.Source.Vndr.Msrc/StellaOps.Concelier.Source.Vndr.Msrc.csproj similarity index 58% rename from src/StellaOps.Feedser.Source.Cve/StellaOps.Feedser.Source.Cve.csproj rename to src/StellaOps.Concelier.Source.Vndr.Msrc/StellaOps.Concelier.Source.Vndr.Msrc.csproj index f7f2c154..7066145d 100644 --- a/src/StellaOps.Feedser.Source.Cve/StellaOps.Feedser.Source.Cve.csproj +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/StellaOps.Concelier.Source.Vndr.Msrc.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Msrc/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Msrc/TASKS.md similarity index 79% rename from src/StellaOps.Feedser.Source.Vndr.Msrc/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Msrc/TASKS.md index 8139644e..b8b1e29f 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Msrc/TASKS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Msrc/TASKS.md @@ -1,11 +1,11 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|FEEDCONN-MSRC-02-001 Document MSRC Security Update Guide API|BE-Conn-MSRC|Research|**DONE (2025-10-11)** – Confirmed REST endpoint (`https://api.msrc.microsoft.com/sug/v2.0/en-US/vulnerabilities`) + CVRF ZIP download flow, required Azure AD client-credentials scope (`api://api.msrc.microsoft.com/.default`), mandatory `api-version=2024-08-01` header, and delta params (`lastModifiedStartDateTime`, `lastModifiedEndDateTime`). Findings recorded in `docs/feedser-connector-research-20251011.md`.| +|FEEDCONN-MSRC-02-001 Document MSRC Security Update Guide API|BE-Conn-MSRC|Research|**DONE (2025-10-11)** – Confirmed REST endpoint (`https://api.msrc.microsoft.com/sug/v2.0/en-US/vulnerabilities`) + CVRF ZIP download flow, required Azure AD client-credentials scope (`api://api.msrc.microsoft.com/.default`), mandatory `api-version=2024-08-01` header, and delta params (`lastModifiedStartDateTime`, `lastModifiedEndDateTime`). Findings recorded in `docs/concelier-connector-research-20251011.md`.| |FEEDCONN-MSRC-02-002 Fetch pipeline & source state|BE-Conn-MSRC|Source.Common, Storage.Mongo|**DONE (2025-10-15)** – Added `MsrcApiClient` + token provider, cursor overlap handling, and detail persistence via GridFS (metadata carries CVRF URL + timestamps). State tracks `lastModifiedCursor` with configurable overlap/backoff. **Next:** coordinate with Tools on shared state-seeding helper once CVRF download flag stabilises.| |FEEDCONN-MSRC-02-003 Parser & DTO implementation|BE-Conn-MSRC|Source.Common|**DONE (2025-10-15)** – Implemented `MsrcDetailParser`/DTOs capturing threats, remediations, KB IDs, CVEs, CVSS, and affected products (build/platform metadata preserved).| |FEEDCONN-MSRC-02-004 Canonical mapping & range primitives|BE-Conn-MSRC|Models|**DONE (2025-10-15)** – `MsrcMapper` emits aliases (MSRC ID/CVE/KB), references (release notes + CVRF), vendor packages with `msrc.build` normalized rules, and CVSS provenance.| -|FEEDCONN-MSRC-02-005 Deterministic fixtures/tests|QA|Testing|**DONE (2025-10-15)** – Added `StellaOps.Feedser.Source.Vndr.Msrc.Tests` with canned token/summary/detail responses and snapshot assertions via Mongo2Go. Fixtures regenerate via `UPDATE_MSRC_FIXTURES`.| -|FEEDCONN-MSRC-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Introduced `MsrcDiagnostics` meter (summary/detail/parse/map metrics), structured fetch logs, README updates, and Ops brief `docs/ops/feedser-msrc-operations.md` covering AAD onboarding + CVRF handling.| +|FEEDCONN-MSRC-02-005 Deterministic fixtures/tests|QA|Testing|**DONE (2025-10-15)** – Added `StellaOps.Concelier.Source.Vndr.Msrc.Tests` with canned token/summary/detail responses and snapshot assertions via Mongo2Go. Fixtures regenerate via `UPDATE_MSRC_FIXTURES`.| +|FEEDCONN-MSRC-02-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Introduced `MsrcDiagnostics` meter (summary/detail/parse/map metrics), structured fetch logs, README updates, and Ops brief `docs/ops/concelier-msrc-operations.md` covering AAD onboarding + CVRF handling.| |FEEDCONN-MSRC-02-007 API contract comparison memo|BE-Conn-MSRC|Research|**DONE (2025-10-11)** – Completed memo outline recommending dual-path (REST for incremental, CVRF for offline); implementation hinges on `FEEDCONN-MSRC-02-008` AAD onboarding for token acquisition.| -|FEEDCONN-MSRC-02-008 Azure AD application onboarding|Ops, BE-Conn-MSRC|Ops|**DONE (2025-10-15)** – Coordinated Ops handoff; drafted AAD onboarding brief (`docs/ops/feedser-msrc-operations.md`) with app registration requirements, secret rotation policy, sample configuration, and CVRF mirroring guidance for Offline Kit.| +|FEEDCONN-MSRC-02-008 Azure AD application onboarding|Ops, BE-Conn-MSRC|Ops|**DONE (2025-10-15)** – Coordinated Ops handoff; drafted AAD onboarding brief (`docs/ops/concelier-msrc-operations.md`) with app registration requirements, secret rotation policy, sample configuration, and CVRF mirroring guidance for Offline Kit.| diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024-single.html b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024-single.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024-single.html rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024-single.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024.html b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024.html rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-calendar-cpuapr2024.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-01.html b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-01.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-01.html rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-01.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-02.html b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-02.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-02.html rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-cpuapr2024-02.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-invalid.html b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-invalid.html similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-invalid.html rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/Fixtures/oracle-detail-invalid.html diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs index 3a8e175c..e6f0bffa 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/Oracle/OracleConnectorTests.cs @@ -18,21 +18,21 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Vndr.Oracle; -using StellaOps.Feedser.Source.Vndr.Oracle.Configuration; -using StellaOps.Feedser.Source.Vndr.Oracle.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Vndr.Oracle; +using StellaOps.Concelier.Source.Vndr.Oracle.Configuration; +using StellaOps.Concelier.Source.Vndr.Oracle.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Tests; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Tests; [Collection("mongo-fixture")] public sealed class OracleConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj new file mode 100644 index 00000000..bf989385 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle.Tests/StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj @@ -0,0 +1,17 @@ + + + net10.0 + enable + enable + + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Oracle/AGENTS.md similarity index 80% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Oracle/AGENTS.md index 0145dc63..64b766e1 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/AGENTS.md @@ -19,9 +19,9 @@ Oracle PSIRT connector for Critical Patch Updates (CPU) and Security Alerts; aut In: PSIRT authoritative mapping, cycles handling, precedence signaling. Out: signing or patch artifact downloads. ## Observability & security expectations -- Metrics: SourceDiagnostics emits `feedser.source.http.*` counters/histograms tagged `feedser.source=oracle`, so observability dashboards slice on that tag to monitor fetch pages, CPU cycle coverage, parse failures, and map affected counts. +- Metrics: SourceDiagnostics emits `concelier.source.http.*` counters/histograms tagged `concelier.source=oracle`, so observability dashboards slice on that tag to monitor fetch pages, CPU cycle coverage, parse failures, and map affected counts. - Logs: cycle tags, advisory ids, extraction timings; redact nothing sensitive. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Vndr.Oracle.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Vndr.Oracle.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Configuration/OracleOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Configuration/OracleOptions.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Configuration/OracleOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Configuration/OracleOptions.cs index 4a336c7a..51371336 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Configuration/OracleOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Configuration/OracleOptions.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Configuration; public sealed class OracleOptions { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs similarity index 85% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs index 07804c01..83a5f6d2 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleAffectedEntry.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal sealed record OracleAffectedEntry( [property: JsonPropertyName("product")] string Product, diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs index 3dc5406e..ae53d027 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCalendarFetcher.cs @@ -7,9 +7,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Vndr.Oracle.Configuration; +using StellaOps.Concelier.Source.Vndr.Oracle.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; public sealed class OracleCalendarFetcher { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCursor.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCursor.cs index 72e9b1b4..17b6834c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleCursor.cs @@ -2,9 +2,9 @@ using System; using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal sealed record OracleCursor( DateTimeOffset? LastProcessed, diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs index b609d5fe..a00f686d 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDocumentMetadata.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal sealed record OracleDocumentMetadata( string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDto.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDto.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDto.cs index 074db653..cd698fff 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal sealed record OracleDto( [property: JsonPropertyName("advisoryId")] string AdvisoryId, diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs index f782e96b..559063a8 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleDtoValidator.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal static class OracleDtoValidator { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleMapper.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleMapper.cs index 0a805658..2f09e92f 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleMapper.cs @@ -2,13 +2,13 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal static class OracleMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleParser.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleParser.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleParser.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleParser.cs index 6cd27135..881df815 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OracleParser.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OracleParser.cs @@ -6,7 +6,7 @@ using System.Text.RegularExpressions; using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal static class OracleParser { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs similarity index 79% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs index 42787aeb..5810e883 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Internal/OraclePatchDocument.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Oracle.Internal; +namespace StellaOps.Concelier.Source.Vndr.Oracle.Internal; internal sealed record OraclePatchDocument( [property: JsonPropertyName("product")] string Product, diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Jobs.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/Jobs.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/Jobs.cs index ba7602be..c94e1bf4 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Oracle; +namespace StellaOps.Concelier.Source.Vndr.Oracle; internal static class OracleJobKinds { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleConnector.cs similarity index 94% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/OracleConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/OracleConnector.cs index 54e24a8f..b8206f18 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleConnector.cs @@ -7,18 +7,18 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Oracle.Configuration; -using StellaOps.Feedser.Source.Vndr.Oracle.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Oracle.Configuration; +using StellaOps.Concelier.Source.Vndr.Oracle.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Oracle; +namespace StellaOps.Concelier.Source.Vndr.Oracle; public sealed class OracleConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs index 1a1f42a2..0c651426 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Vndr.Oracle.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Vndr.Oracle.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Oracle; +namespace StellaOps.Concelier.Source.Vndr.Oracle; public sealed class OracleDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:oracle"; + private const string ConfigurationSection = "concelier:sources:oracle"; public IServiceCollection Register(IServiceCollection services, IConfiguration configuration) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs similarity index 80% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs index 1acaaca8..d28bbdb9 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/OracleServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Oracle.Configuration; -using StellaOps.Feedser.Source.Vndr.Oracle.Internal; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Oracle.Configuration; +using StellaOps.Concelier.Source.Vndr.Oracle.Internal; -namespace StellaOps.Feedser.Source.Vndr.Oracle; +namespace StellaOps.Concelier.Source.Vndr.Oracle; public static class OracleServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class OracleServiceCollectionExtensions { var options = sp.GetRequiredService>().Value; clientOptions.Timeout = TimeSpan.FromSeconds(30); - clientOptions.UserAgent = "StellaOps.Feedser.Oracle/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.Oracle/1.0"; clientOptions.AllowedHosts.Clear(); foreach (var uri in options.AdvisoryUris) { diff --git a/src/StellaOps.Concelier.Source.Vndr.Oracle/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..d60216cd --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Vndr.Oracle.Tests")] diff --git a/src/StellaOps.Concelier.Source.Vndr.Oracle/StellaOps.Concelier.Source.Vndr.Oracle.csproj b/src/StellaOps.Concelier.Source.Vndr.Oracle/StellaOps.Concelier.Source.Vndr.Oracle.csproj new file mode 100644 index 00000000..aabd0211 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/StellaOps.Concelier.Source.Vndr.Oracle.csproj @@ -0,0 +1,17 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Oracle/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Oracle/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs index 0ec2ee31..1f99bc2e 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Oracle/VndrOracleConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Oracle; +namespace StellaOps.Concelier.Source.Vndr.Oracle; public sealed class VndrOracleConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj new file mode 100644 index 00000000..24cbbc72 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj @@ -0,0 +1,18 @@ + + + net10.0 + enable + enable + + + + + + + + + + PreserveNewest + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-advisories.snapshot.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-advisories.snapshot.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-advisories.snapshot.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-advisories.snapshot.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0001.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0001.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0001.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0001.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0002.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0002.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0002.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0002.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0003.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0003.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0003.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-detail-vmsa-2024-0003.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-initial.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-initial.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-initial.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-initial.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-second.json b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-second.json similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-second.json rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/Fixtures/vmware-index-second.json diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs index a1f98a6c..f5f7e9f5 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareConnectorTests.cs @@ -15,21 +15,21 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Source.Vndr.Vmware; -using StellaOps.Feedser.Source.Vndr.Vmware.Configuration; -using StellaOps.Feedser.Source.Vndr.Vmware.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Source.Vndr.Vmware; +using StellaOps.Concelier.Source.Vndr.Vmware.Configuration; +using StellaOps.Concelier.Source.Vndr.Vmware.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Testing; using Xunit.Abstractions; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Tests.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Tests.Vmware; [Collection("mongo-fixture")] public sealed class VmwareConnectorTests : IAsyncLifetime diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs similarity index 87% rename from src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs index 1f7c23b1..99b37ee3 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware.Tests/Vmware/VmwareMapperTests.cs @@ -2,15 +2,15 @@ using System; using System.Collections.Generic; using System.Text.Json; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Vndr.Vmware; -using StellaOps.Feedser.Source.Vndr.Vmware.Internal; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Vndr.Vmware; +using StellaOps.Concelier.Source.Vndr.Vmware.Internal; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; using Xunit; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Tests; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Tests; public sealed class VmwareMapperTests { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/AGENTS.md b/src/StellaOps.Concelier.Source.Vndr.Vmware/AGENTS.md similarity index 80% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/AGENTS.md rename to src/StellaOps.Concelier.Source.Vndr.Vmware/AGENTS.md index 724c6e4e..c1de3217 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/AGENTS.md +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/AGENTS.md @@ -20,9 +20,9 @@ VMware/Broadcom PSIRT connector ingesting VMSA advisories; authoritative for VMw In: PSIRT precedence mapping, affected/fixedBy extraction, advisory references. Out: customer portal authentication flows beyond public advisories; downloading patches. ## Observability & security expectations -- Metrics: SourceDiagnostics emits shared `feedser.source.http.*` counters/histograms tagged `feedser.source=vmware`, allowing dashboards to measure fetch volume, parse failures, and map affected counts without bespoke metric names. +- Metrics: SourceDiagnostics emits shared `concelier.source.http.*` counters/histograms tagged `concelier.source=vmware`, allowing dashboards to measure fetch volume, parse failures, and map affected counts without bespoke metric names. - Logs: vmsa ids, product counts, extraction timings; handle portal rate limits politely. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Source.Vndr.Vmware.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Source.Vndr.Vmware.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Configuration/VmwareOptions.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Configuration/VmwareOptions.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Configuration/VmwareOptions.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Configuration/VmwareOptions.cs index 362c07c8..36c5c14e 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Configuration/VmwareOptions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Configuration/VmwareOptions.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Configuration; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Configuration; public sealed class VmwareOptions { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareCursor.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareCursor.cs similarity index 96% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareCursor.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareCursor.cs index 44b27ca8..327fd4e5 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareCursor.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareCursor.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Internal; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Internal; internal sealed record VmwareCursor( DateTimeOffset? LastModified, diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs similarity index 92% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs index d8d54799..0846148c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareDetailDto.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Internal; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Internal; internal sealed record VmwareDetailDto { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs index 89634a6d..55368d1b 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareFetchCacheEntry.cs @@ -1,8 +1,8 @@ using System; using MongoDB.Bson; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Internal; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Internal; internal sealed record VmwareFetchCacheEntry(string? Sha256, string? ETag, DateTimeOffset? LastModified) { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs similarity index 82% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs index 2099cdb4..cf134cd3 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareIndexItem.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Internal; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Internal; internal sealed record VmwareIndexItem { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareMapper.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareMapper.cs similarity index 93% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareMapper.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareMapper.cs index 9602719f..be6a7b99 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Internal/VmwareMapper.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Internal/VmwareMapper.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Packages; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Packages; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; -namespace StellaOps.Feedser.Source.Vndr.Vmware.Internal; +namespace StellaOps.Concelier.Source.Vndr.Vmware.Internal; internal static class VmwareMapper { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Jobs.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Jobs.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/Jobs.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/Jobs.cs index 14ebcec8..8a4489dd 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Jobs.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Jobs.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; internal static class VmwareJobKinds { diff --git a/src/StellaOps.Concelier.Source.Vndr.Vmware/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f995cad1 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Vndr.Vmware.Tests")] diff --git a/src/StellaOps.Concelier.Source.Vndr.Vmware/StellaOps.Concelier.Source.Vndr.Vmware.csproj b/src/StellaOps.Concelier.Source.Vndr.Vmware/StellaOps.Concelier.Source.Vndr.Vmware.csproj new file mode 100644 index 00000000..5b2da6c4 --- /dev/null +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/StellaOps.Concelier.Source.Vndr.Vmware.csproj @@ -0,0 +1,23 @@ + + + + net10.0 + enable + enable + + + + + + + + + + + + + <_Parameter1>StellaOps.Concelier.Tests + + + + diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/TASKS.md b/src/StellaOps.Concelier.Source.Vndr.Vmware/TASKS.md similarity index 100% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/TASKS.md rename to src/StellaOps.Concelier.Source.Vndr.Vmware/TASKS.md diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnector.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnector.cs similarity index 95% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnector.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnector.cs index f5fe1c3a..1c67b51c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnector.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnector.cs @@ -9,19 +9,19 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Bson.IO; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Source.Vndr.Vmware.Configuration; -using StellaOps.Feedser.Source.Vndr.Vmware.Internal; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Source.Vndr.Vmware.Configuration; +using StellaOps.Concelier.Source.Vndr.Vmware.Internal; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; public sealed class VmwareConnector : IFeedConnector { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnectorPlugin.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnectorPlugin.cs similarity index 88% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnectorPlugin.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnectorPlugin.cs index 98f53d16..27f46e8c 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareConnectorPlugin.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareConnectorPlugin.cs @@ -2,7 +2,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using StellaOps.Plugin; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; public sealed class VmwareConnectorPlugin : IConnectorPlugin { diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs similarity index 86% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs index 914aceb7..7cc5da71 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDependencyInjectionRoutine.cs @@ -2,14 +2,14 @@ using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.DependencyInjection; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Vndr.Vmware.Configuration; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Vndr.Vmware.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; public sealed class VmwareDependencyInjectionRoutine : IDependencyInjectionRoutine { - private const string ConfigurationSection = "feedser:sources:vmware"; + private const string ConfigurationSection = "concelier:sources:vmware"; private const string FetchCron = "10,40 * * * *"; private const string ParseCron = "15,45 * * * *"; private const string MapCron = "20,50 * * * *"; diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDiagnostics.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDiagnostics.cs similarity index 91% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDiagnostics.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDiagnostics.cs index 57a68e6b..72e516eb 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareDiagnostics.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareDiagnostics.cs @@ -1,14 +1,14 @@ using System; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; /// /// VMware connector metrics (fetch, parse, map). /// public sealed class VmwareDiagnostics : IDisposable { - public const string MeterName = "StellaOps.Feedser.Source.Vndr.Vmware"; + public const string MeterName = "StellaOps.Concelier.Source.Vndr.Vmware"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs similarity index 84% rename from src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs index 7765876e..b36f6880 100644 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Source.Vndr.Vmware/VmwareServiceCollectionExtensions.cs @@ -2,10 +2,10 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Source.Common.Http; -using StellaOps.Feedser.Source.Vndr.Vmware.Configuration; +using StellaOps.Concelier.Source.Common.Http; +using StellaOps.Concelier.Source.Vndr.Vmware.Configuration; -namespace StellaOps.Feedser.Source.Vndr.Vmware; +namespace StellaOps.Concelier.Source.Vndr.Vmware; public static class VmwareServiceCollectionExtensions { @@ -23,7 +23,7 @@ public static class VmwareServiceCollectionExtensions var options = sp.GetRequiredService>().Value; clientOptions.BaseAddress = new Uri(options.IndexUri.GetLeftPart(UriPartial.Authority)); clientOptions.Timeout = options.HttpTimeout; - clientOptions.UserAgent = "StellaOps.Feedser.VMware/1.0"; + clientOptions.UserAgent = "StellaOps.Concelier.VMware/1.0"; clientOptions.AllowedHosts.Clear(); clientOptions.AllowedHosts.Add(options.IndexUri.Host); clientOptions.DefaultRequestHeaders["Accept"] = "application/json"; diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs index 07d79762..4e0c1d16 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/AdvisoryStorePerformanceTests.cs @@ -3,15 +3,15 @@ using System.Linq; using System.Threading; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Aliases; -using StellaOps.Feedser.Storage.Mongo.Migrations; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo.Migrations; using Xunit; using Xunit.Abstractions; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class AdvisoryStorePerformanceTests : IClassFixture @@ -43,7 +43,7 @@ public sealed class AdvisoryStorePerformanceTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/AliasStoreTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/AliasStoreTests.cs similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/AliasStoreTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/AliasStoreTests.cs index 122b29b3..7ab62387 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/AliasStoreTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/AliasStoreTests.cs @@ -3,10 +3,10 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Driver; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Aliases; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class AliasStoreTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/DocumentStoreTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/DocumentStoreTests.cs similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/DocumentStoreTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/DocumentStoreTests.cs index f4f9b2b5..66f41f09 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/DocumentStoreTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/DocumentStoreTests.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Documents; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class DocumentStoreTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/DtoStoreTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/DtoStoreTests.cs similarity index 89% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/DtoStoreTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/DtoStoreTests.cs index 4bdf309e..c9046dfd 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/DtoStoreTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/DtoStoreTests.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Bson; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class DtoStoreTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateManagerTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateManagerTests.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateManagerTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateManagerTests.cs index 7e4dc9dd..f7b1a720 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateManagerTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateManagerTests.cs @@ -2,9 +2,9 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; public sealed class ExportStateManagerTests { diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateStoreTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateStoreTests.cs similarity index 90% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateStoreTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateStoreTests.cs index 8eed8ef3..67f9ba63 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/ExportStateStoreTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/ExportStateStoreTests.cs @@ -1,8 +1,8 @@ using System; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.Exporting; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class ExportStateStoreTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/MergeEventStoreTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/MergeEventStoreTests.cs similarity index 88% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/MergeEventStoreTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/MergeEventStoreTests.cs index 3758cf73..496a5ed6 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/MergeEventStoreTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/MergeEventStoreTests.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class MergeEventStoreTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs similarity index 92% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs index 9db94f41..863635f9 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/Migrations/MongoMigrationRunnerTests.cs @@ -6,11 +6,11 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Migrations; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Migrations; using Xunit; -namespace StellaOps.Feedser.Storage.Mongo.Tests.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Tests.Migrations; [Collection("mongo-fixture")] public sealed class MongoMigrationRunnerTests @@ -25,7 +25,7 @@ public sealed class MongoMigrationRunnerTests [Fact] public async Task RunAsync_AppliesPendingMigrationsOnce() { - var databaseName = $"feedser-migrations-{Guid.NewGuid():N}"; + var databaseName = $"concelier-migrations-{Guid.NewGuid():N}"; var database = _fixture.Client.GetDatabase(databaseName); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Migrations); @@ -57,7 +57,7 @@ public sealed class MongoMigrationRunnerTests [Fact] public async Task EnsureDocumentExpiryIndexesMigration_CreatesTtlIndexWhenRetentionEnabled() { - var databaseName = $"feedser-doc-ttl-{Guid.NewGuid():N}"; + var databaseName = $"concelier-doc-ttl-{Guid.NewGuid():N}"; var database = _fixture.Client.GetDatabase(databaseName); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Document); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Migrations); @@ -97,7 +97,7 @@ public sealed class MongoMigrationRunnerTests [Fact] public async Task EnsureDocumentExpiryIndexesMigration_DropsTtlIndexWhenRetentionDisabled() { - var databaseName = $"feedser-doc-notl-{Guid.NewGuid():N}"; + var databaseName = $"concelier-doc-notl-{Guid.NewGuid():N}"; var database = _fixture.Client.GetDatabase(databaseName); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Document); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Migrations); @@ -144,7 +144,7 @@ public sealed class MongoMigrationRunnerTests [Fact] public async Task EnsureGridFsExpiryIndexesMigration_CreatesTtlIndexWhenRetentionEnabled() { - var databaseName = $"feedser-gridfs-ttl-{Guid.NewGuid():N}"; + var databaseName = $"concelier-gridfs-ttl-{Guid.NewGuid():N}"; var database = _fixture.Client.GetDatabase(databaseName); await database.CreateCollectionAsync("documents.files"); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Migrations); @@ -179,7 +179,7 @@ public sealed class MongoMigrationRunnerTests [Fact] public async Task EnsureGridFsExpiryIndexesMigration_DropsTtlIndexWhenRetentionDisabled() { - var databaseName = $"feedser-gridfs-notl-{Guid.NewGuid():N}"; + var databaseName = $"concelier-gridfs-notl-{Guid.NewGuid():N}"; var database = _fixture.Client.GetDatabase(databaseName); await database.CreateCollectionAsync("documents.files"); await database.CreateCollectionAsync(MongoStorageDefaults.Collections.Migrations); diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/MongoBootstrapperTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/MongoBootstrapperTests.cs similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/MongoBootstrapperTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/MongoBootstrapperTests.cs index 80b5fefd..0c86169f 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/MongoBootstrapperTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/MongoBootstrapperTests.cs @@ -5,11 +5,11 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Migrations; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Migrations; using Xunit; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class MongoBootstrapperTests : IClassFixture @@ -24,7 +24,7 @@ public sealed class MongoBootstrapperTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs similarity index 93% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs index af24393a..3ef2e1c3 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/MongoSourceStateRepositoryTests.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Bson; -using StellaOps.Feedser.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class MongoSourceStateRepositoryTests : IClassFixture diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs b/src/StellaOps.Concelier.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs similarity index 92% rename from src/StellaOps.Feedser.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs rename to src/StellaOps.Concelier.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs index 8112b16b..7e062c19 100644 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/RawDocumentRetentionServiceTests.cs @@ -4,11 +4,11 @@ using Microsoft.Extensions.Time.Testing; using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.GridFS; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Storage.Mongo.Tests; +namespace StellaOps.Concelier.Storage.Mongo.Tests; [Collection("mongo-fixture")] public sealed class RawDocumentRetentionServiceTests : IClassFixture diff --git a/src/StellaOps.Concelier.Storage.Mongo.Tests/StellaOps.Concelier.Storage.Mongo.Tests.csproj b/src/StellaOps.Concelier.Storage.Mongo.Tests/StellaOps.Concelier.Storage.Mongo.Tests.csproj new file mode 100644 index 00000000..6b70273e --- /dev/null +++ b/src/StellaOps.Concelier.Storage.Mongo.Tests/StellaOps.Concelier.Storage.Mongo.Tests.csproj @@ -0,0 +1,12 @@ + + + net10.0 + enable + enable + + + + + + + diff --git a/src/StellaOps.Feedser.Storage.Mongo/AGENTS.md b/src/StellaOps.Concelier.Storage.Mongo/AGENTS.md similarity index 90% rename from src/StellaOps.Feedser.Storage.Mongo/AGENTS.md rename to src/StellaOps.Concelier.Storage.Mongo/AGENTS.md index a1f2b543..b60532c6 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/AGENTS.md +++ b/src/StellaOps.Concelier.Storage.Mongo/AGENTS.md @@ -12,7 +12,7 @@ Canonical persistence for raw documents, DTOs, canonical advisories, jobs, and s - Source connectors store raw docs, DTOs, and mapped canonical advisories with provenance; Update SourceState cursor/backoff. - Exporters read advisories and write export_state. ## Interfaces & contracts -- IMongoDatabase injected; MongoUrl from options; database name from options or MongoUrl or default "feedser". +- IMongoDatabase injected; MongoUrl from options; database name from options or MongoUrl or default "concelier". - Repositories expose async methods with CancellationToken; deterministic sorting. - All date/time values stored as UTC; identifiers normalized. ## In/Out of scope @@ -23,7 +23,7 @@ Out: business mapping logic, HTTP, packaging. - Timeouts and retry policies; avoid unbounded scans; page reads. - Do not log DSNs with credentials; redact in diagnostics. ## Tests -- Author and review coverage in `../StellaOps.Feedser.Storage.Mongo.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.Storage.Mongo.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryDocument.cs similarity index 90% rename from src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryDocument.cs index 8077974e..9891e6b5 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryDocument.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Advisories; +namespace StellaOps.Concelier.Storage.Mongo.Advisories; [BsonIgnoreExtraElements] public sealed class AdvisoryDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryStore.cs similarity index 98% rename from src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryStore.cs index 0fa8f135..40788198 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Advisories/AdvisoryStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Advisories/AdvisoryStore.cs @@ -8,10 +8,10 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Aliases; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Aliases; -namespace StellaOps.Feedser.Storage.Mongo.Advisories; +namespace StellaOps.Concelier.Storage.Mongo.Advisories; public sealed class AdvisoryStore : IAdvisoryStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Advisories/IAdvisoryStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Advisories/IAdvisoryStore.cs similarity index 78% rename from src/StellaOps.Feedser.Storage.Mongo/Advisories/IAdvisoryStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Advisories/IAdvisoryStore.cs index f7f3209b..e5ff7bf0 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Advisories/IAdvisoryStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Advisories/IAdvisoryStore.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Storage.Mongo.Advisories; +namespace StellaOps.Concelier.Storage.Mongo.Advisories; public interface IAdvisoryStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocument.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocument.cs index 2d89e021..ef6ba3ed 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocument.cs @@ -1,7 +1,7 @@ using System; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Advisories; +namespace StellaOps.Concelier.Storage.Mongo.Advisories; [BsonIgnoreExtraElements] public sealed class NormalizedVersionDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs b/src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs similarity index 97% rename from src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs rename to src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs index bf9238a2..3e82abb9 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Advisories/NormalizedVersionDocumentFactory.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using StellaOps.Feedser.Models; +using StellaOps.Concelier.Models; -namespace StellaOps.Feedser.Storage.Mongo.Advisories; +namespace StellaOps.Concelier.Storage.Mongo.Advisories; internal static class NormalizedVersionDocumentFactory { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasDocument.cs similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasDocument.cs index b093292e..fefa080f 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasDocument.cs @@ -2,7 +2,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Aliases; +namespace StellaOps.Concelier.Storage.Mongo.Aliases; [BsonIgnoreExtraElements] internal sealed class AliasDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStore.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStore.cs index 7b0d71cd..3137e3ff 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStore.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Bson; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Aliases; +namespace StellaOps.Concelier.Storage.Mongo.Aliases; public sealed class AliasStore : IAliasStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreConstants.cs b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreConstants.cs similarity index 71% rename from src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreConstants.cs rename to src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreConstants.cs index d847acf5..f3f4af4f 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreConstants.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreConstants.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.Aliases; +namespace StellaOps.Concelier.Storage.Mongo.Aliases; public static class AliasStoreConstants { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreMetrics.cs b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreMetrics.cs similarity index 76% rename from src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreMetrics.cs rename to src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreMetrics.cs index 7117434d..c90113b9 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Aliases/AliasStoreMetrics.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Aliases/AliasStoreMetrics.cs @@ -1,14 +1,14 @@ using System.Collections.Generic; using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.Storage.Mongo.Aliases; +namespace StellaOps.Concelier.Storage.Mongo.Aliases; internal static class AliasStoreMetrics { - private static readonly Meter Meter = new("StellaOps.Feedser.Merge"); + private static readonly Meter Meter = new("StellaOps.Concelier.Merge"); internal static readonly Counter AliasCollisionCounter = Meter.CreateCounter( - "feedser.merge.alias_conflict", + "concelier.merge.alias_conflict", unit: "count", description: "Number of alias collisions detected when the same alias maps to multiple advisories."); diff --git a/src/StellaOps.Feedser.Storage.Mongo/Aliases/IAliasStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Aliases/IAliasStore.cs similarity index 92% rename from src/StellaOps.Feedser.Storage.Mongo/Aliases/IAliasStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Aliases/IAliasStore.cs index 200346a5..3a7f8a6a 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Aliases/IAliasStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Aliases/IAliasStore.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo.Aliases; +namespace StellaOps.Concelier.Storage.Mongo.Aliases; public interface IAliasStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs index d9b5e746..44aeca47 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocument.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; [BsonIgnoreExtraElements] public sealed class ChangeHistoryDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs index a5f7f9ea..8cd5e71c 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryDocumentExtensions.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using MongoDB.Bson; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; internal static class ChangeHistoryDocumentExtensions { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs similarity index 87% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs index c8c80a88..6b635c20 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryFieldChange.cs @@ -1,6 +1,6 @@ using System; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; public sealed record ChangeHistoryFieldChange { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs similarity index 93% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs index 3b18af98..6a3cf580 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/ChangeHistoryRecord.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; public sealed class ChangeHistoryRecord { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs similarity index 83% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs index b409f452..6f2d0ce3 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/IChangeHistoryStore.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; public interface IChangeHistoryStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs index 8f7616ce..6e3de766 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ChangeHistory/MongoChangeHistoryStore.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.ChangeHistory; +namespace StellaOps.Concelier.Storage.Mongo.ChangeHistory; public sealed class MongoChangeHistoryStore : IChangeHistoryStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentDocument.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentDocument.cs index e4af65cb..6ffa29f8 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentDocument.cs @@ -2,7 +2,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Documents; +namespace StellaOps.Concelier.Storage.Mongo.Documents; [BsonIgnoreExtraElements] public sealed class DocumentDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentRecord.cs similarity index 87% rename from src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentRecord.cs index 1a371362..7268eed3 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentRecord.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Storage.Mongo.Documents; +namespace StellaOps.Concelier.Storage.Mongo.Documents; public sealed record DocumentRecord( Guid Id, diff --git a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentStore.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentStore.cs index b6c894c8..672ca39a 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Documents/DocumentStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Documents/DocumentStore.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Documents; +namespace StellaOps.Concelier.Storage.Mongo.Documents; public sealed class DocumentStore : IDocumentStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Documents/IDocumentStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Documents/IDocumentStore.cs similarity index 86% rename from src/StellaOps.Feedser.Storage.Mongo/Documents/IDocumentStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Documents/IDocumentStore.cs index 5ce08818..fc4d0179 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Documents/IDocumentStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Documents/IDocumentStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.Documents; +namespace StellaOps.Concelier.Storage.Mongo.Documents; public interface IDocumentStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoDocument.cs similarity index 93% rename from src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoDocument.cs index a9121c79..69bb305c 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoDocument.cs @@ -2,7 +2,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Dtos; +namespace StellaOps.Concelier.Storage.Mongo.Dtos; [BsonIgnoreExtraElements] public sealed class DtoDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoRecord.cs similarity index 76% rename from src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoRecord.cs index 21c4eede..fd8c8faf 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoRecord.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Storage.Mongo.Dtos; +namespace StellaOps.Concelier.Storage.Mongo.Dtos; public sealed record DtoRecord( Guid Id, diff --git a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoStore.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoStore.cs index 8c7c47ea..6a843c20 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Dtos/DtoStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Dtos/DtoStore.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Dtos; +namespace StellaOps.Concelier.Storage.Mongo.Dtos; public sealed class DtoStore : IDtoStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Dtos/IDtoStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Dtos/IDtoStore.cs similarity index 85% rename from src/StellaOps.Feedser.Storage.Mongo/Dtos/IDtoStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Dtos/IDtoStore.cs index 07806e94..25c0e59d 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Dtos/IDtoStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Dtos/IDtoStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.Dtos; +namespace StellaOps.Concelier.Storage.Mongo.Dtos; public interface IDtoStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateDocument.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateDocument.cs index a6e87421..d08e5758 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateDocument.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Exporting; +namespace StellaOps.Concelier.Storage.Mongo.Exporting; [BsonIgnoreExtraElements] public sealed class ExportStateDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateManager.cs b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateManager.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateManager.cs rename to src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateManager.cs index efd051aa..513c7b4f 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateManager.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateManager.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo.Exporting; +namespace StellaOps.Concelier.Storage.Mongo.Exporting; /// /// Helper for exporters to read and persist their export metadata in Mongo-backed storage. diff --git a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateRecord.cs similarity index 85% rename from src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateRecord.cs index 3d72b44e..e7da9625 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateRecord.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.Exporting; +namespace StellaOps.Concelier.Storage.Mongo.Exporting; public sealed record ExportStateRecord( string Id, diff --git a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateStore.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateStore.cs index a45e51a9..2062acc4 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Exporting/ExportStateStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Exporting/ExportStateStore.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Exporting; +namespace StellaOps.Concelier.Storage.Mongo.Exporting; public sealed class ExportStateStore : IExportStateStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Exporting/IExportStateStore.cs b/src/StellaOps.Concelier.Storage.Mongo/Exporting/IExportStateStore.cs similarity index 78% rename from src/StellaOps.Feedser.Storage.Mongo/Exporting/IExportStateStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/Exporting/IExportStateStore.cs index 3dad3c23..910a6763 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Exporting/IExportStateStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Exporting/IExportStateStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.Exporting; +namespace StellaOps.Concelier.Storage.Mongo.Exporting; public interface IExportStateStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/ISourceStateRepository.cs b/src/StellaOps.Concelier.Storage.Mongo/ISourceStateRepository.cs similarity index 90% rename from src/StellaOps.Feedser.Storage.Mongo/ISourceStateRepository.cs rename to src/StellaOps.Concelier.Storage.Mongo/ISourceStateRepository.cs index d5e8a98e..491f36ea 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ISourceStateRepository.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ISourceStateRepository.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public interface ISourceStateRepository { diff --git a/src/StellaOps.Feedser.Storage.Mongo/JobLeaseDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/JobLeaseDocument.cs similarity index 89% rename from src/StellaOps.Feedser.Storage.Mongo/JobLeaseDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/JobLeaseDocument.cs index ae8b5b34..97060ec5 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JobLeaseDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JobLeaseDocument.cs @@ -1,7 +1,7 @@ using MongoDB.Bson.Serialization.Attributes; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; [BsonIgnoreExtraElements] public sealed class JobLeaseDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/JobRunDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/JobRunDocument.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/JobRunDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/JobRunDocument.cs index fabbc3f1..8c49155d 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JobRunDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JobRunDocument.cs @@ -4,9 +4,9 @@ using System.Linq; using System.Text.Json; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; [BsonIgnoreExtraElements] public sealed class JobRunDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/IJpFlagStore.cs b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/IJpFlagStore.cs similarity index 80% rename from src/StellaOps.Feedser.Storage.Mongo/JpFlags/IJpFlagStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/JpFlags/IJpFlagStore.cs index 131ce8b9..25d50dfc 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/IJpFlagStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/IJpFlagStore.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo.JpFlags; +namespace StellaOps.Concelier.Storage.Mongo.JpFlags; public interface IJpFlagStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagDocument.cs similarity index 93% rename from src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagDocument.cs index a493fc51..407b123c 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagDocument.cs @@ -1,6 +1,6 @@ using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.JpFlags; +namespace StellaOps.Concelier.Storage.Mongo.JpFlags; [BsonIgnoreExtraElements] public sealed class JpFlagDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagRecord.cs similarity index 85% rename from src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagRecord.cs index 90fa8dc0..292ce7e2 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagRecord.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.JpFlags; +namespace StellaOps.Concelier.Storage.Mongo.JpFlags; /// /// Captures Japan-specific enrichment flags derived from JVN payloads. diff --git a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagStore.cs b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagStore.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagStore.cs index e5cedaae..efb773f7 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/JpFlags/JpFlagStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/JpFlags/JpFlagStore.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.JpFlags; +namespace StellaOps.Concelier.Storage.Mongo.JpFlags; public sealed class JpFlagStore : IJpFlagStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MIGRATIONS.md b/src/StellaOps.Concelier.Storage.Mongo/MIGRATIONS.md similarity index 71% rename from src/StellaOps.Feedser.Storage.Mongo/MIGRATIONS.md rename to src/StellaOps.Concelier.Storage.Mongo/MIGRATIONS.md index bca738e1..2aafce46 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MIGRATIONS.md +++ b/src/StellaOps.Concelier.Storage.Mongo/MIGRATIONS.md @@ -1,17 +1,17 @@ # Mongo Schema Migration Playbook -This module owns the persistent shape of Feedser's MongoDB database. Upgrades must be deterministic and safe to run on live replicas. The `MongoMigrationRunner` executes idempotent migrations on startup immediately after the bootstrapper completes its collection and index checks. +This module owns the persistent shape of Concelier's MongoDB database. Upgrades must be deterministic and safe to run on live replicas. The `MongoMigrationRunner` executes idempotent migrations on startup immediately after the bootstrapper completes its collection and index checks. ## Execution Path -1. `StellaOps.Feedser.WebService` calls `MongoBootstrapper.InitializeAsync()` during startup. +1. `StellaOps.Concelier.WebService` calls `MongoBootstrapper.InitializeAsync()` during startup. 2. Once collections and baseline indexes are ensured, the bootstrapper invokes `MongoMigrationRunner.RunAsync()`. 3. Each `IMongoMigration` implementation is sorted by its `Id` (ordinal compare) and executed exactly once. Completion is recorded in the `schema_migrations` collection. 4. Failures surface during startup and prevent the service from serving traffic, matching our "fail-fast" requirement for storage incompatibilities. ## Creating a Migration -1. Implement `IMongoMigration` under `StellaOps.Feedser.Storage.Mongo.Migrations`. Use a monotonically increasing identifier such as `yyyyMMdd_description`. +1. Implement `IMongoMigration` under `StellaOps.Concelier.Storage.Mongo.Migrations`. Use a monotonically increasing identifier such as `yyyyMMdd_description`. 2. Keep the body idempotent: query state first, drop/re-create indexes only when mismatch is detected, and avoid multi-document transactions unless required. 3. Add the migration to DI in `ServiceCollectionExtensions` so it flows into the runner. 4. Write an integration test that exercises the migration against a Mongo2Go instance to validate behaviour. @@ -27,8 +27,8 @@ This module owns the persistent shape of Feedser's MongoDB database. Upgrades mu - `schema_migrations` records each applied migration (`_id`, `description`, `appliedAt`). Review this collection when auditing upgrades. - To re-run a migration in a lab, delete the corresponding document from `schema_migrations` and restart the service. **Do not** do this in production unless the migration body is known to be idempotent and safe. -- When changing retention settings (`RawDocumentRetention`), deploy the new configuration and restart Feedser. The migration runner will adjust indexes on the next boot. -- If migrations fail, restart with `Logging__LogLevel__StellaOps.Feedser.Storage.Mongo.Migrations=Debug` to surface diagnostic output. Remediate underlying index/collection drift before retrying. +- When changing retention settings (`RawDocumentRetention`), deploy the new configuration and restart Concelier. The migration runner will adjust indexes on the next boot. +- If migrations fail, restart with `Logging__LogLevel__StellaOps.Concelier.Storage.Mongo.Migrations=Debug` to surface diagnostic output. Remediate underlying index/collection drift before retrying. ## Validating an Upgrade diff --git a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/IMergeEventStore.cs b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/IMergeEventStore.cs similarity index 79% rename from src/StellaOps.Feedser.Storage.Mongo/MergeEvents/IMergeEventStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/MergeEvents/IMergeEventStore.cs index 57df7782..29cececa 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/IMergeEventStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/IMergeEventStore.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.MergeEvents; +namespace StellaOps.Concelier.Storage.Mongo.MergeEvents; public interface IMergeEventStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventDocument.cs similarity index 97% rename from src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventDocument.cs index b0db3bb1..38388d73 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventDocument.cs @@ -4,7 +4,7 @@ using System.Linq; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.MergeEvents; +namespace StellaOps.Concelier.Storage.Mongo.MergeEvents; [BsonIgnoreExtraElements] public sealed class MergeEventDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventRecord.cs similarity index 80% rename from src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventRecord.cs index a3e02214..80998127 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventRecord.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.MergeEvents; +namespace StellaOps.Concelier.Storage.Mongo.MergeEvents; public sealed record MergeEventRecord( Guid Id, diff --git a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventStore.cs b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventStore.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventStore.cs index 3e77e41c..8403ed4c 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeEventStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeEventStore.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.MergeEvents; +namespace StellaOps.Concelier.Storage.Mongo.MergeEvents; public sealed class MergeEventStore : IMergeEventStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeFieldDecision.cs b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeFieldDecision.cs similarity index 77% rename from src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeFieldDecision.cs rename to src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeFieldDecision.cs index 2d3f753e..ced570b1 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MergeEvents/MergeFieldDecision.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MergeEvents/MergeFieldDecision.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.MergeEvents; +namespace StellaOps.Concelier.Storage.Mongo.MergeEvents; public sealed record MergeFieldDecision( string Field, diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs index 12732a81..f8430a9d 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureDocumentExpiryIndexesMigration.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; internal sealed class EnsureDocumentExpiryIndexesMigration : IMongoMigration { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs index 158f7aa7..48e8525a 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/EnsureGridFsExpiryIndexesMigration.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; internal sealed class EnsureGridFsExpiryIndexesMigration : IMongoMigration { diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/IMongoMigration.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/IMongoMigration.cs similarity index 87% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/IMongoMigration.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/IMongoMigration.cs index 0a0b845c..c8696993 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/IMongoMigration.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/IMongoMigration.cs @@ -1,6 +1,6 @@ using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; /// /// Represents a single, idempotent MongoDB migration. diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationDocument.cs similarity index 83% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationDocument.cs index 268996e6..1670b820 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationDocument.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; [BsonIgnoreExtraElements] internal sealed class MongoMigrationDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationRunner.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationRunner.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationRunner.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationRunner.cs index 0256a448..87b38d87 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/MongoMigrationRunner.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/MongoMigrationRunner.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; /// /// Executes pending schema migrations tracked inside MongoDB to keep upgrades deterministic. diff --git a/src/StellaOps.Feedser.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs b/src/StellaOps.Concelier.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs rename to src/StellaOps.Concelier.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs index d54dc669..9a701fe6 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/Migrations/SemVerStyleBackfillMigration.cs @@ -6,10 +6,10 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Storage.Mongo.Advisories; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Storage.Mongo.Advisories; -namespace StellaOps.Feedser.Storage.Mongo.Migrations; +namespace StellaOps.Concelier.Storage.Mongo.Migrations; public sealed class SemVerStyleBackfillMigration : IMongoMigration { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoBootstrapper.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoBootstrapper.cs similarity index 97% rename from src/StellaOps.Feedser.Storage.Mongo/MongoBootstrapper.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoBootstrapper.cs index 04006964..1ce51157 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoBootstrapper.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoBootstrapper.cs @@ -2,9 +2,9 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Storage.Mongo.Migrations; +using StellaOps.Concelier.Storage.Mongo.Migrations; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; /// /// Ensures required collections and indexes exist before the service begins processing. diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoJobStore.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoJobStore.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/MongoJobStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoJobStore.cs index ce0a3fab..a46480f8 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoJobStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoJobStore.cs @@ -5,9 +5,9 @@ using Microsoft.Extensions.Logging; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public sealed class MongoJobStore : IJobStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoLeaseStore.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoLeaseStore.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/MongoLeaseStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoLeaseStore.cs index 5df66eca..6f783fb3 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoLeaseStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoLeaseStore.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Logging; using MongoDB.Driver; -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public sealed class MongoLeaseStore : ILeaseStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoSourceStateRepository.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoSourceStateRepository.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/MongoSourceStateRepository.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoSourceStateRepository.cs index f3a88687..21635e15 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoSourceStateRepository.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoSourceStateRepository.cs @@ -2,7 +2,7 @@ using Microsoft.Extensions.Logging; using MongoDB.Bson; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public sealed class MongoSourceStateRepository : ISourceStateRepository { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoStorageDefaults.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoStorageDefaults.cs similarity index 88% rename from src/StellaOps.Feedser.Storage.Mongo/MongoStorageDefaults.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoStorageDefaults.cs index a3c07576..afe5936b 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoStorageDefaults.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoStorageDefaults.cs @@ -1,8 +1,8 @@ -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public static class MongoStorageDefaults { - public const string DefaultDatabaseName = "feedser"; + public const string DefaultDatabaseName = "concelier"; public static class Collections { diff --git a/src/StellaOps.Feedser.Storage.Mongo/MongoStorageOptions.cs b/src/StellaOps.Concelier.Storage.Mongo/MongoStorageOptions.cs similarity index 96% rename from src/StellaOps.Feedser.Storage.Mongo/MongoStorageOptions.cs rename to src/StellaOps.Concelier.Storage.Mongo/MongoStorageOptions.cs index fe7315b7..0b011f96 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/MongoStorageOptions.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/MongoStorageOptions.cs @@ -1,6 +1,6 @@ using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public sealed class MongoStorageOptions { diff --git a/src/StellaOps.Concelier.Storage.Mongo/Properties/AssemblyInfo.cs b/src/StellaOps.Concelier.Storage.Mongo/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6164a773 --- /dev/null +++ b/src/StellaOps.Concelier.Storage.Mongo/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("StellaOps.Concelier.Storage.Mongo.Tests")] diff --git a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs similarity index 80% rename from src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs index 568f64d3..a70bf2a7 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/IPsirtFlagStore.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo.PsirtFlags; +namespace StellaOps.Concelier.Storage.Mongo.PsirtFlags; public interface IPsirtFlagStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs similarity index 93% rename from src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs index e572588e..92f3a3aa 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagDocument.cs @@ -1,6 +1,6 @@ using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo.PsirtFlags; +namespace StellaOps.Concelier.Storage.Mongo.PsirtFlags; [BsonIgnoreExtraElements] public sealed class PsirtFlagDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs similarity index 84% rename from src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs index c3216ff5..4a809f77 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagRecord.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.Storage.Mongo.PsirtFlags; +namespace StellaOps.Concelier.Storage.Mongo.PsirtFlags; /// /// Describes a PSIRT precedence flag for a canonical advisory. diff --git a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs rename to src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs index 4f42e232..788e07bd 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/PsirtFlags/PsirtFlagStore.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace StellaOps.Feedser.Storage.Mongo.PsirtFlags; +namespace StellaOps.Concelier.Storage.Mongo.PsirtFlags; public sealed class PsirtFlagStore : IPsirtFlagStore { diff --git a/src/StellaOps.Feedser.Storage.Mongo/RawDocumentRetentionService.cs b/src/StellaOps.Concelier.Storage.Mongo/RawDocumentRetentionService.cs similarity index 94% rename from src/StellaOps.Feedser.Storage.Mongo/RawDocumentRetentionService.cs rename to src/StellaOps.Concelier.Storage.Mongo/RawDocumentRetentionService.cs index 60027b57..9e99b401 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/RawDocumentRetentionService.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/RawDocumentRetentionService.cs @@ -3,10 +3,10 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Driver.GridFS; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; /// /// Periodically purges expired raw documents, associated DTO payloads, and GridFS content. diff --git a/src/StellaOps.Feedser.Storage.Mongo/ServiceCollectionExtensions.cs b/src/StellaOps.Concelier.Storage.Mongo/ServiceCollectionExtensions.cs similarity index 83% rename from src/StellaOps.Feedser.Storage.Mongo/ServiceCollectionExtensions.cs rename to src/StellaOps.Concelier.Storage.Mongo/ServiceCollectionExtensions.cs index a28b22e7..6a33a527 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/ServiceCollectionExtensions.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/ServiceCollectionExtensions.cs @@ -3,19 +3,19 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Driver; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Storage.Mongo.Advisories; -using StellaOps.Feedser.Storage.Mongo.Aliases; -using StellaOps.Feedser.Storage.Mongo.ChangeHistory; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; -using StellaOps.Feedser.Storage.Mongo.Exporting; -using StellaOps.Feedser.Storage.Mongo.JpFlags; -using StellaOps.Feedser.Storage.Mongo.MergeEvents; -using StellaOps.Feedser.Storage.Mongo.PsirtFlags; -using StellaOps.Feedser.Storage.Mongo.Migrations; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Storage.Mongo.Advisories; +using StellaOps.Concelier.Storage.Mongo.Aliases; +using StellaOps.Concelier.Storage.Mongo.ChangeHistory; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; +using StellaOps.Concelier.Storage.Mongo.Exporting; +using StellaOps.Concelier.Storage.Mongo.JpFlags; +using StellaOps.Concelier.Storage.Mongo.MergeEvents; +using StellaOps.Concelier.Storage.Mongo.PsirtFlags; +using StellaOps.Concelier.Storage.Mongo.Migrations; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public static class ServiceCollectionExtensions { diff --git a/src/StellaOps.Feedser.Storage.Mongo/SourceStateDocument.cs b/src/StellaOps.Concelier.Storage.Mongo/SourceStateDocument.cs similarity index 95% rename from src/StellaOps.Feedser.Storage.Mongo/SourceStateDocument.cs rename to src/StellaOps.Concelier.Storage.Mongo/SourceStateDocument.cs index d9dacfac..519a59af 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/SourceStateDocument.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/SourceStateDocument.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; [BsonIgnoreExtraElements] public sealed class SourceStateDocument diff --git a/src/StellaOps.Feedser.Storage.Mongo/SourceStateRecord.cs b/src/StellaOps.Concelier.Storage.Mongo/SourceStateRecord.cs similarity index 84% rename from src/StellaOps.Feedser.Storage.Mongo/SourceStateRecord.cs rename to src/StellaOps.Concelier.Storage.Mongo/SourceStateRecord.cs index 6ea2f339..896ce6ec 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/SourceStateRecord.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/SourceStateRecord.cs @@ -1,6 +1,6 @@ using MongoDB.Bson; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public sealed record SourceStateRecord( string SourceName, diff --git a/src/StellaOps.Feedser.Storage.Mongo/SourceStateRepositoryExtensions.cs b/src/StellaOps.Concelier.Storage.Mongo/SourceStateRepositoryExtensions.cs similarity index 89% rename from src/StellaOps.Feedser.Storage.Mongo/SourceStateRepositoryExtensions.cs rename to src/StellaOps.Concelier.Storage.Mongo/SourceStateRepositoryExtensions.cs index 7d4bb300..4a28e82c 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/SourceStateRepositoryExtensions.cs +++ b/src/StellaOps.Concelier.Storage.Mongo/SourceStateRepositoryExtensions.cs @@ -2,7 +2,7 @@ using System; using System.Threading; using System.Threading.Tasks; -namespace StellaOps.Feedser.Storage.Mongo; +namespace StellaOps.Concelier.Storage.Mongo; public static class SourceStateRepositoryExtensions { diff --git a/src/StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj b/src/StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj similarity index 75% rename from src/StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj rename to src/StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj index e39dc64a..004494a9 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj +++ b/src/StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj @@ -13,7 +13,7 @@ - - + + diff --git a/src/StellaOps.Feedser.Storage.Mongo/TASKS.md b/src/StellaOps.Concelier.Storage.Mongo/TASKS.md similarity index 91% rename from src/StellaOps.Feedser.Storage.Mongo/TASKS.md rename to src/StellaOps.Concelier.Storage.Mongo/TASKS.md index dddad01f..ceaa3636 100644 --- a/src/StellaOps.Feedser.Storage.Mongo/TASKS.md +++ b/src/StellaOps.Concelier.Storage.Mongo/TASKS.md @@ -20,5 +20,5 @@ |FEEDSTORAGE-DATA-02-002 Provenance decision persistence|BE-Storage|Models `FEEDMODELS-SCHEMA-01-002`|**DONE (2025-10-12)** – Normalized documents carry decision reasons/source/timestamps with regression coverage verifying SemVer notes + provenance fallbacks.| |FEEDSTORAGE-DATA-02-003 Normalized versions index creation|BE-Storage|Normalization, Mongo bootstrapper|**DONE (2025-10-12)** – Bootstrapper seeds `normalizedVersions.*` indexes when SemVer style is enabled; docs/tests confirm index presence.| |FEEDSTORAGE-DATA-04-001 Advisory payload parity (description/CWEs/canonical metric)|BE-Storage|Models, Core|DONE (2025-10-15) – Mongo payloads round-trip new advisory fields; serializer/tests updated, no migration required beyond optional backfill.| -|FEEDSTORAGE-MONGO-08-001 Causal-consistent session plumbing|BE-Storage|Feedser Core DI|TODO – Introduce scoped MongoDB session provider enabling causal consistency + majority read/write concerns in `AddMongoStorage`; flow optional `IClientSessionHandle` through job/advisory/source state/document stores; add integration test simulating primary election to prove read-your-write + monotonic reads.| +|FEEDSTORAGE-MONGO-08-001 Causal-consistent session plumbing|BE-Storage|Concelier Core DI|TODO – Introduce scoped MongoDB session provider enabling causal consistency + majority read/write concerns in `AddMongoStorage`; flow optional `IClientSessionHandle` through job/advisory/source state/document stores; add integration test simulating primary election to prove read-your-write + monotonic reads.| |FEEDSTORAGE-DATA-07-001 Advisory statement & conflict collections|Team Normalization & Storage Backbone|FEEDMERGE-ENGINE-07-001|TODO – Create `advisory_statements` (immutable) and `advisory_conflicts` collections, define `asOf`/`vulnerabilityKey` indexes, and document migration/rollback steps for event-sourced merge.| diff --git a/src/StellaOps.Feedser.Testing/ConnectorTestHarness.cs b/src/StellaOps.Concelier.Testing/ConnectorTestHarness.cs similarity index 92% rename from src/StellaOps.Feedser.Testing/ConnectorTestHarness.cs rename to src/StellaOps.Concelier.Testing/ConnectorTestHarness.cs index 6e29296d..6bc20e6a 100644 --- a/src/StellaOps.Feedser.Testing/ConnectorTestHarness.cs +++ b/src/StellaOps.Concelier.Testing/ConnectorTestHarness.cs @@ -6,14 +6,14 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using StellaOps.Feedser.Source.Common.Http; +using StellaOps.Concelier.Source.Common.Http; using Microsoft.Extensions.Time.Testing; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Testing; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Testing; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Testing; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Testing; -namespace StellaOps.Feedser.Testing; +namespace StellaOps.Concelier.Testing; /// /// Provides a reusable container for connector integration tests with canned HTTP responses and Mongo isolation. diff --git a/src/StellaOps.Feedser.Testing/MongoIntegrationFixture.cs b/src/StellaOps.Concelier.Testing/MongoIntegrationFixture.cs similarity index 94% rename from src/StellaOps.Feedser.Testing/MongoIntegrationFixture.cs rename to src/StellaOps.Concelier.Testing/MongoIntegrationFixture.cs index c1843801..76cdc146 100644 --- a/src/StellaOps.Feedser.Testing/MongoIntegrationFixture.cs +++ b/src/StellaOps.Concelier.Testing/MongoIntegrationFixture.cs @@ -6,7 +6,7 @@ using Mongo2Go; using Xunit; using MongoDB.Driver; -namespace StellaOps.Feedser.Testing; +namespace StellaOps.Concelier.Testing; public sealed class MongoIntegrationFixture : IAsyncLifetime { @@ -19,7 +19,7 @@ public sealed class MongoIntegrationFixture : IAsyncLifetime EnsureMongo2GoEnvironment(); Runner = MongoDbRunner.Start(singleNodeReplSet: true); Client = new MongoClient(Runner.ConnectionString); - Database = Client.GetDatabase($"feedser-tests-{Guid.NewGuid():N}"); + Database = Client.GetDatabase($"concelier-tests-{Guid.NewGuid():N}"); return Task.CompletedTask; } diff --git a/src/StellaOps.Feedser.Testing/StellaOps.Feedser.Testing.csproj b/src/StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj similarity index 72% rename from src/StellaOps.Feedser.Testing/StellaOps.Feedser.Testing.csproj rename to src/StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj index 2a35b8de..0c1f5178 100644 --- a/src/StellaOps.Feedser.Testing/StellaOps.Feedser.Testing.csproj +++ b/src/StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj @@ -14,7 +14,7 @@ - - + + diff --git a/src/StellaOps.Feedser.Tests.Shared/AssemblyInfo.cs b/src/StellaOps.Concelier.Tests.Shared/AssemblyInfo.cs similarity index 100% rename from src/StellaOps.Feedser.Tests.Shared/AssemblyInfo.cs rename to src/StellaOps.Concelier.Tests.Shared/AssemblyInfo.cs diff --git a/src/StellaOps.Feedser.Tests.Shared/MongoFixtureCollection.cs b/src/StellaOps.Concelier.Tests.Shared/MongoFixtureCollection.cs similarity index 79% rename from src/StellaOps.Feedser.Tests.Shared/MongoFixtureCollection.cs rename to src/StellaOps.Concelier.Tests.Shared/MongoFixtureCollection.cs index 11610647..d479aea2 100644 --- a/src/StellaOps.Feedser.Tests.Shared/MongoFixtureCollection.cs +++ b/src/StellaOps.Concelier.Tests.Shared/MongoFixtureCollection.cs @@ -1,6 +1,6 @@ using Xunit; -namespace StellaOps.Feedser.Testing; +namespace StellaOps.Concelier.Testing; [CollectionDefinition("mongo-fixture", DisableParallelization = true)] public sealed class MongoFixtureCollection : ICollectionFixture; diff --git a/src/StellaOps.Feedser.WebService.Tests/FeedserOptionsPostConfigureTests.cs b/src/StellaOps.Concelier.WebService.Tests/ConcelierOptionsPostConfigureTests.cs similarity index 58% rename from src/StellaOps.Feedser.WebService.Tests/FeedserOptionsPostConfigureTests.cs rename to src/StellaOps.Concelier.WebService.Tests/ConcelierOptionsPostConfigureTests.cs index 9c6ebef8..a357c9e9 100644 --- a/src/StellaOps.Feedser.WebService.Tests/FeedserOptionsPostConfigureTests.cs +++ b/src/StellaOps.Concelier.WebService.Tests/ConcelierOptionsPostConfigureTests.cs @@ -1,11 +1,11 @@ using System; using System.IO; -using StellaOps.Feedser.WebService.Options; +using StellaOps.Concelier.WebService.Options; using Xunit; -namespace StellaOps.Feedser.WebService.Tests; +namespace StellaOps.Concelier.WebService.Tests; -public sealed class FeedserOptionsPostConfigureTests +public sealed class ConcelierOptionsPostConfigureTests { [Fact] public void Apply_LoadsClientSecretFromRelativeFile() @@ -14,19 +14,19 @@ public sealed class FeedserOptionsPostConfigureTests try { var secretPath = Path.Combine(tempDirectory.FullName, "authority.secret"); - File.WriteAllText(secretPath, " feedser-secret "); + File.WriteAllText(secretPath, " concelier-secret "); - var options = new FeedserOptions + var options = new ConcelierOptions { - Authority = new FeedserOptions.AuthorityOptions + Authority = new ConcelierOptions.AuthorityOptions { ClientSecretFile = "authority.secret" } }; - FeedserOptionsPostConfigure.Apply(options, tempDirectory.FullName); + ConcelierOptionsPostConfigure.Apply(options, tempDirectory.FullName); - Assert.Equal("feedser-secret", options.Authority.ClientSecret); + Assert.Equal("concelier-secret", options.Authority.ClientSecret); } finally { @@ -40,16 +40,16 @@ public sealed class FeedserOptionsPostConfigureTests [Fact] public void Apply_ThrowsWhenSecretFileMissing() { - var options = new FeedserOptions + var options = new ConcelierOptions { - Authority = new FeedserOptions.AuthorityOptions + Authority = new ConcelierOptions.AuthorityOptions { ClientSecretFile = "missing.secret" } }; var exception = Assert.Throws(() => - FeedserOptionsPostConfigure.Apply(options, AppContext.BaseDirectory)); + ConcelierOptionsPostConfigure.Apply(options, AppContext.BaseDirectory)); Assert.Contains("Authority client secret file", exception.Message); } diff --git a/src/StellaOps.Feedser.WebService.Tests/PluginLoaderTests.cs b/src/StellaOps.Concelier.WebService.Tests/PluginLoaderTests.cs similarity index 91% rename from src/StellaOps.Feedser.WebService.Tests/PluginLoaderTests.cs rename to src/StellaOps.Concelier.WebService.Tests/PluginLoaderTests.cs index b089b983..db002873 100644 --- a/src/StellaOps.Feedser.WebService.Tests/PluginLoaderTests.cs +++ b/src/StellaOps.Concelier.WebService.Tests/PluginLoaderTests.cs @@ -1,6 +1,6 @@ using StellaOps.Plugin; -namespace StellaOps.Feedser.WebService.Tests; +namespace StellaOps.Concelier.WebService.Tests; public class PluginLoaderTests { diff --git a/src/StellaOps.Concelier.WebService.Tests/StellaOps.Concelier.WebService.Tests.csproj b/src/StellaOps.Concelier.WebService.Tests/StellaOps.Concelier.WebService.Tests.csproj new file mode 100644 index 00000000..796eac59 --- /dev/null +++ b/src/StellaOps.Concelier.WebService.Tests/StellaOps.Concelier.WebService.Tests.csproj @@ -0,0 +1,13 @@ + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/StellaOps.Feedser.WebService.Tests/WebServiceEndpointsTests.cs b/src/StellaOps.Concelier.WebService.Tests/WebServiceEndpointsTests.cs similarity index 80% rename from src/StellaOps.Feedser.WebService.Tests/WebServiceEndpointsTests.cs rename to src/StellaOps.Concelier.WebService.Tests/WebServiceEndpointsTests.cs index c80d4287..cfdd36fe 100644 --- a/src/StellaOps.Feedser.WebService.Tests/WebServiceEndpointsTests.cs +++ b/src/StellaOps.Concelier.WebService.Tests/WebServiceEndpointsTests.cs @@ -12,24 +12,24 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Mongo2Go; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.WebService.Jobs; -using StellaOps.Feedser.WebService.Options; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.WebService.Jobs; +using StellaOps.Concelier.WebService.Options; using Xunit.Sdk; using StellaOps.Auth.Abstractions; using StellaOps.Auth.Client; -namespace StellaOps.Feedser.WebService.Tests; +namespace StellaOps.Concelier.WebService.Tests; public sealed class WebServiceEndpointsTests : IAsyncLifetime { private MongoDbRunner _runner = null!; - private FeedserApplicationFactory _factory = null!; + private ConcelierApplicationFactory _factory = null!; public Task InitializeAsync() { _runner = MongoDbRunner.Start(singleNodeReplSet: true); - _factory = new FeedserApplicationFactory(_runner.ConnectionString); + _factory = new ConcelierApplicationFactory(_runner.ConnectionString); return Task.CompletedTask; } @@ -221,20 +221,20 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime { var environment = new Dictionary { - ["FEEDSER_AUTHORITY__ENABLED"] = "true", - ["FEEDSER_AUTHORITY__ALLOWANONYMOUSFALLBACK"] = "false", - ["FEEDSER_AUTHORITY__ISSUER"] = "https://authority.example", - ["FEEDSER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", - ["FEEDSER_AUTHORITY__AUDIENCES__0"] = "api://feedser", - ["FEEDSER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, - ["FEEDSER_AUTHORITY__BYPASSNETWORKS__0"] = "127.0.0.1/32", - ["FEEDSER_AUTHORITY__BYPASSNETWORKS__1"] = "::1/128", - ["FEEDSER_AUTHORITY__CLIENTID"] = "feedser-jobs", - ["FEEDSER_AUTHORITY__CLIENTSECRET"] = "test-secret", - ["FEEDSER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, + ["CONCELIER_AUTHORITY__ENABLED"] = "true", + ["CONCELIER_AUTHORITY__ALLOWANONYMOUSFALLBACK"] = "false", + ["CONCELIER_AUTHORITY__ISSUER"] = "https://authority.example", + ["CONCELIER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", + ["CONCELIER_AUTHORITY__AUDIENCES__0"] = "api://concelier", + ["CONCELIER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, + ["CONCELIER_AUTHORITY__BYPASSNETWORKS__0"] = "127.0.0.1/32", + ["CONCELIER_AUTHORITY__BYPASSNETWORKS__1"] = "::1/128", + ["CONCELIER_AUTHORITY__CLIENTID"] = "concelier-jobs", + ["CONCELIER_AUTHORITY__CLIENTSECRET"] = "test-secret", + ["CONCELIER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, }; - using var factory = new FeedserApplicationFactory( + using var factory = new ConcelierApplicationFactory( _runner.ConnectionString, authority => { @@ -243,13 +243,13 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime authority.Issuer = "https://authority.example"; authority.RequireHttpsMetadata = false; authority.Audiences.Clear(); - authority.Audiences.Add("api://feedser"); + authority.Audiences.Add("api://concelier"); authority.RequiredScopes.Clear(); - authority.RequiredScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + authority.RequiredScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); authority.BypassNetworks.Clear(); authority.BypassNetworks.Add("127.0.0.1/32"); authority.BypassNetworks.Add("::1/128"); - authority.ClientId = "feedser-jobs"; + authority.ClientId = "concelier-jobs"; authority.ClientSecret = "test-secret"; }, environment); @@ -263,7 +263,7 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime Assert.Equal(HttpStatusCode.OK, response.StatusCode); - var auditLogs = factory.LoggerProvider.Snapshot("Feedser.Authorization.Audit"); + var auditLogs = factory.LoggerProvider.Snapshot("Concelier.Authorization.Audit"); var bypassLog = Assert.Single(auditLogs, entry => entry.TryGetState("Bypass", out var state) && state is bool flag && flag); Assert.True(bypassLog.TryGetState("RemoteAddress", out var remoteObj) && string.Equals(remoteObj?.ToString(), "127.0.0.1", StringComparison.Ordinal)); Assert.True(bypassLog.TryGetState("StatusCode", out var statusObj) && Convert.ToInt32(statusObj) == (int)HttpStatusCode.OK); @@ -274,18 +274,18 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime { var enforcementEnvironment = new Dictionary { - ["FEEDSER_AUTHORITY__ENABLED"] = "true", - ["FEEDSER_AUTHORITY__ALLOWANONYMOUSFALLBACK"] = "false", - ["FEEDSER_AUTHORITY__ISSUER"] = "https://authority.example", - ["FEEDSER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", - ["FEEDSER_AUTHORITY__AUDIENCES__0"] = "api://feedser", - ["FEEDSER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, - ["FEEDSER_AUTHORITY__CLIENTID"] = "feedser-jobs", - ["FEEDSER_AUTHORITY__CLIENTSECRET"] = "test-secret", - ["FEEDSER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, + ["CONCELIER_AUTHORITY__ENABLED"] = "true", + ["CONCELIER_AUTHORITY__ALLOWANONYMOUSFALLBACK"] = "false", + ["CONCELIER_AUTHORITY__ISSUER"] = "https://authority.example", + ["CONCELIER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", + ["CONCELIER_AUTHORITY__AUDIENCES__0"] = "api://concelier", + ["CONCELIER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, + ["CONCELIER_AUTHORITY__CLIENTID"] = "concelier-jobs", + ["CONCELIER_AUTHORITY__CLIENTSECRET"] = "test-secret", + ["CONCELIER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, }; - using var factory = new FeedserApplicationFactory( + using var factory = new ConcelierApplicationFactory( _runner.ConnectionString, authority => { @@ -294,16 +294,16 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime authority.Issuer = "https://authority.example"; authority.RequireHttpsMetadata = false; authority.Audiences.Clear(); - authority.Audiences.Add("api://feedser"); + authority.Audiences.Add("api://concelier"); authority.RequiredScopes.Clear(); - authority.RequiredScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + authority.RequiredScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); authority.BypassNetworks.Clear(); - authority.ClientId = "feedser-jobs"; + authority.ClientId = "concelier-jobs"; authority.ClientSecret = "test-secret"; }, enforcementEnvironment); - var resolved = factory.Services.GetRequiredService>().Value; + var resolved = factory.Services.GetRequiredService>().Value; Assert.False(resolved.Authority.AllowAnonymousFallback); using var client = factory.CreateClient(); @@ -312,7 +312,7 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); - var auditLogs = factory.LoggerProvider.Snapshot("Feedser.Authorization.Audit"); + var auditLogs = factory.LoggerProvider.Snapshot("Concelier.Authorization.Audit"); var enforcementLog = Assert.Single(auditLogs); Assert.True(enforcementLog.TryGetState("BypassAllowed", out var bypassAllowedObj) && bypassAllowedObj is bool bypassAllowed && bypassAllowed == false); Assert.True(enforcementLog.TryGetState("HasPrincipal", out var principalObj) && principalObj is bool hasPrincipal && hasPrincipal == false); @@ -323,21 +323,21 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime { var environment = new Dictionary { - ["FEEDSER_AUTHORITY__ENABLED"] = "true", - ["FEEDSER_AUTHORITY__ISSUER"] = "https://authority.example", - ["FEEDSER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", - ["FEEDSER_AUTHORITY__AUDIENCES__0"] = "api://feedser", - ["FEEDSER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, - ["FEEDSER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.FeedserJobsTrigger, - ["FEEDSER_AUTHORITY__BACKCHANNELTIMEOUTSECONDS"] = "45", - ["FEEDSER_AUTHORITY__RESILIENCE__ENABLERETRIES"] = "true", - ["FEEDSER_AUTHORITY__RESILIENCE__RETRYDELAYS__0"] = "00:00:02", - ["FEEDSER_AUTHORITY__RESILIENCE__RETRYDELAYS__1"] = "00:00:04", - ["FEEDSER_AUTHORITY__RESILIENCE__ALLOWOFFLINECACHEFALLBACK"] = "false", - ["FEEDSER_AUTHORITY__RESILIENCE__OFFLINECACHETOLERANCE"] = "00:02:30" + ["CONCELIER_AUTHORITY__ENABLED"] = "true", + ["CONCELIER_AUTHORITY__ISSUER"] = "https://authority.example", + ["CONCELIER_AUTHORITY__REQUIREHTTPSMETADATA"] = "false", + ["CONCELIER_AUTHORITY__AUDIENCES__0"] = "api://concelier", + ["CONCELIER_AUTHORITY__REQUIREDSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, + ["CONCELIER_AUTHORITY__CLIENTSCOPES__0"] = StellaOpsScopes.ConcelierJobsTrigger, + ["CONCELIER_AUTHORITY__BACKCHANNELTIMEOUTSECONDS"] = "45", + ["CONCELIER_AUTHORITY__RESILIENCE__ENABLERETRIES"] = "true", + ["CONCELIER_AUTHORITY__RESILIENCE__RETRYDELAYS__0"] = "00:00:02", + ["CONCELIER_AUTHORITY__RESILIENCE__RETRYDELAYS__1"] = "00:00:04", + ["CONCELIER_AUTHORITY__RESILIENCE__ALLOWOFFLINECACHEFALLBACK"] = "false", + ["CONCELIER_AUTHORITY__RESILIENCE__OFFLINECACHETOLERANCE"] = "00:02:30" }; - using var factory = new FeedserApplicationFactory( + using var factory = new ConcelierApplicationFactory( _runner.ConnectionString, authority => { @@ -345,11 +345,11 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime authority.Issuer = "https://authority.example"; authority.RequireHttpsMetadata = false; authority.Audiences.Clear(); - authority.Audiences.Add("api://feedser"); + authority.Audiences.Add("api://concelier"); authority.RequiredScopes.Clear(); - authority.RequiredScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + authority.RequiredScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); authority.ClientScopes.Clear(); - authority.ClientScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + authority.ClientScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); authority.BackchannelTimeoutSeconds = 45; }, environment); @@ -359,13 +359,13 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime Assert.Equal("https://authority.example", options.Authority); Assert.Equal(TimeSpan.FromSeconds(45), options.HttpTimeout); - Assert.Equal(new[] { StellaOpsScopes.FeedserJobsTrigger }, options.NormalizedScopes); + Assert.Equal(new[] { StellaOpsScopes.ConcelierJobsTrigger }, options.NormalizedScopes); Assert.Equal(new[] { TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(4) }, options.NormalizedRetryDelays); Assert.False(options.AllowOfflineCacheFallback); Assert.Equal(TimeSpan.FromSeconds(150), options.OfflineCacheTolerance); } - private sealed class FeedserApplicationFactory : WebApplicationFactory + private sealed class ConcelierApplicationFactory : WebApplicationFactory { private readonly string _connectionString; private readonly string? _previousDsn; @@ -375,31 +375,31 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime private readonly string? _previousTelemetryLogging; private readonly string? _previousTelemetryTracing; private readonly string? _previousTelemetryMetrics; - private readonly Action? _authorityConfigure; + private readonly Action? _authorityConfigure; private readonly IDictionary _additionalPreviousEnvironment = new Dictionary(StringComparer.OrdinalIgnoreCase); public CollectingLoggerProvider LoggerProvider { get; } = new(); - public FeedserApplicationFactory( + public ConcelierApplicationFactory( string connectionString, - Action? authorityConfigure = null, + Action? authorityConfigure = null, IDictionary? environmentOverrides = null) { _connectionString = connectionString; _authorityConfigure = authorityConfigure; - _previousDsn = Environment.GetEnvironmentVariable("FEEDSER_STORAGE__DSN"); - _previousDriver = Environment.GetEnvironmentVariable("FEEDSER_STORAGE__DRIVER"); - _previousTimeout = Environment.GetEnvironmentVariable("FEEDSER_STORAGE__COMMANDTIMEOUTSECONDS"); - _previousTelemetryEnabled = Environment.GetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLED"); - _previousTelemetryLogging = Environment.GetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLELOGGING"); - _previousTelemetryTracing = Environment.GetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLETRACING"); - _previousTelemetryMetrics = Environment.GetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLEMETRICS"); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__DSN", connectionString); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__DRIVER", "mongo"); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__COMMANDTIMEOUTSECONDS", "30"); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLED", "false"); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLELOGGING", "false"); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLETRACING", "false"); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLEMETRICS", "false"); + _previousDsn = Environment.GetEnvironmentVariable("CONCELIER_STORAGE__DSN"); + _previousDriver = Environment.GetEnvironmentVariable("CONCELIER_STORAGE__DRIVER"); + _previousTimeout = Environment.GetEnvironmentVariable("CONCELIER_STORAGE__COMMANDTIMEOUTSECONDS"); + _previousTelemetryEnabled = Environment.GetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLED"); + _previousTelemetryLogging = Environment.GetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLELOGGING"); + _previousTelemetryTracing = Environment.GetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLETRACING"); + _previousTelemetryMetrics = Environment.GetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLEMETRICS"); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__DSN", connectionString); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__DRIVER", "mongo"); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__COMMANDTIMEOUTSECONDS", "30"); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLED", "false"); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLELOGGING", "false"); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLETRACING", "false"); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLEMETRICS", "false"); if (environmentOverrides is not null) { foreach (var kvp in environmentOverrides) @@ -432,7 +432,7 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime { services.AddSingleton(); services.AddSingleton(sp => sp.GetRequiredService()); - services.PostConfigure(options => + services.PostConfigure(options => { options.Storage.Driver = "mongo"; options.Storage.Dsn = _connectionString; @@ -442,7 +442,7 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime options.Telemetry.EnableLogging = false; options.Telemetry.EnableTracing = false; options.Telemetry.EnableMetrics = false; - options.Authority ??= new FeedserOptions.AuthorityOptions(); + options.Authority ??= new ConcelierOptions.AuthorityOptions(); _authorityConfigure?.Invoke(options.Authority); }); }); @@ -456,13 +456,13 @@ public sealed class WebServiceEndpointsTests : IAsyncLifetime protected override void Dispose(bool disposing) { base.Dispose(disposing); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__DSN", _previousDsn); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__DRIVER", _previousDriver); - Environment.SetEnvironmentVariable("FEEDSER_STORAGE__COMMANDTIMEOUTSECONDS", _previousTimeout); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLED", _previousTelemetryEnabled); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLELOGGING", _previousTelemetryLogging); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLETRACING", _previousTelemetryTracing); - Environment.SetEnvironmentVariable("FEEDSER_TELEMETRY__ENABLEMETRICS", _previousTelemetryMetrics); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__DSN", _previousDsn); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__DRIVER", _previousDriver); + Environment.SetEnvironmentVariable("CONCELIER_STORAGE__COMMANDTIMEOUTSECONDS", _previousTimeout); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLED", _previousTelemetryEnabled); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLELOGGING", _previousTelemetryLogging); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLETRACING", _previousTelemetryTracing); + Environment.SetEnvironmentVariable("CONCELIER_TELEMETRY__ENABLEMETRICS", _previousTelemetryMetrics); foreach (var kvp in _additionalPreviousEnvironment) { Environment.SetEnvironmentVariable(kvp.Key, kvp.Value); diff --git a/src/StellaOps.Feedser.WebService/AGENTS.md b/src/StellaOps.Concelier.WebService/AGENTS.md similarity index 80% rename from src/StellaOps.Feedser.WebService/AGENTS.md rename to src/StellaOps.Concelier.WebService/AGENTS.md index c6bbeabf..49015f15 100644 --- a/src/StellaOps.Feedser.WebService/AGENTS.md +++ b/src/StellaOps.Concelier.WebService/AGENTS.md @@ -2,8 +2,8 @@ ## Role Minimal API host wiring configuration, storage, plugin routines, and job endpoints. Operational surface for health, readiness, and job control. ## Scope -- Configuration: appsettings.json + etc/feedser.yaml (yaml path = ../etc/feedser.yaml); bind into FeedserOptions with validation (Only Mongo supported). -- Mongo: MongoUrl from options.Storage.Dsn; IMongoClient/IMongoDatabase singletons; default database name fallback (options -> URL -> "feedser"). +- Configuration: appsettings.json + etc/concelier.yaml (yaml path = ../etc/concelier.yaml); bind into ConcelierOptions with validation (Only Mongo supported). +- Mongo: MongoUrl from options.Storage.Dsn; IMongoClient/IMongoDatabase singletons; default database name fallback (options -> URL -> "concelier"). - Services: AddMongoStorage(); AddSourceHttpClients(); RegisterPluginRoutines(configuration, PluginHostOptions). - Bootstrap: MongoBootstrapper.InitializeAsync on startup. - Endpoints (configuration & job control only; root path intentionally unbound): @@ -16,11 +16,11 @@ Minimal API host wiring configuration, storage, plugin routines, and job endpoin - GET /jobs/definitions/{kind}/runs?limit= -> recent runs or 404 if kind unknown. - GET /jobs/active -> currently running. - POST /jobs/{*jobKind} with {trigger?,parameters?} -> 202 Accepted (Location:/jobs/{runId}) | 404 | 409 | 423. -- PluginHost defaults: BaseDirectory = solution root; PluginsDirectory = "PluginBinaries"; SearchPatterns += "StellaOps.Feedser.Plugin.*.dll"; EnsureDirectoryExists = true. +- PluginHost defaults: BaseDirectory = solution root; PluginsDirectory = "PluginBinaries"; SearchPatterns += "StellaOps.Concelier.Plugin.*.dll"; EnsureDirectoryExists = true. ## Participants - Core job system; Storage.Mongo; Source.Common HTTP clients; Exporter and Connector plugin routines discover/register jobs. ## Interfaces & contracts -- Dependency injection boundary for all connectors/exporters; IOptions validated on start. +- Dependency injection boundary for all connectors/exporters; IOptions validated on start. - Cancellation: pass app.Lifetime.ApplicationStopping to bootstrapper. ## In/Out of scope In: hosting, DI composition, REST surface, readiness checks. @@ -29,6 +29,6 @@ Out: business logic of jobs, HTML UI, authn/z (future). - Log startup config (redact DSN credentials), plugin scan results (missing ordered plugins if any). - Structured responses with status codes; no stack traces in HTTP bodies; errors mapped cleanly. ## Tests -- Author and review coverage in `../StellaOps.Feedser.WebService.Tests`. -- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Feedser.Testing`. +- Author and review coverage in `../StellaOps.Concelier.WebService.Tests`. +- Shared fixtures (e.g., `MongoIntegrationFixture`, `ConnectorTestHarness`) live in `../StellaOps.Concelier.Testing`. - Keep fixtures deterministic; match new cases to real-world advisories or regression scenarios. diff --git a/src/StellaOps.Feedser.WebService/Diagnostics/HealthContracts.cs b/src/StellaOps.Concelier.WebService/Diagnostics/HealthContracts.cs similarity index 89% rename from src/StellaOps.Feedser.WebService/Diagnostics/HealthContracts.cs rename to src/StellaOps.Concelier.WebService/Diagnostics/HealthContracts.cs index 63707650..66f70931 100644 --- a/src/StellaOps.Feedser.WebService/Diagnostics/HealthContracts.cs +++ b/src/StellaOps.Concelier.WebService/Diagnostics/HealthContracts.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.WebService.Diagnostics; +namespace StellaOps.Concelier.WebService.Diagnostics; internal sealed record StorageBootstrapHealth( string Driver, diff --git a/src/StellaOps.Feedser.WebService/Diagnostics/JobMetrics.cs b/src/StellaOps.Concelier.WebService/Diagnostics/JobMetrics.cs similarity index 84% rename from src/StellaOps.Feedser.WebService/Diagnostics/JobMetrics.cs rename to src/StellaOps.Concelier.WebService/Diagnostics/JobMetrics.cs index cb85ff95..04ca6f43 100644 --- a/src/StellaOps.Feedser.WebService/Diagnostics/JobMetrics.cs +++ b/src/StellaOps.Concelier.WebService/Diagnostics/JobMetrics.cs @@ -1,10 +1,10 @@ using System.Diagnostics.Metrics; -namespace StellaOps.Feedser.WebService.Diagnostics; +namespace StellaOps.Concelier.WebService.Diagnostics; internal static class JobMetrics { - internal const string MeterName = "StellaOps.Feedser.WebService.Jobs"; + internal const string MeterName = "StellaOps.Concelier.WebService.Jobs"; private static readonly Meter Meter = new(MeterName); diff --git a/src/StellaOps.Feedser.WebService/Diagnostics/ProblemTypes.cs b/src/StellaOps.Concelier.WebService/Diagnostics/ProblemTypes.cs similarity index 90% rename from src/StellaOps.Feedser.WebService/Diagnostics/ProblemTypes.cs rename to src/StellaOps.Concelier.WebService/Diagnostics/ProblemTypes.cs index 8be947b9..bb3352b8 100644 --- a/src/StellaOps.Feedser.WebService/Diagnostics/ProblemTypes.cs +++ b/src/StellaOps.Concelier.WebService/Diagnostics/ProblemTypes.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.WebService.Diagnostics; +namespace StellaOps.Concelier.WebService.Diagnostics; internal static class ProblemTypes { diff --git a/src/StellaOps.Feedser.WebService/Diagnostics/ServiceStatus.cs b/src/StellaOps.Concelier.WebService/Diagnostics/ServiceStatus.cs similarity index 94% rename from src/StellaOps.Feedser.WebService/Diagnostics/ServiceStatus.cs rename to src/StellaOps.Concelier.WebService/Diagnostics/ServiceStatus.cs index 256d09bf..a7c6fbda 100644 --- a/src/StellaOps.Feedser.WebService/Diagnostics/ServiceStatus.cs +++ b/src/StellaOps.Concelier.WebService/Diagnostics/ServiceStatus.cs @@ -1,6 +1,6 @@ using System.Diagnostics; -namespace StellaOps.Feedser.WebService.Diagnostics; +namespace StellaOps.Concelier.WebService.Diagnostics; internal sealed class ServiceStatus { diff --git a/src/StellaOps.Feedser.WebService/Extensions/ConfigurationExtensions.cs b/src/StellaOps.Concelier.WebService/Extensions/ConfigurationExtensions.cs similarity index 83% rename from src/StellaOps.Feedser.WebService/Extensions/ConfigurationExtensions.cs rename to src/StellaOps.Concelier.WebService/Extensions/ConfigurationExtensions.cs index 155d7a49..cb8785ba 100644 --- a/src/StellaOps.Feedser.WebService/Extensions/ConfigurationExtensions.cs +++ b/src/StellaOps.Concelier.WebService/Extensions/ConfigurationExtensions.cs @@ -4,11 +4,11 @@ using Microsoft.Extensions.Configuration; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; -namespace StellaOps.Feedser.WebService.Extensions; +namespace StellaOps.Concelier.WebService.Extensions; public static class ConfigurationExtensions { - public static IConfigurationBuilder AddFeedserYaml(this IConfigurationBuilder builder, string path) + public static IConfigurationBuilder AddConcelierYaml(this IConfigurationBuilder builder, string path) { if (builder is null) { diff --git a/src/StellaOps.Concelier.WebService/Extensions/JobRegistrationExtensions.cs b/src/StellaOps.Concelier.WebService/Extensions/JobRegistrationExtensions.cs new file mode 100644 index 00000000..0e37680d --- /dev/null +++ b/src/StellaOps.Concelier.WebService/Extensions/JobRegistrationExtensions.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Merge.Jobs; + +namespace StellaOps.Concelier.WebService.Extensions; + +internal static class JobRegistrationExtensions +{ + private sealed record BuiltInJob( + string Kind, + string JobType, + string AssemblyName, + TimeSpan Timeout, + TimeSpan LeaseDuration, + string? CronExpression = null); + + private static readonly IReadOnlyList BuiltInJobs = new List + { + new("source:redhat:fetch", "StellaOps.Concelier.Source.Distro.RedHat.RedHatFetchJob", "StellaOps.Concelier.Source.Distro.RedHat", TimeSpan.FromMinutes(12), TimeSpan.FromMinutes(6), "0,15,30,45 * * * *"), + new("source:redhat:parse", "StellaOps.Concelier.Source.Distro.RedHat.RedHatParseJob", "StellaOps.Concelier.Source.Distro.RedHat", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(6), "5,20,35,50 * * * *"), + new("source:redhat:map", "StellaOps.Concelier.Source.Distro.RedHat.RedHatMapJob", "StellaOps.Concelier.Source.Distro.RedHat", TimeSpan.FromMinutes(20), TimeSpan.FromMinutes(6), "10,25,40,55 * * * *"), + + new("source:cert-in:fetch", "StellaOps.Concelier.Source.CertIn.CertInFetchJob", "StellaOps.Concelier.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:cert-in:parse", "StellaOps.Concelier.Source.CertIn.CertInParseJob", "StellaOps.Concelier.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:cert-in:map", "StellaOps.Concelier.Source.CertIn.CertInMapJob", "StellaOps.Concelier.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:cert-fr:fetch", "StellaOps.Concelier.Source.CertFr.CertFrFetchJob", "StellaOps.Concelier.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:cert-fr:parse", "StellaOps.Concelier.Source.CertFr.CertFrParseJob", "StellaOps.Concelier.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:cert-fr:map", "StellaOps.Concelier.Source.CertFr.CertFrMapJob", "StellaOps.Concelier.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:jvn:fetch", "StellaOps.Concelier.Source.Jvn.JvnFetchJob", "StellaOps.Concelier.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:jvn:parse", "StellaOps.Concelier.Source.Jvn.JvnParseJob", "StellaOps.Concelier.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:jvn:map", "StellaOps.Concelier.Source.Jvn.JvnMapJob", "StellaOps.Concelier.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:ics-kaspersky:fetch", "StellaOps.Concelier.Source.Ics.Kaspersky.KasperskyFetchJob", "StellaOps.Concelier.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:ics-kaspersky:parse", "StellaOps.Concelier.Source.Ics.Kaspersky.KasperskyParseJob", "StellaOps.Concelier.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:ics-kaspersky:map", "StellaOps.Concelier.Source.Ics.Kaspersky.KasperskyMapJob", "StellaOps.Concelier.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:osv:fetch", "StellaOps.Concelier.Source.Osv.OsvFetchJob", "StellaOps.Concelier.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:osv:parse", "StellaOps.Concelier.Source.Osv.OsvParseJob", "StellaOps.Concelier.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:osv:map", "StellaOps.Concelier.Source.Osv.OsvMapJob", "StellaOps.Concelier.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:vmware:fetch", "StellaOps.Concelier.Source.Vndr.Vmware.VmwareFetchJob", "StellaOps.Concelier.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:vmware:parse", "StellaOps.Concelier.Source.Vndr.Vmware.VmwareParseJob", "StellaOps.Concelier.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:vmware:map", "StellaOps.Concelier.Source.Vndr.Vmware.VmwareMapJob", "StellaOps.Concelier.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("source:vndr-oracle:fetch", "StellaOps.Concelier.Source.Vndr.Oracle.OracleFetchJob", "StellaOps.Concelier.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:vndr-oracle:parse", "StellaOps.Concelier.Source.Vndr.Oracle.OracleParseJob", "StellaOps.Concelier.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + new("source:vndr-oracle:map", "StellaOps.Concelier.Source.Vndr.Oracle.OracleMapJob", "StellaOps.Concelier.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), + + new("export:json", "StellaOps.Concelier.Exporter.Json.JsonExportJob", "StellaOps.Concelier.Exporter.Json", TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(5)), + new("export:trivy-db", "StellaOps.Concelier.Exporter.TrivyDb.TrivyDbExportJob", "StellaOps.Concelier.Exporter.TrivyDb", TimeSpan.FromMinutes(20), TimeSpan.FromMinutes(10)), + new("merge:reconcile", "StellaOps.Concelier.Merge.Jobs.MergeReconcileJob", "StellaOps.Concelier.Merge", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)) + }; + + public static IServiceCollection AddBuiltInConcelierJobs(this IServiceCollection services) + { + ArgumentNullException.ThrowIfNull(services); + + services.PostConfigure(options => + { + foreach (var registration in BuiltInJobs) + { + if (options.Definitions.ContainsKey(registration.Kind)) + { + continue; + } + + var jobType = Type.GetType( + $"{registration.JobType}, {registration.AssemblyName}", + throwOnError: false, + ignoreCase: false); + + if (jobType is null) + { + continue; + } + + var timeout = registration.Timeout > TimeSpan.Zero ? registration.Timeout : options.DefaultTimeout; + var lease = registration.LeaseDuration > TimeSpan.Zero ? registration.LeaseDuration : options.DefaultLeaseDuration; + + options.Definitions[registration.Kind] = new JobDefinition( + registration.Kind, + jobType, + timeout, + lease, + registration.CronExpression, + Enabled: true); + } + }); + + return services; + } +} diff --git a/src/StellaOps.Feedser.WebService/Extensions/TelemetryExtensions.cs b/src/StellaOps.Concelier.WebService/Extensions/TelemetryExtensions.cs similarity index 81% rename from src/StellaOps.Feedser.WebService/Extensions/TelemetryExtensions.cs rename to src/StellaOps.Concelier.WebService/Extensions/TelemetryExtensions.cs index 8d67a09b..46d3189b 100644 --- a/src/StellaOps.Feedser.WebService/Extensions/TelemetryExtensions.cs +++ b/src/StellaOps.Concelier.WebService/Extensions/TelemetryExtensions.cs @@ -10,21 +10,21 @@ using OpenTelemetry.Trace; using Serilog; using Serilog.Core; using Serilog.Events; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Source.Common.Telemetry; -using StellaOps.Feedser.WebService.Diagnostics; -using StellaOps.Feedser.WebService.Options; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Source.Common.Telemetry; +using StellaOps.Concelier.WebService.Diagnostics; +using StellaOps.Concelier.WebService.Options; -namespace StellaOps.Feedser.WebService.Extensions; +namespace StellaOps.Concelier.WebService.Extensions; public static class TelemetryExtensions { - public static void ConfigureFeedserTelemetry(this WebApplicationBuilder builder, FeedserOptions options) + public static void ConfigureConcelierTelemetry(this WebApplicationBuilder builder, ConcelierOptions options) { ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(options); - var telemetry = options.Telemetry ?? new FeedserOptions.TelemetryOptions(); + var telemetry = options.Telemetry ?? new ConcelierOptions.TelemetryOptions(); if (telemetry.EnableLogging) { @@ -84,11 +84,11 @@ public static class TelemetryExtensions metrics .AddMeter(JobDiagnostics.MeterName) .AddMeter(SourceDiagnostics.MeterName) - .AddMeter("StellaOps.Feedser.Source.CertBund") - .AddMeter("StellaOps.Feedser.Source.Nvd") - .AddMeter("StellaOps.Feedser.Source.Vndr.Chromium") - .AddMeter("StellaOps.Feedser.Source.Vndr.Apple") - .AddMeter("StellaOps.Feedser.Source.Vndr.Adobe") + .AddMeter("StellaOps.Concelier.Source.CertBund") + .AddMeter("StellaOps.Concelier.Source.Nvd") + .AddMeter("StellaOps.Concelier.Source.Vndr.Chromium") + .AddMeter("StellaOps.Concelier.Source.Vndr.Apple") + .AddMeter("StellaOps.Concelier.Source.Vndr.Adobe") .AddMeter(JobMetrics.MeterName) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() @@ -99,7 +99,7 @@ public static class TelemetryExtensions } } - private static void ConfigureSerilog(LoggerConfiguration configuration, FeedserOptions.TelemetryOptions telemetry, string environmentName, string applicationName) + private static void ConfigureSerilog(LoggerConfiguration configuration, ConcelierOptions.TelemetryOptions telemetry, string environmentName, string applicationName) { if (!Enum.TryParse(telemetry.MinimumLogLevel, ignoreCase: true, out LogEventLevel level)) { @@ -117,7 +117,7 @@ public static class TelemetryExtensions .WriteTo.Console(outputTemplate: "[{Timestamp:O}] [{Level:u3}] {Message:lj} {Properties}{NewLine}{Exception}"); } - private static void ConfigureExporters(FeedserOptions.TelemetryOptions telemetry, TracerProviderBuilder tracing) + private static void ConfigureExporters(ConcelierOptions.TelemetryOptions telemetry, TracerProviderBuilder tracing) { if (string.IsNullOrWhiteSpace(telemetry.OtlpEndpoint)) { @@ -145,7 +145,7 @@ public static class TelemetryExtensions } } - private static void ConfigureExporters(FeedserOptions.TelemetryOptions telemetry, MeterProviderBuilder metrics) + private static void ConfigureExporters(ConcelierOptions.TelemetryOptions telemetry, MeterProviderBuilder metrics) { if (string.IsNullOrWhiteSpace(telemetry.OtlpEndpoint)) { @@ -173,7 +173,7 @@ public static class TelemetryExtensions } } - private static string? BuildHeaders(FeedserOptions.TelemetryOptions telemetry) + private static string? BuildHeaders(ConcelierOptions.TelemetryOptions telemetry) { if (telemetry.OtlpHeaders.Count == 0) { diff --git a/src/StellaOps.Feedser.WebService/Filters/JobAuthorizationAuditFilter.cs b/src/StellaOps.Concelier.WebService/Filters/JobAuthorizationAuditFilter.cs similarity index 89% rename from src/StellaOps.Feedser.WebService/Filters/JobAuthorizationAuditFilter.cs rename to src/StellaOps.Concelier.WebService/Filters/JobAuthorizationAuditFilter.cs index 3ef28d2b..9a21a930 100644 --- a/src/StellaOps.Feedser.WebService/Filters/JobAuthorizationAuditFilter.cs +++ b/src/StellaOps.Concelier.WebService/Filters/JobAuthorizationAuditFilter.cs @@ -8,16 +8,16 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StellaOps.Auth.Abstractions; -using StellaOps.Feedser.WebService.Options; +using StellaOps.Concelier.WebService.Options; -namespace StellaOps.Feedser.WebService.Filters; +namespace StellaOps.Concelier.WebService.Filters; /// /// Emits structured audit logs for job endpoint authorization decisions, including bypass usage. /// public sealed class JobAuthorizationAuditFilter : IEndpointFilter { - internal const string LoggerName = "Feedser.Authorization.Audit"; + internal const string LoggerName = "Concelier.Authorization.Audit"; public async ValueTask InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next) { @@ -25,7 +25,7 @@ public sealed class JobAuthorizationAuditFilter : IEndpointFilter ArgumentNullException.ThrowIfNull(next); var httpContext = context.HttpContext; - var options = httpContext.RequestServices.GetRequiredService>().Value; + var options = httpContext.RequestServices.GetRequiredService>().Value; var authority = options.Authority; if (authority is null || !authority.Enabled) @@ -50,7 +50,7 @@ public sealed class JobAuthorizationAuditFilter : IEndpointFilter var clientId = user?.FindFirst(StellaOpsClaimTypes.ClientId)?.Value; logger.LogInformation( - "Feedser authorization audit route={Route} status={StatusCode} subject={Subject} clientId={ClientId} scopes={Scopes} bypass={Bypass} remote={RemoteAddress}", + "Concelier authorization audit route={Route} status={StatusCode} subject={Subject} clientId={ClientId} scopes={Scopes} bypass={Bypass} remote={RemoteAddress}", httpContext.Request.Path.Value ?? string.Empty, httpContext.Response.StatusCode, string.IsNullOrWhiteSpace(subject) ? "(anonymous)" : subject, diff --git a/src/StellaOps.Feedser.WebService/Jobs/JobDefinitionResponse.cs b/src/StellaOps.Concelier.WebService/Jobs/JobDefinitionResponse.cs similarity index 84% rename from src/StellaOps.Feedser.WebService/Jobs/JobDefinitionResponse.cs rename to src/StellaOps.Concelier.WebService/Jobs/JobDefinitionResponse.cs index 55101484..aece0cee 100644 --- a/src/StellaOps.Feedser.WebService/Jobs/JobDefinitionResponse.cs +++ b/src/StellaOps.Concelier.WebService/Jobs/JobDefinitionResponse.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.WebService.Jobs; +namespace StellaOps.Concelier.WebService.Jobs; public sealed record JobDefinitionResponse( string Kind, diff --git a/src/StellaOps.Feedser.WebService/Jobs/JobRunResponse.cs b/src/StellaOps.Concelier.WebService/Jobs/JobRunResponse.cs similarity index 86% rename from src/StellaOps.Feedser.WebService/Jobs/JobRunResponse.cs rename to src/StellaOps.Concelier.WebService/Jobs/JobRunResponse.cs index 9cb60ff0..bb83ff9e 100644 --- a/src/StellaOps.Feedser.WebService/Jobs/JobRunResponse.cs +++ b/src/StellaOps.Concelier.WebService/Jobs/JobRunResponse.cs @@ -1,6 +1,6 @@ -using StellaOps.Feedser.Core.Jobs; +using StellaOps.Concelier.Core.Jobs; -namespace StellaOps.Feedser.WebService.Jobs; +namespace StellaOps.Concelier.WebService.Jobs; public sealed record JobRunResponse( Guid RunId, diff --git a/src/StellaOps.Feedser.WebService/Jobs/JobTriggerRequest.cs b/src/StellaOps.Concelier.WebService/Jobs/JobTriggerRequest.cs similarity index 77% rename from src/StellaOps.Feedser.WebService/Jobs/JobTriggerRequest.cs rename to src/StellaOps.Concelier.WebService/Jobs/JobTriggerRequest.cs index 18c1e443..75c096ff 100644 --- a/src/StellaOps.Feedser.WebService/Jobs/JobTriggerRequest.cs +++ b/src/StellaOps.Concelier.WebService/Jobs/JobTriggerRequest.cs @@ -1,4 +1,4 @@ -namespace StellaOps.Feedser.WebService.Jobs; +namespace StellaOps.Concelier.WebService.Jobs; public sealed class JobTriggerRequest { diff --git a/src/StellaOps.Feedser.WebService/Options/FeedserOptions.cs b/src/StellaOps.Concelier.WebService/Options/ConcelierOptions.cs similarity index 95% rename from src/StellaOps.Feedser.WebService/Options/FeedserOptions.cs rename to src/StellaOps.Concelier.WebService/Options/ConcelierOptions.cs index e16a7567..e23d1acf 100644 --- a/src/StellaOps.Feedser.WebService/Options/FeedserOptions.cs +++ b/src/StellaOps.Concelier.WebService/Options/ConcelierOptions.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -namespace StellaOps.Feedser.WebService.Options; +namespace StellaOps.Concelier.WebService.Options; -public sealed class FeedserOptions +public sealed class ConcelierOptions { public StorageOptions Storage { get; set; } = new(); diff --git a/src/StellaOps.Feedser.WebService/Options/FeedserOptionsPostConfigure.cs b/src/StellaOps.Concelier.WebService/Options/ConcelierOptionsPostConfigure.cs similarity index 80% rename from src/StellaOps.Feedser.WebService/Options/FeedserOptionsPostConfigure.cs rename to src/StellaOps.Concelier.WebService/Options/ConcelierOptionsPostConfigure.cs index 6de16e6e..ac0959ce 100644 --- a/src/StellaOps.Feedser.WebService/Options/FeedserOptionsPostConfigure.cs +++ b/src/StellaOps.Concelier.WebService/Options/ConcelierOptionsPostConfigure.cs @@ -1,23 +1,23 @@ using System; using System.IO; -namespace StellaOps.Feedser.WebService.Options; +namespace StellaOps.Concelier.WebService.Options; /// -/// Post-configuration helpers for . +/// Post-configuration helpers for . /// -public static class FeedserOptionsPostConfigure +public static class ConcelierOptionsPostConfigure { /// /// Applies derived settings that require filesystem access, such as loading client secrets from disk. /// /// The options to mutate. /// Application content root used to resolve relative paths. - public static void Apply(FeedserOptions options, string contentRootPath) + public static void Apply(ConcelierOptions options, string contentRootPath) { ArgumentNullException.ThrowIfNull(options); - options.Authority ??= new FeedserOptions.AuthorityOptions(); + options.Authority ??= new ConcelierOptions.AuthorityOptions(); var authority = options.Authority; if (string.IsNullOrWhiteSpace(authority.ClientSecret) diff --git a/src/StellaOps.Feedser.WebService/Options/FeedserOptionsValidator.cs b/src/StellaOps.Concelier.WebService/Options/ConcelierOptionsValidator.cs similarity index 90% rename from src/StellaOps.Feedser.WebService/Options/FeedserOptionsValidator.cs rename to src/StellaOps.Concelier.WebService/Options/ConcelierOptionsValidator.cs index c66fc520..f480b0f6 100644 --- a/src/StellaOps.Feedser.WebService/Options/FeedserOptionsValidator.cs +++ b/src/StellaOps.Concelier.WebService/Options/ConcelierOptionsValidator.cs @@ -3,11 +3,11 @@ using System.Collections.Generic; using Microsoft.Extensions.Logging; using StellaOps.Auth.Abstractions; -namespace StellaOps.Feedser.WebService.Options; +namespace StellaOps.Concelier.WebService.Options; -public static class FeedserOptionsValidator +public static class ConcelierOptionsValidator { - public static void Validate(FeedserOptions options) + public static void Validate(ConcelierOptions options) { ArgumentNullException.ThrowIfNull(options); @@ -26,10 +26,10 @@ public static class FeedserOptionsValidator throw new InvalidOperationException("Command timeout must be greater than zero seconds."); } - options.Telemetry ??= new FeedserOptions.TelemetryOptions(); + options.Telemetry ??= new ConcelierOptions.TelemetryOptions(); - options.Authority ??= new FeedserOptions.AuthorityOptions(); - options.Authority.Resilience ??= new FeedserOptions.AuthorityOptions.ResilienceOptions(); + options.Authority ??= new ConcelierOptions.AuthorityOptions(); + options.Authority.Resilience ??= new ConcelierOptions.AuthorityOptions.ResilienceOptions(); NormalizeList(options.Authority.Audiences, toLower: false); NormalizeList(options.Authority.RequiredScopes, toLower: true); NormalizeList(options.Authority.BypassNetworks, toLower: false); @@ -38,7 +38,7 @@ public static class FeedserOptionsValidator if (options.Authority.RequiredScopes.Count == 0) { - options.Authority.RequiredScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + options.Authority.RequiredScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); } if (options.Authority.ClientScopes.Count == 0) @@ -51,7 +51,7 @@ public static class FeedserOptionsValidator if (options.Authority.ClientScopes.Count == 0) { - options.Authority.ClientScopes.Add(StellaOpsScopes.FeedserJobsTrigger); + options.Authority.ClientScopes.Add(StellaOpsScopes.ConcelierJobsTrigger); } if (options.Authority.BackchannelTimeoutSeconds <= 0) @@ -166,7 +166,7 @@ public static class FeedserOptionsValidator } } - private static void ValidateResilience(FeedserOptions.AuthorityOptions.ResilienceOptions resilience) + private static void ValidateResilience(ConcelierOptions.AuthorityOptions.ResilienceOptions resilience) { if (resilience.RetryDelays is null) { diff --git a/src/StellaOps.Feedser.WebService/Program.cs b/src/StellaOps.Concelier.WebService/Program.cs similarity index 85% rename from src/StellaOps.Feedser.WebService/Program.cs rename to src/StellaOps.Concelier.WebService/Program.cs index da49b26d..05cb54ce 100644 --- a/src/StellaOps.Feedser.WebService/Program.cs +++ b/src/StellaOps.Concelier.WebService/Program.cs @@ -13,16 +13,16 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.WebService.Diagnostics; +using StellaOps.Concelier.Core.Jobs; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.WebService.Diagnostics; using Serilog; -using StellaOps.Feedser.Merge; -using StellaOps.Feedser.Merge.Services; -using StellaOps.Feedser.WebService.Extensions; -using StellaOps.Feedser.WebService.Jobs; -using StellaOps.Feedser.WebService.Options; -using StellaOps.Feedser.WebService.Filters; +using StellaOps.Concelier.Merge; +using StellaOps.Concelier.Merge.Services; +using StellaOps.Concelier.WebService.Extensions; +using StellaOps.Concelier.WebService.Jobs; +using StellaOps.Concelier.WebService.Options; +using StellaOps.Concelier.WebService.Filters; using Serilog.Events; using StellaOps.Plugin.DependencyInjection; using StellaOps.Plugin.Hosting; @@ -33,67 +33,67 @@ using StellaOps.Auth.ServerIntegration; var builder = WebApplication.CreateBuilder(args); -const string JobsPolicyName = "Feedser.Jobs.Trigger"; +const string JobsPolicyName = "Concelier.Jobs.Trigger"; builder.Configuration.AddStellaOpsDefaults(options => { options.BasePath = builder.Environment.ContentRootPath; - options.EnvironmentPrefix = "FEEDSER_"; + options.EnvironmentPrefix = "CONCELIER_"; options.ConfigureBuilder = configurationBuilder => { - configurationBuilder.AddFeedserYaml(Path.Combine(builder.Environment.ContentRootPath, "../etc/feedser.yaml")); + configurationBuilder.AddConcelierYaml(Path.Combine(builder.Environment.ContentRootPath, "../etc/concelier.yaml")); }; }); var contentRootPath = builder.Environment.ContentRootPath; -var feedserOptions = builder.Configuration.BindOptions(postConfigure: (opts, _) => +var concelierOptions = builder.Configuration.BindOptions(postConfigure: (opts, _) => { - FeedserOptionsPostConfigure.Apply(opts, contentRootPath); - FeedserOptionsValidator.Validate(opts); + ConcelierOptionsPostConfigure.Apply(opts, contentRootPath); + ConcelierOptionsValidator.Validate(opts); }); -builder.Services.AddOptions() +builder.Services.AddOptions() .Bind(builder.Configuration) .PostConfigure(options => { - FeedserOptionsPostConfigure.Apply(options, contentRootPath); - FeedserOptionsValidator.Validate(options); + ConcelierOptionsPostConfigure.Apply(options, contentRootPath); + ConcelierOptionsValidator.Validate(options); }) .ValidateOnStart(); -builder.ConfigureFeedserTelemetry(feedserOptions); +builder.ConfigureConcelierTelemetry(concelierOptions); builder.Services.AddMongoStorage(storageOptions => { - storageOptions.ConnectionString = feedserOptions.Storage.Dsn; - storageOptions.DatabaseName = feedserOptions.Storage.Database; - storageOptions.CommandTimeout = TimeSpan.FromSeconds(feedserOptions.Storage.CommandTimeoutSeconds); + storageOptions.ConnectionString = concelierOptions.Storage.Dsn; + storageOptions.DatabaseName = concelierOptions.Storage.Database; + storageOptions.CommandTimeout = TimeSpan.FromSeconds(concelierOptions.Storage.CommandTimeoutSeconds); }); builder.Services.AddMergeModule(builder.Configuration); builder.Services.AddJobScheduler(); -builder.Services.AddBuiltInFeedserJobs(); +builder.Services.AddBuiltInConcelierJobs(); builder.Services.AddSingleton(sp => new ServiceStatus(sp.GetRequiredService())); -var authorityConfigured = feedserOptions.Authority is { Enabled: true }; +var authorityConfigured = concelierOptions.Authority is { Enabled: true }; if (authorityConfigured) { builder.Services.AddStellaOpsAuthClient(clientOptions => { - clientOptions.Authority = feedserOptions.Authority.Issuer; - clientOptions.ClientId = feedserOptions.Authority.ClientId ?? string.Empty; - clientOptions.ClientSecret = feedserOptions.Authority.ClientSecret; - clientOptions.HttpTimeout = TimeSpan.FromSeconds(feedserOptions.Authority.BackchannelTimeoutSeconds); + clientOptions.Authority = concelierOptions.Authority.Issuer; + clientOptions.ClientId = concelierOptions.Authority.ClientId ?? string.Empty; + clientOptions.ClientSecret = concelierOptions.Authority.ClientSecret; + clientOptions.HttpTimeout = TimeSpan.FromSeconds(concelierOptions.Authority.BackchannelTimeoutSeconds); clientOptions.DefaultScopes.Clear(); - foreach (var scope in feedserOptions.Authority.ClientScopes) + foreach (var scope in concelierOptions.Authority.ClientScopes) { clientOptions.DefaultScopes.Add(scope); } - var resilience = feedserOptions.Authority.Resilience ?? new FeedserOptions.AuthorityOptions.ResilienceOptions(); + var resilience = concelierOptions.Authority.Resilience ?? new ConcelierOptions.AuthorityOptions.ResilienceOptions(); if (resilience.EnableRetries.HasValue) { clientOptions.EnableRetries = resilience.EnableRetries.Value; @@ -124,27 +124,27 @@ if (authorityConfigured) configurationSection: null, configure: resourceOptions => { - resourceOptions.Authority = feedserOptions.Authority.Issuer; - resourceOptions.RequireHttpsMetadata = feedserOptions.Authority.RequireHttpsMetadata; - resourceOptions.BackchannelTimeout = TimeSpan.FromSeconds(feedserOptions.Authority.BackchannelTimeoutSeconds); - resourceOptions.TokenClockSkew = TimeSpan.FromSeconds(feedserOptions.Authority.TokenClockSkewSeconds); + resourceOptions.Authority = concelierOptions.Authority.Issuer; + resourceOptions.RequireHttpsMetadata = concelierOptions.Authority.RequireHttpsMetadata; + resourceOptions.BackchannelTimeout = TimeSpan.FromSeconds(concelierOptions.Authority.BackchannelTimeoutSeconds); + resourceOptions.TokenClockSkew = TimeSpan.FromSeconds(concelierOptions.Authority.TokenClockSkewSeconds); - if (!string.IsNullOrWhiteSpace(feedserOptions.Authority.MetadataAddress)) + if (!string.IsNullOrWhiteSpace(concelierOptions.Authority.MetadataAddress)) { - resourceOptions.MetadataAddress = feedserOptions.Authority.MetadataAddress; + resourceOptions.MetadataAddress = concelierOptions.Authority.MetadataAddress; } - foreach (var audience in feedserOptions.Authority.Audiences) + foreach (var audience in concelierOptions.Authority.Audiences) { resourceOptions.Audiences.Add(audience); } - foreach (var scope in feedserOptions.Authority.RequiredScopes) + foreach (var scope in concelierOptions.Authority.RequiredScopes) { resourceOptions.RequiredScopes.Add(scope); } - foreach (var network in feedserOptions.Authority.BypassNetworks) + foreach (var network in concelierOptions.Authority.BypassNetworks) { resourceOptions.BypassNetworks.Add(network); } @@ -152,19 +152,19 @@ if (authorityConfigured) builder.Services.AddAuthorization(options => { - options.AddStellaOpsScopePolicy(JobsPolicyName, feedserOptions.Authority.RequiredScopes.ToArray()); + options.AddStellaOpsScopePolicy(JobsPolicyName, concelierOptions.Authority.RequiredScopes.ToArray()); }); } -var pluginHostOptions = BuildPluginOptions(feedserOptions, builder.Environment.ContentRootPath); +var pluginHostOptions = BuildPluginOptions(concelierOptions, builder.Environment.ContentRootPath); builder.Services.RegisterPluginRoutines(builder.Configuration, pluginHostOptions); builder.Services.AddEndpointsApiExplorer(); var app = builder.Build(); -var resolvedFeedserOptions = app.Services.GetRequiredService>().Value; -var resolvedAuthority = resolvedFeedserOptions.Authority ?? new FeedserOptions.AuthorityOptions(); +var resolvedConcelierOptions = app.Services.GetRequiredService>().Value; +var resolvedAuthority = resolvedConcelierOptions.Authority ?? new ConcelierOptions.AuthorityOptions(); authorityConfigured = resolvedAuthority.Enabled; var enforceAuthority = resolvedAuthority.Enabled && !resolvedAuthority.AllowAnonymousFallback; @@ -177,7 +177,7 @@ if (resolvedAuthority.Enabled && resolvedAuthority.AllowAnonymousFallback) var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); jsonOptions.Converters.Add(new JsonStringEnumConverter()); -var loggingEnabled = feedserOptions.Telemetry?.EnableLogging ?? true; +var loggingEnabled = concelierOptions.Telemetry?.EnableLogging ?? true; if (loggingEnabled) { @@ -238,7 +238,7 @@ if (authorityConfigured) return; } - var optionsMonitor = context.RequestServices.GetRequiredService>().Value.Authority; + var optionsMonitor = context.RequestServices.GetRequiredService>().Value.Authority; if (optionsMonitor is null || !optionsMonitor.Enabled) { return; @@ -253,7 +253,7 @@ if (authorityConfigured) var bypassAllowed = matcher.IsAllowed(remote); logger.LogWarning( - "Feedser authorization denied route={Route} remote={RemoteAddress} bypassAllowed={BypassAllowed} hasPrincipal={HasPrincipal}", + "Concelier authorization denied route={Route} remote={RemoteAddress} bypassAllowed={BypassAllowed} hasPrincipal={HasPrincipal}", context.Request.Path.Value ?? string.Empty, remote?.ToString() ?? "unknown", bypassAllowed, @@ -326,7 +326,7 @@ void ApplyNoCache(HttpResponse response) await InitializeMongoAsync(app); -app.MapGet("/health", (IOptions opts, ServiceStatus status, HttpContext context) => +app.MapGet("/health", (IOptions opts, ServiceStatus status, HttpContext context) => { ApplyNoCache(context.Response); @@ -656,7 +656,7 @@ if (enforceAuthority) await app.RunAsync(); -static PluginHostOptions BuildPluginOptions(FeedserOptions options, string contentRoot) +static PluginHostOptions BuildPluginOptions(ConcelierOptions options, string contentRoot) { var pluginOptions = new PluginHostOptions { @@ -668,7 +668,7 @@ static PluginHostOptions BuildPluginOptions(FeedserOptions options, string conte if (options.Plugins.SearchPatterns.Count == 0) { - pluginOptions.SearchPatterns.Add("StellaOps.Feedser.Plugin.*.dll"); + pluginOptions.SearchPatterns.Add("StellaOps.Concelier.Plugin.*.dll"); } else { diff --git a/src/StellaOps.Feedser.WebService/Properties/launchSettings.json b/src/StellaOps.Concelier.WebService/Properties/launchSettings.json similarity index 83% rename from src/StellaOps.Feedser.WebService/Properties/launchSettings.json rename to src/StellaOps.Concelier.WebService/Properties/launchSettings.json index 261bc6f8..6801613e 100644 --- a/src/StellaOps.Feedser.WebService/Properties/launchSettings.json +++ b/src/StellaOps.Concelier.WebService/Properties/launchSettings.json @@ -1,6 +1,6 @@ { "profiles": { - "StellaOps.Feedser.WebService": { + "StellaOps.Concelier.WebService": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { diff --git a/src/StellaOps.Feedser.WebService/StellaOps.Feedser.WebService.csproj b/src/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj similarity index 75% rename from src/StellaOps.Feedser.WebService/StellaOps.Feedser.WebService.csproj rename to src/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj index d63572e7..004232a0 100644 --- a/src/StellaOps.Feedser.WebService/StellaOps.Feedser.WebService.csproj +++ b/src/StellaOps.Concelier.WebService/StellaOps.Concelier.WebService.csproj @@ -5,7 +5,7 @@ enable enable true - StellaOps.Feedser.WebService + StellaOps.Concelier.WebService @@ -21,11 +21,11 @@ - - - - - + + + + + diff --git a/src/StellaOps.Feedser.WebService/TASKS.md b/src/StellaOps.Concelier.WebService/TASKS.md similarity index 50% rename from src/StellaOps.Feedser.WebService/TASKS.md rename to src/StellaOps.Concelier.WebService/TASKS.md index 8191864c..1404da04 100644 --- a/src/StellaOps.Feedser.WebService/TASKS.md +++ b/src/StellaOps.Concelier.WebService/TASKS.md @@ -1,24 +1,24 @@ # TASKS | Task | Owner(s) | Depends on | Notes | |---|---|---|---| -|Bind & validate FeedserOptions|BE-Base|WebService|DONE – options bound/validated with failure logging.| +|Bind & validate ConcelierOptions|BE-Base|WebService|DONE – options bound/validated with failure logging.| |Mongo service wiring|BE-Base|Storage.Mongo|DONE – wiring delegated to `AddMongoStorage`.| |Bootstrapper execution on start|BE-Base|Storage.Mongo|DONE – startup calls `MongoBootstrapper.InitializeAsync`.| |Plugin host options finalization|BE-Base|Plugins|DONE – default plugin directories/search patterns configured.| |Jobs API contract tests|QA|Core|DONE – WebServiceEndpointsTests now cover success payloads, filtering, and trigger outcome mapping.| |Health/Ready probes|DevOps|Ops|DONE – `/health` and `/ready` endpoints implemented.| |Serilog + OTEL integration hooks|BE-Base|Observability|DONE – `TelemetryExtensions` wires Serilog + OTEL with configurable exporters.| -|Register built-in jobs (sources/exporters)|BE-Base|Core|DONE – AddBuiltInFeedserJobs adds fallback scheduler definitions for core connectors and exporters via reflection.| +|Register built-in jobs (sources/exporters)|BE-Base|Core|DONE – AddBuiltInConcelierJobs adds fallback scheduler definitions for core connectors and exporters via reflection.| |HTTP problem details consistency|BE-Base|WebService|DONE – API errors now emit RFC7807 responses with trace identifiers and typed problem categories.| |Request logging and metrics|BE-Base|Observability|DONE – Serilog request logging enabled with enriched context and web.jobs counters published via OpenTelemetry.| |Endpoint smoke tests (health/ready/jobs error paths)|QA|WebService|DONE – WebServiceEndpointsTests assert success and problem responses for health, ready, and job trigger error paths.| |Batch job definition last-run lookup|BE-Base|Core|DONE – definitions endpoint now precomputes kinds array and reuses batched last-run dictionary; manual smoke verified via local GET `/jobs/definitions`.| |Add no-cache headers to health/readiness/jobs APIs|BE-Base|WebService|DONE – helper applies Cache-Control/Pragma/Expires on all health/ready/jobs endpoints; awaiting automated probe tests once connector fixtures stabilize.| -|Authority configuration parity (FSR1)|DevEx/Feedser|Authority options schema|**DONE (2025-10-10)** – Options post-config loads clientSecretFile fallback, validators normalize scopes/audiences, and sample config documents issuer/credential/bypass settings.| -|Document authority toggle & scope requirements|Docs/Feedser|Authority integration|**DOING (2025-10-10)** – Quickstart updated with staging flag, client credentials, env overrides; operator guide refresh pending Docs guild review.| +|Authority configuration parity (FSR1)|DevEx/Concelier|Authority options schema|**DONE (2025-10-10)** – Options post-config loads clientSecretFile fallback, validators normalize scopes/audiences, and sample config documents issuer/credential/bypass settings.| +|Document authority toggle & scope requirements|Docs/Concelier|Authority integration|**DOING (2025-10-10)** – Quickstart updated with staging flag, client credentials, env overrides; operator guide refresh pending Docs guild review.| |Plumb Authority client resilience options|BE-Base|Auth libraries LIB5|**DONE (2025-10-12)** – `Program.cs` wires `authority.resilience.*` + client scopes into `AddStellaOpsAuthClient`; new integration test asserts binding and retries.| -|Author ops guidance for resilience tuning|Docs/Feedser|Plumb Authority client resilience options|**DONE (2025-10-12)** – `docs/21_INSTALL_GUIDE.md` + `docs/ops/feedser-authority-audit-runbook.md` document resilience profiles for connected vs air-gapped installs and reference monitoring cues.| -|Document authority bypass logging patterns|Docs/Feedser|FSR3 logging|**DONE (2025-10-12)** – Updated operator guides clarify `Feedser.Authorization.Audit` fields (route/status/subject/clientId/scopes/bypass/remote) and SIEM triggers.| -|Update Feedser operator guide for enforcement cutoff|Docs/Feedser|FSR1 rollout|**DONE (2025-10-12)** – Installation guide emphasises disabling `allowAnonymousFallback` before 2025-12-31 UTC and connects audit signals to the rollout checklist.| -|Rename plugin drop directory to namespaced path|BE-Base|Plugins|**TODO** – Point Feedser source/exporter build outputs to `StellaOps.Feedser.PluginBinaries`, update PluginHost defaults/search patterns to match, ensure Offline Kit packaging/tests expect the new folder, and document migration guidance for operators.| -|Authority resilience adoption|Feedser WebService, Docs|Plumb Authority client resilience options|**BLOCKED (2025-10-10)** – Roll out retry/offline knobs to deployment docs and confirm CLI parity once LIB5 lands; unblock after resilience options wired and tested.| +|Author ops guidance for resilience tuning|Docs/Concelier|Plumb Authority client resilience options|**DONE (2025-10-12)** – `docs/21_INSTALL_GUIDE.md` + `docs/ops/concelier-authority-audit-runbook.md` document resilience profiles for connected vs air-gapped installs and reference monitoring cues.| +|Document authority bypass logging patterns|Docs/Concelier|FSR3 logging|**DONE (2025-10-12)** – Updated operator guides clarify `Concelier.Authorization.Audit` fields (route/status/subject/clientId/scopes/bypass/remote) and SIEM triggers.| +|Update Concelier operator guide for enforcement cutoff|Docs/Concelier|FSR1 rollout|**DONE (2025-10-12)** – Installation guide emphasises disabling `allowAnonymousFallback` before 2025-12-31 UTC and connects audit signals to the rollout checklist.| +|Rename plugin drop directory to namespaced path|BE-Base|Plugins|**TODO** – Point Concelier source/exporter build outputs to `StellaOps.Concelier.PluginBinaries`, update PluginHost defaults/search patterns to match, ensure Offline Kit packaging/tests expect the new folder, and document migration guidance for operators.| +|Authority resilience adoption|Concelier WebService, Docs|Plumb Authority client resilience options|**BLOCKED (2025-10-10)** – Roll out retry/offline knobs to deployment docs and confirm CLI parity once LIB5 lands; unblock after resilience options wired and tested.| diff --git a/src/StellaOps.Feedser.sln b/src/StellaOps.Concelier.sln similarity index 83% rename from src/StellaOps.Feedser.sln rename to src/StellaOps.Concelier.sln index e60b3b4e..eea77512 100644 --- a/src/StellaOps.Feedser.sln +++ b/src/StellaOps.Concelier.sln @@ -3,127 +3,127 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Acsc", "StellaOps.Feedser.Source.Acsc\StellaOps.Feedser.Source.Acsc.csproj", "{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Acsc", "StellaOps.Concelier.Source.Acsc\StellaOps.Concelier.Source.Acsc.csproj", "{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common", "StellaOps.Feedser.Source.Common\StellaOps.Feedser.Source.Common.csproj", "{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common", "StellaOps.Concelier.Source.Common\StellaOps.Concelier.Source.Common.csproj", "{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models", "StellaOps.Feedser.Models\StellaOps.Feedser.Models.csproj", "{061B0042-9A6C-4CFD-9E48-4D3F3B924442}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{061B0042-9A6C-4CFD-9E48-4D3F3B924442}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Cisa", "StellaOps.Feedser.Source.Ics.Cisa\StellaOps.Feedser.Source.Ics.Cisa.csproj", "{6A301F32-2EEE-491B-9DB9-3BF26D032F07}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Cisa", "StellaOps.Concelier.Source.Ics.Cisa\StellaOps.Concelier.Source.Ics.Cisa.csproj", "{6A301F32-2EEE-491B-9DB9-3BF26D032F07}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{AFCCC916-58E8-4676-AABB-54B04CEA3392}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{AFCCC916-58E8-4676-AABB-54B04CEA3392}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo", "StellaOps.Feedser.Storage.Mongo\StellaOps.Feedser.Storage.Mongo.csproj", "{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo", "StellaOps.Concelier.Storage.Mongo\StellaOps.Concelier.Storage.Mongo.csproj", "{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization", "StellaOps.Feedser.Normalization\StellaOps.Feedser.Normalization.csproj", "{429BAA6A-706D-489A-846F-4B0EF1B15121}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{429BAA6A-706D-489A-846F-4B0EF1B15121}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Merge", "StellaOps.Feedser.Merge\StellaOps.Feedser.Merge.csproj", "{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge", "StellaOps.Concelier.Merge\StellaOps.Concelier.Merge.csproj", "{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.Json", "StellaOps.Feedser.Exporter.Json\StellaOps.Feedser.Exporter.Json.csproj", "{1C5506B8-C01B-4419-B888-A48F441E0C69}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json", "StellaOps.Concelier.Exporter.Json\StellaOps.Concelier.Exporter.Json.csproj", "{1C5506B8-C01B-4419-B888-A48F441E0C69}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.TrivyDb", "StellaOps.Feedser.Exporter.TrivyDb\StellaOps.Feedser.Exporter.TrivyDb.csproj", "{4D936BC4-5520-4642-A237-4106E97BC7A0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb", "StellaOps.Concelier.Exporter.TrivyDb\StellaOps.Concelier.Exporter.TrivyDb.csproj", "{4D936BC4-5520-4642-A237-4106E97BC7A0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Plugin", "StellaOps.Plugin\StellaOps.Plugin.csproj", "{B85C1C0E-B245-44FB-877E-C112DE29041A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.WebService", "StellaOps.Feedser.WebService\StellaOps.Feedser.WebService.csproj", "{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService", "StellaOps.Concelier.WebService\StellaOps.Concelier.WebService.csproj", "{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cccs", "StellaOps.Feedser.Source.Cccs\StellaOps.Feedser.Source.Cccs.csproj", "{A7035381-6D20-4A07-817B-A324ED735EB3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Cccs", "StellaOps.Concelier.Source.Cccs\StellaOps.Concelier.Source.Cccs.csproj", "{A7035381-6D20-4A07-817B-A324ED735EB3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Debian", "StellaOps.Feedser.Source.Distro.Debian\StellaOps.Feedser.Source.Distro.Debian.csproj", "{404F5F6E-37E4-4EF9-B09D-6634366B5D44}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Debian", "StellaOps.Concelier.Source.Distro.Debian\StellaOps.Concelier.Source.Distro.Debian.csproj", "{404F5F6E-37E4-4EF9-B09D-6634366B5D44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Ubuntu", "StellaOps.Feedser.Source.Distro.Ubuntu\StellaOps.Feedser.Source.Distro.Ubuntu.csproj", "{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Ubuntu", "StellaOps.Concelier.Source.Distro.Ubuntu\StellaOps.Concelier.Source.Distro.Ubuntu.csproj", "{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kisa", "StellaOps.Feedser.Source.Kisa\StellaOps.Feedser.Source.Kisa.csproj", "{23055A20-7079-4336-AD30-EFAA2FA11665}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Kisa", "StellaOps.Concelier.Source.Kisa\StellaOps.Concelier.Source.Kisa.csproj", "{23055A20-7079-4336-AD30-EFAA2FA11665}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertCc", "StellaOps.Feedser.Source.CertCc\StellaOps.Feedser.Source.CertCc.csproj", "{C2304954-9B15-4776-8DB6-22E293D311E4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertCc", "StellaOps.Concelier.Source.CertCc\StellaOps.Concelier.Source.CertCc.csproj", "{C2304954-9B15-4776-8DB6-22E293D311E4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertFr", "StellaOps.Feedser.Source.CertFr\StellaOps.Feedser.Source.CertFr.csproj", "{E6895821-ED23-46D2-A5DC-06D61F90EC27}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertFr", "StellaOps.Concelier.Source.CertFr\StellaOps.Concelier.Source.CertFr.csproj", "{E6895821-ED23-46D2-A5DC-06D61F90EC27}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Nvd", "StellaOps.Feedser.Source.Nvd\StellaOps.Feedser.Source.Nvd.csproj", "{378CB675-D70B-4A95-B324-62B67D79AAB7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Nvd", "StellaOps.Concelier.Source.Nvd\StellaOps.Concelier.Source.Nvd.csproj", "{378CB675-D70B-4A95-B324-62B67D79AAB7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Oracle", "StellaOps.Feedser.Source.Vndr.Oracle\StellaOps.Feedser.Source.Vndr.Oracle.csproj", "{53AD2E55-B0F5-46AD-BFE5-82F486371872}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Oracle", "StellaOps.Concelier.Source.Vndr.Oracle\StellaOps.Concelier.Source.Vndr.Oracle.csproj", "{53AD2E55-B0F5-46AD-BFE5-82F486371872}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Nkcki", "StellaOps.Feedser.Source.Ru.Nkcki\StellaOps.Feedser.Source.Ru.Nkcki.csproj", "{B880C99C-C0BD-4953-95AD-2C76BC43F760}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Nkcki", "StellaOps.Concelier.Source.Ru.Nkcki\StellaOps.Concelier.Source.Ru.Nkcki.csproj", "{B880C99C-C0BD-4953-95AD-2C76BC43F760}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Suse", "StellaOps.Feedser.Source.Distro.Suse\StellaOps.Feedser.Source.Distro.Suse.csproj", "{23422F67-C1FB-4FF4-899C-706BCD63D9FD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Suse", "StellaOps.Concelier.Source.Distro.Suse\StellaOps.Concelier.Source.Distro.Suse.csproj", "{23422F67-C1FB-4FF4-899C-706BCD63D9FD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Bdu", "StellaOps.Feedser.Source.Ru.Bdu\StellaOps.Feedser.Source.Ru.Bdu.csproj", "{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Bdu", "StellaOps.Concelier.Source.Ru.Bdu\StellaOps.Concelier.Source.Ru.Bdu.csproj", "{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kev", "StellaOps.Feedser.Source.Kev\StellaOps.Feedser.Source.Kev.csproj", "{20DB9837-715B-4515-98C6-14B50060B765}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Kev", "StellaOps.Concelier.Source.Kev\StellaOps.Concelier.Source.Kev.csproj", "{20DB9837-715B-4515-98C6-14B50060B765}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Kaspersky", "StellaOps.Feedser.Source.Ics.Kaspersky\StellaOps.Feedser.Source.Ics.Kaspersky.csproj", "{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Kaspersky", "StellaOps.Concelier.Source.Ics.Kaspersky\StellaOps.Concelier.Source.Ics.Kaspersky.csproj", "{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Osv", "StellaOps.Feedser.Source.Osv\StellaOps.Feedser.Source.Osv.csproj", "{EFB16EDB-78D4-4601-852E-F4B37655FA13}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Osv", "StellaOps.Concelier.Source.Osv\StellaOps.Concelier.Source.Osv.csproj", "{EFB16EDB-78D4-4601-852E-F4B37655FA13}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Jvn", "StellaOps.Feedser.Source.Jvn\StellaOps.Feedser.Source.Jvn.csproj", "{02289F61-0173-42CC-B8F2-25CC53F8E066}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Jvn", "StellaOps.Concelier.Source.Jvn\StellaOps.Concelier.Source.Jvn.csproj", "{02289F61-0173-42CC-B8F2-25CC53F8E066}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertBund", "StellaOps.Feedser.Source.CertBund\StellaOps.Feedser.Source.CertBund.csproj", "{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertBund", "StellaOps.Concelier.Source.CertBund\StellaOps.Concelier.Source.CertBund.csproj", "{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cve", "StellaOps.Feedser.Source.Cve\StellaOps.Feedser.Source.Cve.csproj", "{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Cve", "StellaOps.Concelier.Source.Cve\StellaOps.Concelier.Source.Cve.csproj", "{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Cisco", "StellaOps.Feedser.Source.Vndr.Cisco\StellaOps.Feedser.Source.Vndr.Cisco.csproj", "{19957518-A422-4622-9FD1-621DF3E31869}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Cisco", "StellaOps.Concelier.Source.Vndr.Cisco\StellaOps.Concelier.Source.Vndr.Cisco.csproj", "{19957518-A422-4622-9FD1-621DF3E31869}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Msrc", "StellaOps.Feedser.Source.Vndr.Msrc\StellaOps.Feedser.Source.Vndr.Msrc.csproj", "{69C4C061-F5A0-4EAA-A4CD-9A513523952A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Msrc", "StellaOps.Concelier.Source.Vndr.Msrc\StellaOps.Concelier.Source.Vndr.Msrc.csproj", "{69C4C061-F5A0-4EAA-A4CD-9A513523952A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Chromium", "StellaOps.Feedser.Source.Vndr.Chromium\StellaOps.Feedser.Source.Vndr.Chromium.csproj", "{C7F7DE6F-A369-4F43-9864-286DCEC615F8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Chromium", "StellaOps.Concelier.Source.Vndr.Chromium\StellaOps.Concelier.Source.Vndr.Chromium.csproj", "{C7F7DE6F-A369-4F43-9864-286DCEC615F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Apple", "StellaOps.Feedser.Source.Vndr.Apple\StellaOps.Feedser.Source.Vndr.Apple.csproj", "{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Apple", "StellaOps.Concelier.Source.Vndr.Apple\StellaOps.Concelier.Source.Vndr.Apple.csproj", "{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Vmware", "StellaOps.Feedser.Source.Vndr.Vmware\StellaOps.Feedser.Source.Vndr.Vmware.csproj", "{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Vmware", "StellaOps.Concelier.Source.Vndr.Vmware\StellaOps.Concelier.Source.Vndr.Vmware.csproj", "{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Adobe", "StellaOps.Feedser.Source.Vndr.Adobe\StellaOps.Feedser.Source.Vndr.Adobe.csproj", "{C3A42AA3-800D-4398-A077-5560EE6451EF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Adobe", "StellaOps.Concelier.Source.Vndr.Adobe\StellaOps.Concelier.Source.Vndr.Adobe.csproj", "{C3A42AA3-800D-4398-A077-5560EE6451EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertIn", "StellaOps.Feedser.Source.CertIn\StellaOps.Feedser.Source.CertIn.csproj", "{5016963A-6FC9-4063-AB83-2D1F9A2BC627}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertIn", "StellaOps.Concelier.Source.CertIn\StellaOps.Concelier.Source.CertIn.csproj", "{5016963A-6FC9-4063-AB83-2D1F9A2BC627}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ghsa", "StellaOps.Feedser.Source.Ghsa\StellaOps.Feedser.Source.Ghsa.csproj", "{72F43F43-F852-487F-8334-91D438CE2F7C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ghsa", "StellaOps.Concelier.Source.Ghsa\StellaOps.Concelier.Source.Ghsa.csproj", "{72F43F43-F852-487F-8334-91D438CE2F7C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.RedHat", "StellaOps.Feedser.Source.Distro.RedHat\StellaOps.Feedser.Source.Distro.RedHat.csproj", "{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.RedHat", "StellaOps.Concelier.Source.Distro.RedHat\StellaOps.Concelier.Source.Distro.RedHat.csproj", "{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.DependencyInjection", "StellaOps.DependencyInjection\StellaOps.DependencyInjection.csproj", "{F622D38D-DA49-473E-B724-E706F8113CF2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core.Tests", "StellaOps.Feedser.Core.Tests\StellaOps.Feedser.Core.Tests.csproj", "{3A3D7610-C864-4413-B07E-9E8C2A49A90E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core.Tests", "StellaOps.Concelier.Core.Tests\StellaOps.Concelier.Core.Tests.csproj", "{3A3D7610-C864-4413-B07E-9E8C2A49A90E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Merge.Tests", "StellaOps.Feedser.Merge.Tests\StellaOps.Feedser.Merge.Tests.csproj", "{9C4DEE96-CD7D-4AE3-A811-0B48B477003B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Tests", "StellaOps.Concelier.Merge.Tests\StellaOps.Concelier.Merge.Tests.csproj", "{9C4DEE96-CD7D-4AE3-A811-0B48B477003B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models.Tests", "StellaOps.Feedser.Models.Tests\StellaOps.Feedser.Models.Tests.csproj", "{437B2667-9461-47D2-B75B-4D2E03D69B94}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models.Tests", "StellaOps.Concelier.Models.Tests\StellaOps.Concelier.Models.Tests.csproj", "{437B2667-9461-47D2-B75B-4D2E03D69B94}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization.Tests", "StellaOps.Feedser.Normalization.Tests\StellaOps.Feedser.Normalization.Tests.csproj", "{8249DF28-CDAF-4DEF-A912-C27F57B67FD5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization.Tests", "StellaOps.Concelier.Normalization.Tests\StellaOps.Concelier.Normalization.Tests.csproj", "{8249DF28-CDAF-4DEF-A912-C27F57B67FD5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo.Tests", "StellaOps.Feedser.Storage.Mongo.Tests\StellaOps.Feedser.Storage.Mongo.Tests.csproj", "{CBFB015B-C069-475F-A476-D52222729804}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo.Tests", "StellaOps.Concelier.Storage.Mongo.Tests\StellaOps.Concelier.Storage.Mongo.Tests.csproj", "{CBFB015B-C069-475F-A476-D52222729804}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.Json.Tests", "StellaOps.Feedser.Exporter.Json.Tests\StellaOps.Feedser.Exporter.Json.Tests.csproj", "{2A41D9D2-3218-4F12-9C2B-3DB18A8E732E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json.Tests", "StellaOps.Concelier.Exporter.Json.Tests\StellaOps.Concelier.Exporter.Json.Tests.csproj", "{2A41D9D2-3218-4F12-9C2B-3DB18A8E732E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.TrivyDb.Tests", "StellaOps.Feedser.Exporter.TrivyDb.Tests\StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj", "{3EB22234-642E-4533-BCC3-93E8ED443B1D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb.Tests", "StellaOps.Concelier.Exporter.TrivyDb.Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj", "{3EB22234-642E-4533-BCC3-93E8ED443B1D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.WebService.Tests", "StellaOps.Feedser.WebService.Tests\StellaOps.Feedser.WebService.Tests.csproj", "{84A5DE81-4444-499A-93BF-6DC4CA72F8D4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService.Tests", "StellaOps.Concelier.WebService.Tests\StellaOps.Concelier.WebService.Tests.csproj", "{84A5DE81-4444-499A-93BF-6DC4CA72F8D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common.Tests", "StellaOps.Feedser.Source.Common.Tests\StellaOps.Feedser.Source.Common.Tests.csproj", "{42E21E1D-C3DE-4765-93E9-39391BB5C802}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common.Tests", "StellaOps.Concelier.Source.Common.Tests\StellaOps.Concelier.Source.Common.Tests.csproj", "{42E21E1D-C3DE-4765-93E9-39391BB5C802}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Nvd.Tests", "StellaOps.Feedser.Source.Nvd.Tests\StellaOps.Feedser.Source.Nvd.Tests.csproj", "{B6E2EE26-B297-4AB9-A47E-A227F5EAE108}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Nvd.Tests", "StellaOps.Concelier.Source.Nvd.Tests\StellaOps.Concelier.Source.Nvd.Tests.csproj", "{B6E2EE26-B297-4AB9-A47E-A227F5EAE108}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.RedHat.Tests", "StellaOps.Feedser.Source.Distro.RedHat.Tests\StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj", "{CDB2D636-C82F-43F1-BB30-FFC6258FBAB4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.RedHat.Tests", "StellaOps.Concelier.Source.Distro.RedHat.Tests\StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj", "{CDB2D636-C82F-43F1-BB30-FFC6258FBAB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Chromium.Tests", "StellaOps.Feedser.Source.Vndr.Chromium.Tests\StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj", "{2891FCDE-BB89-46F0-A40C-368EF804DB44}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Chromium.Tests", "StellaOps.Concelier.Source.Vndr.Chromium.Tests\StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj", "{2891FCDE-BB89-46F0-A40C-368EF804DB44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Adobe.Tests", "StellaOps.Feedser.Source.Vndr.Adobe.Tests\StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj", "{B91C60FB-926F-47C3-BFD0-6DD145308344}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Adobe.Tests", "StellaOps.Concelier.Source.Vndr.Adobe.Tests\StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj", "{B91C60FB-926F-47C3-BFD0-6DD145308344}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Oracle.Tests", "StellaOps.Feedser.Source.Vndr.Oracle.Tests\StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj", "{30DF89D1-D66D-4078-8A3B-951637A42265}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Oracle.Tests", "StellaOps.Concelier.Source.Vndr.Oracle.Tests\StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj", "{30DF89D1-D66D-4078-8A3B-951637A42265}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Vmware.Tests", "StellaOps.Feedser.Source.Vndr.Vmware.Tests\StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj", "{6E98C770-72FF-41FA-8C42-30AABAAF5B4E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Vmware.Tests", "StellaOps.Concelier.Source.Vndr.Vmware.Tests\StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj", "{6E98C770-72FF-41FA-8C42-30AABAAF5B4E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertIn.Tests", "StellaOps.Feedser.Source.CertIn.Tests\StellaOps.Feedser.Source.CertIn.Tests.csproj", "{79B36C92-BA93-4406-AB75-6F2282DDFF01}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertIn.Tests", "StellaOps.Concelier.Source.CertIn.Tests\StellaOps.Concelier.Source.CertIn.Tests.csproj", "{79B36C92-BA93-4406-AB75-6F2282DDFF01}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertFr.Tests", "StellaOps.Feedser.Source.CertFr.Tests\StellaOps.Feedser.Source.CertFr.Tests.csproj", "{4B60FA53-81F6-4AB6-BE9F-DE0992E11977}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertFr.Tests", "StellaOps.Concelier.Source.CertFr.Tests\StellaOps.Concelier.Source.CertFr.Tests.csproj", "{4B60FA53-81F6-4AB6-BE9F-DE0992E11977}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Kaspersky.Tests", "StellaOps.Feedser.Source.Ics.Kaspersky.Tests\StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj", "{6BBA820B-8443-4832-91C3-3AB002006494}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Kaspersky.Tests", "StellaOps.Concelier.Source.Ics.Kaspersky.Tests\StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj", "{6BBA820B-8443-4832-91C3-3AB002006494}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Jvn.Tests", "StellaOps.Feedser.Source.Jvn.Tests\StellaOps.Feedser.Source.Jvn.Tests.csproj", "{7845AE1C-FBD7-4177-A06F-D7AAE8315DB2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Jvn.Tests", "StellaOps.Concelier.Source.Jvn.Tests\StellaOps.Concelier.Source.Jvn.Tests.csproj", "{7845AE1C-FBD7-4177-A06F-D7AAE8315DB2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Osv.Tests", "StellaOps.Feedser.Source.Osv.Tests\StellaOps.Feedser.Source.Osv.Tests.csproj", "{F892BFFD-9101-4D59-B6FD-C532EB04D51F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Osv.Tests", "StellaOps.Concelier.Source.Osv.Tests\StellaOps.Concelier.Source.Osv.Tests.csproj", "{F892BFFD-9101-4D59-B6FD-C532EB04D51F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Testing", "StellaOps.Feedser.Testing\StellaOps.Feedser.Testing.csproj", "{EAE910FC-188C-41C3-822A-623964CABE48}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{EAE910FC-188C-41C3-822A-623964CABE48}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Debian.Tests", "StellaOps.Feedser.Source.Distro.Debian.Tests\StellaOps.Feedser.Source.Distro.Debian.Tests.csproj", "{BBA5C780-6348-427D-9600-726EAA8963B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Debian.Tests", "StellaOps.Concelier.Source.Distro.Debian.Tests\StellaOps.Concelier.Source.Distro.Debian.Tests.csproj", "{BBA5C780-6348-427D-9600-726EAA8963B3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration", "StellaOps.Configuration\StellaOps.Configuration.csproj", "{5F44A429-816A-4560-A5AA-61CD23FD8A19}" EndProject @@ -131,9 +131,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli", "StellaOps. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Tests", "StellaOps.Cli.Tests\StellaOps.Cli.Tests.csproj", "{544DBB82-4639-4856-A5F2-76828F7A8396}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Bdu.Tests", "StellaOps.Feedser.Source.Ru.Bdu.Tests\StellaOps.Feedser.Source.Ru.Bdu.Tests.csproj", "{C4B189FA-4268-4B3C-A6B0-C2BB5B96D11A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Bdu.Tests", "StellaOps.Concelier.Source.Ru.Bdu.Tests\StellaOps.Concelier.Source.Ru.Bdu.Tests.csproj", "{C4B189FA-4268-4B3C-A6B0-C2BB5B96D11A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Nkcki.Tests", "StellaOps.Feedser.Source.Ru.Nkcki.Tests\StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj", "{461D4A58-3816-4737-B209-2D1F08B1F4DF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Nkcki.Tests", "StellaOps.Concelier.Source.Ru.Nkcki.Tests\StellaOps.Concelier.Source.Ru.Nkcki.Tests.csproj", "{461D4A58-3816-4737-B209-2D1F08B1F4DF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/StellaOps.Excititor.Storage.Mongo.Tests/StellaOps.Excititor.Storage.Mongo.Tests.csproj b/src/StellaOps.Excititor.Storage.Mongo.Tests/StellaOps.Excititor.Storage.Mongo.Tests.csproj index e8bd0e17..381aceef 100644 --- a/src/StellaOps.Excititor.Storage.Mongo.Tests/StellaOps.Excititor.Storage.Mongo.Tests.csproj +++ b/src/StellaOps.Excititor.Storage.Mongo.Tests/StellaOps.Excititor.Storage.Mongo.Tests.csproj @@ -10,6 +10,6 @@ - + diff --git a/src/StellaOps.Feedser.Exporter.Json.Tests/StellaOps.Feedser.Exporter.Json.Tests.csproj b/src/StellaOps.Feedser.Exporter.Json.Tests/StellaOps.Feedser.Exporter.Json.Tests.csproj deleted file mode 100644 index e579ef8c..00000000 --- a/src/StellaOps.Feedser.Exporter.Json.Tests/StellaOps.Feedser.Exporter.Json.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj b/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj deleted file mode 100644 index 6ac1cb21..00000000 --- a/src/StellaOps.Feedser.Exporter.TrivyDb.Tests/StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.csproj b/src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.csproj deleted file mode 100644 index 756df80f..00000000 --- a/src/StellaOps.Feedser.Merge.Tests/StellaOps.Feedser.Merge.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj b/src/StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj deleted file mode 100644 index d2bb7cd2..00000000 --- a/src/StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Acsc.Tests/StellaOps.Feedser.Source.Acsc.Tests.csproj b/src/StellaOps.Feedser.Source.Acsc.Tests/StellaOps.Feedser.Source.Acsc.Tests.csproj deleted file mode 100644 index 2a28db6b..00000000 --- a/src/StellaOps.Feedser.Source.Acsc.Tests/StellaOps.Feedser.Source.Acsc.Tests.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Acsc/StellaOps.Feedser.Source.Acsc.csproj b/src/StellaOps.Feedser.Source.Acsc/StellaOps.Feedser.Source.Acsc.csproj deleted file mode 100644 index c2d52780..00000000 --- a/src/StellaOps.Feedser.Source.Acsc/StellaOps.Feedser.Source.Acsc.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Cccs/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Cccs/Properties/AssemblyInfo.cs deleted file mode 100644 index 5f71f856..00000000 --- a/src/StellaOps.Feedser.Source.Cccs/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Cccs.Tests")] diff --git a/src/StellaOps.Feedser.Source.Cccs/StellaOps.Feedser.Source.Cccs.csproj b/src/StellaOps.Feedser.Source.Cccs/StellaOps.Feedser.Source.Cccs.csproj deleted file mode 100644 index 04f9158c..00000000 --- a/src/StellaOps.Feedser.Source.Cccs/StellaOps.Feedser.Source.Cccs.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md b/src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md deleted file mode 100644 index 1325e84d..00000000 --- a/src/StellaOps.Feedser.Source.CertCc/FEEDCONN-CERTCC-02-012_HANDOFF.md +++ /dev/null @@ -1,20 +0,0 @@ -# FEEDCONN-CERTCC-02-012 – Schema Sync & Snapshot Regeneration - -## Summary -- Re-ran `StellaOps.Feedser.Source.CertCc.Tests` with `UPDATE_CERTCC_FIXTURES=1`; fixtures now capture SemVer-style normalized versions (`scheme=certcc.vendor`) and `provenance.decisionReason` values emitted by the mapper. -- Recorded HTTP request ordering is persisted in `certcc-requests.snapshot.json` to keep Merge aware of the deterministic fetch plan. -- Advisories snapshot (`certcc-advisories.snapshot.json`) reflects the dual-write storage changes (normalized versions + provenance) introduced by FEEDMODELS-SCHEMA-* and FEEDSTORAGE-DATA-*. - -## Artifacts -- `src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-advisories.snapshot.json` -- `src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-documents.snapshot.json` -- `src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-requests.snapshot.json` -- `src/StellaOps.Feedser.Source.CertCc.Tests/Fixtures/certcc-state.snapshot.json` - -## Validation steps -```bash -dotnet test src/StellaOps.Feedser.Source.CertCc.Tests -UPDATE_CERTCC_FIXTURES=1 dotnet test src/StellaOps.Feedser.Source.CertCc.Tests -``` - -The first command verifies deterministic behavior; the second regenerates fixtures if a future schema change occurs. Share the four snapshot files above with Merge for their backfill diff. diff --git a/src/StellaOps.Feedser.Source.CertCc/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.CertCc/Properties/AssemblyInfo.cs deleted file mode 100644 index 96da4f07..00000000 --- a/src/StellaOps.Feedser.Source.CertCc/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.CertCc.Tests")] diff --git a/src/StellaOps.Feedser.Source.CertFr.Tests/StellaOps.Feedser.Source.CertFr.Tests.csproj b/src/StellaOps.Feedser.Source.CertFr.Tests/StellaOps.Feedser.Source.CertFr.Tests.csproj deleted file mode 100644 index 6cf96d45..00000000 --- a/src/StellaOps.Feedser.Source.CertFr.Tests/StellaOps.Feedser.Source.CertFr.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj b/src/StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj deleted file mode 100644 index a01e6075..00000000 --- a/src/StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.CertIn.Tests/StellaOps.Feedser.Source.CertIn.Tests.csproj b/src/StellaOps.Feedser.Source.CertIn.Tests/StellaOps.Feedser.Source.CertIn.Tests.csproj deleted file mode 100644 index c7000b4f..00000000 --- a/src/StellaOps.Feedser.Source.CertIn.Tests/StellaOps.Feedser.Source.CertIn.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj b/src/StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj deleted file mode 100644 index 7e54853b..00000000 --- a/src/StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Common/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Common/Properties/AssemblyInfo.cs deleted file mode 100644 index 2d379827..00000000 --- a/src/StellaOps.Feedser.Source.Common/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Common.Tests")] diff --git a/src/StellaOps.Feedser.Source.Cve.Tests/StellaOps.Feedser.Source.Cve.Tests.csproj b/src/StellaOps.Feedser.Source.Cve.Tests/StellaOps.Feedser.Source.Cve.Tests.csproj deleted file mode 100644 index c6a19365..00000000 --- a/src/StellaOps.Feedser.Source.Cve.Tests/StellaOps.Feedser.Source.Cve.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/StellaOps.Feedser.Source.Distro.Debian.Tests.csproj b/src/StellaOps.Feedser.Source.Distro.Debian.Tests/StellaOps.Feedser.Source.Distro.Debian.Tests.csproj deleted file mode 100644 index d75a27bb..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Debian.Tests/StellaOps.Feedser.Source.Distro.Debian.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Distro.Debian/AssemblyInfo.cs deleted file mode 100644 index e2c83a72..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Debian/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Distro.Debian.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.Debian/StellaOps.Feedser.Source.Distro.Debian.csproj b/src/StellaOps.Feedser.Source.Distro.Debian/StellaOps.Feedser.Source.Distro.Debian.csproj deleted file mode 100644 index 96165c66..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Debian/StellaOps.Feedser.Source.Distro.Debian.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj b/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj deleted file mode 100644 index 654d8c5f..00000000 --- a/src/StellaOps.Feedser.Source.Distro.RedHat.Tests/StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Distro.RedHat/Properties/AssemblyInfo.cs deleted file mode 100644 index 84fa6ffc..00000000 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Distro.RedHat.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj b/src/StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj deleted file mode 100644 index bedbc3b9..00000000 --- a/src/StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/StellaOps.Feedser.Source.Distro.Suse.Tests.csproj b/src/StellaOps.Feedser.Source.Distro.Suse.Tests/StellaOps.Feedser.Source.Distro.Suse.Tests.csproj deleted file mode 100644 index f56d2dff..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Suse.Tests/StellaOps.Feedser.Source.Distro.Suse.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - PreserveNewest - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Distro.Suse/AssemblyInfo.cs deleted file mode 100644 index 0a90994d..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Suse/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Distro.Suse.Tests")] diff --git a/src/StellaOps.Feedser.Source.Distro.Suse/StellaOps.Feedser.Source.Distro.Suse.csproj b/src/StellaOps.Feedser.Source.Distro.Suse/StellaOps.Feedser.Source.Distro.Suse.csproj deleted file mode 100644 index 96165c66..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Suse/StellaOps.Feedser.Source.Distro.Suse.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/StellaOps.Feedser.Source.Distro.Ubuntu.Tests.csproj b/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/StellaOps.Feedser.Source.Distro.Ubuntu.Tests.csproj deleted file mode 100644 index 65ac759c..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu.Tests/StellaOps.Feedser.Source.Distro.Ubuntu.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - PreserveNewest - - - diff --git a/src/StellaOps.Feedser.Source.Distro.Ubuntu/StellaOps.Feedser.Source.Distro.Ubuntu.csproj b/src/StellaOps.Feedser.Source.Distro.Ubuntu/StellaOps.Feedser.Source.Distro.Ubuntu.csproj deleted file mode 100644 index 96165c66..00000000 --- a/src/StellaOps.Feedser.Source.Distro.Ubuntu/StellaOps.Feedser.Source.Distro.Ubuntu.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj b/src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj deleted file mode 100644 index c476b167..00000000 --- a/src/StellaOps.Feedser.Source.Ghsa.Tests/StellaOps.Feedser.Source.Ghsa.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ghsa/StellaOps.Feedser.Source.Ghsa.csproj b/src/StellaOps.Feedser.Source.Ghsa/StellaOps.Feedser.Source.Ghsa.csproj deleted file mode 100644 index 2b65e902..00000000 --- a/src/StellaOps.Feedser.Source.Ghsa/StellaOps.Feedser.Source.Ghsa.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj b/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj deleted file mode 100644 index 48c95541..00000000 --- a/src/StellaOps.Feedser.Source.Ics.Cisa.Tests/StellaOps.Feedser.Source.Ics.Cisa.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj b/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj deleted file mode 100644 index c3a057e2..00000000 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky.Tests/StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj b/src/StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj deleted file mode 100644 index 7e54853b..00000000 --- a/src/StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Jvn.Tests/StellaOps.Feedser.Source.Jvn.Tests.csproj b/src/StellaOps.Feedser.Source.Jvn.Tests/StellaOps.Feedser.Source.Jvn.Tests.csproj deleted file mode 100644 index 351f26a7..00000000 --- a/src/StellaOps.Feedser.Source.Jvn.Tests/StellaOps.Feedser.Source.Jvn.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj b/src/StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj deleted file mode 100644 index c6e627a2..00000000 --- a/src/StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Kev.Tests/StellaOps.Feedser.Source.Kev.Tests.csproj b/src/StellaOps.Feedser.Source.Kev.Tests/StellaOps.Feedser.Source.Kev.Tests.csproj deleted file mode 100644 index 57e5921a..00000000 --- a/src/StellaOps.Feedser.Source.Kev.Tests/StellaOps.Feedser.Source.Kev.Tests.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Kisa/StellaOps.Feedser.Source.Kisa.csproj b/src/StellaOps.Feedser.Source.Kisa/StellaOps.Feedser.Source.Kisa.csproj deleted file mode 100644 index 2f48c62c..00000000 --- a/src/StellaOps.Feedser.Source.Kisa/StellaOps.Feedser.Source.Kisa.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj b/src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj deleted file mode 100644 index 0b170a63..00000000 --- a/src/StellaOps.Feedser.Source.Nvd.Tests/StellaOps.Feedser.Source.Nvd.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Nvd/StellaOps.Feedser.Source.Nvd.csproj b/src/StellaOps.Feedser.Source.Nvd/StellaOps.Feedser.Source.Nvd.csproj deleted file mode 100644 index 74d98ea9..00000000 --- a/src/StellaOps.Feedser.Source.Nvd/StellaOps.Feedser.Source.Nvd.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj b/src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj deleted file mode 100644 index e501ae0d..00000000 --- a/src/StellaOps.Feedser.Source.Osv.Tests/StellaOps.Feedser.Source.Osv.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - PreserveNewest - - - diff --git a/src/StellaOps.Feedser.Source.Osv/StellaOps.Feedser.Source.Osv.csproj b/src/StellaOps.Feedser.Source.Osv/StellaOps.Feedser.Source.Osv.csproj deleted file mode 100644 index a3256c0b..00000000 --- a/src/StellaOps.Feedser.Source.Osv/StellaOps.Feedser.Source.Osv.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - <_Parameter1>StellaOps.Feedser.Tests - - - <_Parameter1>StellaOps.Feedser.Source.Osv.Tests - - - diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/StellaOps.Feedser.Source.Ru.Bdu.Tests.csproj b/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/StellaOps.Feedser.Source.Ru.Bdu.Tests.csproj deleted file mode 100644 index 148f9dc5..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Bdu.Tests/StellaOps.Feedser.Source.Ru.Bdu.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Ru.Bdu/Properties/AssemblyInfo.cs deleted file mode 100644 index b658730c..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Ru.Bdu.Tests")] diff --git a/src/StellaOps.Feedser.Source.Ru.Bdu/StellaOps.Feedser.Source.Ru.Bdu.csproj b/src/StellaOps.Feedser.Source.Ru.Bdu/StellaOps.Feedser.Source.Ru.Bdu.csproj deleted file mode 100644 index 77fb187a..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Bdu/StellaOps.Feedser.Source.Ru.Bdu.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj b/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj deleted file mode 100644 index 584d4b62..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki.Tests/StellaOps.Feedser.Source.Ru.Nkcki.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Ru.Nkcki/Properties/AssemblyInfo.cs deleted file mode 100644 index a4a4ea6c..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Ru.Nkcki.Tests")] diff --git a/src/StellaOps.Feedser.Source.Ru.Nkcki/StellaOps.Feedser.Source.Ru.Nkcki.csproj b/src/StellaOps.Feedser.Source.Ru.Nkcki/StellaOps.Feedser.Source.Ru.Nkcki.csproj deleted file mode 100644 index 947a0b1c..00000000 --- a/src/StellaOps.Feedser.Source.Ru.Nkcki/StellaOps.Feedser.Source.Ru.Nkcki.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj b/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj deleted file mode 100644 index dbd05cbe..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Apple.Tests/StellaOps.Feedser.Source.Vndr.Apple.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Vndr.Apple/Properties/AssemblyInfo.cs deleted file mode 100644 index ff1c1ce0..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Vndr.Apple.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Apple/StellaOps.Feedser.Source.Vndr.Apple.csproj b/src/StellaOps.Feedser.Source.Vndr.Apple/StellaOps.Feedser.Source.Vndr.Apple.csproj deleted file mode 100644 index c8aaf11c..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Apple/StellaOps.Feedser.Source.Vndr.Apple.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Chromium/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Vndr.Chromium/Properties/AssemblyInfo.cs deleted file mode 100644 index af25849d..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Chromium/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Vndr.Chromium.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Cisco/StellaOps.Feedser.Source.Vndr.Cisco.csproj b/src/StellaOps.Feedser.Source.Vndr.Cisco/StellaOps.Feedser.Source.Vndr.Cisco.csproj deleted file mode 100644 index effa7961..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Cisco/StellaOps.Feedser.Source.Vndr.Cisco.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj b/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj deleted file mode 100644 index 4316bac2..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle.Tests/StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Vndr.Oracle/Properties/AssemblyInfo.cs deleted file mode 100644 index b773c235..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Vndr.Oracle.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Oracle/StellaOps.Feedser.Source.Vndr.Oracle.csproj b/src/StellaOps.Feedser.Source.Vndr.Oracle/StellaOps.Feedser.Source.Vndr.Oracle.csproj deleted file mode 100644 index 75922ca4..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Oracle/StellaOps.Feedser.Source.Vndr.Oracle.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj b/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj deleted file mode 100644 index 88018948..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware.Tests/StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - - - PreserveNewest - - - diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Source.Vndr.Vmware/Properties/AssemblyInfo.cs deleted file mode 100644 index 1e127068..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Source.Vndr.Vmware.Tests")] diff --git a/src/StellaOps.Feedser.Source.Vndr.Vmware/StellaOps.Feedser.Source.Vndr.Vmware.csproj b/src/StellaOps.Feedser.Source.Vndr.Vmware/StellaOps.Feedser.Source.Vndr.Vmware.csproj deleted file mode 100644 index 76cc57c2..00000000 --- a/src/StellaOps.Feedser.Source.Vndr.Vmware/StellaOps.Feedser.Source.Vndr.Vmware.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net10.0 - enable - enable - - - - - - - - - - - - - <_Parameter1>StellaOps.Feedser.Tests - - - - diff --git a/src/StellaOps.Feedser.Storage.Mongo.Tests/StellaOps.Feedser.Storage.Mongo.Tests.csproj b/src/StellaOps.Feedser.Storage.Mongo.Tests/StellaOps.Feedser.Storage.Mongo.Tests.csproj deleted file mode 100644 index 910f1f4e..00000000 --- a/src/StellaOps.Feedser.Storage.Mongo.Tests/StellaOps.Feedser.Storage.Mongo.Tests.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - diff --git a/src/StellaOps.Feedser.Storage.Mongo/Properties/AssemblyInfo.cs b/src/StellaOps.Feedser.Storage.Mongo/Properties/AssemblyInfo.cs deleted file mode 100644 index 6a4ba72a..00000000 --- a/src/StellaOps.Feedser.Storage.Mongo/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("StellaOps.Feedser.Storage.Mongo.Tests")] diff --git a/src/StellaOps.Feedser.WebService.Tests/StellaOps.Feedser.WebService.Tests.csproj b/src/StellaOps.Feedser.WebService.Tests/StellaOps.Feedser.WebService.Tests.csproj deleted file mode 100644 index 51c5b3b7..00000000 --- a/src/StellaOps.Feedser.WebService.Tests/StellaOps.Feedser.WebService.Tests.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net10.0 - enable - enable - - - - - - - - diff --git a/src/StellaOps.Feedser.WebService/Extensions/JobRegistrationExtensions.cs b/src/StellaOps.Feedser.WebService/Extensions/JobRegistrationExtensions.cs deleted file mode 100644 index 73920247..00000000 --- a/src/StellaOps.Feedser.WebService/Extensions/JobRegistrationExtensions.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using StellaOps.Feedser.Core.Jobs; -using StellaOps.Feedser.Merge.Jobs; - -namespace StellaOps.Feedser.WebService.Extensions; - -internal static class JobRegistrationExtensions -{ - private sealed record BuiltInJob( - string Kind, - string JobType, - string AssemblyName, - TimeSpan Timeout, - TimeSpan LeaseDuration, - string? CronExpression = null); - - private static readonly IReadOnlyList BuiltInJobs = new List - { - new("source:redhat:fetch", "StellaOps.Feedser.Source.Distro.RedHat.RedHatFetchJob", "StellaOps.Feedser.Source.Distro.RedHat", TimeSpan.FromMinutes(12), TimeSpan.FromMinutes(6), "0,15,30,45 * * * *"), - new("source:redhat:parse", "StellaOps.Feedser.Source.Distro.RedHat.RedHatParseJob", "StellaOps.Feedser.Source.Distro.RedHat", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(6), "5,20,35,50 * * * *"), - new("source:redhat:map", "StellaOps.Feedser.Source.Distro.RedHat.RedHatMapJob", "StellaOps.Feedser.Source.Distro.RedHat", TimeSpan.FromMinutes(20), TimeSpan.FromMinutes(6), "10,25,40,55 * * * *"), - - new("source:cert-in:fetch", "StellaOps.Feedser.Source.CertIn.CertInFetchJob", "StellaOps.Feedser.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:cert-in:parse", "StellaOps.Feedser.Source.CertIn.CertInParseJob", "StellaOps.Feedser.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:cert-in:map", "StellaOps.Feedser.Source.CertIn.CertInMapJob", "StellaOps.Feedser.Source.CertIn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:cert-fr:fetch", "StellaOps.Feedser.Source.CertFr.CertFrFetchJob", "StellaOps.Feedser.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:cert-fr:parse", "StellaOps.Feedser.Source.CertFr.CertFrParseJob", "StellaOps.Feedser.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:cert-fr:map", "StellaOps.Feedser.Source.CertFr.CertFrMapJob", "StellaOps.Feedser.Source.CertFr", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:jvn:fetch", "StellaOps.Feedser.Source.Jvn.JvnFetchJob", "StellaOps.Feedser.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:jvn:parse", "StellaOps.Feedser.Source.Jvn.JvnParseJob", "StellaOps.Feedser.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:jvn:map", "StellaOps.Feedser.Source.Jvn.JvnMapJob", "StellaOps.Feedser.Source.Jvn", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:ics-kaspersky:fetch", "StellaOps.Feedser.Source.Ics.Kaspersky.KasperskyFetchJob", "StellaOps.Feedser.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:ics-kaspersky:parse", "StellaOps.Feedser.Source.Ics.Kaspersky.KasperskyParseJob", "StellaOps.Feedser.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:ics-kaspersky:map", "StellaOps.Feedser.Source.Ics.Kaspersky.KasperskyMapJob", "StellaOps.Feedser.Source.Ics.Kaspersky", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:osv:fetch", "StellaOps.Feedser.Source.Osv.OsvFetchJob", "StellaOps.Feedser.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:osv:parse", "StellaOps.Feedser.Source.Osv.OsvParseJob", "StellaOps.Feedser.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:osv:map", "StellaOps.Feedser.Source.Osv.OsvMapJob", "StellaOps.Feedser.Source.Osv", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:vmware:fetch", "StellaOps.Feedser.Source.Vndr.Vmware.VmwareFetchJob", "StellaOps.Feedser.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:vmware:parse", "StellaOps.Feedser.Source.Vndr.Vmware.VmwareParseJob", "StellaOps.Feedser.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:vmware:map", "StellaOps.Feedser.Source.Vndr.Vmware.VmwareMapJob", "StellaOps.Feedser.Source.Vndr.Vmware", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("source:vndr-oracle:fetch", "StellaOps.Feedser.Source.Vndr.Oracle.OracleFetchJob", "StellaOps.Feedser.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:vndr-oracle:parse", "StellaOps.Feedser.Source.Vndr.Oracle.OracleParseJob", "StellaOps.Feedser.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - new("source:vndr-oracle:map", "StellaOps.Feedser.Source.Vndr.Oracle.OracleMapJob", "StellaOps.Feedser.Source.Vndr.Oracle", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)), - - new("export:json", "StellaOps.Feedser.Exporter.Json.JsonExportJob", "StellaOps.Feedser.Exporter.Json", TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(5)), - new("export:trivy-db", "StellaOps.Feedser.Exporter.TrivyDb.TrivyDbExportJob", "StellaOps.Feedser.Exporter.TrivyDb", TimeSpan.FromMinutes(20), TimeSpan.FromMinutes(10)), - new("merge:reconcile", "StellaOps.Feedser.Merge.Jobs.MergeReconcileJob", "StellaOps.Feedser.Merge", TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(5)) - }; - - public static IServiceCollection AddBuiltInFeedserJobs(this IServiceCollection services) - { - ArgumentNullException.ThrowIfNull(services); - - services.PostConfigure(options => - { - foreach (var registration in BuiltInJobs) - { - if (options.Definitions.ContainsKey(registration.Kind)) - { - continue; - } - - var jobType = Type.GetType( - $"{registration.JobType}, {registration.AssemblyName}", - throwOnError: false, - ignoreCase: false); - - if (jobType is null) - { - continue; - } - - var timeout = registration.Timeout > TimeSpan.Zero ? registration.Timeout : options.DefaultTimeout; - var lease = registration.LeaseDuration > TimeSpan.Zero ? registration.LeaseDuration : options.DefaultLeaseDuration; - - options.Definitions[registration.Kind] = new JobDefinition( - registration.Kind, - jobType, - timeout, - lease, - registration.CronExpression, - Enabled: true); - } - }); - - return services; - } -} diff --git a/src/StellaOps.Plugin/PluginContracts.cs b/src/StellaOps.Plugin/PluginContracts.cs index 924ca656..d50c26a9 100644 --- a/src/StellaOps.Plugin/PluginContracts.cs +++ b/src/StellaOps.Plugin/PluginContracts.cs @@ -60,7 +60,7 @@ public sealed class PluginCatalog return this; } - public PluginCatalog AddFromDirectory(string directory, string searchPattern = "StellaOps.Feedser.*.dll") + public PluginCatalog AddFromDirectory(string directory, string searchPattern = "StellaOps.Concelier.*.dll") { if (string.IsNullOrWhiteSpace(directory)) throw new ArgumentException("Directory is required", nameof(directory)); diff --git a/src/StellaOps.Web/AGENTS.md b/src/StellaOps.Web/AGENTS.md index 03209b69..f0f3fa9d 100644 --- a/src/StellaOps.Web/AGENTS.md +++ b/src/StellaOps.Web/AGENTS.md @@ -1,7 +1,7 @@ # StellaOps Web Frontend ## Mission -Design and build the StellaOps web user experience that surfaces backend capabilities (Authority, Feedser, Exporters) through an offline-friendly Angular application. +Design and build the StellaOps web user experience that surfaces backend capabilities (Authority, Concelier, Exporters) through an offline-friendly Angular application. ## Team Composition - **UX Specialist** – defines user journeys, interaction patterns, accessibility guidelines, and visual design language. @@ -9,7 +9,7 @@ Design and build the StellaOps web user experience that surfaces backend capabil ## Operating Principles - Favor modular Angular architecture (feature modules, shared UI kit) with strong typing via latest TypeScript/Angular releases. -- Align UI flows with backend contracts; coordinate with Authority and Feedser teams for API changes. +- Align UI flows with backend contracts; coordinate with Authority and Concelier teams for API changes. - Keep assets and build outputs deterministic and cacheable for Offline Kit packaging. - Track work using the local `TASKS.md` board; keep statuses (TODO/DOING/REVIEW/BLOCKED/DONE) up to date. diff --git a/src/StellaOps.sln b/src/StellaOps.sln index ccf8698b..fa22036a 100644 --- a/src/StellaOps.sln +++ b/src/StellaOps.sln @@ -29,129 +29,129 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli", "StellaOps. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cli.Tests", "StellaOps.Cli.Tests\StellaOps.Cli.Tests.csproj", "{B2967228-F8F7-4931-B257-1C63CB58CE1D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Testing", "StellaOps.Feedser.Testing\StellaOps.Feedser.Testing.csproj", "{6D52EC2B-0A1A-4693-A8EE-5AB32A4A3ED9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "StellaOps.Concelier.Testing\StellaOps.Concelier.Testing.csproj", "{6D52EC2B-0A1A-4693-A8EE-5AB32A4A3ED9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common", "StellaOps.Feedser.Source.Common\StellaOps.Feedser.Source.Common.csproj", "{37F203A3-624E-4794-9C99-16CAC22C17DF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common", "StellaOps.Concelier.Source.Common\StellaOps.Concelier.Source.Common.csproj", "{37F203A3-624E-4794-9C99-16CAC22C17DF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo", "StellaOps.Feedser.Storage.Mongo\StellaOps.Feedser.Storage.Mongo.csproj", "{3FF93987-A30A-4D50-8815-7CF3BB7CAE05}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo", "StellaOps.Concelier.Storage.Mongo\StellaOps.Concelier.Storage.Mongo.csproj", "{3FF93987-A30A-4D50-8815-7CF3BB7CAE05}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{AACE8717-0760-42F2-A225-8FCCE876FB65}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core", "StellaOps.Concelier.Core\StellaOps.Concelier.Core.csproj", "{AACE8717-0760-42F2-A225-8FCCE876FB65}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models", "StellaOps.Feedser.Models\StellaOps.Feedser.Models.csproj", "{4AAD6965-E879-44AD-A8ED-E1D713A3CD6D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models", "StellaOps.Concelier.Models\StellaOps.Concelier.Models.csproj", "{4AAD6965-E879-44AD-A8ED-E1D713A3CD6D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization", "StellaOps.Feedser.Normalization\StellaOps.Feedser.Normalization.csproj", "{85D82A87-1F4A-4B1B-8422-5B7A7B7704E3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization", "StellaOps.Concelier.Normalization\StellaOps.Concelier.Normalization.csproj", "{85D82A87-1F4A-4B1B-8422-5B7A7B7704E3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core.Tests", "StellaOps.Feedser.Core.Tests\StellaOps.Feedser.Core.Tests.csproj", "{FE227DF2-875D-4BEA-A4E0-14EA7F3EC1D0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Core.Tests", "StellaOps.Concelier.Core.Tests\StellaOps.Concelier.Core.Tests.csproj", "{FE227DF2-875D-4BEA-A4E0-14EA7F3EC1D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.Json", "StellaOps.Feedser.Exporter.Json\StellaOps.Feedser.Exporter.Json.csproj", "{D0FB54BA-4D14-4A32-B09F-7EC94F369460}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json", "StellaOps.Concelier.Exporter.Json\StellaOps.Concelier.Exporter.Json.csproj", "{D0FB54BA-4D14-4A32-B09F-7EC94F369460}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.Json.Tests", "StellaOps.Feedser.Exporter.Json.Tests\StellaOps.Feedser.Exporter.Json.Tests.csproj", "{69C9E010-CBDD-4B89-84CF-7AB56D6A078A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.Json.Tests", "StellaOps.Concelier.Exporter.Json.Tests\StellaOps.Concelier.Exporter.Json.Tests.csproj", "{69C9E010-CBDD-4B89-84CF-7AB56D6A078A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.TrivyDb", "StellaOps.Feedser.Exporter.TrivyDb\StellaOps.Feedser.Exporter.TrivyDb.csproj", "{E471176A-E1F3-4DE5-8D30-0865903A217A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb", "StellaOps.Concelier.Exporter.TrivyDb\StellaOps.Concelier.Exporter.TrivyDb.csproj", "{E471176A-E1F3-4DE5-8D30-0865903A217A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.TrivyDb.Tests", "StellaOps.Feedser.Exporter.TrivyDb.Tests\StellaOps.Feedser.Exporter.TrivyDb.Tests.csproj", "{FA013511-DF20-45F7-8077-EBA2D6224D64}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Exporter.TrivyDb.Tests", "StellaOps.Concelier.Exporter.TrivyDb.Tests\StellaOps.Concelier.Exporter.TrivyDb.Tests.csproj", "{FA013511-DF20-45F7-8077-EBA2D6224D64}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Merge", "StellaOps.Feedser.Merge\StellaOps.Feedser.Merge.csproj", "{B9F84697-54FE-4648-B173-EE3D904FFA4D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge", "StellaOps.Concelier.Merge\StellaOps.Concelier.Merge.csproj", "{B9F84697-54FE-4648-B173-EE3D904FFA4D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Merge.Tests", "StellaOps.Feedser.Merge.Tests\StellaOps.Feedser.Merge.Tests.csproj", "{6751A76C-8ED8-40F4-AE2B-069DB31395FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Merge.Tests", "StellaOps.Concelier.Merge.Tests\StellaOps.Concelier.Merge.Tests.csproj", "{6751A76C-8ED8-40F4-AE2B-069DB31395FE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models.Tests", "StellaOps.Feedser.Models.Tests\StellaOps.Feedser.Models.Tests.csproj", "{DDBFA2EF-9CAE-473F-A438-369CAC25C66A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Models.Tests", "StellaOps.Concelier.Models.Tests\StellaOps.Concelier.Models.Tests.csproj", "{DDBFA2EF-9CAE-473F-A438-369CAC25C66A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization.Tests", "StellaOps.Feedser.Normalization.Tests\StellaOps.Feedser.Normalization.Tests.csproj", "{063DE5E1-C8FE-47D0-A12A-22A25CDF2C22}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Normalization.Tests", "StellaOps.Concelier.Normalization.Tests\StellaOps.Concelier.Normalization.Tests.csproj", "{063DE5E1-C8FE-47D0-A12A-22A25CDF2C22}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Acsc", "StellaOps.Feedser.Source.Acsc\StellaOps.Feedser.Source.Acsc.csproj", "{35350FAB-FC51-4FE8-81FB-011003134C37}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Acsc", "StellaOps.Concelier.Source.Acsc\StellaOps.Concelier.Source.Acsc.csproj", "{35350FAB-FC51-4FE8-81FB-011003134C37}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cccs", "StellaOps.Feedser.Source.Cccs\StellaOps.Feedser.Source.Cccs.csproj", "{1BFC95B4-4C8A-44B2-903A-11FBCAAB9519}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Cccs", "StellaOps.Concelier.Source.Cccs\StellaOps.Concelier.Source.Cccs.csproj", "{1BFC95B4-4C8A-44B2-903A-11FBCAAB9519}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertBund", "StellaOps.Feedser.Source.CertBund\StellaOps.Feedser.Source.CertBund.csproj", "{C4A65377-22F7-4D15-92A3-4F05847D167E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertBund", "StellaOps.Concelier.Source.CertBund\StellaOps.Concelier.Source.CertBund.csproj", "{C4A65377-22F7-4D15-92A3-4F05847D167E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertCc", "StellaOps.Feedser.Source.CertCc\StellaOps.Feedser.Source.CertCc.csproj", "{BDDE59E1-C643-4C87-8608-0F9A7A54DE09}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertCc", "StellaOps.Concelier.Source.CertCc\StellaOps.Concelier.Source.CertCc.csproj", "{BDDE59E1-C643-4C87-8608-0F9A7A54DE09}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertFr", "StellaOps.Feedser.Source.CertFr\StellaOps.Feedser.Source.CertFr.csproj", "{0CC116C8-A7E5-4B94-9688-32920177FF97}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertFr", "StellaOps.Concelier.Source.CertFr\StellaOps.Concelier.Source.CertFr.csproj", "{0CC116C8-A7E5-4B94-9688-32920177FF97}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertFr.Tests", "StellaOps.Feedser.Source.CertFr.Tests\StellaOps.Feedser.Source.CertFr.Tests.csproj", "{E8862F6E-85C1-4FDB-AA92-0BB489B7EA1E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertFr.Tests", "StellaOps.Concelier.Source.CertFr.Tests\StellaOps.Concelier.Source.CertFr.Tests.csproj", "{E8862F6E-85C1-4FDB-AA92-0BB489B7EA1E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertIn", "StellaOps.Feedser.Source.CertIn\StellaOps.Feedser.Source.CertIn.csproj", "{84DEDF05-A5BD-4644-86B9-6B7918FE3F31}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertIn", "StellaOps.Concelier.Source.CertIn\StellaOps.Concelier.Source.CertIn.csproj", "{84DEDF05-A5BD-4644-86B9-6B7918FE3F31}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertIn.Tests", "StellaOps.Feedser.Source.CertIn.Tests\StellaOps.Feedser.Source.CertIn.Tests.csproj", "{9DEB1F54-94B5-40C4-AC44-220E680B016D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.CertIn.Tests", "StellaOps.Concelier.Source.CertIn.Tests\StellaOps.Concelier.Source.CertIn.Tests.csproj", "{9DEB1F54-94B5-40C4-AC44-220E680B016D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common.Tests", "StellaOps.Feedser.Source.Common.Tests\StellaOps.Feedser.Source.Common.Tests.csproj", "{7C3E87F2-93D8-4968-95E3-52C46947D46C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common.Tests", "StellaOps.Concelier.Source.Common.Tests\StellaOps.Concelier.Source.Common.Tests.csproj", "{7C3E87F2-93D8-4968-95E3-52C46947D46C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cve", "StellaOps.Feedser.Source.Cve\StellaOps.Feedser.Source.Cve.csproj", "{C0504D97-9BCD-4AE4-B0DC-B31C17B150F2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Cve", "StellaOps.Concelier.Source.Cve\StellaOps.Concelier.Source.Cve.csproj", "{C0504D97-9BCD-4AE4-B0DC-B31C17B150F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Debian", "StellaOps.Feedser.Source.Distro.Debian\StellaOps.Feedser.Source.Distro.Debian.csproj", "{31B05493-104F-437F-9FA7-CA5286CE697C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Debian", "StellaOps.Concelier.Source.Distro.Debian\StellaOps.Concelier.Source.Distro.Debian.csproj", "{31B05493-104F-437F-9FA7-CA5286CE697C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Debian.Tests", "StellaOps.Feedser.Source.Distro.Debian.Tests\StellaOps.Feedser.Source.Distro.Debian.Tests.csproj", "{937AF12E-D770-4534-8FF8-C59042609C2A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Debian.Tests", "StellaOps.Concelier.Source.Distro.Debian.Tests\StellaOps.Concelier.Source.Distro.Debian.Tests.csproj", "{937AF12E-D770-4534-8FF8-C59042609C2A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.RedHat", "StellaOps.Feedser.Source.Distro.RedHat\StellaOps.Feedser.Source.Distro.RedHat.csproj", "{5A028B04-9D76-470B-B5B3-766CE4CE860C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.RedHat", "StellaOps.Concelier.Source.Distro.RedHat\StellaOps.Concelier.Source.Distro.RedHat.csproj", "{5A028B04-9D76-470B-B5B3-766CE4CE860C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.RedHat.Tests", "StellaOps.Feedser.Source.Distro.RedHat.Tests\StellaOps.Feedser.Source.Distro.RedHat.Tests.csproj", "{749DE4C8-F733-43F8-B2A8-6649E71C7570}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.RedHat.Tests", "StellaOps.Concelier.Source.Distro.RedHat.Tests\StellaOps.Concelier.Source.Distro.RedHat.Tests.csproj", "{749DE4C8-F733-43F8-B2A8-6649E71C7570}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Suse", "StellaOps.Feedser.Source.Distro.Suse\StellaOps.Feedser.Source.Distro.Suse.csproj", "{56D2C79E-2737-4FF9-9D19-150065F568D5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Suse", "StellaOps.Concelier.Source.Distro.Suse\StellaOps.Concelier.Source.Distro.Suse.csproj", "{56D2C79E-2737-4FF9-9D19-150065F568D5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Suse.Tests", "StellaOps.Feedser.Source.Distro.Suse.Tests\StellaOps.Feedser.Source.Distro.Suse.Tests.csproj", "{E41F6DC4-68B5-4EE3-97AE-801D725A2C13}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Suse.Tests", "StellaOps.Concelier.Source.Distro.Suse.Tests\StellaOps.Concelier.Source.Distro.Suse.Tests.csproj", "{E41F6DC4-68B5-4EE3-97AE-801D725A2C13}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Ubuntu", "StellaOps.Feedser.Source.Distro.Ubuntu\StellaOps.Feedser.Source.Distro.Ubuntu.csproj", "{285F1D0F-501F-4E2E-8FA0-F2CF28AE3798}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Ubuntu", "StellaOps.Concelier.Source.Distro.Ubuntu\StellaOps.Concelier.Source.Distro.Ubuntu.csproj", "{285F1D0F-501F-4E2E-8FA0-F2CF28AE3798}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Ubuntu.Tests", "StellaOps.Feedser.Source.Distro.Ubuntu.Tests\StellaOps.Feedser.Source.Distro.Ubuntu.Tests.csproj", "{26055403-C7F5-4709-8813-0F7387102791}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Distro.Ubuntu.Tests", "StellaOps.Concelier.Source.Distro.Ubuntu.Tests\StellaOps.Concelier.Source.Distro.Ubuntu.Tests.csproj", "{26055403-C7F5-4709-8813-0F7387102791}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ghsa", "StellaOps.Feedser.Source.Ghsa\StellaOps.Feedser.Source.Ghsa.csproj", "{0C00D0DA-C4C3-4B23-941F-A3DB2DBF33AF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ghsa", "StellaOps.Concelier.Source.Ghsa\StellaOps.Concelier.Source.Ghsa.csproj", "{0C00D0DA-C4C3-4B23-941F-A3DB2DBF33AF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Cisa", "StellaOps.Feedser.Source.Ics.Cisa\StellaOps.Feedser.Source.Ics.Cisa.csproj", "{258327E9-431E-475C-933B-50893676E452}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Cisa", "StellaOps.Concelier.Source.Ics.Cisa\StellaOps.Concelier.Source.Ics.Cisa.csproj", "{258327E9-431E-475C-933B-50893676E452}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Kaspersky", "StellaOps.Feedser.Source.Ics.Kaspersky\StellaOps.Feedser.Source.Ics.Kaspersky.csproj", "{42AF60C8-A5E1-40E0-86F8-98256364AF6F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Kaspersky", "StellaOps.Concelier.Source.Ics.Kaspersky\StellaOps.Concelier.Source.Ics.Kaspersky.csproj", "{42AF60C8-A5E1-40E0-86F8-98256364AF6F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Kaspersky.Tests", "StellaOps.Feedser.Source.Ics.Kaspersky.Tests\StellaOps.Feedser.Source.Ics.Kaspersky.Tests.csproj", "{88C6A9C3-B433-4C36-8767-429C8C2396F8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ics.Kaspersky.Tests", "StellaOps.Concelier.Source.Ics.Kaspersky.Tests\StellaOps.Concelier.Source.Ics.Kaspersky.Tests.csproj", "{88C6A9C3-B433-4C36-8767-429C8C2396F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Jvn", "StellaOps.Feedser.Source.Jvn\StellaOps.Feedser.Source.Jvn.csproj", "{6B7099AB-01BF-4EC4-87D0-5C9C032266DE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Jvn", "StellaOps.Concelier.Source.Jvn\StellaOps.Concelier.Source.Jvn.csproj", "{6B7099AB-01BF-4EC4-87D0-5C9C032266DE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Jvn.Tests", "StellaOps.Feedser.Source.Jvn.Tests\StellaOps.Feedser.Source.Jvn.Tests.csproj", "{14C918EA-693E-41FE-ACAE-2E82DF077BEA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Jvn.Tests", "StellaOps.Concelier.Source.Jvn.Tests\StellaOps.Concelier.Source.Jvn.Tests.csproj", "{14C918EA-693E-41FE-ACAE-2E82DF077BEA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kev", "StellaOps.Feedser.Source.Kev\StellaOps.Feedser.Source.Kev.csproj", "{81111B26-74F6-4912-9084-7115FD119945}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Kev", "StellaOps.Concelier.Source.Kev\StellaOps.Concelier.Source.Kev.csproj", "{81111B26-74F6-4912-9084-7115FD119945}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kisa", "StellaOps.Feedser.Source.Kisa\StellaOps.Feedser.Source.Kisa.csproj", "{80E2D661-FF3E-4A10-A2DF-AFD4F3D433FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Kisa", "StellaOps.Concelier.Source.Kisa\StellaOps.Concelier.Source.Kisa.csproj", "{80E2D661-FF3E-4A10-A2DF-AFD4F3D433FE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Nvd", "StellaOps.Feedser.Source.Nvd\StellaOps.Feedser.Source.Nvd.csproj", "{8D0F501D-01B1-4E24-958B-FAF35B267705}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Nvd", "StellaOps.Concelier.Source.Nvd\StellaOps.Concelier.Source.Nvd.csproj", "{8D0F501D-01B1-4E24-958B-FAF35B267705}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Nvd.Tests", "StellaOps.Feedser.Source.Nvd.Tests\StellaOps.Feedser.Source.Nvd.Tests.csproj", "{5BA91095-7F10-4717-B296-49DFBFC1C9C2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Nvd.Tests", "StellaOps.Concelier.Source.Nvd.Tests\StellaOps.Concelier.Source.Nvd.Tests.csproj", "{5BA91095-7F10-4717-B296-49DFBFC1C9C2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Osv", "StellaOps.Feedser.Source.Osv\StellaOps.Feedser.Source.Osv.csproj", "{99616566-4EF1-4DC7-B655-825FE43D203D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Osv", "StellaOps.Concelier.Source.Osv\StellaOps.Concelier.Source.Osv.csproj", "{99616566-4EF1-4DC7-B655-825FE43D203D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Osv.Tests", "StellaOps.Feedser.Source.Osv.Tests\StellaOps.Feedser.Source.Osv.Tests.csproj", "{EE3C03AD-E604-4C57-9B78-CF7F49FBFCB0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Osv.Tests", "StellaOps.Concelier.Source.Osv.Tests\StellaOps.Concelier.Source.Osv.Tests.csproj", "{EE3C03AD-E604-4C57-9B78-CF7F49FBFCB0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Bdu", "StellaOps.Feedser.Source.Ru.Bdu\StellaOps.Feedser.Source.Ru.Bdu.csproj", "{A3B19095-2D95-4B09-B07E-2C082C72394B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Bdu", "StellaOps.Concelier.Source.Ru.Bdu\StellaOps.Concelier.Source.Ru.Bdu.csproj", "{A3B19095-2D95-4B09-B07E-2C082C72394B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Nkcki", "StellaOps.Feedser.Source.Ru.Nkcki\StellaOps.Feedser.Source.Ru.Nkcki.csproj", "{807837AF-B392-4589-ADF1-3FDB34D6C5BF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ru.Nkcki", "StellaOps.Concelier.Source.Ru.Nkcki\StellaOps.Concelier.Source.Ru.Nkcki.csproj", "{807837AF-B392-4589-ADF1-3FDB34D6C5BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Adobe", "StellaOps.Feedser.Source.Vndr.Adobe\StellaOps.Feedser.Source.Vndr.Adobe.csproj", "{64EAFDCF-8283-4D5C-AC78-7969D5FE926A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Adobe", "StellaOps.Concelier.Source.Vndr.Adobe\StellaOps.Concelier.Source.Vndr.Adobe.csproj", "{64EAFDCF-8283-4D5C-AC78-7969D5FE926A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Adobe.Tests", "StellaOps.Feedser.Source.Vndr.Adobe.Tests\StellaOps.Feedser.Source.Vndr.Adobe.Tests.csproj", "{68F4D8A1-E32F-487A-B460-325F36989BE3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Adobe.Tests", "StellaOps.Concelier.Source.Vndr.Adobe.Tests\StellaOps.Concelier.Source.Vndr.Adobe.Tests.csproj", "{68F4D8A1-E32F-487A-B460-325F36989BE3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Apple", "StellaOps.Feedser.Source.Vndr.Apple\StellaOps.Feedser.Source.Vndr.Apple.csproj", "{4A3DA4AE-7B88-4674-A7E2-F5D42B8256F2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Apple", "StellaOps.Concelier.Source.Vndr.Apple\StellaOps.Concelier.Source.Vndr.Apple.csproj", "{4A3DA4AE-7B88-4674-A7E2-F5D42B8256F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Chromium", "StellaOps.Feedser.Source.Vndr.Chromium\StellaOps.Feedser.Source.Vndr.Chromium.csproj", "{606C751B-7CF1-47CF-A25C-9248A55C814F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Chromium", "StellaOps.Concelier.Source.Vndr.Chromium\StellaOps.Concelier.Source.Vndr.Chromium.csproj", "{606C751B-7CF1-47CF-A25C-9248A55C814F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Chromium.Tests", "StellaOps.Feedser.Source.Vndr.Chromium.Tests\StellaOps.Feedser.Source.Vndr.Chromium.Tests.csproj", "{0BE44D0A-CC4B-4E84-8AF3-D8D99551C431}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Chromium.Tests", "StellaOps.Concelier.Source.Vndr.Chromium.Tests\StellaOps.Concelier.Source.Vndr.Chromium.Tests.csproj", "{0BE44D0A-CC4B-4E84-8AF3-D8D99551C431}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Cisco", "StellaOps.Feedser.Source.Vndr.Cisco\StellaOps.Feedser.Source.Vndr.Cisco.csproj", "{CC4CCE5F-55BC-4745-A204-4FA92BC1BADC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Cisco", "StellaOps.Concelier.Source.Vndr.Cisco\StellaOps.Concelier.Source.Vndr.Cisco.csproj", "{CC4CCE5F-55BC-4745-A204-4FA92BC1BADC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Cisco.Tests", "StellaOps.Feedser.Source.Vndr.Cisco.Tests\StellaOps.Feedser.Source.Vndr.Cisco.Tests.csproj", "{99BAE717-9A2E-41F5-9ECC-5FB97E4A6066}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Cisco.Tests", "StellaOps.Concelier.Source.Vndr.Cisco.Tests\StellaOps.Concelier.Source.Vndr.Cisco.Tests.csproj", "{99BAE717-9A2E-41F5-9ECC-5FB97E4A6066}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Msrc", "StellaOps.Feedser.Source.Vndr.Msrc\StellaOps.Feedser.Source.Vndr.Msrc.csproj", "{5CCE0DB7-C115-4B21-A7AE-C8488C22A853}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Msrc", "StellaOps.Concelier.Source.Vndr.Msrc\StellaOps.Concelier.Source.Vndr.Msrc.csproj", "{5CCE0DB7-C115-4B21-A7AE-C8488C22A853}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Oracle", "StellaOps.Feedser.Source.Vndr.Oracle\StellaOps.Feedser.Source.Vndr.Oracle.csproj", "{A09C9E66-5496-47EC-8B23-9EEB7CBDC75E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Oracle", "StellaOps.Concelier.Source.Vndr.Oracle\StellaOps.Concelier.Source.Vndr.Oracle.csproj", "{A09C9E66-5496-47EC-8B23-9EEB7CBDC75E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Oracle.Tests", "StellaOps.Feedser.Source.Vndr.Oracle.Tests\StellaOps.Feedser.Source.Vndr.Oracle.Tests.csproj", "{06DC817F-A936-4F83-8929-E00622B32245}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Oracle.Tests", "StellaOps.Concelier.Source.Vndr.Oracle.Tests\StellaOps.Concelier.Source.Vndr.Oracle.Tests.csproj", "{06DC817F-A936-4F83-8929-E00622B32245}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Vmware", "StellaOps.Feedser.Source.Vndr.Vmware\StellaOps.Feedser.Source.Vndr.Vmware.csproj", "{2C999476-0291-4161-B3E9-1AA99A3B1139}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Vmware", "StellaOps.Concelier.Source.Vndr.Vmware\StellaOps.Concelier.Source.Vndr.Vmware.csproj", "{2C999476-0291-4161-B3E9-1AA99A3B1139}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Vmware.Tests", "StellaOps.Feedser.Source.Vndr.Vmware.Tests\StellaOps.Feedser.Source.Vndr.Vmware.Tests.csproj", "{476EAADA-1B39-4049-ABE4-CCAC21FFE9E2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Vndr.Vmware.Tests", "StellaOps.Concelier.Source.Vndr.Vmware.Tests\StellaOps.Concelier.Source.Vndr.Vmware.Tests.csproj", "{476EAADA-1B39-4049-ABE4-CCAC21FFE9E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo.Tests", "StellaOps.Feedser.Storage.Mongo.Tests\StellaOps.Feedser.Storage.Mongo.Tests.csproj", "{0EF56124-E6E8-4E89-95DD-5A5D5FF05A98}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo.Tests", "StellaOps.Concelier.Storage.Mongo.Tests\StellaOps.Concelier.Storage.Mongo.Tests.csproj", "{0EF56124-E6E8-4E89-95DD-5A5D5FF05A98}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.WebService", "StellaOps.Feedser.WebService\StellaOps.Feedser.WebService.csproj", "{0DBB9FC4-2E46-4C3E-BE88-2A8DCB59DB7D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService", "StellaOps.Concelier.WebService\StellaOps.Concelier.WebService.csproj", "{0DBB9FC4-2E46-4C3E-BE88-2A8DCB59DB7D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.WebService.Tests", "StellaOps.Feedser.WebService.Tests\StellaOps.Feedser.WebService.Tests.csproj", "{8A40142F-E8C8-4E86-BE70-7DD4AB1FFDEE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.WebService.Tests", "StellaOps.Concelier.WebService.Tests\StellaOps.Concelier.WebService.Tests.csproj", "{8A40142F-E8C8-4E86-BE70-7DD4AB1FFDEE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Configuration.Tests", "StellaOps.Configuration.Tests\StellaOps.Configuration.Tests.csproj", "{C9D20F74-EE5F-4C9E-9AB1-C03E90B34F92}" EndProject @@ -169,11 +169,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.ServerIntegr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Auth.Client.Tests", "StellaOps.Authority\StellaOps.Auth.Client.Tests\StellaOps.Auth.Client.Tests.csproj", "{7DBE31A6-D2FD-499E-B675-4092723175AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kev.Tests", "StellaOps.Feedser.Source.Kev.Tests\StellaOps.Feedser.Source.Kev.Tests.csproj", "{D99E6EAE-D278-4480-AA67-85F025383E47}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Kev.Tests", "StellaOps.Concelier.Source.Kev.Tests\StellaOps.Concelier.Source.Kev.Tests.csproj", "{D99E6EAE-D278-4480-AA67-85F025383E47}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cve.Tests", "StellaOps.Feedser.Source.Cve.Tests\StellaOps.Feedser.Source.Cve.Tests.csproj", "{D3825714-3DDA-44B7-A99C-5F3E65716691}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Cve.Tests", "StellaOps.Concelier.Source.Cve.Tests\StellaOps.Concelier.Source.Cve.Tests.csproj", "{D3825714-3DDA-44B7-A99C-5F3E65716691}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ghsa.Tests", "StellaOps.Feedser.Source.Ghsa.Tests\StellaOps.Feedser.Source.Ghsa.Tests.csproj", "{FAB78D21-7372-48FE-B2C3-DE1807F1157D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Ghsa.Tests", "StellaOps.Concelier.Source.Ghsa.Tests\StellaOps.Concelier.Source.Ghsa.Tests.csproj", "{FAB78D21-7372-48FE-B2C3-DE1807F1157D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Cryptography", "StellaOps.Cryptography\StellaOps.Cryptography.csproj", "{EADFA337-B0FA-4712-A24A-7C08235BDF98}" EndProject diff --git a/tools/FixtureUpdater/FixtureUpdater.csproj b/tools/FixtureUpdater/FixtureUpdater.csproj index ee29c5d9..f9c6eb3b 100644 --- a/tools/FixtureUpdater/FixtureUpdater.csproj +++ b/tools/FixtureUpdater/FixtureUpdater.csproj @@ -8,13 +8,13 @@ - - - - - - - + + + + + + + diff --git a/tools/FixtureUpdater/Program.cs b/tools/FixtureUpdater/Program.cs index 6387c5dd..3f80a2cd 100644 --- a/tools/FixtureUpdater/Program.cs +++ b/tools/FixtureUpdater/Program.cs @@ -3,15 +3,15 @@ using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using MongoDB.Bson; -using StellaOps.Feedser.Models; -using StellaOps.Feedser.Source.Ghsa; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Ghsa.Internal; -using StellaOps.Feedser.Source.Osv.Internal; -using StellaOps.Feedser.Source.Osv; -using StellaOps.Feedser.Source.Nvd; -using StellaOps.Feedser.Storage.Mongo.Documents; -using StellaOps.Feedser.Storage.Mongo.Dtos; +using StellaOps.Concelier.Models; +using StellaOps.Concelier.Source.Ghsa; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Ghsa.Internal; +using StellaOps.Concelier.Source.Osv.Internal; +using StellaOps.Concelier.Source.Osv; +using StellaOps.Concelier.Source.Nvd; +using StellaOps.Concelier.Storage.Mongo.Documents; +using StellaOps.Concelier.Storage.Mongo.Dtos; var serializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) { @@ -20,9 +20,9 @@ var serializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) var projectRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..")); -var osvFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Feedser.Source.Osv.Tests", "Fixtures"); -var ghsaFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Feedser.Source.Ghsa.Tests", "Fixtures"); -var nvdFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Feedser.Source.Nvd.Tests", "Nvd", "Fixtures"); +var osvFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Concelier.Source.Osv.Tests", "Fixtures"); +var ghsaFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Concelier.Source.Ghsa.Tests", "Fixtures"); +var nvdFixturesPath = Path.Combine(projectRoot, "src", "StellaOps.Concelier.Source.Nvd.Tests", "Nvd", "Fixtures"); RewriteOsvFixtures(osvFixturesPath); RewriteSnapshotFixtures(osvFixturesPath); diff --git a/tools/SourceStateSeeder/Program.cs b/tools/SourceStateSeeder/Program.cs index 183c5166..6802a780 100644 --- a/tools/SourceStateSeeder/Program.cs +++ b/tools/SourceStateSeeder/Program.cs @@ -5,10 +5,10 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using MongoDB.Bson; using MongoDB.Driver; -using StellaOps.Feedser.Source.Common; -using StellaOps.Feedser.Source.Common.Fetch; -using StellaOps.Feedser.Storage.Mongo; -using StellaOps.Feedser.Storage.Mongo.Documents; +using StellaOps.Concelier.Source.Common; +using StellaOps.Concelier.Source.Common.Fetch; +using StellaOps.Concelier.Storage.Mongo; +using StellaOps.Concelier.Storage.Mongo.Documents; namespace SourceStateSeeder; diff --git a/tools/SourceStateSeeder/SourceStateSeeder.csproj b/tools/SourceStateSeeder/SourceStateSeeder.csproj index 0a1cbb03..06bbefbd 100644 --- a/tools/SourceStateSeeder/SourceStateSeeder.csproj +++ b/tools/SourceStateSeeder/SourceStateSeeder.csproj @@ -6,7 +6,7 @@ enable - - + + diff --git a/tools/certbund_offline_snapshot.py b/tools/certbund_offline_snapshot.py index 8d7aafc4..ba33adb6 100644 --- a/tools/certbund_offline_snapshot.py +++ b/tools/certbund_offline_snapshot.py @@ -67,7 +67,7 @@ class CertBundClient: raise RuntimeError( "CERT-Bund XSRF token not available. Provide --xsrf-token or a cookie file " - "containing XSRF-TOKEN (see docs/ops/feedser-certbund-operations.md)." + "containing XSRF-TOKEN (see docs/ops/concelier-certbund-operations.md)." ) def fetch_search_pages( @@ -281,7 +281,7 @@ def _build_search_record(path: Path) -> Dict[str, Any]: return { "type": "search", "path": path, - "source": "feedser.cert-bund.search", + "source": "concelier.cert-bund.search", "itemCount": len(content), "from": range_from, "to": range_to, @@ -301,7 +301,7 @@ def _build_export_record(path: Path) -> Dict[str, Any]: return { "type": "export", "path": path, - "source": "feedser.cert-bund.export", + "source": "concelier.cert-bund.export", "itemCount": None, "from": from_value, "to": to_value, @@ -358,7 +358,7 @@ def build_manifest(root: Path, records: Iterable[Dict[str, Any]], manifest_path: manifest_path.parent.mkdir(parents=True, exist_ok=True) manifest_document = { - "source": "feedser.cert-bund", + "source": "concelier.cert-bund", "generatedAt": dt.datetime.now(tz=UTC).isoformat(), "artifacts": manifest_entries, }