Concelier Connector Disposition

This ledger records connectors that have been removed, folded into another source, or otherwise retired, together with the rationale and date. It is the authoritative answer to “why is there no <x> connector / source in the tree?” so future agents do not re-add a dead or duplicate source.

For the live connector roster see docs/modules/concelier/connectors.mdand the runtime bundle inventory at src/Concelier/__Libraries/StellaOps.Concelier.Core/RuntimePluginBundleInventory.cs.

ConnectorStatusReasonDate
azure (StellaOps.Concelier.Connector.Cloud.Azure, plugin id cloud-azure, source key azure)RemovedStandalone connector was an intentional no-opFetchAsync/ParseAsync/MapAsync all returned Task.CompletedTask and produced 0 advisories (catalog-alias-only, per Sprint 20260505_038). Azure security-advisory coverage is already provided by the MSRC connector (StellaOps.Concelier.Connector.Vndr.Msrc, plugin id vndr-msrc, source key microsoft), which ingests the full Microsoft product family — including Azure — via api.msrc.microsoft.com/sug/v2.0/ with first-party attribution. The standalone azure source was therefore a dead/duplicate source and removed to avoid operator confusion and a fragile parallel scraper target.2026-06-25
auscert / ACSC (StellaOps.Concelier.Connector.Acsc, plugin id acsc, source key auscert, capability fetch:auscert)Removed from active plugin set (source retained)Data-availability disposition, not a code defect — the connector code is sound (32/32 unit tests green). In this deployment there is no viable data path: (1) the lab advisory-fixture.stella-ops.local serves a generic 49-byte health stub at the auscert path, not real ACSC RSS, so ParseAsync has nothing valid to ingest; (2) the real upstream www.cyber.gov.au sits behind Akamai Bot Manager, which terminates DC-ASN HTTP/2 streams and blocks datacenter egress; and (3) no RelayEndpoint is configured to proxy the fetch from a residential/allowed egress. With both the fixture and the live feed dead and no relay, the connector can only fail or no-op, so it is dropped from the recommended runtime bundle set until a relay or real-data path exists. The connector source project and tests are intentionally retained (src/Concelier/__Libraries/StellaOps.Concelier.Connector.Acsc/, src/Concelier/__Tests/StellaOps.Concelier.Connector.Acsc.Tests/) — re-add the packaging entry once a data path is available.2026-06-25
cert-in (StellaOps.Concelier.Connector.CertIn, plugin id cert-in, source key cert-in)Removed from active plugin set — not geographically reachable (source retained)Geographic/network unreachability, not a code defect. cert-in.org.in is unreachable from datacenter egress (TLS handshake fails / HTTP 502; see CertInDependencyInjectionRoutine.cs). Dropped from package-runtime-plugins.ps1 ($recommendedProjects) + RuntimePluginBundleInventory.cs; SourceDefinitions.CertIn is EnabledByDefault=false + tagged geo-unreachable; the live vuln.sources row is kept (enabled=false, metadata.reachability="not-geographically-reachable"). Connector source + tests retained. Re-add to packaging + inventory + flip the markers once a regional relay/real-data path exists.2026-06-25
auscert / ACSC — also marked not geographically reachable 2026-06-25(see below)In addition to the data-availability removal noted below, SourceDefinitions.AusCert is now EnabledByDefault=false + tagged geo-unreachable, and the live vuln.sources row is kept with metadata.reachability="not-geographically-reachable"cyber.gov.au (Akamai Bot Manager) is not reachable from DC egress.2026-06-25
adobe (StellaOps.Concelier.Connector.Vndr.Adobe, plugin id vndr-adobe, source key adobe)Kept — fixed via compose overrideFixture-date-aging, not a code defect — the connector code is sound (17/17 unit tests green). The connector computes its fetch window from wall-clock time: backfillStart = now - InitialBackfill (default 90 days), and drops index entries with PublishedUtc < windowStart as droppedOldByWindow (AdobeConnector.cs:297-304,379). The committed offline fixture (devops/compose/fixtures/integration-fixtures/advisory/data/vendor/adobe/adobe-index.html) carries APSB25-85 (Sep 9, 2025) and APSB25-87 (Sep 8, 2025); those dates have aged out of the default 90-day window relative to the current wall clock, so a live fixture fetch ingests 0 advisories. The fixture cannot be re-dated because _PROVENANCE.md (sprint 20260504_004 FIXTURE-002) requires it to stay byte-identical to its upstream test fixture, which keeps the date-anchored AdobeConnectorFetchTests deterministic. Fix: a fixture-mode compose override (devops/compose/docker-compose.adobe-fixture.override.yml) sets Concelier__Sources__Adobe__InitialBackfill=36500.00:00:00 (~100 years) so the frozen Sep-2025 entries stay in-window — the same pattern docker-compose.nvd-real.override.yml / docker-compose.osv-real.override.yml use for their frozen feeds. No code, fixture, or image change.2026-06-25
distro-arch (StellaOps.Concelier.Connector.Distro.Arch, plugin id distro-arch, source key distro-arch)Kept — fixed (live-fetch path implemented)Missing capability, not a data-availability or fixture issue — the connector was snapshot-only with NO live-fetch code path. FetchAsync only read ASA JSON files from a local snapshot directory whose default (src/__Tests/__Datasets/os/arch-asa-snapshot) is a test dataset absent from the runtime image, so a stock deployment ingested 0 advisories (the directory simply did not exist → warn + no-op). ArchOptions.BaseUri was declared but never consulted; no HTTP client was registered and nothing ever called the network. Fix: implemented a live-fetch path against the Arch Linux Security Tracker JSON feed (https://security.archlinux.org/json, alias /all.json). ArchTrackerFeedParser parses the feed’s array of AVG (Arch Vulnerability Group) objects, projects each onto the connector’s existing ArchAsaDto, and the connector re-serializes each group into canonical ASA JSON and persists it as a per-advisory source_document (source.kind=live) so the unchanged parse/map pipeline produces pkg:alpm/arch advisories. BaseUri now defaults to the tracker host (live-first); operators null it out to force snapshot-only (air-gap). On live failure the connector falls back to the offline snapshot (FallbackToSnapshotOnLiveFailure=true). Also fixed a latent fetch→parse bug shared by the snapshot path: documents now persist their raw Payload so ParseAsync recovers bytes after a worker scope reset. Going live requires egress to security.archlinux.org (or an offline snapshot provisioned at Concelier__Sources__Arch__SnapshotPath); no image rebuild is needed for code already in the image — re-run source:distro-arch:fetch:parse:map.2026-06-25
distro-gentoo (StellaOps.Concelier.Connector.Distro.Gentoo, plugin id distro-gentoo-glsa, source key distro-gentoo-glsa)Kept — fixed (live-fetch path implemented)Missing capability, intentionally deferred — the GLSA connector was an offline snapshot loader with NO live fetcher. FetchAsync only read glsa-*.xml files from a local snapshot directory whose default (src/__Tests/__Datasets/os/gentoo-glsa-snapshot) is a test dataset absent from the runtime image, so a stock deployment ingested 0 advisories (directory missing → warn + no-op). The connector AGENTS.md explicitly stated “does not perform live HTTP”. Fix: implemented a live-fetch path against security.gentoo.org. GentooGlsaIndexParser parses the GLSA plaintext listing index (glsa-index.txt) into canonical GLSA ids (YYYYNN-NN), the connector GETs each referenced glsa-{id}.xml and persists it as a per-advisory source_document (source.kind=live) so the unchanged GlsaXmlParser→Parse→Map pipeline produces pkg:gentoo/<cat>/<name> advisories. BaseUri now defaults to the Gentoo security host (live-first); operators null it out to force snapshot-only (air-gap). On live failure the connector falls back to the offline snapshot (FallbackToSnapshotOnLiveFailure=true). Same latent fetch→parse bug as Arch (Postgres stamps PayloadId = row.Id) fixed in the new live path: documents persist their raw Payload and use the document id as the blob id so ParseAsync recovers bytes after a worker scope reset. Going live requires egress to security.gentoo.org (or an offline snapshot provisioned at Concelier__Sources__Gentoo__SnapshotPath); the new code must ship in a rebuilt image — then re-run source:distro-gentoo-glsa:fetch:parse:map.2026-06-25

Removal details — azure

What was deleted

What was intentionally NOT touched

Coverage proof

Azure advisories continue to flow through MSRC (source 'microsoft'). No advisory coverage is lost by this removal because the azure connector never produced any advisories in the first place.

Verification (2026-06-25)

Removal details — auscert / ACSC

Why removed (data-availability, not a code defect)

The ACSC connector (source key 'auscert') is removed from the active deployed plugin set because this deployment has no working data path into it:

  1. Lab fixture is a stub, not data. The fixture-mode override points the connector at http://advisory-fixture.stella-ops.local/cert/auscert/ (devops/compose/docker-compose.fixture-mode.yml), but in this deployment that path returns a generic 49-byte health stub, not real ACSC RSS. ParseAsync therefore has no valid feed to ingest.
  2. Real upstream is bot-blocked from DC egress. www.cyber.gov.au sits behind Akamai Bot Manager, which frequently terminates datacenter-ASN HTTP/2 streams. The realfeeds override already documents this as best-effort / SCRAPER / REGION_CERT (devops/compose/docker-compose.realfeeds-full.override.yml, the Concelier__Sources__Auscert__BaseEndpoint=https://www.cyber.gov.au/ line).
  3. No relay configured. There is no RelayEndpoint wired to proxy the fetch from a residential / allowed egress, so neither (1) nor (2) yields data.

With the fixture dead and the live feed unreachable and no relay, the connector can only fail or no-op. Keeping it mounted produces failing/empty jobs and operator confusion, so it is dropped from the recommended runtime bundle set until a viable data path exists.

What was changed

What was intentionally NOT touched

Re-enable path

When a relay or real-data path becomes available, re-add the acsc entry to both package-runtime-plugins.ps1 ($recommendedProjects) and RuntimePluginBundleInventory.cs (OptionalConnector("acsc", "auscert", ...)), re-run package-runtime-plugins.ps1 to regenerate the devops/plugins/concelier/recommended/acsc/ bundle, point Concelier__Sources__Auscert__BaseEndpoint (and a RelayEndpoint) at the working source, then redeploy Concelier and re-run source:auscert:fetch.

Verification (2026-06-25)

Fix details — adobe

Root cause (fixture-date-aging, not a code defect)

AdobeConnector.LoadIndexAsync derives its fetch window from wall-clock time (src/Concelier/__Libraries/StellaOps.Concelier.Connector.Vndr.Adobe/AdobeConnector.cs:297-304):

var now           = _timeProvider.GetUtcNow();       // real clock in prod
var backfillStart = now - _options.InitialBackfill;  // InitialBackfill default = 90 days
var windowStart   = cursor.LastPublished.HasValue
    ? cursor.LastPublished.Value - _options.WindowOverlap
    : backfillStart;
if (windowStart < backfillStart) windowStart = backfillStart;

and then drops any index entry older than the window as droppedOldByWindow (AdobeConnector.cs:379: if (entry.PublishedUtc < windowStart) ...).

The committed offline fixture (devops/compose/fixtures/integration-fixtures/advisory/data/vendor/adobe/adobe-index.html) lists two bulletins published September 8–9, 2025:

With the default 90-day InitialBackfill, backfillStart is ~90 days before the current wall clock (now far past Sep 2025), so both fixture entries fall before windowStart and are dropped. The connector therefore ingests 0 advisories from the fixture — even though the code path is correct.

Why the fixture is not the fix

devops/compose/fixtures/.../adobe/_PROVENANCE.md (frozen at sprint 20260504_004, criterion FIXTURE-002) requires the fixture to remain byte-identical to its upstream test-fixture source so the connector’s date-anchored AdobeConnectorFetchTests (which pin a FakeTimeProvider to 2025-09-10) stay deterministic. Re-dating the fixture HTML would break that contract. The fix instead widens the runtime window so the frozen dates stay in-range.

What was changed

What was intentionally NOT touched

Deploy path (post-drains, coordinated — NOT done in this change)

Append docker-compose.adobe-fixture.override.yml to the compose chain after the base files so it wins, recreate/redeploy Concelier with the existing fixture-mode chain, then re-run source:vndr-adobe:fetch:parse:map. No image rebuild and no egress are required — the data already lives in the in-repo fixture.

Verification (2026-06-25)

Fix details — distro-arch

Root cause (missing capability — offline-snapshot-only, no live-fetch)

The Arch connector shipped with FetchAsync reading ASA JSON files from a local snapshot directory only (src/Concelier/__Libraries/StellaOps.Concelier.Connector.Distro.Arch/ArchConnector.cs, old FetchAsyncArchSnapshotReader.Read). Its default snapshot path (ArchOptions.DefaultSnapshotRelativePath = "src/__Tests/__Datasets/os/arch-asa-snapshot") is a test dataset that is not present in the runtime image, so on a stock deployment the directory does not exist → the connector logs a warning and no-ops, ingesting 0 advisories. ArchOptions.BaseUri existed in the options class but was never read by any code path, no IHttpClientFactory client was registered for the source, and nothing performed a network fetch. The connector was therefore inert in production unless an operator manually provisioned a snapshot directory.

What was changed (live-fetch path against the Arch Security Tracker)

What was intentionally NOT touched

Tests (new, in StellaOps.Concelier.Connector.Distro.Arch.Tests)

Deploy path (post-drains, coordinated — NOT done in this change)

To make this live, the Concelier deployment needs egress to security.archlinux.org(the code already in a rebuilt image, or this change shipped in the next image build), then re-run source:distro-arch:fetch:parse:map. For an air-gapped deployment, instead provision an ASA snapshot directory and point Concelier__Sources__Arch__SnapshotPath at it (and optionally clear Concelier__Sources__Arch__BaseUri to skip the live attempt). No compose override is required for the default live behaviour.

Verification (2026-06-25)

Fix details — distro-gentoo

Root cause (missing capability — offline snapshot loader, no live fetcher)

The Gentoo GLSA connector (src/Concelier/__Libraries/StellaOps.Concelier.Connector.Distro.Gentoo/) shipped with FetchAsync reading glsa-*.xml files from a local snapshot directory only. The previous GentooGlsaConnector facade and the connector AGENTS.md both stated the live IFeedConnector HTTP path was intentionally deferred (“does not use SourceFetchService and does not perform live HTTP”). The default snapshot path (GentooGlsaOptions.DefaultSnapshotRelativePath = "src/__Tests/__Datasets/os/gentoo-glsa-snapshot") is a test dataset that is not present in the runtime image, so on a stock deployment the directory does not exist → the connector logs a warning and no-ops, ingesting 0 advisories. No IHttpClientFactory client was registered for the source and nothing performed a network fetch.

What was changed (live-fetch path against security.gentoo.org)

What was intentionally NOT touched

Tests (new, in StellaOps.Concelier.Connector.Distro.Gentoo.Tests)

Deploy path (post-drains, coordinated — NOT done in this change)

To make this live, the Concelier deployment needs the new code in a rebuilt image (this is a source change, not just a config flip) and egress to security.gentoo.org, then re-run source:distro-gentoo-glsa:fetch:parse:map. For an air-gapped deployment, instead provision a GLSA snapshot directory and point Concelier__Sources__Gentoo__SnapshotPath at it (and optionally clear Concelier__Sources__Gentoo__BaseUri to skip the live attempt). No compose override is required for the default live behaviour. Snapshot provisioning alternative: mirror the data/glsa.git glsa-*.xml set (and a glsa-index.txt listing) into an offline-kit directory mounted at the configured SnapshotPath — the connector ingests it identically to the live path.

Verification (2026-06-25)