Skip to content

Commit d772b25

Browse files
committed
docs: record UYAP Live Pilot 1 third real live FAIL + Live Interoperability Fix 3
README pilot callout and DEVELOPMENT_HISTORY milestone updated to reflect THREE real live runs all FAIL and the dual entry paths. Third-run root cause: from the search/listing page a global page-level text locator was not scoped to the 2026/263 card (generic text node not actionable -> click timeout -> MISSING_APPRAISAL/FAIL); mutation guard passed (count 7). Fix 3 is page-state-aware and target-record-scoped: classify_page_state, find_target_record_card (by official file identity, Esas/Icra alias, never price/nth), actionable card-local control requirement, classify_document_entry_path (listing_card_modal vs detail_tab_panel), row-local eye vs download distinction, and a shared document-row collector converging both paths -> new-tab UDF viewer. No live PASS is claimed and the UDF viewer representation is not asserted; a post-Fix-3 operator rerun is required. Structural core, four SMM moments, conditional_on_trade, Theta_A, TOKI external status, and the numerical-search convention are unchanged.
1 parent e0560cc commit d772b25

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ Get-Content data\ingestion\uyap\pilot_report.json
259259

260260
The dedicated profile lives **outside** the repository; browser profiles, cookies, tokens, and the pilot report are gitignored and never committed. Outcome semantics: **`PASS`** (real live session reached, required evidence extracted, reconciliation passed, audit `ADMISSIBLE_COMPLETED_SALE`, known-truth matched, `uyap.json` unchanged, count still 7); **`PARTIAL`** (live session worked but a required artifact/parser path was unsupported, reconciliation ambiguous, or terminal evidence not collected); **`FAIL`** (a real live run produced incorrect required evidence or an incorrect audit decision); **`NOT_RUN`** (no real user-controlled UYAP browser session was available). Offline regression success does **not** convert `NOT_RUN` into `PASS`.
261261

262-
> **Two real live runs, both `FAIL` (interoperability); Fix 2 targets the operator-observed UI.** A real operator Chrome/CDP session connected and the real UYAP `2026/263` page was reached; the appraisal (`6,800,000`), terminal status (`satildi`) and KDV (`20.0`) are extracted, but no run has yet collected the official auction-result document, so the explicit İhale Bedeli is missing (`audit_decision = MISSING_AUCTION_PRICE`). Both runs left `uyap.json` byte-unchanged with the genuine count at **7** — a collection defect, not a structural/admission defect. **Fix 1** hardened KDV (`KDV Oranı : %20` → `20.0`) and found the "İhale Evrak Listesi" control, but then wrongly waited for a modal/dialog. The operator then directly observed the real UI: "İhale Evrak Listesi" is a **same-page tab/panel** (no modal), and each row's **eye/view action opens a new UYAP tab** at a `viewer.jsp?mimeType=Udf&evrakId=...` **UDF viewer** ("Evrak Görüntüleme"). **Fix 2** adds first-class same-page document-panel detection (modal only as fallback), row-local eye-action association (never a global Nth-eye), new-tab detection via the browser-context page delta, and honest viewer-representation diagnostics (`viewer_url_kind`, `viewer_text_available`, iframe/canvas/image/embed/object counts) that collect a document **only** from a deterministically accessible source (no OCR, no fabrication). **A live `PASS` is not claimed**, and the UDF viewer's content representation is **not** asserted until a runtime rerun observes it — the operator must rerun `sold uyap pilot` against the real UYAP page and a new real live report must measure `PASS` (or an honest `PARTIAL` if the UDF viewer proves canvas/image-only).
262+
> **Three real live runs, all `FAIL` (interoperability); Fix 3 makes document entry page-state-aware and target-record-scoped.** A real operator Chrome/CDP session connected and the real UYAP `2026/263` page was reached; the appraisal (`6,800,000`), terminal status (`satildi`) and KDV (`20.0`) are extracted, but no run has yet collected the official auction-result document, so the explicit İhale Bedeli is missing (`audit_decision = MISSING_APPRAISAL` / `MISSING_AUCTION_PRICE`). Every run left `uyap.json` byte-unchanged with the genuine count at **7** — a collection defect, not a structural/admission defect. **Fix 1** hardened KDV (`KDV Oranı : %20` → `20.0`) and found the "İhale Evrak Listesi" control, but then wrongly waited for a modal/dialog. **Fix 2** switched to same-page tab/panel detection with a row-local eye action opening a new-tab `viewer.jsp?mimeType=Udf&evrakId=...` **UDF viewer**. The third live run then failed differently: the operator ran from the **search/listing page**, where the code used a **global page-level text locator** for "İhale Evrak Listesi" that was **not scoped to the `2026/263` record card**; a generic text node is not an actionable control, so the click timed out (`document_list_opened = false`, labels `[]`). The operator also confirmed **two genuine entry paths** to the same documents: **(A)** on the **listing card** the card-local "İhale Evrak Listesi" opens a **modal**; **(B)** "İncele" opens a **detail page** whose "İhale Evrak Listesi" **tab** renders a **same-page panel**. **Fix 3** adds a page-state classifier (`classify_page_state` → `search_listing` / `record_detail` / `udf_viewer`), locates the **target record card by official file identity** (`find_target_record_card` — never by price, never a first/Nth card, with an Esas/İcra listing-alias match), requires an **actionable card-local control** (`card_document_list_control`; bare text is rejected as `non_actionable_text_only`), derives the **entry path** (`classify_document_entry_path`), distinguishes a **row-local eye action from a download arrow** (downloads are skipped), and converges **both paths** onto the **same document-row abstraction** → new-tab UDF viewer. **A live `PASS` is not claimed**, and the UDF viewer's content representation is **not** asserted until a runtime rerun observes it — the operator must rerun `sold uyap pilot` against the real UYAP page (the search/listing page with the `2026/263` card visible is recommended) and a new real live report must measure `PASS` (or an honest `PARTIAL` if the UDF viewer proves canvas/image-only).
263263

264264
## Optional direct-label validation channel
265265

docs/DEVELOPMENT_HISTORY.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,38 @@ milestones:
260260
viewer content representation is not asserted** until a runtime operator rerun observes it. Structural
261261
core, four SMM moments, `conditional_on_trade`, `Θ_A`, TOKİ external status, and the numerical-search
262262
convention are unchanged; the pilot remains non-mutating (genuine count stays 7).
263+
264+
- **UYAP Live Browser Pilot 1 — Live Interoperability Fix 3 (measured third live result: `FAIL`)**
265+
chronology: first real live pilot = **FAIL** → Fix 1 → second real live pilot = **FAIL** → Fix 2 →
266+
third real live pilot = **FAIL** → Fix 3 → operator rerun pending. On the third real run the operator
267+
launched from the **search/listing page** (`esatis.uyap.gov.tr/pp/index.jsp`, one tab). Fix 2's
268+
document-entry logic used a **global page-level text locator** (`get_by_text("evrak listesi")`) that was
269+
**not scoped to the `2026/263` record card**; a generic text node is not an actionable control, so the
270+
click **timed out** (`document_list_control_found=true`, `kind=text`, then Timeout 5000ms;
271+
`document_list_opened=false`, `document_labels_observed=[]`, `document_actions_observed=0`), yielding
272+
`audit_decision=MISSING_APPRAISAL`, `pilot_outcome=FAIL`. The mutation guard passed again (`uyap.json`
273+
unchanged, count `7 -> 7`, SMM unchanged). The operator also confirmed **two genuine entry paths** to the
274+
same documents: **(A)** on the **listing card** ("Ankara … 2026/263 İcra") the card-local "İhale Evrak
275+
Listesi" opens a **modal/overlay**; **(B)** "İncele" opens a **detail page** whose "İhale Evrak Listesi"
276+
**tab** renders a **same-page panel** (Fix 2). Both paths reach the same document rows → row-local eye →
277+
new-tab UDF viewer. **Fix 3 (narrow):** a page-state classifier (`classify_page_state`
278+
`search_listing` / `record_detail` / `udf_viewer` / `unknown`, by content semantics not just URL);
279+
**target-record-card matching by official file identity** (`find_target_record_card` +
280+
`normalize_file_identity` + `file_identity_matches` with an Esas/İcra listing alias) that is **never**
281+
chosen by price and **never** a first/Nth card, guarded so a whole-list container (multiple file numbers)
282+
is not mistaken for a card; an **actionable card-local control** requirement (`card_document_list_control`
283+
returns `actionable=true` only for a button/link, else `non_actionable_text_only`); entry-path derivation
284+
(`classify_document_entry_path``listing_card_modal` / `detail_tab_panel`); a **row-local eye vs
285+
download-arrow** distinction (`_is_download_action` + `_DOWNLOAD_TOKENS`; downloads are skipped so the
286+
eye/view action is used); and a page-state-aware live collector (`_collect_documents(page, context,
287+
target_file_id, target_institution)`) that scopes the click to the target card in the live DOM
288+
(`_locate_card_control`, not a global locator) and converges **both** paths onto one shared document-row
289+
collector (`_collect_from_container`) → new-tab UDF viewer. New report diagnostics: `page_state`,
290+
`document_entry_path`, `target_record_card_found`, `target_record_card_match_fields`,
291+
`target_record_card_file_text`, `target_record_card_control_labels`. The collector still captures the UDF
292+
**only** from a deterministically accessible source — **no OCR, no fabrication, no injected truth**, and
293+
result-card `Satış Tutarı` is never substituted for the explicit İhale Bedeli. Added 27 offline tests.
294+
Full suite: **304 passed** (277 baseline + 27 tests). **No live `PASS` is claimed and the UDF viewer
295+
content representation is not asserted** until a runtime operator rerun observes it. Structural core, four
296+
SMM moments, `conditional_on_trade`, `Θ_A`, TOKİ external status, and the numerical-search convention are
297+
unchanged; the pilot remains non-mutating (genuine count stays 7).

0 commit comments

Comments
 (0)