sabaridsnfuji's picture
|
download
raw
8.08 kB
# NOTICE — third-party provenance
posterly is licensed **as a whole under AGPL-3.0 © 2026 Ruishuo Chen** (see `LICENSE`). It
additionally vendors a set of poster-quality "gate" tools, three tokenized templates, and one
component catalog from **ARIS** (Auto-claude-code-research-in-sleep), whose `paper-poster-html`
skill is itself a fork of posterly. Those ARIS files are **MIT-licensed**; MIT is
GPL/AGPL-compatible, so they are lawfully combined into this AGPL project while remaining
individually available under their original MIT terms (see below). This file records the vendor
boundary so the relationship stays clean and attribution is preserved in both directions.
## Licensing of this combined work
- The project **as a whole** is **AGPL-3.0** (`LICENSE`). Any distributed or network-deployed
(SaaS) derivative of posterly must release its complete corresponding source under AGPL-3.0.
- The **body-unmodified ARIS tools** below (`style_check.py`, `asset_check.py`,
`extract_pdf_figures.py`, `preprocess_figures.py`) are verbatim **MIT © 2026 wanshuiyin** and
remain **additionally available under MIT** (`LICENSES/aris-MIT.txt`) — anyone may extract just
those files and use them under MIT. AGPL copyleft applies to posterly as a whole, not to these
individual third-party files in isolation.
- The **adapted** files (templates, `COMPONENTS.md`, `run_gates.py`) are derivative works
combining posterly-original material with ARIS's MIT contribution; as part of posterly they are
distributed under AGPL-3.0, with the MIT origin attributed below.
## Vendored from ARIS (MIT)
- **Upstream**: ARIS — https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep
(skill `paper-poster-html`).
- **License**: MIT, © 2026 wanshuiyin. Full text: `LICENSES/aris-MIT.txt`.
- **Note on lineage**: ARIS's `paper-poster-html` vendored posterly's render/measure engine
(`_posterly/`, `poster_check.py`, `render_preview.py`) unchanged, then layered the gate
tools below on top. We vendor those ARIS-original additions back here. posterly keeps its
**own** (newer) `_posterly/` and `poster_check.py` — they are NOT replaced.
Vendored, **body unmodified** (a provenance header comment was prepended to each `.py`):
| Path | Origin in ARIS | Purpose |
|------|----------------|---------|
| `tools/style_check.py` | `scripts/style_check.py` | style HARD gate (13 rules: token-only colors, no inline `style=`, no gradients, font whitelist, `--fs-*` scale, data-attribute contracts, BEM-variant CSS presence) |
| `tools/asset_check.py` | `scripts/asset_check.py` | real-figure provenance gate (`data-source="paper"` + `FIGURE_MANIFEST.json` sha256 chain + rendered-area bands) |
| `tools/extract_pdf_figures.py` | `scripts/extract_pdf_figures.py` | pull real figures out of a paper PDF (contact-sheet / auto / crop) — needs PyMuPDF + Pillow |
| `tools/preprocess_figures.py` | `scripts/preprocess_figures.py` | autocrop / resolution-check extracted crops, keep `FIGURE_MANIFEST.json` honest — needs Pillow |
These vendored scripts import posterly's own `tools/_posterly/` (canvas/render/textutil),
so they run against posterly's engine, not a copy.
Vendored and **adapted**:
| Path | Origin | posterly modifications |
|------|--------|------------------------|
| `templates/COMPONENTS.md` | `templates/COMPONENTS.md` | re-pointed from the ARIS skill's design docs to posterly's `SKILL.md` + `tools/` gates; provenance note added. The component classes it catalogs are posterly's own. |
| `templates/landscape_4col_neutral.html` | `templates/landscape_4col.html` | the **tokenized** form of posterly's own neutral template — replaced the non-tokenized original in place so `style_check` passes out of the box; provenance comment prepended. Measure-role skeleton, component classes, and placeholder copy are posterly's own (verified identical). |
| `templates/landscape_hero_neutral.html` | `templates/landscape_hero.html` | same as above |
| `templates/portrait_2col_neutral.html` | `templates/portrait_2col.html` | same as above |
| `tools/run_gates.py` | `scripts/run_gates.py` | gate orchestrator → `GATE_REPORT.json`. **Modified by posterly** (fixes an upstream false-pass): the asset gate is now opt-in — without `--manifest` it is reported `NOT_RUN` and excluded from `overall`, instead of being run, crashing on its required arg (child exit 2), and silently counted as a pass; a hard gate that ends in SKIPPED from a real environment error now counts as a failure. Also forwards `--hero` to `asset_check`; the report `skill` field is `posterly`. |
## ARIS-inspired, original posterly work (not a copy)
- The **softened closed-set fix vocabulary** and the **cross-model final-review** step in
`SKILL.md` are original posterly text, inspired by `paper-poster-html`'s DESIGN_FINAL
(Phase 5 anti-patch-loop / Phase 6 Codex review). posterly's version is half-closed (the
agent may *propose* a new token/variant for human review rather than being hard-blocked)
and uses adjustable round caps, suited to a human-in-the-loop workflow.
## Not vendored
ARIS's venue color-token packs (`templates/tokens/*.json`) were intentionally **not** taken:
posterly derives its palette from poster signals (logo / figure / brand) under WCAG AA,
rather than from fixed per-venue presets.
## ResearchStudio-inspired, original posterly work (not a copy)
Five loop-convergence mechanisms were inspired by **ResearchStudio**'s `paper2poster` skill
(https://github.com/ai-nuts/ResearchStudio, `ResearchStudio-Reel/skills/paper2poster`) after a
2026-07 side-by-side review. **No code or prose was copied** — the mechanisms were re-designed
for posterly's human-in-the-loop workflow and implemented from scratch against posterly's own
`_posterly` engine (paper2poster shares distant ancestry with that engine but diverged long
ago):
- the **shared-passing-band + safe-delta hints** in `measure` (their `needPx`/`needPxRange`;
posterly's version couples the spread and gap constraints into one band),
- the **on-disk measure circuit breaker** (`_posterly/budget.py`; their `.fill_budget.json`
posterly counts *consecutive failures* and auto-resets on PASS / 12 h idle),
- the **`pack` column-feasibility pre-check** (their static floor arithmetic; posterly instead
probes the Gate A band endpoints live in the browser),
- the **edit-targets block** (their `EDIT TARGETS` verbatim-source dump; posterly emits source
line numbers + math-stripped anchors instead, since MathJax mutates the DOM),
- the **keybox two-line label reservation** (their `.stat-mini .lbl { min-height: 2.4em }`;
posterly uses `2lh` so each template's own line-height is tracked).
## Vendored third-party runtime: MathJax
`assets/mathjax/tex-svg.js` is the **unmodified** MathJax 3.2.2 single-file SVG bundle
(https://www.mathjax.org/, **Apache-2.0** — license text at `assets/mathjax/LICENSE`, version
pin at `assets/mathjax/VERSION`). The check tools' renderer intercepts the templates' MathJax
CDN request and serves this bundle (`_posterly/render.py route_mathjax_local`), so the
measurement gates typeset math deterministically offline. Vendoring an Apache-2.0 file into
this AGPL-3.0 project is license-compatible; the file remains individually available under
Apache-2.0. (Mechanism ported from ResearchStudio paper2poster's offline-math routing,
re-implemented here; the MathJax bundle itself is upstream MathJax's build, not theirs.)
## Upstream-sync rule
When pulling new ARIS releases of these tools, preserve the vendor boundary: re-vendor the
body-unmodified `.py` files (`style_check.py`, `asset_check.py`, `extract_pdf_figures.py`,
`preprocess_figures.py`) as drop-in replacements (re-prepend the provenance header), and
re-apply the documented `COMPONENTS.md` + template adaptations. **`run_gates.py` is not a
drop-in**: re-apply posterly's asset-opt-in / no-silent-false-pass patch on top of the new
upstream version. Do not fold posterly-specific logic into the body-unmodified files, so the
ARIS diff stays clean and re-syncable.

Xet Storage Details

Size:
8.08 kB
·
Xet hash:
6c71ebcca81800f4caba43a40f46c8fb7998e2829e3a1d09a1534d39c53678f1

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.