inb-45: pin historical-pipeline upload-artifact to v3 (Gitea 1.x / GHES) #4
Reference in New Issue
Block a user
Delete Branch "inb-45-pin-upload-artifact-v3"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The INB-43 historical probe run #860 (job 1023) on 2026-06-08 failed the
Upload run log as artifactstep with:This is the same failure mode that hit
live-pipeline.ymlon run #674 on2026-06-07.
live-pipeline.ymlwas already pinned toactions/upload-artifact@v3in commitc5b7cf8("Gitea-compatible artifactupload"), but the equivalent pin was missed in
historical-pipeline.yml.Changes
.gitea/workflows/historical-pipeline.yml: pinUpload run log as artifactto
actions/upload-artifact@v3with the same explanatory comment shape aslive-pipeline.yml(mentions both the run #674 and run #860 evidence).docs/gitea-actions.md§7 Observability: document the v3 pin, the GHESfailure mode, and the do-not-bump-to-v4+ rule so a future editor does
not silently regress both workflows.
Verification (post-merge)
Re-dispatch
historical-pipeline.ymlwithlimit=1and confirm:Upload run log as artifactstep ends insuccess.historical-pipeline-logappears under the run and isdownloadable from the Gitea Actions UI.
live-pipeline.ymlkeeps working at v3 (it has been sincec5b7cf8, sothis is a regression check rather than a new capability).
Out of scope
actions/checkout@v4oractions/setup-python@v5pins(per INB-45 acceptance criteria).
pipelines/historical_pipeline.py(per INB-45 acceptancecriteria).
Closes
References
c5b7cf8— the prior commit that pinned live-pipeline.yml to v3 with thesame GHES reasoning.
Lifts the historical Papra attachment uploader into common.py and adds a pure policy function + dry-run gate, so the live and historical pipelines can audit Papra write decisions on real traffic before the first real write goes out. - common.py: PapraConfig, PapraTarget, PapraDecision, papra_decide, papra_write_attachment, papra_write_body, content-hash and HTML-strip helpers. Dry-run defaults to True; honors PAPRA_DRY_RUN env. Pure decide() is unit-testable without HTTP. Write helpers never raise; failures are logged as papra_write_failed. - live_pipeline.py: wires papra_decide + papra_write_* into process_one_message after the NocoDB UPSERTs. Emits papra_decision per message even on the skip path. - historical_pipeline.py: replaces inline upload_attachments_to_papra with the shared helper, keeps attachment behavior intact, and adds the post-classification body-write pass. - .gitea/workflows/{live,historical}-pipeline.yml: export PAPRA_BASE_URL / API_TOKEN / ORG_ID / DRY_RUN (default 'true') and the body-write / metadata-only module lists. - tests: 13/13 new test_papra_decide_offline.py + 14/14 test_live_pipeline_offline.py + 7/7 per-message historical tests (the unchanged-shape 100MB e2e test is not re-run this commit). - docs/papra-write-policy.md: policy, env vars, dry-run flag, audit recipe, future papra_index note. No real Papra HTTP request is made during the dry-run smoke. Co-Authored-By: Paperclip <noreply@paperclip.ing>e2a84c3318to87ac5be35d