TC89 — the normal upload path itself, captured (not just the post-hoc read-back) ================================================================================== The original ingestion of these two fixtures did not capture the actual POST /document/create-by-file call. Re-submitted both files through the same normal upload path so the submission itself is visible, not just asserted: deleted the two existing document entries, then re-uploaded fresh, capturing full request + response, then re-confirmed the same terminal error status as before. End state is unchanged — same two files, same two error messages — only the evidence now shows the submission. === bad_01_truncated.pdf — POST /datasets/{dataset_id}/document/create-by-file === Request (multipart/form-data): file: bad_01_truncated.pdf (89876 bytes, application/pdf) data: {"indexing_technique": "high_quality", "process_rule": {"mode": "automatic"}} Status: 200 Response body: { "document": { "id": "1a2edc6b-e93d-48a7-b7b6-daabb76f0e2c", "position": 16, "data_source_type": "upload_file", "data_source_info": { "upload_file_id": "ee786383-82cc-4e94-abf3-f7cabe9d39b8" }, "data_source_detail_dict": { "upload_file": { "id": "ee786383-82cc-4e94-abf3-f7cabe9d39b8", "name": "bad_01_truncated.pdf", "size": 89876, "extension": "pdf", "mime_type": "application/pdf", "created_by": "f1034bbd-04df-4592-ba22-56dac49ae8ad", "created_at": 1790630159.628549 } }, "dataset_process_rule_id": "7ac7f7a1-2dfa-4e08-a22f-94383b30f68e", "name": "bad_01_truncated.pdf", "created_from": "api", "created_by": "f1034bbd-04df-4592-ba22-56dac49ae8ad", "created_at": 1790630160, "tokens": null, "indexing_status": "waiting", "error": null, "enabled": true, "disabled_at": null, "disabled_by": null, "archived": false, "display_status": "queuing", "word_count": null, "hit_count": 0, "doc_form": "text_model", "doc_metadata": [], "summary_index_status": null, "need_summary": false }, "batch": "20260928211559622562" } At submission time the file is accepted and queued (indexing_status: "waiting") — the failure is not visible yet at this point, only after processing completes. === bad_01_truncated.pdf — GET /datasets/{dataset_id}/documents (after indexing completes) === { "id": "1a2edc6b-e93d-48a7-b7b6-daabb76f0e2c", "name": "bad_01_truncated.pdf", "indexing_status": "error", "error": "Failed to load document (PDFium: Data format error)." } === bad_02_password_protected.pdf — POST /datasets/{dataset_id}/document/create-by-file === Request (multipart/form-data): file: bad_02_password_protected.pdf (174963 bytes, application/pdf) data: {"indexing_technique": "high_quality", "process_rule": {"mode": "automatic"}} Status: 200 Response body: { "document": { "id": "b412cd09-d3ff-4158-9553-dd144aca0ebb", "position": 17, "data_source_type": "upload_file", "data_source_info": { "upload_file_id": "21b39597-bf04-4bbc-bdf5-687f00304e0d" }, "data_source_detail_dict": { "upload_file": { "id": "21b39597-bf04-4bbc-bdf5-687f00304e0d", "name": "bad_02_password_protected.pdf", "size": 174963, "extension": "pdf", "mime_type": "application/pdf", "created_by": "f1034bbd-04df-4592-ba22-56dac49ae8ad", "created_at": 1790630161.440151 } }, "dataset_process_rule_id": "0e65cec5-7a1a-4dea-9142-bad58c3590f4", "name": "bad_02_password_protected.pdf", "created_from": "api", "created_by": "f1034bbd-04df-4592-ba22-56dac49ae8ad", "created_at": 1790630162, "tokens": null, "indexing_status": "waiting", "error": null, "enabled": true, "disabled_at": null, "disabled_by": null, "archived": false, "display_status": "queuing", "word_count": null, "hit_count": 0, "doc_form": "text_model", "doc_metadata": [], "summary_index_status": null, "need_summary": false }, "batch": "20260928211601929654" } === bad_02_password_protected.pdf — GET /datasets/{dataset_id}/documents (after indexing completes) === { "id": "b412cd09-d3ff-4158-9553-dd144aca0ebb", "name": "bad_02_password_protected.pdf", "indexing_status": "error", "error": "Failed to load document (PDFium: Incorrect password error)." } Both files, submitted through the exact same normal upload path (POST /document/create-by-file), are accepted at submission time (queued, no error yet) and only fail once processing actually runs — the truncated file with a data-format error, the password-protected file with an incorrect-password error. Neither is ever reported as "completed"; both terminal statuses are "error" with a specific, accurate message. Same result as the original run this replaces — the submission itself is now part of the evidence, not just the read-back.