Concelier Apple Security Update Connector — Operations Runbook
Audience: Stella Ops operators running the Concelier Apple security updates connector.
This runbook covers staging and production rollout for the Apple security updates connector (source:vndr-apple:*), including observability checks and fixture maintenance.
1. Prerequisites
- Network egress (or mirrored cache) for the official Apple Support security releases index (
https://support.apple.com/en-us/100100) and detail pages underhttps://support.apple.com/. - Optional: corporate proxy exclusions for the Apple hosts if outbound traffic is normally filtered.
- Updated configuration (environment variables or
concelier.yaml) with anapplesection. Example baseline:
concelier:
sources:
apple:
softwareLookupUri: "https://support.apple.com/en-us/100100"
advisoryBaseUri: "https://support.apple.com/"
localeSegment: "en-us"
maxAdvisoriesPerFetch: 25
initialBackfill: "120.00:00:00"
modifiedTolerance: "02:00:00"
failureBackoff: "00:05:00"
softwareLookupUriandadvisoryBaseUrimust stay absolute and aligned with the HTTP allow-list; Concelier automatically adds both hosts to the connector HttpClient.
The Apple connector intentionally rejects https://gdmf.apple.com/v2/pmv. That endpoint is Apple release metadata (PublicAssetSets, AssetSets, PublicBackgroundSecurityImprovements), not a security-advisory index. A fetch cycle that receives that JSON shape fails with the unsupported-shape diagnostic gdmf_release_metadata_json instead of reporting a successful empty run.
2. Staging Smoke Test
- Deploy the configuration and restart the Concelier workers to ensure the Apple connector options are bound.
- Trigger a full connector cycle:
- CLI: run
stella db fetch --source vndr-apple --stage fetch, then--stage parse, then--stage map. - REST:
POST /jobs/run { "kind": "source:vndr-apple:fetch", "chain": ["source:vndr-apple:parse", "source:vndr-apple:map"] }
- CLI: run
- Validate metrics exported under meter
StellaOps.Concelier.Connector.Vndr.Apple:apple.fetch.items(documents fetched)apple.fetch.failuresapple.fetch.unchangedapple.index.rows_droppedwith reasons such asno_published_cve,no_link,bad_date,invalid_detail_uri,duplicate_article,trust_filter, andold_by_windowapple.index.unsupported_shapeswith shapes such asgdmf_release_metadata_json,html_list_shape, orhtml_unexpected_table_shapeapple.parse.failuresapple.map.affected.count(histogram of affected package counts)
- Cross-check the shared HTTP counters:
concelier.source.http.requests_total{concelier_source="vndr-apple"}should increase for both index and detail phases.concelier.source.http.failures_total{concelier_source="vndr-apple"}should remain flat (0) during a healthy run.
- Inspect the info logs:
Apple index loop ... rowsSeen=X indexEntries=Y keptAfterFilters=Z selected=N droppedNoPublishedCve=D droppedOldByWindow=WApple advisory parse complete ... aliases=... affected=...Mapped Apple advisory ... pendingMappings=0
- Confirm PostgreSQL state (schema
vuln):raw_documentstable contains the HT article HTML with metadata (apple.articleId,apple.postingDate).dtostable hasschemaVersion="apple.security.update.v1".advisoriestable includes keysHTxxxxxxwith normalized SemVer rules.source_statesentry forappleshows a recentcursor.lastPosted.
3. Production Monitoring
- Dashboards - Add the following expressions to your Concelier Grafana board (OTLP/Prometheus naming assumed):
rate(apple_fetch_items_total[15m])vsrate(concelier_source_http_requests_total{concelier_source="vndr-apple"}[15m])rate(apple_fetch_failures_total[5m])for error spikes (severity=warningat>0)histogram_quantile(0.95, rate(apple_map_affected_count_bucket[1h]))to watch affected-package fan-outincrease(apple_parse_failures_total[6h])to catch parser drift (alerts at>0)
- Alerts - Page if
rate(apple_fetch_items_total[2h]) == 0during business hours while other connectors are active. This often indicates support-page fetch failures, unsupported source shape, date-window filtering, or misconfigured allow-lists. - Logs - Surface warnings
Apple advisory index ... returned unsupported source shape,Apple document {DocumentId} missing document payload, orApple parse failed. Repeated hits imply endpoint drift, storage issues, or HTML regressions. - Telemetry pipeline -
StellaOps.Concelier.WebServicenow exportsStellaOps.Concelier.Connector.Vndr.Applealongside existing Concelier meters; ensure your OTEL collector or Prometheus scraper includes it.
4. Fixture Maintenance
Regression fixtures live under src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests/Apple/Fixtures. Refresh them whenever Apple reshapes the HT layout or when new platforms appear.
- Run the helper script matching your platform:
- Bash:
./scripts/update-apple-fixtures.sh - PowerShell:
./scripts/update-apple-fixtures.ps1
- Bash:
- Each script exports
UPDATE_APPLE_FIXTURES=1, updates theWSLENVpassthrough, and touches.update-apple-fixturesso WSL+VS Code test runs observe the flag. The subsequent test execution fetches the live HT articles listed inAppleFixtureManager, sanitises the HTML, and rewrites the.expected.jsonDTO snapshots. - Review the diff for localisation or nav noise. Once satisfied, re-run the tests without the env var (
dotnet test src/Concelier/__Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests/StellaOps.Concelier.Connector.Vndr.Apple.Tests.csproj) to verify determinism. - Commit fixture updates together with any parser/mapping changes that motivated them.
5. Known Issues & Follow-up Tasks
- Apple occasionally throttles anonymous requests after bursts. The connector backs off automatically, but persistent
apple.fetch.failuresspikes might require mirroring the support-page HTML and HT content or scheduling wider fetch windows. - If Apple changes the security releases page away from the table shape (
gb-tableor equivalent semantic headers), the connector fails withhtml_list_shape,html_unexpected_table_shape, orhtml_missing_security_release_table. Collect sample HTML and refresh fixtures to confirm parser coverage. - Multi-locale content is still under regression sweep (
src/Concelier/StellaOps.Concelier.PluginBinaries/StellaOps.Concelier.Connector.Vndr.Apple/TASKS.md). Capture non-en-ussnapshots once the fixture tooling stabilises.
