Rename Concelier Source modules to Connector
This commit is contained in:
		
							
								
								
									
										100
									
								
								SPRINTS.md
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								SPRINTS.md
									
									
									
									
									
								
							@@ -17,29 +17,29 @@
 | 
				
			|||||||
| 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<br>`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-11) | Team WebService & Authority | SEC3.BUILD | Authority rate-limiter follow-through<br>`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/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<br>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.Authority/StellaOps.Authority.Plugin.Standard/TASKS.md | DONE (2025-10-11) | Team WebService & Authority | PLG6.DOC | Plugin developer guide polish<br>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.Concelier.Source.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-001 | Fetch pipeline & state tracking<br>Summary planner now drives monthly/yearly VINCE fetches, persists pending summaries/notes, and hydrates VINCE detail queue with telemetry.<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-001 | Fetch pipeline & state tracking<br>Summary planner now drives monthly/yearly VINCE fetches, persists pending summaries/notes, and hydrates VINCE detail queue with telemetry.<br>Team instructions: Read ./AGENTS.md and src/StellaOps.Concelier.Connector.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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-002 | VINCE note detail fetcher<br>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<br>Added VINCE DTO aggregate, Markdown→text sanitizer, vendor/status/vulnerability parsers, and parser regression fixture. |
 | 
					| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-003 | DTO & parser implementation<br>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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-004 | Canonical mapping & range primitives<br>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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-005 | Deterministic fixtures/tests<br>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<br>`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.Connector.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-006 | Telemetry & documentation<br>`CertCcDiagnostics` publishes summary/detail/parse/map metrics (meter `StellaOps.Concelier.Connector.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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-007 | Connector test harness remediation<br>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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-008 | Snapshot coverage handoff<br>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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-012 | Schema sync & snapshot regen follow-up<br>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<br>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.Connector.CertCc/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-009 | Detail/map reintegration plan<br>Staged reintegration plan published in `src/StellaOps.Concelier.Connector.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<br>Detail fetch now tolerates 404/403/410 responses and regression tests cover mixed endpoint availability. |
 | 
					| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Connector.CertCc/TASKS.md | DONE (2025-10-12) | Team Connector Resumption – CERT/RedHat | FEEDCONN-CERTCC-02-010 | Partial-detail graceful degradation<br>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<br>Instructions to work:<br>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.Connector.Distro.RedHat/TASKS.md | DONE (2025-10-11) | Team Connector Resumption – CERT/RedHat | FEEDCONN-REDHAT-02-001 | Fixture validation sweep<br>Instructions to work:<br>Fixtures regenerated post-model-helper rollout; provenance ordering and normalizedVersions scaffolding verified via tests. Conflict resolver deltas logged in src/StellaOps.Concelier.Connector.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<br>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.Connector.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-001 | Canonical mapping & range primitives<br>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<br>Sanitized live fixtures + regression snapshots wired into tests; normalized rule coverage asserted. |
 | 
					| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Connector.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-002 | Deterministic fixtures/tests<br>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<br>Apple meter metrics wired into Concelier WebService OpenTelemetry configuration; README and fixtures document normalizedVersions coverage. |
 | 
					| Sprint 1 | Stabilize In-Progress Foundations | src/StellaOps.Concelier.Connector.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-003 | Telemetry & documentation<br>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<br>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.Connector.Vndr.Apple/TASKS.md | DONE (2025-10-12) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-004 | Live HTML regression sweep<br>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<br>`UPDATE_APPLE_FIXTURES=1` flow fetches & rewrites fixtures; README documents usage.<br>Instructions to work:<br>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.Connector.Vndr.Apple/TASKS.md | DONE (2025-10-11) | Team Vendor Apple Specialists | FEEDCONN-APPLE-02-005 | Fixture regeneration tooling<br>`UPDATE_APPLE_FIXTURES=1` flow fetches & rewrites fixtures; README documents usage.<br>Instructions to work:<br>DONE Read ./AGENTS.md and src/StellaOps.Concelier.Connector.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<br>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.Connector.Ghsa/TASKS.md | DONE (2025-10-12) | Team Connector Normalized Versions Rollout | FEEDCONN-GHSA-02-001 | GHSA normalized versions & provenance<br>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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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<br>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-10) | Team WebService & Authority | FEEDWEB-DOCS-01-001 | Document authority toggle & scope requirements<br>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<br>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-ENGINE-01-002 | Plumb Authority client resilience options<br>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<br>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-003 | Author ops guidance for resilience tuning<br>Operator docs now outline connected vs air-gapped resilience profiles and monitoring cues. |
 | 
				
			||||||
@@ -59,28 +59,28 @@
 | 
				
			|||||||
| 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-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<br>Indexes seeded + docs updated 2025-10-11 to cover flattened normalized rules for connector adoption. |
 | 
					| 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<br>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<br>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.Merge/TASKS.md | DONE (2025-10-11) | Team Normalization & Storage Backbone | FEEDMERGE-ENGINE-02-002 | Normalized versions union & dedupe<br>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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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<br>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.Connector.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Expansion – GHSA/NVD/OSV | FEEDCONN-OSV-02-005 | Fixture updater workflow<br>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.Connector.Osv.Tests`, `src/StellaOps.Concelier.Connector.Ghsa.Tests`, `src/StellaOps.Concelier.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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.Connector.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 | src/StellaOps.Concelier.Connector.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<br>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-01-001 | Canonical schema docs refresh<br>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 | Concelier-SemVer Playbook<br>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<br>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<br>Delivered Mongo index/query addendum with `$unwind` recipes, dedupe checks, and operational checklist.<br>Instructions to work:<br>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 2 | Connector & Data Implementation Wave | docs/TASKS.md | DONE (2025-10-11) | Team Docs & Knowledge Base | FEEDDOCS-DOCS-02-002 | Normalized versions query guide<br>Delivered Mongo index/query addendum with `$unwind` recipes, dedupe checks, and operational checklist.<br>Instructions to work:<br>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. |
 | 
				
			||||||
@@ -93,9 +93,9 @@
 | 
				
			|||||||
| 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<br>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-002 | Override metrics instrumentation<br>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<br>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-ENGINE-04-003 | Reference & credit union pipeline<br>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<br>Added regression tests (`AdvisoryMergeServiceTests`) covering canonical + precedence flow.<br>Instructions to work:<br>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.Merge/TASKS.md | DONE (2025-10-11) | Team Merge & QA Enforcement | FEEDMERGE-QA-04-001 | End-to-end conflict regression suite<br>Added regression tests (`AdvisoryMergeServiceTests`) covering canonical + precedence flow.<br>Instructions to work:<br>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.Connector.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.Connector.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<br>Instructions to work:<br>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 | src/StellaOps.Concelier.Connector.Osv/TASKS.md | DONE (2025-10-12) | Team Connector Regression Fixtures | FEEDCONN-OSV-04-002 | OSV conflict regression fixtures<br>Instructions to work:<br>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<br>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-11) | Team Documentation Guild – Conflict Guidance | FEEDDOCS-DOCS-05-001 | Concelier Conflict Rules<br>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<br>Ops review completed, alert thresholds applied, and change log appended in `docs/ops/concelier-conflict-resolution.md`; task closed after connector signals verified. |
 | 
					| 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<br>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)<br>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.Models/TASKS.md | DONE (2025-10-15) | Team Models & Merge Leads | FEEDMODELS-SCHEMA-04-001 | Advisory schema parity (description/CWE/canonical metric)<br>Extend `Advisory` and related records with description text, CWE collection, and canonical metric pointer; refresh validation + serializer determinism tests. |
 | 
				
			||||||
@@ -105,8 +105,8 @@
 | 
				
			|||||||
| 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<br>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.Merge/TASKS.md | DONE (2025-10-15) | Team Merge & QA Enforcement | FEEDMERGE-ENGINE-04-005 | Connector coordination for new advisory fields<br>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<br>Update schemas/offline bundle + fixtures once model/core parity lands.<br>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.Json/TASKS.md | DONE (2025-10-15) | Team Exporters – JSON | FEEDEXPORT-JSON-04-001 | Surface new advisory fields in JSON exporter<br>Update schemas/offline bundle + fixtures once model/core parity lands.<br>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<br>Extend Bolt builder, metadata, and regression tests for the expanded schema.<br>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.Exporter.TrivyDb/TASKS.md | DONE (2025-10-15) | Team Exporters – Trivy DB | FEEDEXPORT-TRIVY-04-001 | Propagate new advisory fields into Trivy DB package<br>Extend Bolt builder, metadata, and regression tests for the expanded schema.<br>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.Connector.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 4 | Schema Parity & Freshness Alignment | src/StellaOps.Concelier.Connector.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-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-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. |
 | 
					| 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. |
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								TODOS.md
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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-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-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-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.Concelier.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.Connector.CertCc/FEEDCONN-CERTCC-02-009_PLAN.md`; outlines staged enablement + rollback.|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Connector Apple Status
 | 
					# Connector Apple Status
 | 
				
			||||||
| Task | Status | Notes |
 | 
					| Task | Status | Notes |
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,13 +63,13 @@ The script spins up MongoDB/Redis via Testcontainers and requires:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The Concelier 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
 | 
					that checks a curated set of GHSA identifiers against OSV responses. The fixture
 | 
				
			||||||
snapshots live in `src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/` and are kept
 | 
					snapshots live in `src/StellaOps.Concelier.Connector.Osv.Tests/Fixtures/` and are kept
 | 
				
			||||||
deterministic so the parity report remains reproducible.
 | 
					deterministic so the parity report remains reproducible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To refresh the fixtures when GHSA/OSV payloads change:
 | 
					To refresh the fixtures when GHSA/OSV payloads change:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Ensure outbound HTTPS access to `https://api.osv.dev` and `https://api.github.com`.
 | 
					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.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj`.
 | 
					2. Run `UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Osv.Tests/StellaOps.Concelier.Connector.Osv.Tests.csproj`.
 | 
				
			||||||
3. Commit the regenerated `osv-ghsa.*.json` files that the test emits (raw snapshots and canonical advisories).
 | 
					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
 | 
					The regen flow logs `[Parity]` messages and normalises `recordedAt` timestamps so the
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,39 +7,39 @@ fixture sets, where they live, and how to regenerate them safely.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## GHSA ↔ OSV parity fixtures
 | 
					## GHSA ↔ OSV parity fixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Location:** `src/StellaOps.Concelier.Source.Osv.Tests/Fixtures/osv-ghsa.*.json`
 | 
					- **Location:** `src/StellaOps.Concelier.Connector.Osv.Tests/Fixtures/osv-ghsa.*.json`
 | 
				
			||||||
- **Purpose:** Exercised by `OsvGhsaParityRegressionTests` to ensure OSV + GHSA outputs stay aligned on aliases,
 | 
					- **Purpose:** Exercised by `OsvGhsaParityRegressionTests` to ensure OSV + GHSA outputs stay aligned on aliases,
 | 
				
			||||||
  ranges, references, and credits.
 | 
					  ranges, references, and credits.
 | 
				
			||||||
- **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`)
 | 
					- **Regeneration:** Either run the test harness with online regeneration (`UPDATE_PARITY_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Osv.Tests/StellaOps.Concelier.Connector.Osv.Tests.csproj`)
 | 
				
			||||||
  or execute the fixture updater (`dotnet run --project tools/FixtureUpdater/FixtureUpdater.csproj`). Both paths
 | 
					  or execute the fixture updater (`dotnet run --project tools/FixtureUpdater/FixtureUpdater.csproj`). Both paths
 | 
				
			||||||
  normalise timestamps and canonical ordering.
 | 
					  normalise timestamps and canonical ordering.
 | 
				
			||||||
- **SemVer provenance:** The regenerated fixtures should show `normalizedVersions[].notes` in the
 | 
					- **SemVer provenance:** The regenerated fixtures should show `normalizedVersions[].notes` in the
 | 
				
			||||||
  `osv:{ecosystem}:{advisoryId}:{identifier}` shape emitted by `SemVerRangeRuleBuilder`. Confirm the
 | 
					  `osv:{ecosystem}:{advisoryId}:{identifier}` shape emitted by `SemVerRangeRuleBuilder`. Confirm the
 | 
				
			||||||
  constraints and notes line up with GHSA/NVD composites before committing.
 | 
					  constraints and notes line up with GHSA/NVD composites before committing.
 | 
				
			||||||
- **Verification:** Inspect the diff, then re-run `dotnet test src/StellaOps.Concelier.Source.Osv.Tests/StellaOps.Concelier.Source.Osv.Tests.csproj` to confirm parity.
 | 
					- **Verification:** Inspect the diff, then re-run `dotnet test src/StellaOps.Concelier.Connector.Osv.Tests/StellaOps.Concelier.Connector.Osv.Tests.csproj` to confirm parity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## GHSA credit parity fixtures
 | 
					## GHSA credit parity fixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Location:** `src/StellaOps.Concelier.Source.Ghsa.Tests/Fixtures/credit-parity.{ghsa,osv,nvd}.json`
 | 
					- **Location:** `src/StellaOps.Concelier.Connector.Ghsa.Tests/Fixtures/credit-parity.{ghsa,osv,nvd}.json`
 | 
				
			||||||
- **Purpose:** Exercised by `GhsaCreditParityRegressionTests` to guarantee GHSA/NVD/OSV acknowledgements remain in lockstep.
 | 
					- **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.
 | 
					- **Regeneration:** `dotnet run --project tools/FixtureUpdater/FixtureUpdater.csproj` rewrites all three canonical snapshots.
 | 
				
			||||||
- **Verification:** `dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj`.
 | 
					- **Verification:** `dotnet test src/StellaOps.Concelier.Connector.Ghsa.Tests/StellaOps.Concelier.Connector.Ghsa.Tests.csproj`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> Always commit fixture changes together with the code that motivated them and reference the regression test that guards the behaviour.
 | 
					> Always commit fixture changes together with the code that motivated them and reference the regression test that guards the behaviour.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Apple security update fixtures
 | 
					## Apple security update fixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Location:** `src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/*.html` and `.expected.json`.
 | 
					- **Location:** `src/StellaOps.Concelier.Connector.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.
 | 
					- **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.
 | 
					- **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.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.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.Connector.Vndr.Apple.Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj` without the env var to confirm determinism.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> **Tip for other connector owners:** mirror the sentinel + `WSLENV` pattern (`touch .update-<connector>-fixtures`, append the env var via `WSLENV`) when you add fixture refresh scripts so contributors running under WSL inherit the regeneration flag automatically.
 | 
					> **Tip for other connector owners:** mirror the sentinel + `WSLENV` pattern (`touch .update-<connector>-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
 | 
					## KISA advisory fixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Location:** `src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-{feed,detail}.(xml|json)`
 | 
					- **Location:** `src/StellaOps.Concelier.Connector.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.
 | 
					- **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.Concelier.Source.Kisa.Tests/StellaOps.Concelier.Source.Kisa.Tests.csproj`
 | 
					- **Regeneration:** `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Kisa.Tests/StellaOps.Concelier.Connector.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.
 | 
					- **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.
 | 
					- **Localisation note:** RSS `category` values (e.g. `취약점정보`) remain in Hangul—do not translate them in fixtures; they feed directly into metrics/log tags.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ The KISA/KNVD connector now ships with structured telemetry, richer logging, and
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Telemetry counters
 | 
					## Telemetry counters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All metrics are emitted from `KisaDiagnostics` (`Meter` name `StellaOps.Concelier.Source.Kisa`).
 | 
					All metrics are emitted from `KisaDiagnostics` (`Meter` name `StellaOps.Concelier.Connector.Kisa`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Metric | Description | Tags |
 | 
					| 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”.
 | 
					- 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.
 | 
					- 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.
 | 
					- 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.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`.
 | 
					- Fixtures live under `src/StellaOps.Concelier.Connector.Kisa.Tests/Fixtures/`. Regenerate with `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Kisa.Tests/StellaOps.Concelier.Connector.Kisa.Tests.csproj`.
 | 
				
			||||||
- The regression suite asserts canonical mapping, state cleanup, and telemetry counters (`KisaConnectorTests.Telemetry_RecordsMetrics`) so QA can track instrumentation drift.
 | 
					- 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.
 | 
					For operator docs, link to this brief when documenting Hangul handling or counter dashboards so localisation reviewers have a single reference point.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,22 +18,22 @@ This dashboard tracks connector readiness for emitting `AffectedPackage.Normaliz
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
| Connector | Owner team | Normalized versions status | Last update | Next action / link |
 | 
					| 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.Concelier.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.Connector.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`. |
 | 
					| 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.Concelier.Source.CertBund/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.Connector.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`. |
 | 
					| 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.Connector.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`. |
 | 
					| Kev | BE-Conn-KEV | ✅ Normalized catalog/due-date rules verified | 2025-10-12 | Fixtures reconfirmed via `dotnet test src/StellaOps.Concelier.Connector.Kev.Tests`; `src/StellaOps.Concelier.Connector.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`. |
 | 
					| Cve | BE-Conn-CVE | ✅ Normalized SemVer rules verified | 2025-10-12 | Snapshot parity green (`dotnet test src/StellaOps.Concelier.Connector.Cve.Tests`); `src/StellaOps.Concelier.Connector.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`. |
 | 
					| Ghsa | BE-Conn-GHSA | ⚠️ DOING – normalized rollout task active | 2025-10-11 18:45 UTC | Wire `SemVerRangeRuleBuilder` + refresh fixtures; `src/StellaOps.Concelier.Connector.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`. |
 | 
					| Osv | BE-Conn-OSV | ✅ SemVer mapper & parity fixtures verified | 2025-10-12 | GHSA parity regression passing (`dotnet test src/StellaOps.Concelier.Connector.Osv.Tests`); `src/StellaOps.Concelier.Connector.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`. |
 | 
					| Ics.Cisa | BE-Conn-ICS-CISA | ❌ Not started – mapper TODO | 2025-10-11 | Plan SemVer/firmware scheme selection; `src/StellaOps.Concelier.Connector.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. |
 | 
					| 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.Concelier.Source.Ru.Bdu/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.Connector.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`. |
 | 
					| Ru.Nkcki | BE-Conn-Nkcki | ❌ Not started – mapper TODO | 2025-10-11 | Similar to BDU; ensure Cyrillic provenance preserved; `src/StellaOps.Concelier.Connector.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.Apple | BE-Conn-Apple | ✅ Shipped – emitting normalized arrays | 2025-10-11 | Continue fixture/tooling work; `src/StellaOps.Concelier.Connector.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.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.Concelier.Source.Vndr.Msrc/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.Connector.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`. |
 | 
					| 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.Connector.Nvd/TASKS.md`. |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Legend: ✅ complete, ⚠️ in progress/partial, ❌ not started.
 | 
					Legend: ✅ complete, ⚠️ in progress/partial, ❌ not started.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ concelier:
 | 
				
			|||||||
2. Trigger a full connector cycle:
 | 
					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`
 | 
					   - 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"] }`
 | 
					   - 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.Concelier.Source.Vndr.Apple`:
 | 
					3. Validate metrics exported under meter `StellaOps.Concelier.Connector.Vndr.Apple`:
 | 
				
			||||||
   - `apple.fetch.items` (documents fetched)
 | 
					   - `apple.fetch.items` (documents fetched)
 | 
				
			||||||
   - `apple.fetch.failures`
 | 
					   - `apple.fetch.failures`
 | 
				
			||||||
   - `apple.fetch.unchanged`
 | 
					   - `apple.fetch.unchanged`
 | 
				
			||||||
@@ -57,21 +57,21 @@ concelier:
 | 
				
			|||||||
  - `increase(apple_parse_failures_total[6h])` to catch parser drift (alerts at `>0`)
 | 
					  - `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.
 | 
					- **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.
 | 
					- **Logs** – Surface warnings `Apple document {DocumentId} missing GridFS payload` or `Apple parse failed`—repeated hits imply storage issues or HTML regressions.
 | 
				
			||||||
- **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.
 | 
					- **Telemetry pipeline** – `StellaOps.Concelier.WebService` now exports `StellaOps.Concelier.Connector.Vndr.Apple` alongside existing Concelier meters; ensure your OTEL collector or Prometheus scraper includes it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 4. Fixture Maintenance
 | 
					## 4. Fixture Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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.
 | 
					Regression fixtures live under `src/StellaOps.Concelier.Connector.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:
 | 
					1. Run the helper script matching your platform:
 | 
				
			||||||
   - Bash: `./scripts/update-apple-fixtures.sh`
 | 
					   - Bash: `./scripts/update-apple-fixtures.sh`
 | 
				
			||||||
   - PowerShell: `./scripts/update-apple-fixtures.ps1`
 | 
					   - 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.
 | 
					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.Concelier.Source.Vndr.Apple.Tests/StellaOps.Concelier.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.Connector.Vndr.Apple.Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj`) to verify determinism.
 | 
				
			||||||
4. Commit fixture updates together with any parser/mapping changes that motivated them.
 | 
					4. Commit fixture updates together with any parser/mapping changes that motivated them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 5. Known Issues & Follow-up Tasks
 | 
					## 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.
 | 
					- 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.
 | 
					- 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.Concelier.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.Connector.Vndr.Apple/TASKS.md`). Capture non-`en-us` snapshots once the fixture tooling stabilises.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ concelier:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 2. Telemetry & Logging
 | 
					## 2. Telemetry & Logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Metrics (Meter `StellaOps.Concelier.Source.Cccs`):**
 | 
					- **Metrics (Meter `StellaOps.Concelier.Connector.Cccs`):**
 | 
				
			||||||
  - `cccs.fetch.attempts`, `cccs.fetch.success`, `cccs.fetch.failures`
 | 
					  - `cccs.fetch.attempts`, `cccs.fetch.success`, `cccs.fetch.failures`
 | 
				
			||||||
  - `cccs.fetch.documents`, `cccs.fetch.unchanged`
 | 
					  - `cccs.fetch.documents`, `cccs.fetch.unchanged`
 | 
				
			||||||
  - `cccs.parse.success`, `cccs.parse.failures`, `cccs.parse.quarantine`
 | 
					  - `cccs.parse.success`, `cccs.parse.failures`, `cccs.parse.quarantine`
 | 
				
			||||||
@@ -67,6 +67,6 @@ Suggested Grafana alerts:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 5. Fixture Maintenance
 | 
					## 5. Fixture Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Regression fixtures live in `src/StellaOps.Concelier.Source.Cccs.Tests/Fixtures`.
 | 
					- Regression fixtures live in `src/StellaOps.Concelier.Connector.Cccs.Tests/Fixtures`.
 | 
				
			||||||
- Refresh via `UPDATE_CCCS_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Cccs.Tests/StellaOps.Concelier.Source.Cccs.Tests.csproj`.
 | 
					- Refresh via `UPDATE_CCCS_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Cccs.Tests/StellaOps.Concelier.Connector.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.
 | 
					- Fixtures capture both EN/FR advisories with nested lists to guard against sanitiser regressions; review diffs for heading/list changes before committing.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ concelier:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 2. Telemetry & Logging
 | 
					## 2. Telemetry & Logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Meter**: `StellaOps.Concelier.Source.CertBund`
 | 
					- **Meter**: `StellaOps.Concelier.Connector.CertBund`
 | 
				
			||||||
- **Counters / histograms**:
 | 
					- **Counters / histograms**:
 | 
				
			||||||
  - `certbund.feed.fetch.attempts|success|failures`
 | 
					  - `certbund.feed.fetch.attempts|success|failures`
 | 
				
			||||||
  - `certbund.feed.items.count`
 | 
					  - `certbund.feed.items.count`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@ This runbook describes how Ops provisions, rotates, and distributes Cisco PSIRT
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 7. Telemetry & Monitoring
 | 
					## 7. Telemetry & Monitoring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Metrics (Meter `StellaOps.Concelier.Source.Vndr.Cisco`)**
 | 
					- **Metrics (Meter `StellaOps.Concelier.Connector.Vndr.Cisco`)**
 | 
				
			||||||
  - `cisco.fetch.documents`, `cisco.fetch.failures`, `cisco.fetch.unchanged`
 | 
					  - `cisco.fetch.documents`, `cisco.fetch.failures`, `cisco.fetch.unchanged`
 | 
				
			||||||
  - `cisco.parse.success`, `cisco.parse.failures`
 | 
					  - `cisco.parse.success`, `cisco.parse.failures`
 | 
				
			||||||
  - `cisco.map.success`, `cisco.map.failures`, `cisco.map.affected.packages`
 | 
					  - `cisco.map.success`, `cisco.map.failures`, `cisco.map.affected.packages`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -139,13 +139,13 @@ Keep this runbook synchronized with future sprint notes and update alert thresho
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 9. Synthetic Regression Fixtures
 | 
					## 9. Synthetic Regression Fixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **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`.
 | 
					- **Locations** – Canonical conflict snapshots now live at `src/StellaOps.Concelier.Connector.Ghsa.Tests/Fixtures/conflict-ghsa.canonical.json`, `src/StellaOps.Concelier.Connector.Nvd.Tests/Nvd/Fixtures/conflict-nvd.canonical.json`, and `src/StellaOps.Concelier.Connector.Osv.Tests/Fixtures/conflict-osv.canonical.json`.
 | 
				
			||||||
- **Validation commands** – To regenerate and verify the fixtures offline, run:
 | 
					- **Validation commands** – To regenerate and verify the fixtures offline, run:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
dotnet test src/StellaOps.Concelier.Source.Ghsa.Tests/StellaOps.Concelier.Source.Ghsa.Tests.csproj --filter GhsaConflictFixtureTests
 | 
					dotnet test src/StellaOps.Concelier.Connector.Ghsa.Tests/StellaOps.Concelier.Connector.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.Connector.Nvd.Tests/StellaOps.Concelier.Connector.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.Connector.Osv.Tests/StellaOps.Concelier.Connector.Osv.Tests.csproj --filter OsvConflictFixtureTests
 | 
				
			||||||
dotnet test src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj --filter MergeAsync_AppliesCanonicalRulesAndPersistsDecisions
 | 
					dotnet test src/StellaOps.Concelier.Merge.Tests/StellaOps.Concelier.Merge.Tests.csproj --filter MergeAsync_AppliesCanonicalRulesAndPersistsDecisions
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ concelier:
 | 
				
			|||||||
2. Trigger one end-to-end cycle:
 | 
					2. Trigger one end-to-end cycle:
 | 
				
			||||||
   - Concelier 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"] }`
 | 
					   - 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.Concelier.Source.Cve`):
 | 
					3. Observe the following metrics (exported via OTEL meter `StellaOps.Concelier.Connector.Cve`):
 | 
				
			||||||
   - `cve.fetch.attempts`, `cve.fetch.success`, `cve.fetch.documents`, `cve.fetch.failures`, `cve.fetch.unchanged`
 | 
					   - `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.parse.success`, `cve.parse.failures`, `cve.parse.quarantine`
 | 
				
			||||||
   - `cve.map.success`
 | 
					   - `cve.map.success`
 | 
				
			||||||
@@ -58,12 +58,12 @@ concelier:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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:
 | 
					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.Concelier.Source.Cve.Tests/StellaOps.Concelier.Source.Cve.Tests.csproj -l "console;verbosity=detailed"`
 | 
					- Command: `dotnet test src/StellaOps.Concelier.Connector.Cve.Tests/StellaOps.Concelier.Connector.Cve.Tests.csproj -l "console;verbosity=detailed"`
 | 
				
			||||||
- Summary log emitted by the connector:
 | 
					- 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
 | 
					  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.Concelier.Source.Cve`:
 | 
					- Telemetry captured by `Meter` `StellaOps.Concelier.Connector.Cve`:
 | 
				
			||||||
  | Metric | Value |
 | 
					  | Metric | Value |
 | 
				
			||||||
  |--------|-------|
 | 
					  |--------|-------|
 | 
				
			||||||
  | `cve.fetch.attempts` | 1 |
 | 
					  | `cve.fetch.attempts` | 1 |
 | 
				
			||||||
@@ -109,7 +109,7 @@ Treat repeated schema failures or growing anomaly counts as an upstream regressi
 | 
				
			|||||||
2. Trigger a pipeline run:
 | 
					2. Trigger a pipeline run:
 | 
				
			||||||
   - CLI: `stella db jobs run source:kev:fetch --and-then source:kev:parse --and-then source:kev:map`
 | 
					   - 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"] }`
 | 
					   - REST: `POST /jobs/run { "kind": "source:kev:fetch", "chain": ["source:kev:parse", "source:kev:map"] }`
 | 
				
			||||||
3. Verify the metrics exposed by meter `StellaOps.Concelier.Source.Kev`:
 | 
					3. Verify the metrics exposed by meter `StellaOps.Concelier.Connector.Kev`:
 | 
				
			||||||
   - `kev.fetch.attempts`, `kev.fetch.success`, `kev.fetch.unchanged`, `kev.fetch.failures`
 | 
					   - `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.parse.entries` (tag `catalogVersion`), `kev.parse.failures`, `kev.parse.anomalies` (tag `reason`)
 | 
				
			||||||
   - `kev.map.advisories` (tag `catalogVersion`)
 | 
					   - `kev.map.advisories` (tag `catalogVersion`)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,7 +102,7 @@ The Offline Kit deployment script copies this file into the container secret dir
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 6. Telemetry & Monitoring
 | 
					## 6. Telemetry & Monitoring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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.
 | 
					The connector emits metrics under the meter `StellaOps.Concelier.Connector.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: `concelier.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.parse.*` – counters for `success`/`failures` and histograms `icscisa.parse.advisories`, `icscisa.parse.attachments`, `icscisa.parse.detail_fetches` to monitor enrichment workload per feed document.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ concelier:
 | 
				
			|||||||
2. Run a full connector cycle:
 | 
					2. Run a full connector cycle:
 | 
				
			||||||
   - CLI: `stella db jobs run source:kisa:fetch --and-then source:kisa:parse --and-then source:kisa:map`
 | 
					   - 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"] }`
 | 
					   - REST: `POST /jobs/run { "kind": "source:kisa:fetch", "chain": ["source:kisa:parse", "source:kisa:map"] }`
 | 
				
			||||||
3. Confirm telemetry (Meter `StellaOps.Concelier.Source.Kisa`):
 | 
					3. Confirm telemetry (Meter `StellaOps.Concelier.Connector.Kisa`):
 | 
				
			||||||
   - `kisa.feed.success`, `kisa.feed.items`
 | 
					   - `kisa.feed.success`, `kisa.feed.items`
 | 
				
			||||||
   - `kisa.detail.success` / `.failures`
 | 
					   - `kisa.detail.success` / `.failures`
 | 
				
			||||||
   - `kisa.parse.success` / `.failures`
 | 
					   - `kisa.parse.success` / `.failures`
 | 
				
			||||||
@@ -63,8 +63,8 @@ concelier:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 5. Fixture & Regression Maintenance
 | 
					## 5. Fixture & Regression Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Regression fixtures: `src/StellaOps.Concelier.Source.Kisa.Tests/Fixtures/kisa-feed.xml` and `kisa-detail.json`.
 | 
					- Regression fixtures: `src/StellaOps.Concelier.Connector.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`.
 | 
					- Refresh via `UPDATE_KISA_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Kisa.Tests/StellaOps.Concelier.Connector.Kisa.Tests.csproj`.
 | 
				
			||||||
- The telemetry regression (`KisaConnectorTests.Telemetry_RecordsMetrics`) will fail if counters/log wiring drifts—treat failures as gating.
 | 
					- The telemetry regression (`KisaConnectorTests.Telemetry_RecordsMetrics`) will fail if counters/log wiring drifts—treat failures as gating.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 6. Known Issues
 | 
					## 6. Known Issues
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ When operating in offline-first mode, set `cacheDirectory` to a writable path (e
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Telemetry
 | 
					## Telemetry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`RuNkckiDiagnostics` emits the following metrics under meter `StellaOps.Concelier.Source.Ru.Nkcki`:
 | 
					`RuNkckiDiagnostics` emits the following metrics under meter `StellaOps.Concelier.Connector.Ru.Nkcki`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `nkcki.listing.fetch.attempts` / `nkcki.listing.fetch.success` / `nkcki.listing.fetch.failures`
 | 
					- `nkcki.listing.fetch.attempts` / `nkcki.listing.fetch.success` / `nkcki.listing.fetch.failures`
 | 
				
			||||||
- `nkcki.listing.pages.visited` (histogram, `pages`)
 | 
					- `nkcki.listing.pages.visited` (histogram, `pages`)
 | 
				
			||||||
@@ -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.
 | 
					- 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.
 | 
					- 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.Concelier.Source.Ru.Nkcki/TASKS.md` for outstanding items.
 | 
					Refer to `ru-nkcki` entries in `src/StellaOps.Concelier.Connector.Ru.Nkcki/TASKS.md` for outstanding items.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.
 | 
					- 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
 | 
					## 4. Runbook updates
 | 
				
			||||||
- 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`.
 | 
					- Fixture parity suites (`osv-ghsa.*`) now assert the fallback id and provenance notes. Regenerate via `dotnet test src/StellaOps.Concelier.Connector.Osv.Tests/StellaOps.Concelier.Connector.Osv.Tests.csproj`.
 | 
				
			||||||
- When investigating merge severity conflicts, include the fallback counter and confirm OSV advisories carry the expected `osv:severity/<level>` id before raising connector bugs.
 | 
					- When investigating merge severity conflicts, include the fallback counter and confirm OSV advisories carry the expected `osv:severity/<level>` id before raising connector bugs.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,9 +10,9 @@ $env:UPDATE_APPLE_FIXTURES = "1"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Push-Location $rootDir
 | 
					Push-Location $rootDir
 | 
				
			||||||
try {
 | 
					try {
 | 
				
			||||||
    $sentinel = Join-Path $rootDir "src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures"
 | 
					    $sentinel = Join-Path $rootDir "src/StellaOps.Concelier.Connector.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures"
 | 
				
			||||||
    New-Item -ItemType File -Path $sentinel -Force | Out-Null
 | 
					    New-Item -ItemType File -Path $sentinel -Force | Out-Null
 | 
				
			||||||
    dotnet test "src\StellaOps.Concelier.Source.Vndr.Apple.Tests\StellaOps.Concelier.Source.Vndr.Apple.Tests.csproj" @Args
 | 
					    dotnet test "src\StellaOps.Concelier.Connector.Vndr.Apple.Tests\StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj" @Args
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
finally {
 | 
					finally {
 | 
				
			||||||
    Pop-Location
 | 
					    Pop-Location
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,5 +10,5 @@ else
 | 
				
			|||||||
  export WSLENV="UPDATE_APPLE_FIXTURES/up"
 | 
					  export WSLENV="UPDATE_APPLE_FIXTURES/up"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
touch "$ROOT_DIR/src/StellaOps.Concelier.Source.Vndr.Apple.Tests/Apple/Fixtures/.update-apple-fixtures"
 | 
					touch "$ROOT_DIR/src/StellaOps.Concelier.Connector.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" "$@" )
 | 
					( cd "$ROOT_DIR" && dotnet test "src/StellaOps.Concelier.Connector.Vndr.Apple.Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj" "$@" )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
    <ConcelierPluginOutputRoot Condition="'$(ConcelierPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries</ConcelierPluginOutputRoot>
 | 
					    <ConcelierPluginOutputRoot Condition="'$(ConcelierPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries</ConcelierPluginOutputRoot>
 | 
				
			||||||
    <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == ''">$(SolutionDir)PluginBinaries\Authority</AuthorityPluginOutputRoot>
 | 
					    <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == ''">$(SolutionDir)PluginBinaries\Authority</AuthorityPluginOutputRoot>
 | 
				
			||||||
    <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries\Authority</AuthorityPluginOutputRoot>
 | 
					    <AuthorityPluginOutputRoot Condition="'$(AuthorityPluginOutputRoot)' == '' and '$(SolutionDir)' == ''">$(MSBuildThisFileDirectory)PluginBinaries\Authority</AuthorityPluginOutputRoot>
 | 
				
			||||||
    <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Source.'))">true</IsConcelierPlugin>
 | 
					    <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Connector.'))">true</IsConcelierPlugin>
 | 
				
			||||||
    <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Exporter.'))">true</IsConcelierPlugin>
 | 
					    <IsConcelierPlugin Condition="'$(IsConcelierPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Concelier.Exporter.'))">true</IsConcelierPlugin>
 | 
				
			||||||
    <IsAuthorityPlugin Condition="'$(IsAuthorityPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Authority.Plugin.'))">true</IsAuthorityPlugin>
 | 
					    <IsAuthorityPlugin Condition="'$(IsAuthorityPlugin)' == '' and $([System.String]::Copy('$(MSBuildProjectName)').StartsWith('StellaOps.Authority.Plugin.'))">true</IsAuthorityPlugin>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Authority.Plugins
 | 
				
			|||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Testing", "..\StellaOps.Concelier.Testing\StellaOps.Concelier.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
 | 
					EndProject
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Source.Common", "..\StellaOps.Concelier.Source.Common\StellaOps.Concelier.Source.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}"
 | 
					Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Connector.Common", "..\StellaOps.Concelier.Connector.Common\StellaOps.Concelier.Connector.Common.csproj", "{E0B9CD7A-C4FF-44EB-BE04-9B998C1C4166}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Concelier.Storage.Mongo", "..\StellaOps.Concelier.Storage.Mongo\StellaOps.Concelier.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
 | 
					EndProject
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,17 +10,17 @@ using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			|||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using Microsoft.Extensions.Time.Testing;
 | 
					using Microsoft.Extensions.Time.Testing;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc;
 | 
					using StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class AcscConnectorFetchTests : IAsyncLifetime
 | 
					public sealed class AcscConnectorFetchTests : IAsyncLifetime
 | 
				
			||||||
@@ -10,11 +10,11 @@ using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			|||||||
using Microsoft.Extensions.Time.Testing;
 | 
					using Microsoft.Extensions.Time.Testing;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Models;
 | 
					using StellaOps.Concelier.Models;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc;
 | 
					using StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
@@ -22,7 +22,7 @@ using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			|||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class AcscConnectorParseTests : IAsyncLifetime
 | 
					public sealed class AcscConnectorParseTests : IAsyncLifetime
 | 
				
			||||||
@@ -2,11 +2,11 @@ using System.Net;
 | 
				
			|||||||
using System.Net.Http;
 | 
					using System.Net.Http;
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Tests.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Tests.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class AcscHttpClientConfigurationTests
 | 
					public sealed class AcscHttpClientConfigurationTests
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -7,10 +7,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Testing/StellaOps.Concelier.Testing.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Acsc/StellaOps.Concelier.Source.Acsc.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Acsc/StellaOps.Concelier.Connector.Acsc.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
@@ -35,6 +35,6 @@ Out of scope:
 | 
				
			|||||||
- Handle transient fetch failures gracefully with exponential backoff and mark failures in source state.
 | 
					- Handle transient fetch failures gracefully with exponential backoff and mark failures in source state.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Tests
 | 
					## Tests
 | 
				
			||||||
- Add integration-style tests under `StellaOps.Concelier.Source.Acsc.Tests` covering fetch/parse/map with canned fixtures.
 | 
					- Add integration-style tests under `StellaOps.Concelier.Connector.Acsc.Tests` covering fetch/parse/map with canned fixtures.
 | 
				
			||||||
- Snapshot canonical advisories; provide UPDATE flag flow for regeneration.
 | 
					- Snapshot canonical advisories; provide UPDATE flag flow for regeneration.
 | 
				
			||||||
- Validate determinism (ordering, casing, timestamps) to satisfy pipeline reproducibility requirements.
 | 
					- Validate determinism (ordering, casing, timestamps) to satisfy pipeline reproducibility requirements.
 | 
				
			||||||
@@ -12,18 +12,18 @@ using Microsoft.Extensions.Logging;
 | 
				
			|||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using MongoDB.Bson.IO;
 | 
					using MongoDB.Bson.IO;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Internal;
 | 
					using StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Fetch;
 | 
					using StellaOps.Concelier.Connector.Common.Fetch;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
					using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class AcscConnector : IFeedConnector
 | 
					public sealed class AcscConnector : IFeedConnector
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class AcscConnectorPlugin : IConnectorPlugin
 | 
					public sealed class AcscConnectorPlugin : IConnectorPlugin
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,9 +2,9 @@ using Microsoft.Extensions.Configuration;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.DependencyInjection;
 | 
					using StellaOps.DependencyInjection;
 | 
				
			||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class AcscDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
					public sealed class AcscDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					using StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Acsc.Internal;
 | 
					using StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public static class AcscServiceCollectionExtensions
 | 
					public static class AcscServiceCollectionExtensions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using System.Text.RegularExpressions;
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
/// Defines a single ACSC RSS feed endpoint.
 | 
					/// Defines a single ACSC RSS feed endpoint.
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
using System.Net.Http;
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Configuration;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
/// Connector options governing ACSC feed access and retry behaviour.
 | 
					/// Connector options governing ACSC feed access and retry behaviour.
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal enum AcscEndpointPreference
 | 
					internal enum AcscEndpointPreference
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
using System.Diagnostics.Metrics;
 | 
					using System.Diagnostics.Metrics;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class AcscDiagnostics : IDisposable
 | 
					public sealed class AcscDiagnostics : IDisposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private const string MeterName = "StellaOps.Concelier.Source.Acsc";
 | 
					    private const string MeterName = "StellaOps.Concelier.Connector.Acsc";
 | 
				
			||||||
    private const string MeterVersion = "1.0.0";
 | 
					    private const string MeterVersion = "1.0.0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly Meter _meter;
 | 
					    private readonly Meter _meter;
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal readonly record struct AcscDocumentMetadata(string FeedSlug, string FetchMode)
 | 
					internal readonly record struct AcscDocumentMetadata(string FeedSlug, string FetchMode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record AcscFeedDto(
 | 
					internal sealed record AcscFeedDto(
 | 
				
			||||||
    [property: JsonPropertyName("feedSlug")] string FeedSlug,
 | 
					    [property: JsonPropertyName("feedSlug")] string FeedSlug,
 | 
				
			||||||
@@ -4,9 +4,9 @@ using System.Xml.Linq;
 | 
				
			|||||||
using AngleSharp.Dom;
 | 
					using AngleSharp.Dom;
 | 
				
			||||||
using AngleSharp.Html.Parser;
 | 
					using AngleSharp.Html.Parser;
 | 
				
			||||||
using System.Security.Cryptography;
 | 
					using System.Security.Cryptography;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class AcscFeedParser
 | 
					internal static class AcscFeedParser
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -5,7 +5,7 @@ using StellaOps.Concelier.Models;
 | 
				
			|||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
					using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Acsc.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class AcscMapper
 | 
					internal static class AcscMapper
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Acsc;
 | 
					namespace StellaOps.Concelier.Connector.Acsc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class AcscJobKinds
 | 
					internal static class AcscJobKinds
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
using System.Runtime.CompilerServices;
 | 
					using System.Runtime.CompilerServices;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[assembly: InternalsVisibleTo("StellaOps.Concelier.Source.Nvd.Tests")]
 | 
					 | 
				
			||||||
[assembly: InternalsVisibleTo("FixtureUpdater")]
 | 
					[assembly: InternalsVisibleTo("FixtureUpdater")]
 | 
				
			||||||
 | 
					[assembly: InternalsVisibleTo("StellaOps.Concelier.Connector.Acsc.Tests")]
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
## StellaOps.Concelier.Source.Acsc
 | 
					## StellaOps.Concelier.Connector.Acsc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Australian Cyber Security Centre (ACSC) connector that ingests RSS/Atom advisories, sanitises embedded HTML, and maps entries into canonical `Advisory` records for Concelier.
 | 
					Australian Cyber Security Centre (ACSC) connector that ingests RSS/Atom advisories, sanitises embedded HTML, and maps entries into canonical `Advisory` records for Concelier.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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. |
 | 
					| `source:acsc:probe` | `25,55 * * * *` | Verify direct endpoint health and adjust cursor preference. |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Metrics
 | 
					### Metrics
 | 
				
			||||||
Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Concelier.Source.Acsc`):
 | 
					Emitted via `AcscDiagnostics` (`Meter` = `StellaOps.Concelier.Connector.Acsc`):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Instrument | Unit | Description |
 | 
					| Instrument | Unit | Description |
 | 
				
			||||||
| --- | --- | --- |
 | 
					| --- | --- | --- |
 | 
				
			||||||
@@ -54,10 +54,10 @@ Key log messages include:
 | 
				
			|||||||
Logs include feed slug metadata for troubleshooting parallel ingestion.
 | 
					Logs include feed slug metadata for troubleshooting parallel ingestion.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Tests & fixtures
 | 
					### Tests & fixtures
 | 
				
			||||||
`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:
 | 
					`StellaOps.Concelier.Connector.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
 | 
					```bash
 | 
				
			||||||
UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Source.Acsc.Tests/StellaOps.Concelier.Source.Acsc.Tests.csproj
 | 
					UPDATE_ACSC_FIXTURES=1 dotnet test src/StellaOps.Concelier.Connector.Acsc.Tests/StellaOps.Concelier.Connector.Acsc.Tests.csproj
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Remember to review the generated `.actual.json` files when assertions fail without fixture updates.
 | 
					Remember to review the generated `.actual.json` files when assertions fail without fixture updates.
 | 
				
			||||||
@@ -9,10 +9,10 @@
 | 
				
			|||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
				
			||||||
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Core/StellaOps.Concelier.Core.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -11,18 +11,18 @@ using Microsoft.Extensions.Logging;
 | 
				
			|||||||
using Microsoft.Extensions.Logging.Abstractions;
 | 
					using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs;
 | 
					using StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					using StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Tests;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class CccsConnectorTests : IAsyncLifetime
 | 
					public sealed class CccsConnectorTests : IAsyncLifetime
 | 
				
			||||||
@@ -3,12 +3,12 @@ using System.IO;
 | 
				
			|||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Text.Json;
 | 
					using System.Text.Json;
 | 
				
			||||||
using FluentAssertions;
 | 
					using FluentAssertions;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Internal;
 | 
					using StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
using Xunit.Abstractions;
 | 
					using Xunit.Abstractions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Tests.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Tests.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsHtmlParserTests
 | 
					public sealed class CccsHtmlParserTests
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,12 +1,12 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using FluentAssertions;
 | 
					using FluentAssertions;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Internal;
 | 
					using StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Tests.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Tests.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsMapperTests
 | 
					public sealed class CccsMapperTests
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -5,8 +5,8 @@
 | 
				
			|||||||
    <Nullable>enable</Nullable>
 | 
					    <Nullable>enable</Nullable>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.CertCc/StellaOps.Concelier.Source.CertCc.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Cccs/StellaOps.Concelier.Connector.Cccs.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <PackageReference Include="FluentAssertions" Version="6.12.0" />
 | 
					    <PackageReference Include="FluentAssertions" Version="6.12.0" />
 | 
				
			||||||
@@ -35,6 +35,6 @@ Out of scope:
 | 
				
			|||||||
- Respect upstream rate limits; mark failures in source state with backoff.
 | 
					- Respect upstream rate limits; mark failures in source state with backoff.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Tests
 | 
					## Tests
 | 
				
			||||||
- Add `StellaOps.Concelier.Source.Cccs.Tests` covering fetch/parse/map with canned fixtures.
 | 
					- Add `StellaOps.Concelier.Connector.Cccs.Tests` covering fetch/parse/map with canned fixtures.
 | 
				
			||||||
- Snapshot canonical advisories; support fixture regeneration via env flag.
 | 
					- Snapshot canonical advisories; support fixture regeneration via env flag.
 | 
				
			||||||
- Validate deterministic ordering and timestamps to maintain reproducibility.
 | 
					- Validate deterministic ordering and timestamps to maintain reproducibility.
 | 
				
			||||||
@@ -11,17 +11,17 @@ using System.Globalization;
 | 
				
			|||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					using StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Internal;
 | 
					using StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Fetch;
 | 
					using StellaOps.Concelier.Connector.Common.Fetch;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
					using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs;
 | 
					namespace StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsConnector : IFeedConnector
 | 
					public sealed class CccsConnector : IFeedConnector
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,7 +2,7 @@ using System;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs;
 | 
					namespace StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsConnectorPlugin : IConnectorPlugin
 | 
					public sealed class CccsConnectorPlugin : IConnectorPlugin
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,9 +3,9 @@ using Microsoft.Extensions.Configuration;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.DependencyInjection;
 | 
					using StellaOps.DependencyInjection;
 | 
				
			||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					using StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs;
 | 
					namespace StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
					public sealed class CccsDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,12 +3,12 @@ using System.Linq;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
 | 
					using Microsoft.Extensions.DependencyInjection.Extensions;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					using StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Internal;
 | 
					using StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs;
 | 
					namespace StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public static class CccsServiceCollectionExtensions
 | 
					public static class CccsServiceCollectionExtensions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsOptions
 | 
					public sealed class CccsOptions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,7 +2,7 @@ using System;
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record CccsAdvisoryDto
 | 
					internal sealed record CccsAdvisoryDto
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
 | 
				
			|||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record CccsCursor(
 | 
					internal sealed record CccsCursor(
 | 
				
			||||||
    IReadOnlyCollection<Guid> PendingDocuments,
 | 
					    IReadOnlyCollection<Guid> PendingDocuments,
 | 
				
			||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
using System.Diagnostics.Metrics;
 | 
					using System.Diagnostics.Metrics;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsDiagnostics : IDisposable
 | 
					public sealed class CccsDiagnostics : IDisposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private const string MeterName = "StellaOps.Concelier.Source.Cccs";
 | 
					    private const string MeterName = "StellaOps.Concelier.Connector.Cccs";
 | 
				
			||||||
    private const string MeterVersion = "1.0.0";
 | 
					    private const string MeterVersion = "1.0.0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly Meter _meter;
 | 
					    private readonly Meter _meter;
 | 
				
			||||||
@@ -6,10 +6,10 @@ using System.Text.Json.Serialization;
 | 
				
			|||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using StellaOps.Concelier.Source.Cccs.Configuration;
 | 
					using StellaOps.Concelier.Connector.Cccs.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Fetch;
 | 
					using StellaOps.Concelier.Connector.Common.Fetch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsFeedClient
 | 
					public sealed class CccsFeedClient
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
 | 
				
			|||||||
using System.Text.Json;
 | 
					using System.Text.Json;
 | 
				
			||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed class CccsFeedResponse
 | 
					internal sealed class CccsFeedResponse
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -6,9 +6,9 @@ using System.Text.RegularExpressions;
 | 
				
			|||||||
using AngleSharp.Dom;
 | 
					using AngleSharp.Dom;
 | 
				
			||||||
using AngleSharp.Html.Dom;
 | 
					using AngleSharp.Html.Dom;
 | 
				
			||||||
using AngleSharp.Html.Parser;
 | 
					using AngleSharp.Html.Parser;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CccsHtmlParser
 | 
					public sealed class CccsHtmlParser
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -4,7 +4,7 @@ using System.Linq;
 | 
				
			|||||||
using StellaOps.Concelier.Models;
 | 
					using StellaOps.Concelier.Models;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class CccsMapper
 | 
					internal static class CccsMapper
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs.Internal;
 | 
					namespace StellaOps.Concelier.Connector.Cccs.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record CccsRawAdvisoryDocument
 | 
					internal sealed record CccsRawAdvisoryDocument
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,7 +3,7 @@ using System.Threading;
 | 
				
			|||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.Cccs;
 | 
					namespace StellaOps.Concelier.Connector.Cccs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class CccsJobKinds
 | 
					internal static class CccsJobKinds
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					using System.Runtime.CompilerServices;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[assembly: InternalsVisibleTo("StellaOps.Concelier.Connector.Cccs.Tests")]
 | 
				
			||||||
@@ -9,9 +9,8 @@
 | 
				
			|||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Storage.Mongo/StellaOps.Concelier.Storage.Mongo.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
|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-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-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-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.Concelier.Source.Cccs.Tests`). Canned HTTP handler + Mongo fixture enables fetch→parse→map regression; fixtures refresh via `UPDATE_CCCS_FIXTURES=1`.|
 | 
					|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.Connector.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-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-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 `<h#>`/`section` nodes, and regression fixtures/tests assert EN/FR list handling + preserved HTML structure.|
 | 
					|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 `<h#>`/`section` nodes, and regression fixtures/tests assert EN/FR list handling + preserved HTML structure.|
 | 
				
			||||||
@@ -11,11 +11,11 @@ using Microsoft.Extensions.Logging;
 | 
				
			|||||||
using Microsoft.Extensions.Logging.Abstractions;
 | 
					using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Fetch;
 | 
					using StellaOps.Concelier.Connector.Common.Fetch;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
@@ -23,7 +23,7 @@ using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			|||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Tests;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class CertBundConnectorTests : IAsyncLifetime
 | 
					public sealed class CertBundConnectorTests : IAsyncLifetime
 | 
				
			||||||
@@ -5,8 +5,8 @@
 | 
				
			|||||||
    <Nullable>enable</Nullable>
 | 
					    <Nullable>enable</Nullable>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.CertBund/StellaOps.Concelier.Source.CertBund.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.CertBund/StellaOps.Concelier.Connector.CertBund.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <PackageReference Include="FluentAssertions" Version="6.12.0" />
 | 
					    <PackageReference Include="FluentAssertions" Version="6.12.0" />
 | 
				
			||||||
@@ -35,6 +35,6 @@ Out of scope:
 | 
				
			|||||||
- Handle transient failures gracefully with exponential backoff and failure records in source state.
 | 
					- Handle transient failures gracefully with exponential backoff and failure records in source state.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Tests
 | 
					## Tests
 | 
				
			||||||
- Add `StellaOps.Concelier.Source.CertBund.Tests` covering fetch/parse/map with canned fixtures.
 | 
					- Add `StellaOps.Concelier.Connector.CertBund.Tests` covering fetch/parse/map with canned fixtures.
 | 
				
			||||||
- Snapshot canonical advisories; support regeneration via environment flag.
 | 
					- Snapshot canonical advisories; support regeneration via environment flag.
 | 
				
			||||||
- Ensure deterministic ordering, casing, and timestamps.
 | 
					- Ensure deterministic ordering, casing, and timestamps.
 | 
				
			||||||
@@ -7,18 +7,18 @@ using System.Threading.Tasks;
 | 
				
			|||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Internal;
 | 
					using StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Fetch;
 | 
					using StellaOps.Concelier.Connector.Common.Fetch;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
					using StellaOps.Concelier.Storage.Mongo.Dtos;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund;
 | 
					namespace StellaOps.Concelier.Connector.CertBund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundConnector : IFeedConnector
 | 
					public sealed class CertBundConnector : IFeedConnector
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,7 +2,7 @@ using System;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.Plugin;
 | 
					using StellaOps.Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund;
 | 
					namespace StellaOps.Concelier.Connector.CertBund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundConnectorPlugin : IConnectorPlugin
 | 
					public sealed class CertBundConnectorPlugin : IConnectorPlugin
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,9 +3,9 @@ using Microsoft.Extensions.Configuration;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using StellaOps.DependencyInjection;
 | 
					using StellaOps.DependencyInjection;
 | 
				
			||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund;
 | 
					namespace StellaOps.Concelier.Connector.CertBund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
					public sealed class CertBundDependencyInjectionRoutine : IDependencyInjectionRoutine
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,12 +3,12 @@ using System.Net;
 | 
				
			|||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
 | 
					using Microsoft.Extensions.DependencyInjection.Extensions;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Internal;
 | 
					using StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund;
 | 
					namespace StellaOps.Concelier.Connector.CertBund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public static class CertBundServiceCollectionExtensions
 | 
					public static class CertBundServiceCollectionExtensions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundOptions
 | 
					public sealed class CertBundOptions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,7 +2,7 @@ using System;
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed record CertBundAdvisoryDto
 | 
					public sealed record CertBundAdvisoryDto
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,7 +2,7 @@ using System;
 | 
				
			|||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record CertBundCursor(
 | 
					internal sealed record CertBundCursor(
 | 
				
			||||||
    IReadOnlyCollection<Guid> PendingDocuments,
 | 
					    IReadOnlyCollection<Guid> PendingDocuments,
 | 
				
			||||||
@@ -3,9 +3,9 @@ using System.Collections.Generic;
 | 
				
			|||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Text.Json;
 | 
					using System.Text.Json;
 | 
				
			||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Html;
 | 
					using StellaOps.Concelier.Connector.Common.Html;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundDetailParser
 | 
					public sealed class CertBundDetailParser
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
using System.Text.Json.Serialization;
 | 
					using System.Text.Json.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal sealed record CertBundDetailResponse
 | 
					internal sealed record CertBundDetailResponse
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2,14 +2,14 @@ using System;
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Diagnostics.Metrics;
 | 
					using System.Diagnostics.Metrics;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
/// Emits OpenTelemetry counters and histograms for the CERT-Bund connector.
 | 
					/// Emits OpenTelemetry counters and histograms for the CERT-Bund connector.
 | 
				
			||||||
/// </summary>
 | 
					/// </summary>
 | 
				
			||||||
public sealed class CertBundDiagnostics : IDisposable
 | 
					public sealed class CertBundDiagnostics : IDisposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private const string MeterName = "StellaOps.Concelier.Source.CertBund";
 | 
					    private const string MeterName = "StellaOps.Concelier.Connector.CertBund";
 | 
				
			||||||
    private const string MeterVersion = "1.0.0";
 | 
					    private const string MeterVersion = "1.0.0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly Meter _meter;
 | 
					    private readonly Meter _meter;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class CertBundDocumentMetadata
 | 
					internal static class CertBundDocumentMetadata
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -8,9 +8,9 @@ using System.Threading.Tasks;
 | 
				
			|||||||
using System.Xml.Linq;
 | 
					using System.Xml.Linq;
 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertBund.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertBund.Configuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public sealed class CertBundFeedClient
 | 
					public sealed class CertBundFeedClient
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4,7 +4,7 @@ using System.Linq;
 | 
				
			|||||||
using StellaOps.Concelier.Models;
 | 
					using StellaOps.Concelier.Models;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund.Internal;
 | 
					namespace StellaOps.Concelier.Connector.CertBund.Internal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class CertBundMapper
 | 
					internal static class CertBundMapper
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -3,7 +3,7 @@ using System.Threading;
 | 
				
			|||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using StellaOps.Concelier.Core.Jobs;
 | 
					using StellaOps.Concelier.Core.Jobs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertBund;
 | 
					namespace StellaOps.Concelier.Connector.CertBund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal static class CertBundJobKinds
 | 
					internal static class CertBundJobKinds
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
- **Detail API** – `https://wid.cert-bund.de/portal/api/securityadvisory?name=<ID>`. 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.
 | 
					- **Detail API** – `https://wid.cert-bund.de/portal/api/securityadvisory?name=<ID>`. 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
 | 
					## Telemetry
 | 
				
			||||||
The OpenTelemetry meter is `StellaOps.Concelier.Source.CertBund`. Key instruments:
 | 
					The OpenTelemetry meter is `StellaOps.Concelier.Connector.CertBund`. Key instruments:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Metric | Type | Notes |
 | 
					| Metric | Type | Notes |
 | 
				
			||||||
| --- | --- | --- |
 | 
					| --- | --- | --- |
 | 
				
			||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Plugin/StellaOps.Plugin.csproj" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Source.Common/StellaOps.Concelier.Source.Common.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Connector.Common/StellaOps.Concelier.Connector.Common.csproj" />
 | 
				
			||||||
    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
					    <ProjectReference Include="../StellaOps.Concelier.Models/StellaOps.Concelier.Models.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
@@ -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-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-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-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.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-005 Regression fixtures & tests|QA|Testing|**DONE (2025-10-14)** – Added `StellaOps.Concelier.Connector.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-006 Telemetry & documentation|DevEx|Docs|**DONE (2025-10-15)** – Added `CertBundDiagnostics` (meter `StellaOps.Concelier.Connector.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-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-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/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.|
 | 
					|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.|
 | 
				
			||||||
@@ -10,19 +10,19 @@ using Microsoft.Extensions.Logging;
 | 
				
			|||||||
using Microsoft.Extensions.Logging.Abstractions;
 | 
					using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			||||||
using Microsoft.Extensions.Time.Testing;
 | 
					using Microsoft.Extensions.Time.Testing;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc;
 | 
					using StellaOps.Concelier.Connector.CertCc;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertCc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc.Internal;
 | 
					using StellaOps.Concelier.Connector.CertCc.Internal;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Cursors;
 | 
					using StellaOps.Concelier.Connector.Common.Cursors;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc;
 | 
					namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class CertCcConnectorFetchTests : IAsyncLifetime
 | 
					public sealed class CertCcConnectorFetchTests : IAsyncLifetime
 | 
				
			||||||
@@ -16,19 +16,19 @@ using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			|||||||
using Microsoft.Extensions.Time.Testing;
 | 
					using Microsoft.Extensions.Time.Testing;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using StellaOps.Concelier.Models;
 | 
					using StellaOps.Concelier.Models;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc;
 | 
					using StellaOps.Concelier.Connector.CertCc;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertCc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Cursors;
 | 
					using StellaOps.Concelier.Connector.Common.Cursors;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc;
 | 
					namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class CertCcConnectorSnapshotTests : IAsyncLifetime
 | 
					public sealed class CertCcConnectorSnapshotTests : IAsyncLifetime
 | 
				
			||||||
@@ -15,19 +15,19 @@ using Microsoft.Extensions.Logging.Abstractions;
 | 
				
			|||||||
using Microsoft.Extensions.Time.Testing;
 | 
					using Microsoft.Extensions.Time.Testing;
 | 
				
			||||||
using MongoDB.Bson;
 | 
					using MongoDB.Bson;
 | 
				
			||||||
using MongoDB.Driver;
 | 
					using MongoDB.Driver;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc;
 | 
					using StellaOps.Concelier.Connector.CertCc;
 | 
				
			||||||
using StellaOps.Concelier.Source.CertCc.Configuration;
 | 
					using StellaOps.Concelier.Connector.CertCc.Configuration;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common;
 | 
					using StellaOps.Concelier.Connector.Common;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Cursors;
 | 
					using StellaOps.Concelier.Connector.Common.Cursors;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Http;
 | 
					using StellaOps.Concelier.Connector.Common.Http;
 | 
				
			||||||
using StellaOps.Concelier.Source.Common.Testing;
 | 
					using StellaOps.Concelier.Connector.Common.Testing;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo;
 | 
					using StellaOps.Concelier.Storage.Mongo;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
					using StellaOps.Concelier.Storage.Mongo.Documents;
 | 
				
			||||||
using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
					using StellaOps.Concelier.Storage.Mongo.Advisories;
 | 
				
			||||||
using StellaOps.Concelier.Testing;
 | 
					using StellaOps.Concelier.Testing;
 | 
				
			||||||
using Xunit;
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace StellaOps.Concelier.Source.CertCc.Tests.CertCc;
 | 
					namespace StellaOps.Concelier.Connector.CertCc.Tests.CertCc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Collection("mongo-fixture")]
 | 
					[Collection("mongo-fixture")]
 | 
				
			||||||
public sealed class CertCcConnectorTests : IAsyncLifetime
 | 
					public sealed class CertCcConnectorTests : IAsyncLifetime
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user