算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
, code blocks won't get syntax highlighting, but everything stays readable.\n- **Pure stdlib helper.** `render_html.py` uses only `re`, `html`, `hashlib`, `json`, `datetime`, `pathlib`, `argparse`, `sys`. No pip install required.\n- **Defense-in-depth XSS sanitization.** The helper strips `\u003cscript>`/`\u003cstyle>`/`\u003ciframe>`/`\u003cobject>`/`\u003cembed>`/`\u003cform>`/`\u003cinput>`/`\u003cbutton>`/`\u003clink>`/`\u003cmeta>`/`\u003cbase>` tags, all `on*` event-handler attributes (`onclick`, `onload`, …), and rewrites `javascript:`/`vbscript:`/`data:` href/src/action schemes to `#blocked-unsafe-url:`. ARIS workflow artifacts should not contain these in the first place, but the sanitizer is the safety net in case an LLM hallucinates one. Markdown text content is HTML-escaped separately and never reaches the sanitizer.\n\n## Tool Location\n\nArch C self-contained: the canonical implementation lives at `skills/render-html/scripts/render_html.py` (this SKILL's own `scripts/` subdirectory), together with its templates at `skills/render-html/scripts/templates/{academic,dashboard}.html`. The helper is new — no legacy `tools/` shim exists.\n\nResolve `$RENDER_HTML` with the hybrid chain (Layer 0 prefers the self-contained location for the owning SKILL; Layers 1-3 are the shared-runtime chain documented in [`shared-references/integration-contract.md`](../shared-references/integration-contract.md) §2, **Policy A — skill-local gate**):\n\n```bash\n# Layer 0: self-contained (CC 1.0+ exposes $CLAUDE_SKILL_DIR).\nRENDER_HTML=\"\"\nif [ -n \"${CLAUDE_SKILL_DIR:-}\" ] && [ -f \"$CLAUDE_SKILL_DIR/scripts/render_html.py\" ]; then\n RENDER_HTML=\"$CLAUDE_SKILL_DIR/scripts/render_html.py\"\nfi\n# Layers 1-3: shared-runtime chain (non-CC hosts + manual installs).\nif [ -z \"$RENDER_HTML\" ]; then\n cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" || exit 1\n if [ -z \"${ARIS_REPO:-}\" ] && [ -f .aris/installed-skills.txt ]; then\n ARIS_REPO=$(awk -F'\\t' '$1==\"repo_root\"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true\n fi\n RENDER_HTML=\".aris/skills/render-html/scripts/render_html.py\"\n [ -f \"$RENDER_HTML\" ] || RENDER_HTML=\"skills/render-html/scripts/render_html.py\"\n [ -f \"$RENDER_HTML\" ] || { [ -n \"${ARIS_REPO:-}\" ] && RENDER_HTML=\"$ARIS_REPO/skills/render-html/scripts/render_html.py\"; }\n [ -f \"$RENDER_HTML\" ] || RENDER_HTML=\"\"\nfi\n[ -z \"$RENDER_HTML\" ] && {\n echo \"ERROR: render_html.py not resolved (layer 0: \\$CLAUDE_SKILL_DIR/scripts/; layers 1-3: .aris/skills/render-html/scripts/, skills/render-html/scripts/, \\$ARIS_REPO/skills/render-html/scripts/).\" >&2\n echo \" /render-html cannot produce HTML output. Fix: rerun bash tools/install_aris.sh, or copy from \\$ARIS_REPO/skills/render-html/scripts/.\" >&2\n exit 1\n}\n```\n\n## Invocation\n\n```bash\n# Default: academic template, output to \u003cinput>.html alongside source\npython3 \"$RENDER_HTML\" idea-stage/IDEA_REPORT.md\n\n# Dashboard template for cockpit-style views\npython3 \"$RENDER_HTML\" research-wiki/SUMMARY.md --template dashboard\n\n# Custom output path + title + eyebrow\npython3 \"$RENDER_HTML\" review-stage/AUTO_REVIEW.md \\\n --out review-stage/AUTO_REVIEW.html \\\n --title \"Auto Review — overnight run\" \\\n --eyebrow \"Workflow 2\"\n\n# Embed sidecar state JSON (rendered as a folded \u003cdetails> JSON block at end)\npython3 \"$RENDER_HTML\" review-stage/AUTO_REVIEW.md \\\n --state review-stage/REVIEW_STATE.json\n\n# Embed sidecar JSON (e.g., for KILL_ARGUMENT.md + KILL_ARGUMENT.json)\npython3 \"$RENDER_HTML\" paper/KILL_ARGUMENT.md \\\n --json paper/KILL_ARGUMENT.json \\\n --title \"Kill Argument — adversarial review\"\n\n# Offline (no CDN; math + code render as plain text)\npython3 \"$RENDER_HTML\" idea-stage/IDEA_REPORT.md --offline\n\n# JSON-only input (wrapped in a \u003cpre>\u003ccode class=\"language-json\"> block)\npython3 \"$RENDER_HTML\" review-stage/REVIEW_STATE.json --template dashboard\n\n# Language attr (default zh-CN; set for English-primary artifacts)\npython3 \"$RENDER_HTML\" docs/SKILLS_CATALOG.md --lang en\n\n# Skip review (academic template otherwise reviews by default)\npython3 \"$RENDER_HTML\" idea-stage/IDEA_REPORT.md\n# … then the skill skips the mcp__codex__codex review step if --no-review\n# was on the command line. Pass --review to a dashboard render to force it.\n```\n\nThe `--review` / `--no-review` flags are parsed by the SKILL orchestrator\n(Claude Code), not by `render_html.py`. The helper itself stays pure\nstdlib and never calls MCP. See § *HTML Review Gate* below for the\nexact resolution and prompt.\n\n## Workflow\n\n### Step 1: Identify the artifact\n\nFrom `$ARGUMENTS`, determine what to render. Common patterns:\n\n- \"render IDEA_REPORT\" → `idea-stage/IDEA_REPORT.md`, academic template\n- \"make AUTO_REVIEW readable\" → `review-stage/AUTO_REVIEW.md` + `--state review-stage/REVIEW_STATE.json`\n- \"show the kill argument as HTML\" → `paper/KILL_ARGUMENT.md` + `--json paper/KILL_ARGUMENT.json`\n- \"research-wiki dashboard\" → look for `research-wiki/SUMMARY.md` or generate from raw entity counts (Phase 2 work; for Phase 1 just render `SUMMARY.md` if present, else fall back to listing top-level wiki structure)\n\n### Step 2: Pick template\n\n- `academic` (default): linear long-form. Sticky TOC sidebar + serif body + callouts + tables + math + Q&A `\u003cdetails>`. Use for IDEA_REPORT, AUTO_REVIEW, KILL_ARGUMENT, PAPER_PLAN.\n- `dashboard`: grid layout, smaller font, denser metrics cards, no TOC sidebar. Use for research-wiki cockpit, RESUBMIT_REPORT, multi-project overviews.\n\n### Step 3: Run the helper\n\nUse the resolver above to get `$RENDER_HTML`, then invoke. The script writes the HTML alongside the source by default (or wherever `--out` says) and prints a one-line confirmation including the source SHA256 prefix.\n\n### Step 4: HTML Review Gate (cross-model)\n\n**Decide whether to run review.** Per ARIS invariant \"executor must not judge its own output\", the academic-template HTML is reviewed by a fresh cross-family Codex thread before being claimed as a delivered view. Resolution:\n\n```\nshould_review = explicit --review present\n or (template == \"academic\" and --no-review NOT present)\n```\n\nSo:\n\n- `--template academic` (default) → **review by default**. Skip with `--no-review`.\n- `--template dashboard` → no review by default. Force with `--review`.\n- Phase 2 workflow auto-emit (activated 2026-05) selects per-skill via the RENDER_HTML hooks documented below — interim views default to `--no-review`, final / audit-class deliverables default to full gate.\n\n**If `should_review` is true**, fire a fresh `mcp__codex__codex` thread (NEVER `codex-reply`; pin `model: gpt-6-astra` + `config: {\"model_reasoning_effort\": \"xhigh\"}` per `../shared-references/reviewer-routing.md`) with the prompt below. The reviewer reads the source MD + generated HTML directly; it does **not** see this skill's intermediate state.\n\n**Scope of review (narrow on purpose).** The HTML reviewer audits **render fidelity / safety / structure only** — not claim truthfulness. Claim audit belongs upstream (`/paper-claim-audit`, `/research-review`, `/result-to-claim`). Specifically the reviewer checks:\n\n1. **Information fidelity** — every section, claim, table, code block, list, math snippet, sidecar payload is present in the HTML (no silent drop)\n2. **Structural integrity** — heading hierarchy / nested lists / table cells / code fences / `\u003cdetails>` blocks / math delimiters survive parsing\n3. **Callout routing** — `> 🚨 …` got `.callout-bad`, `> 💡 …` got `.callout-info`, etc.\n4. **Safety / escaping** — no raw `\u003cscript>` / `onclick=` / `javascript:` / unreplaced placeholders / template-leak survives\n5. **Expected-difference allowance** — frontmatter strip, generated header/footer/meta, TOC insert, sanitized unsafe HTML are all expected, not flagged\n\n**Codex prompt (mandatory shape).** Send this as a fresh thread (`mcp__codex__codex`, NOT `codex-reply`):\n\n```\nYou are an independent ARIS HTML render auditor. This is a fresh review thread.\n\nRead these files directly:\n- Source artifact: \u003cABS path to source.md or source.json>\n- Generated HTML: \u003cABS path to out.html>\n- Optional sidecars: \u003cstate.json>, \u003ckill_argument.json> (if any)\n\nTask: Audit whether the generated HTML is a faithful, safe, structurally\nusable view of the source artifact. Do NOT judge whether the research\nclaims are true. Judge only rendering fidelity.\n\nChecks:\n1. Information fidelity — sections / claims / tables / code blocks /\n lists / math / sidecars not silently dropped or materially altered.\n2. Structural integrity — heading hierarchy, tables, nested lists,\n code fences, details/summary, math delimiters preserved.\n3. Callout routing — warning/critical/good/info blockquotes map to\n appropriate CSS classes when present.\n4. Safety/escaping — no unexpected raw script/style/iframe/form/\n event-handler/javascript/data URL survives from source.\n5. Placeholder/template leakage — no unreplaced {{PLACEHOLDER}} or\n parser private placeholder character appears.\n6. Expected differences — frontmatter strip, generated header/footer/\n meta, TOC insertion, sanitized unsafe HTML are EXPECTED and not a\n defect.\n\nReturn STRICT JSON first, then a short prose note:\n\n{\n \"verdict\": \"PASS|WARN|FAIL|ERROR\",\n \"checks\": {\n \"source_hash_match\": \"pass|warn|fail|unknown\",\n \"information_fidelity\": \"pass|warn|fail\",\n \"structure\": \"pass|warn|fail\",\n \"math_code_tables\": \"pass|warn|fail\",\n \"callouts\": \"pass|warn|fail|not_applicable\",\n \"safety_escaping\": \"pass|warn|fail\",\n \"placeholder_leak\": \"pass|warn|fail\"\n },\n \"blocking_issues\": [\n {\"severity\": \"fail\",\n \"source_location\": \"L\u003cn>...\",\n \"html_location\": \"\u003cselector or near-text>\",\n \"issue\": \"...\",\n \"suggested_fix\": \"...\"}\n ],\n \"warnings\": [\n {\"severity\": \"warn\", \"issue\": \"...\", \"suggested_fix\": \"...\"}\n ],\n \"summary\": \"one paragraph\"\n}\n\nVerdict rules:\n- PASS: no material fidelity/safety issue.\n- WARN: readable output with minor unsupported-Markdown or cosmetic\n degradation only.\n- FAIL: missing/altered meaningful content, broken tables/math/code/\n callouts that change interpretation, unsafe executable HTML, source\n hash mismatch, or placeholder leakage.\n- ERROR: files could not be read or audit could not complete.\n```\n\n**Save outputs**:\n\n1. Write the JSON verdict to `\u003cout_path>.review.json` (sibling to the HTML).\n2. Save the raw codex trace to `.aris/traces/render-html/\u003cYYYY-MM-DD>_run\u003cNN>/review.{txt,json}` per `shared-references/review-tracing.md`.\n3. Print a one-line summary to the user: `verdict, N blocking, N warnings, trace: \u003cpath>`.\n\n**If `verdict == FAIL`**: the HTML is **NOT** a delivered review-passed view. Tell the user the blocking issues, point them at the source (fix MD or template, not the HTML), and re-render. Do not silently overwrite or mark as complete.\n\n**If `verdict == WARN`**: deliver the HTML but surface the warning list. User decides whether to fix or accept.\n\n**If `mcp__codex__codex` is not available** (e.g., user runs `/render-html` on a Codex-CLI-only setup where Codex MCP isn't wired): emit `verdict: REVIEW_UNAVAILABLE` to the sidecar, do not fabricate `PASS`, and tell the user the HTML was generated but **not** independently reviewed. The user can manually invoke `/research-review` on the source MD or re-run with Codex MCP available.\n\n### Step 5: (Optional) Verify in browser\n\n`open \u003cout.html>` on macOS, `xdg-open` on Linux, `start` on Windows. Math + code highlighting need internet (CDN); offline mode degrades gracefully to readable text.\n\n## What the helper supports\n\n**Markdown subset** (chosen to match what ARIS workflows actually emit):\n\n- Headings `#`/`##`/`###`/`####` with auto-generated IDs for TOC\n- Paragraphs, bold `**x**`, italic `*x*` / `_x_`, inline code `` `x` ``, strikethrough `~~x~~`, links `[t](url)`, images ``\n- Unordered/ordered lists with 2-space nested indentation\n- Code blocks with optional language (` ```python `) — gets `\u003cpre>\u003ccode class=\"language-python\">` for highlight.js\n- ASCII-art code blocks (heuristic: many box-drawing chars) → `\u003cpre class=\"diagram\">` with a distinct cream-yellow background\n- Tables with `:---` / `:---:` / `---:` alignment\n- Blockquotes `> ...` — emoji-prefix detection routes to callout variants:\n - `⚠️` → `.callout-warn` (Warning)\n - `💡` / `📝` → `.callout-info` (Tip / Note)\n - `✅` / `🔒` → `.callout-good` (OK / Guarantee)\n - `❌` / `🚨` → `.callout-bad` (Blocked / Critical)\n- HTML passthrough for `\u003cdetails>`, `\u003csummary>`, `\u003cdiv>`, `\u003cfigure>`, `\u003ctable>`, `\u003csection>`, etc. (block-level) — used for the existing Round-1/2/3 fix details in `KILL_ARGUMENT.md`\n- LaTeX math: inline `$x
render-html【设计与创意】Render an ARIS Markdown / JSON artifact (IDEA_REPORT, AUTO_REVIEW, KILL_ARGUMENT, PAPER_PLAN, research-wiki state, etc.) into a single-file HTML view designed for human reading. Use when the user says "渲染 HTML", "出一份 HTML 报告", "render html", "make this readable", "export to html", or wants a polished web-rendered view of a Markdown artifact.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Markdown is for writers. HTML is for readers. ARIS workflow nodes write Markdown (canonical, audit-trail-friendly, machine-parseable).
/render-htmlturns selected artifacts into a polished single-file HTML view for the human who actually has to read them. The Markdown stays the source of truth.
Use /render-html for ARIS artifacts that have a real human reader:
| Artifact | Why HTML helps | Template |
|---|---|---|
idea-stage/IDEA_REPORT.md | Ranked ideas + pilot signal + scores feel like a decision dashboard, not a flat list | academic |
review-stage/AUTO_REVIEW.md (+ REVIEW_STATE.json) | Round-by-round score progression + weakness status; pass --state to embed the JSON | academic |
paper/KILL_ARGUMENT.md (+ KILL_ARGUMENT.json) | Per-point attack/defense with <details> Q&A cards + red/yellow/green callouts | academic |
research-wiki/SUMMARY.md (or research-wiki/index.md) | Cross-entity cockpit: papers / ideas / experiments / claims at a glance | dashboard |
PAPER_PLAN.md (optional) | Claims-evidence matrix renders better as a polished table than raw MD | academic |
RESUBMIT_REPORT.{md,json} (optional) | 7-state failure-mode ledger | academic or dashboard |
Do NOT use for:
SKILL.md files — those are internal LLM-facing protocol..aris/traces/* review traces — forensic debug, not human display.--review to force it. See § HTML Review Gate below.<meta> tags AND in the visible page header. If the HTML and source diverge, the meta tells you which version of the source produced it.node_modules. Just one .html.--offline fallback. MathJax 3 and highlight.js load from cdn.jsdelivr.net by default. Pass --offline to skip both — math will appear as raw $x$, code blocks won't get syntax highlighting, but everything stays readable.render_html.py uses only re, html, hashlib, json, datetime, pathlib, argparse, sys. No pip install required.<script>/<style>/<iframe>/<object>/<embed>/<form>/<input>/<button>/<link>/<meta>/<base> tags, all on* event-handler attributes (onclick, onload, …), and rewrites javascript:/vbscript:/data: href/src/action schemes to #blocked-unsafe-url:. ARIS workflow artifacts should not contain these in the first place, but the sanitizer is the safety net in case an LLM hallucinates one. Markdown text content is HTML-escaped separately and never reaches the sanitizer.Arch C self-contained: the canonical implementation lives at skills/render-html/scripts/render_html.py (this SKILL's own scripts/ subdirectory), together with its templates at skills/render-html/scripts/templates/{academic,dashboard}.html. The helper is new — no legacy tools/ shim exists.
Resolve $RENDER_HTML with the hybrid chain (Layer 0 prefers the self-contained location for the owning SKILL; Layers 1-3 are the shared-runtime chain documented in shared-references/integration-contract.md §2, Policy A — skill-local gate):
# Layer 0: self-contained (CC 1.0+ exposes $CLAUDE_SKILL_DIR).
RENDER_HTML=""
if [ -n "${CLAUDE_SKILL_DIR:-}" ] && [ -f "$CLAUDE_SKILL_DIR/scripts/render_html.py" ]; then
RENDER_HTML="$CLAUDE_SKILL_DIR/scripts/render_html.py"
fi
# Layers 1-3: shared-runtime chain (non-CC hosts + manual installs).
if [ -z "$RENDER_HTML" ]; then
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
RENDER_HTML=".aris/skills/render-html/scripts/render_html.py"
[ -f "$RENDER_HTML" ] || RENDER_HTML="skills/render-html/scripts/render_html.py"
[ -f "$RENDER_HTML" ] || { [ -n "${ARIS_REPO:-}" ] && RENDER_HTML="$ARIS_REPO/skills/render-html/scripts/render_html.py"; }
[ -f "$RENDER_HTML" ] || RENDER_HTML=""
fi
[ -z "$RENDER_HTML" ] && {
echo "ERROR: render_html.py not resolved (layer 0: \$CLAUDE_SKILL_DIR/scripts/; layers 1-3: .aris/skills/render-html/scripts/, skills/render-html/scripts/, \$ARIS_REPO/skills/render-html/scripts/)." >&2
echo " /render-html cannot produce HTML output. Fix: rerun bash tools/install_aris.sh, or copy from \$ARIS_REPO/skills/render-html/scripts/." >&2
exit 1
}
# Default: academic template, output to <input>.html alongside source
python3 "$RENDER_HTML" idea-stage/IDEA_REPORT.md
# Dashboard template for cockpit-style views
python3 "$RENDER_HTML" research-wiki/SUMMARY.md --template dashboard
# Custom output path + title + eyebrow
python3 "$RENDER_HTML" review-stage/AUTO_REVIEW.md \
--out review-stage/AUTO_REVIEW.html \
--title "Auto Review — overnight run" \
--eyebrow "Workflow 2"
# Embed sidecar state JSON (rendered as a folded <details> JSON block at end)
python3 "$RENDER_HTML" review-stage/AUTO_REVIEW.md \
--state review-stage/REVIEW_STATE.json
# Embed sidecar JSON (e.g., for KILL_ARGUMENT.md + KILL_ARGUMENT.json)
python3 "$RENDER_HTML" paper/KILL_ARGUMENT.md \
--json paper/KILL_ARGUMENT.json \
--title "Kill Argument — adversarial review"
# Offline (no CDN; math + code render as plain text)
python3 "$RENDER_HTML" idea-stage/IDEA_REPORT.md --offline
# JSON-only input (wrapped in a <pre><code class="language-json"> block)
python3 "$RENDER_HTML" review-stage/REVIEW_STATE.json --template dashboard
# Language attr (default zh-CN; set for English-primary artifacts)
python3 "$RENDER_HTML" docs/SKILLS_CATALOG.md --lang en
# Skip review (academic template otherwise reviews by default)
python3 "$RENDER_HTML" idea-stage/IDEA_REPORT.md
# … then the skill skips the mcp__codex__codex review step if --no-review
# was on the command line. Pass --review to a dashboard render to force it.
The --review / --no-review flags are parsed by the SKILL orchestrator
(Claude Code), not by render_html.py. The helper itself stays pure
stdlib and never calls MCP. See § HTML Review Gate below for the
exact resolution and prompt.
From $ARGUMENTS, determine what to render. Common patterns:
idea-stage/IDEA_REPORT.md, academic templatereview-stage/AUTO_REVIEW.md + --state review-stage/REVIEW_STATE.jsonpaper/KILL_ARGUMENT.md + --json paper/KILL_ARGUMENT.jsonresearch-wiki/SUMMARY.md or generate from raw entity counts (Phase 2 work; for Phase 1 just render SUMMARY.md if present, else fall back to listing top-level wiki structure)academic (default): linear long-form. Sticky TOC sidebar + serif body + callouts + tables + math + Q&A <details>. Use for IDEA_REPORT, AUTO_REVIEW, KILL_ARGUMENT, PAPER_PLAN.dashboard: grid layout, smaller font, denser metrics cards, no TOC sidebar. Use for research-wiki cockpit, RESUBMIT_REPORT, multi-project overviews.Use the resolver above to get $RENDER_HTML, then invoke. The script writes the HTML alongside the source by default (or wherever --out says) and prints a one-line confirmation including the source SHA256 prefix.
Decide whether to run review. Per ARIS invariant "executor must not judge its own output", the academic-template HTML is reviewed by a fresh cross-family Codex thread before being claimed as a delivered view. Resolution:
should_review = explicit --review present
or (template == "academic" and --no-review NOT present)
So:
--template academic (default) → review by default. Skip with --no-review.--template dashboard → no review by default. Force with --review.--no-review, final / audit-class deliverables default to full gate.If should_review is true, fire a fresh mcp__codex__codex thread (NEVER codex-reply; pin model: gpt-6-astra + config: {"model_reasoning_effort": "xhigh"} per ../shared-references/reviewer-routing.md) with the prompt below. The reviewer reads the source MD + generated HTML directly; it does not see this skill's intermediate state.
Scope of review (narrow on purpose). The HTML reviewer audits render fidelity / safety / structure only — not claim truthfulness. Claim audit belongs upstream (/paper-claim-audit, /research-review, /result-to-claim). Specifically the reviewer checks:
<details> blocks / math delimiters survive parsing> 🚨 … got .callout-bad, > 💡 … got .callout-info, etc.<script> / onclick= / javascript: / unreplaced placeholders / template-leak survivesCodex prompt (mandatory shape). Send this as a fresh thread (mcp__codex__codex, NOT codex-reply):
You are an independent ARIS HTML render auditor. This is a fresh review thread.
Read these files directly:
- Source artifact: <ABS path to source.md or source.json>
- Generated HTML: <ABS path to out.html>
- Optional sidecars: <state.json>, <kill_argument.json> (if any)
Task: Audit whether the generated HTML is a faithful, safe, structurally
usable view of the source artifact. Do NOT judge whether the research
claims are true. Judge only rendering fidelity.
Checks:
1. Information fidelity — sections / claims / tables / code blocks /
lists / math / sidecars not silently dropped or materially altered.
2. Structural integrity — heading hierarchy, tables, nested lists,
code fences, details/summary, math delimiters preserved.
3. Callout routing — warning/critical/good/info blockquotes map to
appropriate CSS classes when present.
4. Safety/escaping — no unexpected raw script/style/iframe/form/
event-handler/javascript/data URL survives from source.
5. Placeholder/template leakage — no unreplaced {{PLACEHOLDER}} or
parser private placeholder character appears.
6. Expected differences — frontmatter strip, generated header/footer/
meta, TOC insertion, sanitized unsafe HTML are EXPECTED and not a
defect.
Return STRICT JSON first, then a short prose note:
{
"verdict": "PASS|WARN|FAIL|ERROR",
"checks": {
"source_hash_match": "pass|warn|fail|unknown",
"information_fidelity": "pass|warn|fail",
"structure": "pass|warn|fail",
"math_code_tables": "pass|warn|fail",
"callouts": "pass|warn|fail|not_applicable",
"safety_escaping": "pass|warn|fail",
"placeholder_leak": "pass|warn|fail"
},
"blocking_issues": [
{"severity": "fail",
"source_location": "L<n>...",
"html_location": "<selector or near-text>",
"issue": "...",
"suggested_fix": "..."}
],
"warnings": [
{"severity": "warn", "issue": "...", "suggested_fix": "..."}
],
"summary": "one paragraph"
}
Verdict rules:
- PASS: no material fidelity/safety issue.
- WARN: readable output with minor unsupported-Markdown or cosmetic
degradation only.
- FAIL: missing/altered meaningful content, broken tables/math/code/
callouts that change interpretation, unsafe executable HTML, source
hash mismatch, or placeholder leakage.
- ERROR: files could not be read or audit could not complete.
Save outputs:
<out_path>.review.json (sibling to the HTML)..aris/traces/render-html/<YYYY-MM-DD>_run<NN>/review.{txt,json} per shared-references/review-tracing.md.verdict, N blocking, N warnings, trace: <path>.If verdict == FAIL: the HTML is NOT a delivered review-passed view. Tell the user the blocking issues, point them at the source (fix MD or template, not the HTML), and re-render. Do not silently overwrite or mark as complete.
If verdict == WARN: deliver the HTML but surface the warning list. User decides whether to fix or accept.
If mcp__codex__codex is not available (e.g., user runs /render-html on a Codex-CLI-only setup where Codex MCP isn't wired): emit verdict: REVIEW_UNAVAILABLE to the sidecar, do not fabricate PASS, and tell the user the HTML was generated but not independently reviewed. The user can manually invoke /research-review on the source MD or re-run with Codex MCP available.
open <out.html> on macOS, xdg-open on Linux, start on Windows. Math + code highlighting need internet (CDN); offline mode degrades gracefully to readable text.
Markdown subset (chosen to match what ARIS workflows actually emit):
#/##/###/#### with auto-generated IDs for TOC**x**, italic *x* / _x_, inline code `x`, strikethrough ~~x~~, links [t](url), images ```python) — gets <pre><code class="language-python"> for highlight.js<pre class="diagram"> with a distinct cream-yellow background:--- / :---: / ---: alignment> ... — emoji-prefix detection routes to callout variants:
⚠️ → .callout-warn (Warning)💡 / 📝 → .callout-info (Tip / Note)✅ / 🔒 → .callout-good (OK / Guarantee)❌ / 🚨 → .callout-bad (Blocked / Critical)<details>, <summary>, <div>, <figure>, <table>, <section>, etc. (block-level) — used for the existing Round-1/2/3 fix details in KILL_ARGUMENT.md$x$ and display $x$ pass through verbatim to MathJaxWhat the helper does NOT support (intentional simplifications):
[^1])[label][ref]=== / --- underline form — ARIS doesn't emit these)Frontmatter (--- ... ---) at the very top of the file is stripped before rendering (SKILL.md frontmatter style); the body that follows is what gets converted.
Phase 1 (originally shipped): Opt-in only. Users explicitly called /render-html <artifact.md> after a workflow completes.
Phase 2 (activated 2026-05): Eight key skills now auto-emit HTML at workflow termination, each guarded by a RENDER_HTML = true constant that the user can flip off per skill (or pass — render html: false at invocation).
Cost-tiered review gate (per artifact type):
| Skill | Artifact | Review tier | Why |
|---|---|---|---|
/idea-discovery | idea-stage/IDEA_REPORT.md | --no-review | Interim; source went through novelty + cross-model review already |
/auto-review-loop | review-stage/AUTO_REVIEW.md | --no-review | Per-round log; the loop itself is the cross-model review |
/research-pipeline | NARRATIVE_REPORT.md | --no-review | Internal Stage 5 handoff to /paper-writing; not reviewer-facing — upstream Stage 4 auto-review-loop already gated the claims |
/kill-argument | <paper-dir>/KILL_ARGUMENT.md | full gate | Audit-class artifact; matches skill's own cross-model invariant |
/paper-claim-audit | paper/PAPER_CLAIM_AUDIT.md | full gate | Audit-class artifact |
/citation-audit | paper/CITATION_AUDIT.md | full gate | Audit-class artifact |
/proof-checker | PROOF_AUDIT.md | full gate | Audit-class artifact |
/rebuttal | REBUTTAL_DRAFT_rich.md | full gate | Pre-submission deliverable |
/paper-writing | (no auto-HTML) | n/a | The final reader artifact is PDF |
/research-wiki | research-wiki/index.html dashboard | future | Phase 2.1 — dashboard template work, not in this round |
--no-review for interim reports is intentional: the source MD has already been reviewed by the producing skill's own cross-model gate, and the HTML render only converts structure — it doesn't add new claims. Full review at every checkpoint would multiply Codex calls per pipeline by 4-6×.
To disable HTML output for a specific skill: set RENDER_HTML = false in the skill's constants block or pass — render html: false. To globally disable: skip with environment variable ARIS_RENDER_HTML=0 (planned, not yet implemented; flag per skill in the meantime).
The two templates live at skills/render-html/scripts/templates/{academic,dashboard}.html. Each is a single self-contained HTML file with inline CSS using {{PLACEHOLDER}} substitution. To customize:
my_brand.html.:root { ... } to change colors, the font stack, or layout dimensions.--template choices in render_html.py argparse./render-html <input> --template my_brand.The default templates are derived from the user's own academic-newspaper tutorial style (Source Serif Pro + Songti SC, 3-color palette, sticky TOC, low-flash). Stay close to that idiom for ARIS artifacts unless you have a specific reason to break the visual language.
For deck / poster / Xiaohongshu card / tweet card / data report style outputs, point users to html-anything (Apache-2.0, 3000⭐ at time of writing). It ships 75 SKILL.md templates across 9 surfaces and detects 8 coding-agent CLIs (including Claude Code, Codex, Copilot). ARIS does not depend on it — /render-html covers ARIS-native artifacts; html-anything is the recommended path for richer publishing surfaces.
/proof-checker, /paper-claim-audit, /citation-audit, /kill-argument gate their respective products. --no-review is appropriate for interim auto-emits (e.g., idea-stage/IDEA_REPORT.html, per-round review-stage/AUTO_REVIEW.html) where the source MD has already passed an upstream cross-model gate — the HTML render is then a structural conversion, not a new claim audit. For shipped / reviewer-facing / audit-class outputs, keep the full gate./paper-claim-audit, /result-to-claim, /research-review. The HTML reviewer asks: "did the renderer faithfully + safely convert this source?" — nothing more.--offline is for air-gapped runs / archival.pip install dependency to render_html.py requires an explicit decision — the helper currently has none. MCP calls live in the skill orchestrator, never in the helper script.