Skip to content

Commit bda945a

Browse files
ci(013): install TeX Live + fonts in real-call runner; un-skip publisher SC-006 (#210)
Real-call runner now installs TeX Live (lualatex/bibtex) + the house fonts so the publisher's llmxive.cls full compile + Zenodo Sandbox publish runs for real (SC-006 reaches 'posted'). Reverts the silent skip-on-failure: the test now fails loudly with the agent's outcome/reason if it doesn't post. CI verified: publisher first-publication + versioning both PASSED (not skipped).
1 parent cdca9c2 commit bda945a

2 files changed

Lines changed: 42 additions & 21 deletions

File tree

.github/workflows/llmxive-real-call-tests.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,38 @@ jobs:
5151
- name: Install package and dev deps
5252
run: pip install -e ".[dev]"
5353

54+
# The publisher real-call test (SC-006) and any compile-dependent
55+
# e2e test need a real TeX toolchain: the llmxive.cls full compile
56+
# runs lualatex + bibtex + fontspec. Without TeX Live the publisher's
57+
# `_compile_full` fails, the deposit never happens, and the test can't
58+
# reach `posted`. Install lualatex + the package set llmxive.cls pulls
59+
# in (fontspec, geometry, xcolor, microtype, adjustbox, tabularray,
60+
# tcolorbox, caption, booktabs, listings, natbib, hyperref, fancyhdr,
61+
# fontawesome5, tikz, algorithms, …) via the texlive-* meta-packages.
62+
- name: Install TeX Live (lualatex + bibtex) for paper compiles
63+
run: |
64+
sudo apt-get update
65+
sudo apt-get install -y --no-install-recommends \
66+
texlive-luatex texlive-latex-recommended texlive-latex-extra \
67+
texlive-fonts-recommended texlive-fonts-extra texlive-science \
68+
texlive-bibtex-extra texlive-pictures texlive-plain-generic \
69+
texlive-lang-english fonts-noto-core
70+
lualatex --version | head -1
71+
bibtex --version | head -1
72+
73+
# Install the house fonts (Fraunces serif + JetBrains Mono) so
74+
# fontspec resolves them and the real-call compile renders the true
75+
# llmXive style. The class falls back to TeX Gyre Pagella / Inconsolata
76+
# via \IfFontExistsTF when these are absent, but the published PDF
77+
# should match production.
78+
- name: Install llmXive house fonts
79+
run: |
80+
mkdir -p "$HOME/.fonts"
81+
cp papers/.style/fonts/*.ttf "$HOME/.fonts/"
82+
fc-cache -f >/dev/null
83+
fc-list | grep -iE "fraunces|jetbrains" | head || \
84+
echo "WARN: house fonts not registered (class will fall back)"
85+
5486
# FR-031 / T114: Per-PR pre-checks BEFORE running real-call tests.
5587
# If any of these fail, the gate fails fast — saving real-LLM minutes.
5688
- name: Prompt existence check (every prompt referenced by registry exists and parses)

tests/real_call/test_publisher_zenodo_sandbox.py

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,29 +137,18 @@ def test_publisher_sandbox_e2e_first_publication() -> None:
137137
)
138138
result = agent.run(ctx)
139139

140-
# Stage advanced.
140+
# Stage advanced to `posted`. The CI runner installs TeX Live + the
141+
# house fonts (see the workflow) so the publisher's full llmxive.cls
142+
# compile + real Zenodo Sandbox publish runs for real here, exactly
143+
# as it does locally. If it does NOT reach `posted`, that's a genuine
144+
# failure — surface the agent's outcome + reason in the message
145+
# rather than skipping.
141146
proj = project_state.load(pid, repo_root=_REPO)
142147
assert proj is not None
143-
# The publisher is deterministic and verified end-to-end LOCALLY
144-
# (~10s: full llmxive.cls compile + real Zenodo Sandbox publish).
145-
# When the real publish can't complete in THIS environment, the
146-
# agent records a FAILED outcome and leaves the stage at
147-
# paper_accepted. The two environmental gaps that hit the CI
148-
# real-call runner are: (1) no TeX Live / house fonts for the
149-
# llmxive.cls full compile (the runner installs neither — the
150-
# implementer e2e fixture deliberately uses \documentclass{article}
151-
# to avoid this), and (2) Zenodo Sandbox being transiently
152-
# unreachable. Mirror the missing-creds skip above and treat an
153-
# un-posted result as a skip-with-diagnostic rather than a hard
154-
# failure; publisher LOGIC is covered by tests/unit/test_publisher.py
155-
# and the real sandbox path is exercised locally.
156-
if proj.current_stage != Stage.POSTED:
157-
pytest.skip(
158-
"sandbox publish could not complete in this environment "
159-
f"(outcome={result.outcome.value!r}, "
160-
f"reason={result.failure_reason!r}) — verified locally."
161-
)
162-
assert proj.current_stage == Stage.POSTED
148+
assert proj.current_stage == Stage.POSTED, (
149+
f"publisher did not reach 'posted' "
150+
f"(outcome={result.outcome.value!r}, reason={result.failure_reason!r})"
151+
)
163152

164153
# Publication metadata written; DOI is sandbox-prefixed.
165154
pub = pub_state.load(pid, repo_root=_REPO)

0 commit comments

Comments
 (0)