Skip to content

P4 Stage 1: zunifikuj parsowanie błędów PBN przez ErrorRecord#611

Open
mpasternak wants to merge 1 commit into
feat/pbn-shimsfrom
feat/pbn-p4-reader
Open

P4 Stage 1: zunifikuj parsowanie błędów PBN przez ErrorRecord#611
mpasternak wants to merge 1 commit into
feat/pbn-shimsfrom
feat/pbn-p4-reader

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Cel

Cztery rozproszone, kruche parsery błędów wysyłki do PBN (format_pbn_error,
parse_pbn_api_error, parse_error_details, admin exception_details) →
cienkie adaptery nad jednym kontraktem ErrorRecord.

Rdzeń (ErrorRecord + parse + serialize) mieszka w pakiecie pbn-client
(0.2.1) jako czysta wiedza o protokole — patrz iplweb/pbn-client#7. W BPP
zostają tylko Django-owe adaptery display.

Rollout reader-first (Stage 1)

Readery rozumieją legacy ORAZ format v1; writery bez zmian.
serialize() istnieje, ale nie jest podpięty (Stage 2 — dopiero po wdrożeniu
Stage 1 na całej flocie). To eliminuje deploy-race przy przełączaniu writerów.

Byte-identyczność

Golden testy charakteryzacyjne (test_error_record_golden.py + fixture
data/error_record_golden.json) zdjęte z outputu sprzed unifikacji pinują
byte-identyczność realistycznego legacy (per-funkcja, na jej realnej domenie
wejścia). Świadome ulepszenia: koniec crasha TypeError na payloadzie-liczbie;
koniec hacka split('"details":')[1][:-3] w adminie.

Recenzje adwersaryjne (2× Fable) — naprawione

  • Reader-first dla v1: bez pola wire readery klasyfikowały blob v1 jako
    „nie-PBN" / renderowały surowy JSON → Stage 1 nie kupował ochrony. Naprawione
    • pinowane test_error_record_v1_reader.py.
  • Totalność parse(): RecursionError/OverflowError/MemoryError.
  • Konflacja JSON null ↔ niepoprawny body: pole content_json_valid.
  • serialize(): capy na wszystkie pola.

Rozliczenie findingów: docs/deweloper/p4-error-record-unifikacja-spec.md §9.

Zależność / merge order

[tool.uv.sources] pinuje pbn-client git-source do commita gałęzi
feat/error-record (pakiet PUBLIC, CI go pobierze). Po wydaniu pbn-client
0.2.1 na PyPI
usunąć wpis z [tool.uv.sources] — pin >=0.2.1,<0.3
wystarczy. Merge dopiero po iplweb/pbn-client#7.

Testy

Pełne pbn_export_queue + pbn_api: 601 passed (w tym playwright admin
changelist renderujący exception_details). ruff + manage.py check czyste.

Stack: na feat/pbn-shims (#609).

🤖 Generated with Claude Code

Cztery rozproszone, kruche parsery błędów wysyłki do PBN (format_pbn_error,
parse_pbn_api_error, parse_error_details, admin exception_details) stają się
cienkimi adapterami nad jednym, wspólnym kontraktem ErrorRecord.

Rdzeń (ErrorRecord + totalne parse() + serialize() do formatu v1) mieszka w
pakiecie pbn-client (0.2.1) jako czysta, framework-niezależna wiedza o
protokole PBN. W BPP zostają wyłącznie Django-owe adaptery display. Do czasu
publikacji pbn-client 0.2.1 na PyPI, zależność jest pinowana git-source w
[tool.uv.sources] (do usunięcia po release).

Rollout reader-first (Stage 1): readery rozumieją legacy ORAZ format v1;
writery bez zmian. serialize() istnieje, ale nie jest podpięty (Stage 2).

Byte-identyczność realistycznego legacy pinowana golden testami
charakteryzacyjnymi (zdjętymi sprzed unifikacji). Świadome ulepszenia:
format_pbn_error nie rzuca już TypeError na payloadzie-liczbie; admin
exception_details porzuca hack split('"details":')[1][:-3].

Naprawy z 2× adwersaryjnej recenzji Fable: (1) readery poprawnie obsługują
blob v1 (pole `wire`; guard >512 tylko dla legacy) — bez tego Stage 1 nie
kupował ochrony przed deploy-race; (2) parse() jest totalne także na
RecursionError/OverflowError/MemoryError z wrogiego body; (3) content_json_valid
odróżnia JSON null od niepoprawnego body; (4) serialize() capuje wszystkie pola
(blob dowodliwie < 65535). Szczegóły: docs/deweloper/p4-error-record-unifikacja-spec.md §9.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant