inb-45: pin historical-pipeline upload-artifact to v3 (Gitea 1.x / GHES) #4

Merged
Ghost merged 3 commits from inb-45-pin-upload-artifact-v3 into main 2026-06-08 08:23:22 +00:00

Summary

The INB-43 historical probe run #860 (job 1023) on 2026-06-08 failed the
Upload run log as artifact step with:

GHESNotSupportedError: @actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES.

This is the same failure mode that hit live-pipeline.yml on run #674 on
2026-06-07. live-pipeline.yml was already pinned to
actions/upload-artifact@v3 in commit c5b7cf8 ("Gitea-compatible artifact
upload"), but the equivalent pin was missed in historical-pipeline.yml.

Changes

  • .gitea/workflows/historical-pipeline.yml: pin Upload run log as artifact
    to actions/upload-artifact@v3 with the same explanatory comment shape as
    live-pipeline.yml (mentions both the run #674 and run #860 evidence).
  • docs/gitea-actions.md §7 Observability: document the v3 pin, the GHES
    failure 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.yml with limit=1 and confirm:

  1. The Upload run log as artifact step ends in success.
  2. The artifact historical-pipeline-log appears under the run and is
    downloadable from the Gitea Actions UI.
  3. live-pipeline.yml keeps working at v3 (it has been since c5b7cf8, so
    this is a regression check rather than a new capability).

Out of scope

  • No change to actions/checkout@v4 or actions/setup-python@v5 pins
    (per INB-45 acceptance criteria).
  • No change to pipelines/historical_pipeline.py (per INB-45 acceptance
    criteria).

Closes

  • INB-45 (this fix)
  • INB-44 (superseded — same intent, but without the historical-probe evidence)

References

  • INB-45 — the issue this PR resolves.
  • INB-43 — the probe dispatch that surfaced the regression.
  • c5b7cf8 — the prior commit that pinned live-pipeline.yml to v3 with the
    same GHES reasoning.
## Summary The INB-43 historical probe run #860 (job 1023) on 2026-06-08 failed the `Upload run log as artifact` step with: ``` GHESNotSupportedError: @actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES. ``` This is the same failure mode that hit `live-pipeline.yml` on run #674 on 2026-06-07. `live-pipeline.yml` was already pinned to `actions/upload-artifact@v3` in commit `c5b7cf8` ("Gitea-compatible artifact upload"), but the equivalent pin was missed in `historical-pipeline.yml`. ## Changes * `.gitea/workflows/historical-pipeline.yml`: pin `Upload run log as artifact` to `actions/upload-artifact@v3` with the same explanatory comment shape as `live-pipeline.yml` (mentions both the run #674 and run #860 evidence). * `docs/gitea-actions.md` §7 Observability: document the v3 pin, the GHES failure 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.yml` with `limit=1` and confirm: 1. The `Upload run log as artifact` step ends in `success`. 2. The artifact `historical-pipeline-log` appears under the run and is downloadable from the Gitea Actions UI. 3. `live-pipeline.yml` keeps working at v3 (it has been since c5b7cf8, so this is a regression check rather than a new capability). ## Out of scope * No change to `actions/checkout@v4` or `actions/setup-python@v5` pins (per INB-45 acceptance criteria). * No change to `pipelines/historical_pipeline.py` (per INB-45 acceptance criteria). ## Closes * INB-45 (this fix) * INB-44 (superseded — same intent, but without the historical-probe evidence) ## References * INB-45 — the issue this PR resolves. * INB-43 — the probe dispatch that surfaced the regression. * c5b7cf8 — the prior commit that pinned live-pipeline.yml to v3 with the same GHES reasoning.
Ghost added 3 commits 2026-06-08 08:23:11 +00:00
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>
- docs/operations-runbook.md: 8-section runbook (system overview,
  service inventory, workflow ops, observability, failure modes,
  security, cost, glossary) so a new operator can recover from
  common failures without re-deriving the architecture.
- README.md: top-level entry point that links to the runbook as
  the day-1 incident-response reference.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
inb-45: pin historical-pipeline upload-artifact to v3 (Gitea 1.x / GHES)
InboxOS — PR CI / Fast offline tests (pull_request) Successful in 28s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Successful in 43s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 11m8s
87ac5be35d
The INB-43 historical probe run #860 (job 1023) on 2026-06-08 failed
the 'Upload run log as artifact' step with:

  GHESNotSupportedError: @actions/artifact v2.0.0+, upload-artifact@v4+
  and download-artifact@v4+ are not currently supported on GHES.

...which is the same failure live-pipeline.yml already hit on run #674
on 2026-06-07. live-pipeline.yml has been on actions/upload-artifact@v3
since c5b7cf8 ("Gitea-compatible artifact upload"), but the equivalent
pin was missed in historical-pipeline.yml. Pin both to v3 here, with
the same explanatory comment, and add a §7 Observability note in
docs/gitea-actions.md explaining the pin + the run-history evidence
so the next person who edits the workflow does not silently re-bump to
v4+ and reintroduce the regression.

* .gitea/workflows/historical-pipeline.yml: pin to v3 with the same
  comment shape as live-pipeline.yml (mentions run #674 and run #860).
* docs/gitea-actions.md §7: document the pin, the GHES failure mode,
  and the "do not bump to v4+ on either workflow" rule.

Closes INB-45. Supersedes the low-priority INB-44 (which had the same
intent but without the historical-probe evidence).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Ghost force-pushed inb-45-pin-upload-artifact-v3 from e2a84c3318 to 87ac5be35d 2026-06-08 08:23:11 +00:00 Compare
Ghost merged commit 1a502662f1 into main 2026-06-08 08:23:22 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: coreci/inboxos-v1#4