Catalog Operations¶
How the version-controlled compatibility catalog is maintained, verified, and consumed. The catalog is the single source of truth for Azure version knowledge: handlers never hardcode dates or support matrices.
Where the catalog lives¶
- Facts:
src/azure_functions_doctor/assets/compatibility/catalog.json - Loader/model:
azure_functions_doctor.compatibility(load_catalog()) - Each fact carries
fact_id,applies_to,status,support_end(value + precision),source_url,last_verified, andverification_notes.
Update procedure¶
- Identify the drift. The weekly maintenance workflow
(
.github/workflows/maintenance.yml) fails whencatalog.last_verifiedis older than 30 days, or when a fact's upstream source changes (found manually or via the freshness sweep). - Re-verify against the source. Open every fact's
source_urland confirm the dates/statuses.support_end.precisionrecords what the source actually publishes —day,month, oryear— and comparisons always widen to the last calendar day of that precision (never narrower). - Edit
catalog.json. Updatestatus/support_endper the source; set the fact'slast_verifiedto the re-verification date; extendverification_noteswith a one-line quote of the source sentence that justifies the change. - Bump
catalog_version(semantic: new/changed facts = minor, removed facts = major) and the top-levellast_verified. - Run the gates:
hatch run pytest(the verdict matrix intests/test_catalog_verdict_matrix.pyis derived from the catalog, so it stays green automatically), plus the standard style/typecheck.
The runtime never fetches the network — catalog updates are a commit-time operation, keeping every verdict offline and reproducible.
Freshness policy¶
- The shipped runtime is 100% offline; freshness is a governance concern, not a runtime one.
- The weekly maintenance job fails when
last_verifiedis >30 days old. 30 days matches the cadence at which Microsoft publishes lifecycle changes; a failing weekly job is the alert, and the fix is the update procedure above (never silencing the gate). - Findings expose provenance so consumers can audit staleness themselves:
last_verified,source_url, andcatalog_versionride along in the JSON output and SARIF properties.
Incomplete target configuration¶
The doctor resolves the deployment target from infra config (bicep/ARM)
and local.settings.json. When information is missing, rules skip
explicitly rather than guess:
| Missing input | Behavior | What to supply |
|---|---|---|
| Any deploy config (no bicep/ARM) | Flex family + linuxFxVersion + dev-storage skip |
Infra templates in the project (or run with --profile development) |
hosting_plan undeterminable |
Hosting-plan lifecycle + Functions runtime lifecycle skip | hostingPlan/plan-bearing infra (--hosting-plan where supported) |
| Not a Flex Consumption app | The three Flex rules skip | Nothing — out of scope by design |
local.settings.json absent |
FUNCTIONS_EXTENSION_VERSION check skips |
A local.settings.json with Values |
| Target Python unknown | Python lifecycle uses the running interpreter | --target-python |
git unavailable |
local.settings git-tracking skips | Run inside a git checkout |
azure-functions-validation not declared |
Endpoint-metadata rule skips | Declare it or ignore the skip |
Skips are first-class statuses ("skip" in the JSON contract) — they never
gate and never count as findings in SARIF.