fix(sec): defer expected Company Facts lag without alerting

This commit is contained in:
2026-07-31 12:40:29 +02:00
parent 862d1d536b
commit f58f8b0818
7 changed files with 88 additions and 10 deletions
+15 -1
View File
@@ -48,6 +48,7 @@ STATUS_RUNNING = "running"
STATUS_VALIDATED = "validated"
STATUS_PROMOTED = "promoted"
STATUS_NO_OP = "no_op"
STATUS_DEFERRED = "deferred"
STATUS_FAILED = "failed"
_MAX_ERROR_LEN = 4000
@@ -68,6 +69,9 @@ class ValidationResult:
summary: dict[str, Any] = field(default_factory=dict)
source_max_date: date | None = None
messages: list[str] = field(default_factory=list)
# Expected source-side lag: retry next run without an operational alert.
# This is only meaningful when ok=False.
retryable: bool = False
@runtime_checkable
@@ -208,9 +212,19 @@ async def run_import(
run.validation_json = json.dumps(result.summary, default=str)
if not result.ok:
run.status = STATUS_FAILED
run.error_details = ("; ".join(result.messages))[:_MAX_ERROR_LEN]
run.completed_at = _now()
if result.retryable:
run.status = STATUS_DEFERRED
await session.commit()
logger.info(
"data_import %s: deferred for retry: %s",
source,
result.messages,
)
return run
run.status = STATUS_FAILED
await session.commit()
await _alert(session, source, "validation_failed", result.messages)
logger.warning(
@@ -413,6 +413,14 @@ class SecFundamentalsImporter:
summary=summary,
source_max_date=self._latest_index_date,
messages=messages,
# Pure Company-Facts publication lag is expected and self-healing:
# keep the cursor in place and retry, but do not page operators. Any
# other missing reason or validation message remains a real failure.
retryable=(
len(messages) == 1
and bool(blocking)
and all(m.get("reason") == "not_in_companyfacts" for m in blocking)
),
)
async def promote(self, db, staged: StagedFundamentals, run_id: int) -> dict[str, int]: