INB-33: provision second self-hosted Gitea Actions runner #2
Closed
Ghost
wants to merge 4 commits from
inb-33-gitea-runner-2 into main
pull from: inb-33-gitea-runner-2
merge into: coreci:main
coreci:main
coreci:release/v1.5
coreci:be/INB-1.5-B-api-spec
coreci:be/INB-1.5-C-rbac-spec
coreci:cto/pillar-ii-gate-v1-20260615
coreci:fe/INB-1.5-A-ui-impl
coreci:be/INB-1.5-A-api-spec
coreci:frontend/story-133-design-system-tokens
coreci:ux/INB-1.5-D-design-spec
coreci:be/INB-1.5-A-api-impl
coreci:be/INB-1.5-B-api-impl
coreci:be/INB-1.5-C-rbac-impl
coreci:da/INB-1.5-C-data-spec
coreci:fe/INB-1.5-B-ui-impl
coreci:fe/INB-1.5-C-rbac-integrate
coreci:se/INB-1.5-A-qa
coreci:se/INB-1.5-B-qa
coreci:se/INB-1.5-C-rbac-pentest
coreci:ux/INB-1.5-A-ui-spec
coreci:ux/INB-1.5-B-ui-spec
coreci:epic/EPIC-INB-1.4-E-dpia
coreci:epic/EPIC-INB-1.4-F-threat-model
coreci:release/v1
No Reviewers
Labels
Clear labels
architecture
compliance
cpo-approval-required
cpo-review
cto-approved
debt
domain/architecture
domain/backend
domain/data-model
domain/data-pipeline
domain/devops
domain/frontend
domain/security
domain/ux
epic
feature
infra
initiative
intake
major/v1
needs-cto-clarification
pattern/a
pattern/b
pattern/c
pattern/d
pattern/e
pattern/f
pattern/g
pillar-i
pillar-ii
pillar-ii-approved
pillar-iii
refactor
risk
status:dev
status:done
status:qa
status:triage
story
technical-debt
trd
type:epic
type:feature
type:needs-triage
type:project
type:task
type:user-story
v1.0
v1.4
v1.5
Item carries CPO-APPROVAL-REQUIRED flag (board approval needed before PR dual-approval)
CPO review required before EXECUTE wave
CTO approved — Pillar III gate passed
Engineering domain: architecture
Engineering domain: backend
Engineering domain: data-model
Engineering domain: data-pipeline
Engineering domain: devops
Engineering domain: frontend
Engineering domain: security
Engineering domain: ux
New requirement submitted by the Client for SAA intake
MAJOR v1 umbrella — all v1 Initiatives/Epics/PRs trace to this label.
Ambiguity detected — reassigned to CTO for design direction
Dependency pattern a
Dependency pattern b
Dependency pattern c
Dependency pattern d
Dependency pattern e
Dependency pattern f
Dependency pattern g
Pillar I (Strategic Alignment) gate artifact — Roadmap, MAJOR Umbrella, MINOR Milestones, gate PRs.
Execution / decomposition lane (CTO)
Pillar II design/spec approved by CTO
Pillar III — implementation / integration / ADR stories
Kanban state per INB-172 rule 2.
Kanban state per INB-172 rule 2.
Kanban state per INB-172 rule 2.
Kanban state per INB-172 rule 2.
Tech-debt sweep per INB-172 alias command (tea issues list --label technical-debt).
issue-hierarchy canon class (standards/issue-hierarchy.md)
issue-hierarchy canon class (standards/issue-hierarchy.md)
issue-hierarchy canon class (standards/issue-hierarchy.md)
issue-hierarchy canon class (standards/issue-hierarchy.md)
issue-hierarchy canon class (standards/issue-hierarchy.md)
issue-hierarchy canon class (standards/issue-hierarchy.md)
MINOR v1.5 — Mailbox & Administrative Management Interface
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: coreci/inboxos-v1#2
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "inb-33-gitea-runner-2"
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
Adds a second self-hosted Gitea Actions runner (inboxos-runner-2) with the same label set as inboxos-runner-1 so the live-pipeline cron and historical-pipeline workflow_dispatch can run in parallel on the same host. Removes the single-runner contention that was leaving historical runs queued indefinitely while the every-5-min live pipeline was in flight.
Changes
Deploy steps (post-merge, on host)
Resolves INB-33. Unblocks INB-7.
INB-21 board decision: the pipeline makes a single LLM call per step, with the model pinned via INBOXOS_LLM_MODEL / INBOXOS_LLM_MODEL_EXTRACT (default gemma4:e4b for both). There is no model-escalation chain. Transient HTTP / JSON failures are retried by tenacity in llm_run_command (3 attempts, exponential backoff); a permanent failure dead-letters the message and the next scheduled run retries from the same checkpoint. Changes ------- * pipelines/common.py - LLMConfig: drop model_chain field and the INBOXOS_LLM_MODEL_CHAIN env-var loader; drop model_chain_for_command. - Drop ollama_run_command_with_chain and llm_run_command_with_chain. - Update docstring to spell out the single-model contract and the retry policy. * pipelines/historical_pipeline.py - classify() and extract_for_module() now call llm_run_command directly (no chain). - main() summary log no longer includes the chain field. * pipelines/live_pipeline.py - extract_for_module() now calls llm_run_command directly. - Drop the now-unused llm_run_command_with_chain import. * .gitea/workflows/{live,historical}-pipeline.yml - Drop INBOXOS_LLM_MODEL_CHAIN from the env block. - Refresh the header comments to describe the single-model contract. * pipelines/_tests/smoke_inb21_extract.py - Now asserts the model is gemma4:e4b (the INB-21 default), not the previous lfm2.5:8b / gemma4:12b split. - Calls llm_run_command directly (no chain wrapper). * pipelines/_tests/test_live_pipeline_offline.py - Default cfg now uses gemma4:e4b for both classify and extract; the per-step routing test asserts the new defaults. - Drop the fake_chain install in _install_fakes; drop the lp.llm_run_command_with_chain patch. * pipelines/_tests/test_historical_pipeline_offline.py - Drop test_process_escalation_recovers_on_second_model (chain is gone). - _install_fakes now patches llm_run_command instead of llm_run_command_with_chain; the 100MB e2e uses the same single-model fake. * .gitea/workflows/ci-pr.yml (new) - PR-only gate. Three jobs: fast-tests (gitea_request, mbox_stream, live_pipeline_offline, historical fast subset), e2e-100mb (the slow historical end-to-end against a synthetic 100MB mbox), and live-llm-smoke (real Ollama against the Substack input from run #674). Triggers on pull_request targeting main + workflow_dispatch for manual reruns. live-llm-smoke is no-op when OLLAMA_BASE_URL is unset so fork PRs without infra access stay unblocked. Operational contract (per CEO directive, 2026-06-07) ---------------------------------------------------- Run fast tests locally, commit, push, open a PR, wait for the ci-pr workflow to go green, then merge. The 100MB e2e and live Ollama smoke no longer run on a developer workstation. Co-Authored-By: Paperclip <noreply@paperclip.ing>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>Pull request closed