Skip to content

WebhookCodeScanningAlertClosedByUserPropAlert.fixed_at typed as Missing[None] but GitHub sends a datetime string #279

@donicrosby

Description

@donicrosby

Description

The generated model WebhookCodeScanningAlertClosedByUserPropAlert (in githubkit/versions/v2022_11_28/models/group_0542.py) defines the fixed_at field as:

fixed_at: Missing[None] = Field(
    default=UNSET,
    description="The time that the alert was fixed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.",
)

This means the field can only be UNSET or None. However, when GitHub delivers a code_scanning_alert webhook with action: "closed_by_user" for an alert that was previously auto-fixed, the alert.fixed_at field contains an ISO 8601 datetime string (e.g. "2026-03-04T17:53:59Z"), which causes a Pydantic ValidationError.

Expected

fixed_at should be typed as Missing[Union[datetime, None]] (or equivalently Missing[Optional[datetime]]), consistent with how it is already typed on WebhookCodeScanningAlertFixedPropAlert (fixed in PR #277).

Error

pydantic_core._pydantic_core.ValidationError: 1 validation error for
tagged-union[...,WebhookCodeScanningAlertClosedByUser,...]
closed_by_user.alert.fixed_at
  Input should be <UNSET> [type=literal_error, input_value='2026-03-04T17:53:59Z', input_type=str]

Root Cause

This is an upstream issue in the GitHub REST API OpenAPI description. The webhook schema for code_scanning_alert (action closed_by_user) defines fixed_at with only type: null. This is the same class of bug that was previously fixed for the fixed action in PR #277.

I've filed a Schema Inaccuracy issue upstream: github/rest-api-description#6081

Workaround

A runtime monkey-patch can be applied before any webhook parsing occurs, following the same pattern as the fixed_at workaround in #275:

from datetime import datetime

from githubkit.typing import Missing
from githubkit.versions.latest.models import (
    WebhookCodeScanningAlertClosedByUser,
    WebhookCodeScanningAlertClosedByUserPropAlert,
)

_FIXED_AT_TYPE = Missing[datetime | None]
WebhookCodeScanningAlertClosedByUserPropAlert.__annotations__["fixed_at"] = _FIXED_AT_TYPE
WebhookCodeScanningAlertClosedByUserPropAlert.model_fields["fixed_at"].annotation = _FIXED_AT_TYPE
WebhookCodeScanningAlertClosedByUserPropAlert.model_rebuild(force=True)
WebhookCodeScanningAlertClosedByUser.model_rebuild(force=True)

Note: both __annotations__ and model_fields must be patched because the source uses from __future__ import annotations, so model_rebuild re-resolves from the string annotation. The parent model must also be rebuilt so its compiled Pydantic-core validator picks up the new child schema.

Environment

  • githubkit version: 0.14.6
  • Python: 3.12
  • Pydantic: v2

Metadata

Metadata

Assignees

No one assigned

    Labels

    WebHookbugSomething isn't workingschemaschema related

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions