paper-poster-html

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Paper Poster (HTML): measurement-gated poster generation

论文海报(HTML版):基于测量校验的海报生成

One HTML file styled for an exact print canvas (
@page { size: W H }
), rendered to PDF via Playwright print emulation. Iterate by measuring, not eyeballing — the screen preview lies; only print emulation at the correct viewport tells the truth. Core gate machinery is adapted from posterly (MIT, © 2026 Ruishuo Chen — see
NOTICE.md
and
LICENSES/posterly-MIT.txt
); ARIS adds style discipline gates, figure-provenance gates, the cross-model review loop, and the anti-patch-loop fix vocabulary.
单个HTML文件,针对精确打印画布进行样式设置(
@page { size: W H }
),通过Playwright打印模拟渲染为PDF。通过测量而非目测迭代——屏幕预览不可靠;只有在正确视口下的打印模拟才能反映真实效果。核心校验机制改编自posterly(MIT协议,©2026 Ruishuo Chen——详见
NOTICE.md
LICENSES/posterly-MIT.txt
);ARIS新增了样式规范校验、图表来源校验、跨模型评审循环以及防补丁循环的修复词汇表。

Why this skill exists (the failure it prevents)

该技能存在的原因(解决的痛点)

A predecessor pipeline produced a poster with 30+ colors, zero real paper figures, a screen-pixel canvas, and tiny formulas floating in oversized boxes, then spent 12+ review rounds making it worse — each round added a new badge color or bespoke SVG patch. The cure is structural, not exhortative:
  1. Hard gates run before any aesthetic opinion (alignment, style, assets must PASS first — a reviewer never sees an unmeasured poster).
  2. A closed fix vocabulary — visual-review fixes can only touch design tokens, whole catalogued components, content rebalance, assets, or canvas choice. New inline styles / new hex values / bespoke decorations are structurally forbidden.
  3. Two-hue discipline as a machine check, not a style suggestion.
  4. Real paper figures with provenance manifest, or the gate fails.
此前的流水线生成的海报存在30余种颜色、无真实论文图表、基于屏幕像素画布、公式在超大框中悬浮等问题,后续经过12轮以上的评审后效果反而更差——每一轮都新增了新的徽章颜色或定制SVG补丁。解决方案是结构性的,而非劝诫性的:
  1. 严格校验优先于任何审美意见(对齐、样式、资源必须先通过校验——评审者永远不会看到未经过测量校验的海报)。
  2. 封闭的修复词汇表——视觉评审的修复只能修改设计令牌、已分类的完整组件、内容平衡、资源或画布选择。从结构上禁止新增内联样式/新十六进制颜色值/定制装饰。
  3. 双色调规范作为机器校验项,而非风格建议。
  4. 带来源清单的真实论文图表,否则校验不通过。

Mental model

心智模型

paper (.tex / PDF) ──► content plan + claim→evidence audit (codex, fresh)
   figures extracted ─────────┤  FIGURE_MANIFEST.json (provenance, sha256)
   (real paper figures ONLY)  ▼
   template scaffold ──► fill ──► run_gates.py            ◄─── HARD, loop here
                                  preflight → style → asset → measure → polish
                              │ all hard gates PASS
                    Claude visual review (≤3 issues × ≤3 rounds, fix-vocabulary only)
                              │ score ≥ 9
                    codex final cross-model review (fresh thread, full HTML+PDF)
                              │ pass
                    verify-final → poster.pdf + GATE_REPORT.json
paper (.tex / PDF) ──► 内容规划 + 论点→证据审核(codex,全新线程)
   提取的图表 ─────────┤  FIGURE_MANIFEST.json(来源信息,sha256)
   (仅真实论文图表)  ▼
   模板脚手架 ──► 填充内容 ──► run_gates.py            ◄─── 严格校验,在此循环
                                  预检 → 样式 → 资源 → 测量 → 优化
                              │ 所有严格校验通过
                    Claude视觉评审(≤3个问题 × ≤3轮,仅使用修复词汇表)
                              │ 评分≥9
                    codex最终跨模型评审(全新线程,完整HTML+PDF)
                              │ 通过
                    最终验证 → poster.pdf + GATE_REPORT.json

Constants

常量定义

  • SKILL_SCRIPTS =
    ${CLAUDE_SKILL_DIR}/scripts
    — all helpers are single-owner and ship inside this skill (Arch C). If the directory is missing the install is broken: abort and tell the user to re-install the skill (Policy A — the gates ARE the skill; never improvise replacements).
  • REVIEWER_MODEL =
    gpt-5.6-sol
    , reasoning
    xhigh
    , fresh thread per review call (
    mcp__codex__codex
    , never
    codex-reply
    across review boundaries).
  • CANVAS — from the venue's official spec, looked up live in Phase 0. Never assume. (Known anchor: ICLR 2026 main = 185×90 cm landscape per its official printing service; ICML/NeurIPS commonly 60×36 in landscape; workshop posters often 61×91 cm portrait. Specs change yearly — verify.)
  • PALETTE — default =
    templates/tokens/generic.json
    (slate-blue
    #2D5F8B
    accent
    • gold
      #C9A24A
      highlight + neutrals) for all venues. Venue packs are opt-in via
      — venue-colors: true
      . Purple-dominant accents (hue 250–285) are banned unless the user passes
      — allow-purple: true
      .
  • AUTO_PROCEED = false — wait for explicit confirmation at every 🚦 checkpoint.
  • OUTPUT_DIR =
    poster_html/
    in the working directory.
  • SKILL_SCRIPTS =
    ${CLAUDE_SKILL_DIR}/scripts
    —— 所有辅助脚本均为单一所有者维护,并随该技能一同发布(架构C)。若目录缺失则安装失败:终止流程并告知用户重新安装该技能(策略A——校验机制是技能的核心;切勿临时替代)。
  • REVIEWER_MODEL =
    gpt-5.6-sol
    ,推理等级
    xhigh
    每次评审调用使用全新线程
    mcp__codex__codex
    ,评审边界间绝不能使用
    codex-reply
    )。
  • CANVAS —— 来自会议官方规范,在第0阶段实时查询。切勿假设已知。(参考示例:ICLR 2026主会场海报为185×90厘米横版,来自其官方印刷服务;ICML/NeurIPS通常为60×36英寸横版; workshop海报常为61×91厘米竖版。规范每年变化——务必验证。)
  • PALETTE —— 默认值 =
    templates/tokens/generic.json
    (石板蓝
    #2D5F8B
    强调色 + 金色
    #C9A24A
    高亮色 + 中性色),适用于所有会议。可通过
    — venue-colors: true
    选择启用会议专属配色包。除非用户传入
    — allow-purple: true
    ,否则禁止使用紫色系强调色(色相250–285)。
  • AUTO_PROCEED = false —— 在每个🚦检查点等待用户明确确认。
  • OUTPUT_DIR = 工作目录下的
    poster_html/

Workflow

工作流程

Phase 0 — Resume, dependencies, venue spec

第0阶段 —— 恢复、依赖项、会议规范

  1. Resume: if
    poster_html/POSTER_STATE.json
    exists with
    status: in_progress
    (< 24 h), resume from the saved phase.
  2. Dependencies (degradation chain, in order):
    • Playwright + bundled Chromium → if missing,
      python3 -m playwright install chromium
      → if install fails but system Chrome exists, scripts fall back to
      channel="chrome"
      → if all fail: you may produce the content plan and scaffold only, label everything "not print verified", and must NOT emit a final PDF.
    • pdfinfo
      missing → PyMuPDF reads PDF dimensions. At least one of pdftoppm / PyMuPDF must exist for PNG review renders.
    • MathJax: download
      tex-svg.js
      once into
      poster_html/assets/mathjax/
      and reference it locally in the HTML. CDN is acceptable only for drafts; the measure gate hard-fails on unrendered MathJax either way.
  3. Venue spec lookup (live): consult the venue's official poster-instructions page (search + fetch). Extract dimensions, orientation, font floor, logo policy, anonymity rules, file format. Record
    {spec, source_url, retrieved}
    into
    POSTER_STATE.json
    — specs change yearly; never reuse a cached spec silently.
🚦 Checkpoint: echo the venue spec table (canvas, orientation, source URL) and the chosen template. Wait.
  1. 恢复流程:若
    poster_html/POSTER_STATE.json
    存在且
    status: in_progress
    (创建时间<24小时),则从保存的阶段恢复。
  2. 依赖项(降级顺序):
    • Playwright + 捆绑版Chromium → 若缺失,执行
      python3 -m playwright install chromium
      → 若安装失败但系统存在Chrome,脚本将回退至
      channel="chrome"
      → 若全部失败:仅可生成内容规划和脚手架,标记所有内容为**“未经过打印验证”**,且不得生成最终PDF。
    • pdfinfo
      缺失 → 使用PyMuPDF读取PDF尺寸。必须至少存在pdftoppm / PyMuPDF中的一个,用于生成PNG评审预览图。
    • MathJax:将
      tex-svg.js
      下载一次至
      poster_html/assets/mathjax/
      ,并在HTML中本地引用。仅草稿可使用CDN;无论如何,测量校验会因未渲染的MathJax而失败。
  3. 实时查询会议规范:查阅会议官方海报指南页面(搜索+获取)。提取尺寸、方向、最小字体要求、Logo政策、匿名规则、文件格式。将
    {spec, source_url, retrieved}
    记录至
    POSTER_STATE.json
    ——规范每年变化;切勿静默复用缓存的规范。
🚦 检查点:输出会议规范表格(画布、方向、来源URL)和选定的模板。等待用户确认。

Phase 0.5 — Design discovery (one AskUserQuestion batch)

第0.5阶段 —— 设计确认(一次用户提问批量完成)

Ask once, ≤4 questions: layout template (from
templates/README.md
), palette (default generic pack / venue pack / custom within constraints), logos + venue mark (paths or "none" — never fabricate; check the venue's logo policy), QR target (paper / code / project page / none — generate offline with
qrencode
or python-
qrcode
; never a remote QR-service URL). Persist answers in
POSTER_STATE.json
as
design_decisions
— re-read before any later "improvement" so deliberate choices are never reverted.
仅提问一次,最多4个问题:布局模板(来自
templates/README.md
)、配色方案(默认通用包/会议专属包/符合约束的自定义方案)、Logo+会议标识(路径或“无”——切勿伪造;需符合会议Logo政策)、二维码目标(论文/代码/项目页面/无——使用
qrencode
或python-
qrcode
离线生成;禁止使用远程二维码服务URL)。将答案保存至
POSTER_STATE.json
design_decisions
字段——后续进行任何“优化”前需重新读取,避免回退用户的明确选择。

Phase 1 — Paper ingest, content plan, claim audit

第1阶段 —— 论文导入、内容规划、论点审核

  1. Read the paper source (
    .tex
    ideal; PDF otherwise). Extract: title/authors/affils, the 3–5 headline numbers, core method (equations verbatim), main results (tables/figures and what they show), takeaways. Build
    poster_html/POSTER_CONTENT_PLAN.md
    — what goes in which column, word budget per card. Target density (excluding table cells, captions, author line, footer): standard poster 550–850 words; dense theory+empirical poster 750–1050 words, allowed only when ≥2 compact components are used (
    eqn-anatomy
    ,
    flow-strip
    ,
    derived-col
    ,
    claim-pills
    ,
    keybox--4
    ). Warn yourself below 500 words on a 4-column landscape (it will read as sparse next to professionally dense posters) unless the template is hero/visual-first; warn above 1100 unless the user asked for dense mode. Bullets ≤ 8 words when possible — density comes from structure, not long prose. Prefer compact structure over prose: if the paper contains an explicit objective, algorithm, theorem mechanism, or baseline comparison, extract at least two of: (1) empirical objective / loss stack; (2) term-by-term equation anatomy; (3) a method-flow strip grounded in paper variables; (4) a derived-Δ column for method-vs-baseline rows; (5) a 4-up implementation/theory keybox; (6) a claim/evidence pill table for numeric-heavy posters. Do not invent an algorithm. If the paper has only an objective, label the component "objective flow" or "loss anatomy", never "algorithm".
  2. Cross-model content audit (fresh codex thread,
    xhigh
    ): give it the content plan path + paper source path(s) — paths only, no summaries — and ask for a claim→evidence table:
    | claim on poster | paper file:line | paper says (verbatim) | match? |
    with match ∈ {OK, NUMERIC-MISMATCH, OVERCLAIM, MISSING-PRECONDITION, NOT-IN-PAPER, SCOPE-NARROWED}. Save to
    poster_html/CLAIM_EVIDENCE.md
    .
  3. Fix every non-OK row or record it as a user-acknowledged tradeoff.
🚦 Checkpoint: content plan + audit summary. Wait.
  1. 读取论文源文件(优先
    .tex
    ;其次PDF)。提取:标题/作者/机构、3–5个核心数据、核心方法(公式原文)、主要结果(表格/图表及其说明)、结论。生成
    poster_html/POSTER_CONTENT_PLAN.md
    ——内容分布到哪些列,每个卡片的字数预算。目标密度(不含表格单元格、标题、作者栏、页脚):标准海报550–850词;密集型理论+实证海报750–1050词,仅当使用≥2个紧凑组件时允许(
    eqn-anatomy
    ,
    flow-strip
    ,
    derived-col
    ,
    claim-pills
    ,
    keybox--4
    )。若4列横版海报字数低于500词(除非模板为视觉优先型),需发出警告;若超过1100词且未启用密集模式,也需警告。尽可能使用≤8词的项目符号——密度来自结构,而非冗长文本。优先选择紧凑结构而非散文:若论文包含明确的目标、算法、定理机制或基线对比,至少提取以下两项:(1) 实证目标/损失栈;(2) 逐术语公式解析;(3) 基于论文变量的方法流程条;(4) 方法vs基线的差异对比列;(5) 4栏式实现/理论关键框;(6) 数值密集型海报的论点/证据胶囊表格。切勿发明算法。若论文仅包含目标,将组件标记为“目标流程”或“损失解析”,绝不能标记为“算法”。
  2. 跨模型内容审核(全新codex线程,
    xhigh
    推理等级):传入内容规划路径+论文源文件路径(仅传路径,无需摘要),要求生成论点→证据表格:
    | 海报论点 | 论文文件:行号 | 论文原文 | 匹配度 |
    ,匹配度可选值为{OK, NUMERIC-MISMATCH, OVERCLAIM, MISSING-PRECONDITION, NOT-IN-PAPER, SCOPE-NARROWED}。保存至
    poster_html/CLAIM_EVIDENCE.md
  3. 修复所有非OK行,或记录为用户确认的权衡项。
🚦 检查点:输出内容规划+审核摘要。等待用户确认。

Phase 2 — Real paper figures (provenance-gated)

第2阶段 —— 真实论文图表(来源校验)

Source preference chain:
  1. Paper source
    figures/
    (vector SVG/PDF → convert to SVG via
    inkscape
    /
    pdf2svg
    if available, else rasterize ≥ 2× rendered px).
  2. PDF-only:
    extract_pdf_figures.py contact-sheet
    +
    auto
    to list candidate regions → pick crops (🚦 human confirms crop choices) →
    crop
    at 300–450 DPI.
  3. Last resort: user supplies explicit
    page,x0,y0,x1,y1
    bboxes.
Then
preprocess_figures.py --autocrop
every asset. Every paper-derived image gets a
FIGURE_MANIFEST.json
entry (source hash, page, bbox, dpi, sha256, natural_px) and is embedded as
<img data-source="paper" data-asset-id="...">
.
Hard rule: ≥ 2 paper-derived visuals or the asset gate fails. Theory-only papers may waive the total-area rule (
--waive-total-area
) at a human checkpoint — never silently. Never draw bespoke decorative SVG "figures" as substitutes.
Figure-area bands (asset gate, fractions of body): total target 14–22 % (warn < 12 % / > 24 %, hard < 10 % / > 28 %); per ordinary figure target 4–8 % (warn
10 %, hard > 13 %);
figure--duo
combined 8–12 %. Hero templates pass
--hero
(centerpiece may take 30–40 %). The failure mode is symmetric: too small reads as decoration, too big crowds out content. Sibling figures that share axes or tell a before→after story belong in one
figure--duo
card, not two cards.
来源优先级:
  1. 论文源文件的
    figures/
    目录(矢量SVG/PDF → 若可用,通过
    inkscape
    /
    pdf2svg
    转换为SVG,否则以≥2倍渲染像素光栅化)。
  2. 仅PDF文件:执行
    extract_pdf_figures.py contact-sheet
    +
    auto
    列出候选区域 → 选择裁剪区域(🚦 人工确认裁剪选择) → 以300–450 DPI裁剪。
  3. 最后手段:用户提供明确的
    page,x0,y0,x1,y1
    边界框。
然后对所有资源执行
preprocess_figures.py --autocrop
。每个来自论文的图像都会在
FIGURE_MANIFEST.json
中生成条目(源文件哈希、页码、边界框、DPI、sha256、原始像素尺寸),并以
<img data-source="paper" data-asset-id="...">
的形式嵌入。
严格规则:至少包含2个来自论文的可视化内容,否则资源校验失败。纯理论论文可在人工检查点豁免总面积规则
--waive-total-area
)——切勿静默豁免。切勿绘制定制装饰性SVG“图表”作为替代。
图表面积范围(资源校验,占主体区域的比例):总目标14–22 %(低于12%/高于24%时警告,低于10%/高于28%时校验失败);单张普通图表目标4–8 %(高于10%时警告,高于13%时校验失败);
figure--duo
组合图表8–12 %。视觉优先模板可传入
--hero
(中心图表可占30–40%)。两种极端均为失败模式:过小会显得像装饰,过大会挤占内容空间。共享坐标轴或展示前后对比的图表应放入同一个
figure--duo
卡片,而非两个独立卡片。

Phase 3 — Scaffold + tokens

第3阶段 —— 脚手架 + 令牌

cp templates/<chosen>.html poster_html/poster.html
; retarget
@page
+
.poster
dims to the venue canvas (two edits, same values); apply the chosen token pack onto the
:root
DESIGN TOKENS block; fill content per the plan; embed manifest figures. Run
preflight
+
style_check
— both must PASS before any layout iteration. (A fresh scaffold is expected to fail
measure
— that gate judges a filled poster.)
执行
cp templates/<chosen>.html poster_html/poster.html
;将
@page
+
.poster
尺寸修改为会议画布尺寸(两处修改,值相同);将选定的令牌包应用到
:root
设计令牌块;根据规划填充内容;嵌入带来源清单的图表。执行
preflight
+
style_check
——两者均需通过才能进行布局迭代。(全新脚手架预期会
measure
校验失败——该校验针对填充后的海报。)

Phase 4 — Layout hard loop

第4阶段 —— 布局严格循环

After every layout change:
bash
python3 "$SKILL_SCRIPTS/run_gates.py" poster_html/poster.html \
    --tokens <pack.json> --manifest poster_html/FIGURE_MANIFEST.json \
    --report poster_html/GATE_REPORT.json
Canonical order: preflight → style → asset → measure → polish. Targets: column-bottom spread < 5 px (aim < 3), footer gap ∈ [30, 50] px, intercard gap ∈ [12, 50] px, canvas-fill ∈ [95, 101] %, poster bbox aligned to page within ±2 px. Fix guidance for each failure mode lives in the gate output and
templates/COMPONENTS.md
. Do not proceed while any hard gate fails. Do not let a reviewer see an unmeasured poster. Balance under-filled columns with content from the paper (Gate C), never with whitespace,
space-between
, or stretched cards.
每次布局修改后:
bash
python3 "$SKILL_SCRIPTS/run_gates.py" poster_html/poster.html \
    --tokens <pack.json> --manifest poster_html/FIGURE_MANIFEST.json \
    --report poster_html/GATE_REPORT.json
标准顺序:预检 → 样式 → 资源 → 测量 → 优化。目标:列底部间距<5 px(目标<3 px),页脚间隙∈[30, 50] px,卡片间间隙∈[12, 50] px,画布填充率∈[95, 101] %,海报边界框与页面对齐误差±2 px内。每种失败模式的修复指南可在校验输出和
templates/COMPONENTS.md
中找到。任何严格校验未通过时不得继续。切勿让评审者看到未经过测量校验的海报。 使用论文中的内容填充列的空白(规则C),切勿使用空白、
space-between
或拉伸卡片。

Phase 5 — Claude visual review (gated aesthetics)

第5阶段 —— Claude视觉评审(审美校验)

Render and read the result yourself:
bash
python3 "$SKILL_SCRIPTS/render_preview.py" poster_html/poster.html
pdftoppm -r 100 poster_html/poster_preview.pdf poster_html/review_full -png -f 1 -l 1
自行渲染并查看结果:
bash
python3 "$SKILL_SCRIPTS/render_preview.py" poster_html/poster.html
pdftoppm -r 100 poster_html/poster_preview.pdf poster_html/review_full -png -f 1 -l 1

plus 2-4 region crops at higher res (header / one column / equations) via PIL

另外通过PIL生成2-4个高分辨率区域裁剪图(页眉/某一列/公式)


**Calibrate first** (`../shared-references/taste-calibration.md`): if
**human-curated** `references/good/` + `references/bad/` exist under this skill
dir (or the project supplies its own pair), score those 3+3 reference posters
on the axes below BEFORE the target, anchoring the scale. Never select, search
for, or generate anchors yourself; if no reference sets exist, proceed
uncalibrated and mark `CALIBRATION: none` — never fabricate anchor scores.
Axes (weights sum 1.0): Design 0.35 · Craft 0.30 · Functionality 0.20 ·
Originality 0.15. Mapping: `SCORE = min(round(1 + 9 × COMPOSITE), lowest
triggered cap)` — caps apply AFTER the mapping, and the loop's `Score ≥ 9`
threshold below always reads this final capped `SCORE`, never the raw
composite.

Score strictly 1–10. **Critical caps** (hard floors — a calibrated composite
never overrides them): < 2 real paper figures → ≤ 3; broken canvas /
clipped content / unreadable math → ≤ 4; ≥ 4 visible hue families or gradient-heavy
header → ≤ 4; large blank cards or columns → ≤ 5; fabricated visual claim → ≤ 3.
Checks: posterly-showcase gestalt (would this hang next to a professionally designed
poster without looking like a patched dashboard?), single-accent discipline, real
figures readable and central, print hierarchy (title → headline stats → figures →
detail), column fill, **equation prominence** (no tiny math in oversized boxes),
serif-body/sans-display pairing, no gradient kitsch, component consistency, 60-second
narrative. Output format:
SCORE: N/10 (= min(round(1 + 9 × COMPOSITE), lowest cap); drives the loop) COMPOSITE: 0.xx (weighted; list the four per-axis scores) CALIBRATION: anchored | none GAP: <which reference poster the target falls short of / exceeds, on which axis, and why — one paragraph; omit only when CALIBRATION: none> CAPS_TRIGGERED: ... TOP_ISSUES: (max 3) ALLOWED_FIX_TYPE per issue: token | component | rebalance | asset | template/canvas PATCH_LOOP_RISK: low | medium | high

Loop: fix (fix vocabulary below) → re-run Phase 4 gates → re-score. **≤ 3 issues per
round, ≤ 3 rounds.** Score ≥ 9 → Phase 6. Still < 9 after 3 rounds → STOP patching;
escalate to template / canvas / content re-choice (back to Phase 3) or a human
decision. Never enter round 4 of cosmetic patching.

**先校准**(`../shared-references/taste-calibration.md`):若该技能目录下存在**人工筛选**的`references/good/` + `references/bad/`参考海报(或项目提供了自己的参考对),在评估目标海报前,先对这些3+3个参考海报按以下维度评分,锚定评分标准。切勿自行选择、搜索或生成锚点;若无参考集,则不校准并标记`CALIBRATION: none`——切勿伪造锚点评分。维度(权重总和1.0):设计0.35 · 工艺0.30 · 功能性0.20 · 原创性0.15。评分映射:`SCORE = min(round(1 + 9 × COMPOSITE), 触发的最低上限)`——上限在映射后应用,循环中的`Score ≥ 9`阈值始终读取最终的上限后SCORE,而非原始综合得分。

严格评分1–10。**关键上限**(严格下限——校准后的综合得分绝不能覆盖):<2张真实论文图表 → ≤3;画布破损/内容裁剪/公式不可读 → ≤4;≥4个可见色相家族或渐变密集页眉 → ≤4;大面积空白卡片或列 → ≤5;伪造视觉论点 → ≤3。检查项:posterly展示级整体效果(该海报能否与专业设计的海报一同展示,而不会像拼凑的仪表盘?)、单强调色规范、真实图表清晰且居中、打印层级(标题 → 核心数据 → 图表 → 细节)、列填充、**公式突出度**(无超大框中的微小公式)、衬线正文/无衬线标题配对、无渐变俗套设计、组件一致性、60秒叙事性。输出格式:
SCORE: N/10 (= min(round(1 + 9 × COMPOSITE), 触发的最低上限);驱动循环) COMPOSITE: 0.xx (加权得分;列出四个维度的单独得分) CALIBRATION: anchored | none GAP: <目标海报在哪个维度上与哪个参考海报存在差距/优势,原因——一段文字;仅当CALIBRATION: none时省略> CAPS_TRIGGERED: ... TOP_ISSUES: (最多3个) ALLOWED_FIX_TYPE per issue: token | component | rebalance | asset | template/canvas PATCH_LOOP_RISK: low | medium | high

循环:修复(使用以下修复词汇表)→ 重新执行第4阶段校验 → 重新评分。**每轮≤3个问题,最多3轮**。评分≥9 → 第6阶段。3轮后仍<9 → 停止补丁;升级为重新选择模板/画布/内容(回到第3阶段)或人工决策。绝不能进入第4轮 cosmetic补丁。

Fix vocabulary (closed set — the anti-patch-loop core)

修复词汇表(封闭集合——防补丁循环核心)

Allowed: (a) edit a
:root
token value; (b) swap/remove/add a whole component instance from
templates/COMPONENTS.md
; (c) content rebalance (move a card across columns, trim/grow text from the paper, resize a figure within its AR band); (d) template/canvas re-choice; (e) global edits to an existing component's CSS that reference only tokens; (f) switching predefined variants (
.eqn--large
,
.card--compact
,
.figure--wide
,
.nowrap
, …); (g) asset fixes (re-crop, swap for a clearer figure from the same paper, re-preprocess).
Forbidden: new inline styles, new hex values anywhere, bespoke decorative SVG, per-element font-size overrides. A new component may not be born inside the visual loop — stop, get a human checkpoint, add it to
COMPONENTS.md
, re-run from Phase 3.
允许:(a) 修改
:root
令牌值;(b)
templates/COMPONENTS.md
中替换/移除/添加完整组件实例;(c) 内容平衡(跨列移动卡片、从论文中删减/扩充文本、在宽高比范围内调整图表尺寸);(d) 重新选择模板/画布;(e) 对现有组件的CSS进行全局编辑,且仅引用令牌;(f) 切换预定义变体(
.eqn--large
,
.card--compact
,
.figure--wide
,
.nowrap
, …);(g) 资源修复(重新裁剪、替换为论文中更清晰的图表、重新预处理)。
禁止:新增内联样式、任何位置新增十六进制颜色值、定制装饰性SVG、逐元素字体大小覆盖。视觉循环中不得新增组件——停止流程,获取人工检查点,将组件添加到
COMPONENTS.md
,从第3阶段重新执行。

Phase 6 — Codex final review (fresh thread, cross-model)

第6阶段 —— Codex最终评审(全新线程,跨模型)

All hard gates PASS + polish warnings zero-or-waived + visual ≥ 9 first. Then a fresh codex thread (
xhigh
) reviews the final artifacts (not the content plan):
poster.html
, the rendered PDF/PNG, the paper source,
GATE_REPORT.json
,
CLAIM_EVIDENCE.md
— paths only, no executor framing. It checks: (1) fidelity & overclaims re-checked on final text (polish introduces new claims), (2) residue (
\ref{
,
TODO
, raw
<
in math, missing images, remote URLs), (3) visual rhetoric (headline numbers prominent, banner readable from 2 m), (4) gate-log coherence. The reviewer recommends; it does not edit. Any fix → back through Phase 4/5 gates — never straight to re-review.
所有严格校验通过 + 优化警告为零或已豁免 + 视觉评分≥9后,进入此阶段。使用全新codex线程(
xhigh
推理等级)评审最终产物(而非内容规划):
poster.html
、渲染后的PDF/PNG、论文源文件、
GATE_REPORT.json
CLAIM_EVIDENCE.md
——仅传路径,无需执行框架说明。检查内容:(1) 最终文本的准确性与过度陈述重检(优化可能引入新论点),(2) 残留内容(
\ref{
,
TODO
, 数学公式中的原始
<
、缺失图像、远程URL),(3) 视觉修辞(核心数据突出、标题在2米外可读),(4) 校验逻辑一致性。评审者仅提供建议;不进行编辑。任何修复需回到第4/5阶段校验——绝不能直接进入重新评审。

Phase 7 — Final verification + report

第7阶段 —— 最终验证 + 报告

bash
python3 "$SKILL_SCRIPTS/poster_check.py" verify-final poster_html/poster_preview.pdf \
    --from-html poster_html/poster.html --max-size-mb 20
Page count 1, dimensions match
@page
, size ≤ 20 MB, no TODO/residue, no remote assets. Report: PDF path, final spread px, footer-gap range, gate summary table, unresolved waivers, codex verdict. Update
POSTER_STATE.json
done
.
bash
python3 "$SKILL_SCRIPTS/poster_check.py" verify-final poster_html/poster_preview.pdf \
    --from-html poster_html/poster.html --max-size-mb 20
页数为1,尺寸匹配
@page
设置,大小≤20 MB,无TODO/残留内容,无远程资源。报告内容:PDF路径、最终间距px、页脚间隙范围、校验摘要表、未解决的豁免项、codex评审结论。更新
POSTER_STATE.json
done

State persistence

状态持久化

poster_html/POSTER_STATE.json
:
{phase, venue, canvas{w,h,orientation,source_url, retrieved}, template, token_pack, design_decisions{...}, figures_selected[], visual_rounds, codex_threads{audit, final}, status, timestamp}
— written after every phase; enables compact-recovery resume.
poster_html/POSTER_STATE.json
{phase, venue, canvas{w,h,orientation,source_url,retrieved}, template, token_pack, design_decisions{...}, figures_selected[], visual_rounds, codex_threads{audit, final}, status, timestamp}
——每个阶段后写入;支持快速恢复流程。

Key rules

核心规则

  • Measure, don't eyeball. No layout claim without
    run_gates.py
    output.
  • Gates before aesthetics. Claude/codex review only ever sees a poster whose hard gates PASS. This ordering is what kills the patch-loop death spiral.
  • Never invent paper numbers or figures. Numbers come from the paper source; visuals carry manifest provenance. Fabrication = critical cap ≤ 3.
  • Two hues, one system. Accent + gold + neutrals. The style gate enforces it; don't negotiate with the gate.
  • Real figures are the poster. A poster without the paper's own figures is a dashboard, not a poster.
  • Fix vocabulary is closed. If a fix isn't expressible as token / component / rebalance / asset / canvas, it's the wrong fix.
  • Cross-model verdicts. Claude drives the loop and scores visuals; acceptance of content fidelity comes from the fresh codex thread (a loop can drive, never acquit).
  • Preserve user decisions. Re-read
    design_decisions
    before "improving" anything.
  • Vendor boundary.
    poster_check.py
    ,
    render_preview.py
    ,
    _posterly/
    are vendored from posterly — keep diffs minimal; ARIS-side logic goes in the new scripts, not in vendored files.
  • 测量,而非目测。无
    run_gates.py
    输出则不得做出布局结论。
  • 校验优先于审美。Claude/codex评审仅能看到严格校验通过的海报。此顺序可避免补丁循环的恶性循环。
  • 切勿发明论文数据或图表。数据来自论文源文件;视觉内容需带来源清单。伪造内容→关键上限≤3。
  • 双色调,单系统。强调色+金色+中性色。样式校验会强制执行;切勿与校验机制妥协。
  • 真实图表是海报的核心。无论文自身图表的海报只是仪表盘,而非海报。
  • 修复词汇表是封闭的。若修复无法用令牌/组件/平衡/资源/画布表达,则该修复是错误的。
  • 跨模型结论。Claude驱动循环并进行视觉评分;内容准确性的认可来自全新codex线程(循环仅能驱动,绝不能自行确认)。
  • 保留用户决策。进行任何“优化”前需重新读取
    design_decisions
  • 供应商边界
    poster_check.py
    ,
    render_preview.py
    ,
    _posterly/
    来自posterly——尽量减少差异;ARIS侧逻辑放入新脚本,而非修改供应商文件。

Review tracing

评审追踪

Save every codex reviewer call's trace per
shared-references/review-tracing.md
to
.aris/traces/paper-poster-html/<date>_run<NN>/
(audit + final threads, raw responses).
按照
shared-references/review-tracing.md
保存每次codex评审调用的追踪记录至
.aris/traces/paper-poster-html/<date>_run<NN>/
(审核+最终线程,原始响应)。

Output contract

输出约定

poster_html/
├── poster.html              # single-file source of truth
├── poster_preview.pdf       # print-emulated, verify-final-checked
├── poster_preview.png       # thumbnail
├── POSTER_STATE.json        # resume state
├── GATE_REPORT.json         # canonical gate ledger (schema v1)
├── POSTER_CONTENT_PLAN.md   # what-goes-where + word budgets
├── CLAIM_EVIDENCE.md        # codex claim→evidence audit
├── FIGURE_MANIFEST.json     # figure provenance (sha256, page, bbox, dpi)
└── assets/{paper_figures,logos,qr,mathjax}/
poster_html/
├── poster.html              # 单文件可信源
├── poster_preview.pdf       # 打印模拟生成,已通过最终验证
├── poster_preview.png       # 缩略图
├── POSTER_STATE.json        # 恢复状态
├── GATE_REPORT.json         # 标准校验记录(schema v1)
├── POSTER_CONTENT_PLAN.md   # 内容分布+字数预算
├── CLAIM_EVIDENCE.md        # codex论点→证据审核
├── FIGURE_MANIFEST.json     # 图表来源信息(sha256,页码,边界框,DPI)
└── assets/{paper_figures,logos,qr,mathjax}/

When NOT to use

不适用场景

  • Slides, not a poster →
    /paper-talk
    /
    /slides-polish
    .
  • The paper's headline isn't stable yet — fix the paper first; a poster amplifies whatever story it's given.
  • 需要幻灯片而非海报 → 使用
    /paper-talk
    /
    /slides-polish
  • 论文核心观点尚未稳定——先完善论文;海报只会放大它所承载的故事。