Data Viz Deck
thatrebeccarae/claude-marketing
Transform audit data, performance reports, and structured analyses into polished visual deliverables.
Produces the reader-facing HTML artifact — report, dashboard, architecture view, data browser, or review workbench — evidence-backed, browser-verified.
$ npx skills add daymade/claude-code-skills --skill report-with-html -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install daymade/claude-code-skills report-with-html --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/report-with-html .claude/skills/report-with-html && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .claude/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/daymade/claude-code-skills/tree/main/report-with-htmlType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add daymade/claude-code-skills --skill report-with-html -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install daymade/claude-code-skills report-with-html --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/report-with-html .agents/skills/report-with-html && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .agents/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add daymade/claude-code-skills --skill report-with-html -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install daymade/claude-code-skills report-with-html --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/report-with-html .cursor/skills/report-with-html && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .cursor/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/daymade/claude-code-skills.git --path report-with-html--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add daymade/claude-code-skills --skill report-with-html -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install daymade/claude-code-skills report-with-html --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/report-with-html .gemini/skills/report-with-html && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .gemini/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install daymade/claude-code-skills report-with-htmlInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add daymade/claude-code-skills --skill report-with-html -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/report-with-html .github/skills/report-with-html && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .github/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add daymade/claude-code-skills --skill report-with-html -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install daymade/claude-code-skills report-with-html --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/daymade/claude-code-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/report-with-html .opencode/skills/report-with-html && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "report-with-html" agent skill from https://github.com/daymade/claude-code-skills/tree/main/report-with-html into .opencode/skills/report-with-html/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "report-with-html", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
report-with-htmlProduces the reader-facing HTML artifact — report, dashboard, architecture view, data browser, or review workbench — evidence-backed, browser-verified.
Report With HTML is an agent skill from daymade/claude-code-skills. Produces the reader-facing HTML artifact — report, dashboard, architecture view, data browser, or review workbench — evidence-backed, browser-verified. Use when the deliverable IS a visual HTML report, or the user asks for an HTML/web presentation. Load data-visualization-discipline for chart judgment. Not for chat status or Markdown prose unless asked to become a report; not for PowerPoint (deck-creator Route C).
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. The skill folder holds 25 other files, including scripts, reference files and assets (for example `assets/delivery-gates.json`, `assets/regen-docs-template.py` and `references/approved-examples.md`).
It sits in Frontend & Design, covering Data visualization, HTML artifacts and PowerPoint presentations. It works with Microsoft PowerPoint. The repository describes itself as: Professional Claude Code skills marketplace featuring production-ready skills for enhanced development workflows. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 91bed2b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
uvFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Report With HTML loads about 11k tokens when it runs, and up to ~37k if it reads all its reference files. Until then it costs about 109 tokens; SKILL.md has 6,338 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from daymade/claude-code-skills at commit 91bed2b, republished under its MIT licence (© daymade). 6,338 words, ~11,453 tokens.
.claude/skills/report-with-html/SKILL.md (or your agent's skills folder). This skill also uses 21 other files; get the full folder from GitHub.Create a reader-facing HTML artifact whose information architecture follows the reader's question—not the author's implementation checklist.
Use this skill when the requested artifact is itself a visual HTML report or interactive information tool. Typical outputs include:
Do not trigger it for a normal status reply, generic review, code diff, issue list, or Markdown document. Those tasks may be reported in chat unless the user explicitly asks to turn the result into a visual HTML artifact.
The default delivery is the verified HTML opened in a browser. A PNG is a QA artifact
and is delivered only when the user asks for an image. If the user needs editable
PowerPoint, finish and verify the HTML first, then use deck-creator (Route C).
Visualization judgment lives in another skill — load it before designing any chart or
geometry. data-visualization-discipline:data-visualization-discipline owns which form
fits the content, which chart type and summary statistic to use, whether segments may be
aggregated, how many categorical colors are allowed, cross-view color identity, table
discipline, the antipattern list, and the pre-delivery self-check gate. This skill does not
restate those rules; a second copy would drift. This skill owns the report page itself:
register calibration, the component shelf, the approved corpus, page order, the decision-card
contract, interaction contracts, and browser verification.
references/design-principles.mdreferences/visualization-patterns.md.
Not conditional on having already chosen a form — most of it applies to every page
regardless of what you draw. This line used to open with "Chosen form →", which reads as a
precondition; a 2026-08 delivery filed the file under "the implementation lookup I'll consult
if I build one of those components", never opened it, and shipped a page missing three of its
rules. The gate a step hides behind must not be a step you have not taken yet.references/approved-examples.mdreferences/interaction-components.mdreferences/visual-evidence.md.
Load before authoring when objects, physical choices, visual defects or relationships
need to be seen; do not wait until images have already been selected.references/long-lived-report-maintenance.mdreferences/independent-review-prompt.mdassets/report-template.htmlRead these before authoring — the principles, the patterns file, the closest
approved example, and data-visualization-discipline. The rest are activated by what the
artifact actually contains.
Do not let "read only what's activated" decide the required sources above. That filter operates over needs you already know you have, so it is structurally unable to surface a step you don't know exists — and it hands the skip a legitimate-sounding rationale, which is worse than forgetting. These are the sources that tell you which steps exist.
Write down the audience, the decision or understanding the page must enable, and the authoritative sources before choosing components. Retrieve current facts during this session. Every number needs a unit, date/window, and traceable source; unknown values stay unknown.
Screen copy may contain a factual takeaway when the same page visibly supports it
with data, mechanism, or primary evidence. Remove unsupported value judgments,
slogans, maxims, superlatives, and unproven causal claims. A grep pattern such as
不是.*是 only surfaces candidates; its presence alone is never a failure. Judge each
candidate with the test in design-principles.md §3 — delete the sentence, and ask
whether the reader loses a fact they could have checked on this page, or only an opinion.
The first stays, the second goes.
Use complete, audience-readable language. Internal codes, private shorthand, naked algorithm scores, and unexplained abbreviations do not belong on the page.
Implementation state is a badge on that skeleton, not the skeleton itself. A missing dependency, unverified result, or unknown must remain visible.
For technical selection or purchase comparisons, use the concrete-plan reading order
in references/visualization-patterns.md before arranging sections. Distinguish choosing
what to investigate next from authorizing a purchase or deployment.
Use position and length for important quantitative comparisons. Color carries category or state, not a second independent measure. A geometry needs an explicit encoding key and a data-supported readout.
Do not redraw the same entity set in multiple decorative forms. Each section must answer a different sub-question. For UI or visual-product review, real screenshots are the primary evidence: crop the exact defect with enough surrounding context and keep before/after crops identical.
Use an installed mature charting capability or the current project's declared chart stack for statistical charts. If neither exists, research and select a maintained library before implementing; do not hand-build a chart engine.
Evidence comes to the reader; the reader does not travel to the evidence. When the
page cites a clause, a screenshot, or a source passage, embed it at the point of citation
— an in-place overlay or drawer that returns the reader to where they were. An anchor
that throws the reader elsewhere on the page and expects them to navigate back is
prohibited, not merely discouraged; design-principles.md §13 holds the rule and the
user's own words for it. Hash anchors remain correct for nav and for external deep links:
what is banned is being forced to leave mid-read.
Copy approved interactions from assets/components/ instead of rebuilding them.
Behavior is part of the component contract; register-specific styling may change.
Copy each component through its complete contract:
citation-drawer, for instance, only linkifies inside <section>
elements and needs a generator-produced #s9.Every interaction must work without a pointer:
Define success. Record audience, question, source set, required evidence,
delivery form, and what would make the artifact fail. The gate template (step 5) also
always carries a 读者已知清单 slot — fill it when the declared audience is narrower than
"any reader" (an internal, already-informed reader rather than a stranger): the specific
terms, scripts, or systems that audience is assumed to already know, in checkable
backtick-quoted form. When the audience genuinely is a stranger, write
不适用: <why> — the slot still has to be filled, just with that answer. Write this before
step 9's first review, not after one returns findings — see references/audience-triage.md
for why the ordering is load-bearing and how step 9 uses this list.
Resolve the actual reader and intended use from the original request, later corrections, and the current project contract. Distinguish a publication-ready draft from an actual external publication. Set evidence precision for that use: for private investigation, retain traceable original identifiers, paths, and logs rather than silently substituting a public, redacted edition. Follow the authorized project's existing delivery directory or document library; a scratch directory is a working location. If no destination is established, choose a reversible local default and state it. Ask only for missing inputs that materially affect the result and cannot reasonably be defaulted. For an investigation, record complete readability and proof of the core causal claim as separate acceptance results. A readable report does not close the investigation while necessary, authorized actions can still advance that claim; unavailable historical evidence remains unknown.
Calibrate. Read the mandatory sources — design-principles.md,
references/visualization-patterns.md, the closest entry in approved-examples.md, and
data-visualization-discipline — then any component reference the artifact activates.
Use the nearest approved register; do not copy a skin blindly. (This step used to say
"the activated pattern reference", which let the patterns file be filed as not-yet-needed
and skipped; the SSOT map above explains why that filter cannot work here.)
Plan visual evidence and 造量纲 — before a line of HTML. First follow
references/visual-evidence.md for sections about concrete objects, physical choices,
visual defects or relationships. Put representative images at the relevant options
and explain connections with diagrams; identify unavailable evidence explicitly.
Record the selected visuals in the existing page intent, not a second inventory.
Section by section, name what in the content is
ordered / has magnitude / has direction / has a counterpart, and write that quantity
down. Each geometry then carries it in the markup:
<div data-geometry="退款家数刻度轴"
data-derived-from="退款家数(0–30 家线性,共同基线;位置=家数÷30)"> … </div>No supported quantity or relationship means no invented geometry. Keep that content as prose; a verified photo or screenshot can still show the object or evidence. Wrapping a sentence in a coloured box does not make it a diagram.
A number and the coordinate that encodes it come out of the same script. As soon as
any geometry is positioned by a computed value — a bar length, a tick at left:30.80%,
an axis label, a line's endpoints — write a small no-dependency script that prints both
the finding and the coordinates, paste from its output, and ship the script next to the
page. Computing the value in prose and then hand-writing the SVG attribute is a two-copy
fact with no grep that can catch the drift: it is how the same quantity ends up rounded
two different ways in two sections, and how an axis label lands at the position of a
smaller number — a lie factor authored by the very page arguing against lie factors.
Shipping the script also makes the drawing auditable: a reader re-runs it and diffs.
Step 5's gate asks for that script's path and stats the file, so this rule has a machine
consumer rather than being one more thing only you referee. (It was prose-only for exactly
one version, and an independent audit named it the next rule likely to get skipped — the
variable that decides whether a step survives is not "does it produce an artifact" but
"does anything downstream consume the artifact". The visual-discipline gates were
already artifact steps when they got skipped.)
Why this is a numbered step rather than a principle: the rule already lived in
design-principles.md §2 and in data-visualization-discipline, and was read in both
places immediately before a delivery that shipped eight prose sections and one geometry.
A judgment step whose only referee is its author gets comprehended instead of executed.
These two attributes are what let a script see whether the step happened.
Author. If a calling Skill supplies a user-approved local report form that still
fits this report's output contract, use that form as the starting point. Otherwise
start from assets/report-template.html or an approved example. The calling Skill
owns template approval and storage; this Skill owns report generation and visual QA.
Keep customer facts and conclusions tied to current evidence, and do not copy the
caller's template into this Skill's update-owned assets/. Use actual shelf
components. If the page embeds mutable source documents, follow the long-lived-report
reference and keep generated and authored regions separate.
Run the delivery gate — it produces the artifacts the judgment steps otherwise skip.
uv run <skill-dir>/scripts/delivery_gate.py init page.html [--height 9600]
# → renders page.png AND page--masked.png (all text transparent — the squint test,
# headless; see the script header for the technique's provenance)
# → scans for ≥120 CSS px whitespace voids (visualization-patterns.md 版面填充纪律)
# → writes page.html.gate.md: the delivery gates + the stage-1 questions
# (`STAGE1` in delivery_gate.py owns the exact list), every slot empty
# Read the masked PNG segment by segment, fill every slot, then:
uv run <skill-dir>/scripts/delivery_gate.py check page.html # exit 1 until it passescheck fails on: a missing or stale masked render (so 遮字自测 cannot be claimed without
the evidence), a percentage-driven visual with no data-geometry/data-derived-from (so
造量纲 cannot be skipped — pure-layout boxes opt out visibly with data-layout), any
unfilled slot, and a gate file older than the page (so "filled the checklist, then kept
editing" cannot pass). It asserts these steps happened; it says nothing about whether
the conclusions are right — that is still steps 9 and 10.
Render a fresh artifact. Step 5 already produced page.png at the height you passed
it; re-render here only when you changed the page since, and pass the same height —
render_report.sh overwrites in place, so a shorter H silently replaces a good render with
a truncated one.
<skill-dir>/scripts/render_report.sh page.html page.png 1300 2400 # H is an example, not a default<skill-dir> is this skill's own directory — its absolute path is given to you when
the skill loads. Bare relative paths like report-with-html/scripts/… only resolve
from one particular parent directory and fail with exit 127 anywhere else.
The renderer fails without a new valid PNG and never treats an existing output as
success. Set CHROME_BIN to an explicit managed Chrome/Chromium executable in CI
or a shared-browser environment; an invalid override is a hard failure.
Then split it and read every segment — a tall PNG exceeds what one Read can resolve:
uv run <skill-dir>/scripts/crop_segments.py page.png --segments 5That step is also where truncation is caught. Chrome screenshots exactly the
--window-size you passed and never grows to fit, while the renderer's PNG check only
proves the bytes are a valid image — so a page taller than your H loses its tail
silently, and §6 of design-principles.md puts the strongest conclusion last. The
splitter warns when content runs to the final canvas row, which means the canvas cut
through the page rather than the page ending inside it. It is checked here rather than
in the renderer because the only non-mutating way to measure page height is a second
--dump-dom call, and that hangs on some pages — a gate that can never measure is a
gate that always skips.
That warning has one false positive, and its obvious remedy does not terminate under
it — so read the warning's own two branches before you re-render. If the page sizes
anything in vh (a scrolling panel at max-height:78vh is the common case), headless
1vh is H/100, so raising H grows that element too and content stays pinned to the
canvas bottom at every H. Discriminate once by rendering at a clearly different H and
comparing the reported content bottom: unchanged means it was real truncation and is now
fixed; still ≈ the new canvas height means it is the vh loop. Do not keep doubling H —
an operator who sees the same warning at 3000 and at 40000 learns to ignore it, and a
gate trained into noise no longer catches the real truncation it exists for.
Also test the narrow-screen layout with real device emulation and measure overflow.
Device emulation is not optional phrasing: headless Chrome clamps --window-size to a
~500 CSS px minimum width (measured 2026-09-17: asking 390 yields innerWidth=500;
--force-device-scale-factor does not shrink the CSS viewport either). For 390-class
phone widths use Playwright/CDP Emulation.setDeviceMetricsOverride (or Ego) — never
report a --window-size=390 run as a phone-width test.
Measuring painted bar spans for the proportion gate: anchor on the container (find the track box first, then measure dark pixels inside it), never cluster content pixels globally — edge antialiasing creates phantom clusters and a long bar hides its own track row (two real failures from 2026-09-17).
Exercise the journey. In a real browser, follow the reader's route—not merely
a click list. Test understanding order, the obvious next action, keyboard access,
modal focus, deep links, filters, and error/empty states. Use
frontend-visual-qa for micro, macro, and intent review. Every shelf component you
embedded gets its primary interaction clicked here, and you write down what you
observed — "the drawer opened and highlighted clause 7" is evidence; "the component
is present" is not. Check that actual images load, important details are readable,
captions remain next to their visuals, and the delivered local file has no missing assets.
Reconcile and verify.
For a merge or a current-state update, apply the semantic acceptance contract in
references/long-lived-report-maintenance.md §6.1. Keep the information-point
mapping with the gate evidence; a source-link index is not the requested synthesis.
For a rewrite or merge, run:
uv run --python 3.12 python <skill-dir>/scripts/reconcile_content_diff.py old.html new.htmlIt opens both pages in Chrome and compares their initial, computed reader-visible text. This does not traverse tabs/accordions or other interaction-created states; cover those states in the Journey/browser harness.
For generated long-lived pages, run the page generator and then its --check
mode. Missing/duplicate anchors or stale output are failures.
Search for stale facts, shorthand, unsupported claims, broken file paths, and duplicated version/status values.
Independent reader review — and leave a file saying it happened. The reviewer
must start with no inherited conversation or author reasoning: in Codex use
fork_turns: "none"; in Claude Code start a separate non-fork general-purpose
agent and put all required reader context in its prompt. Give that reviewer the HTML plus its
rendered screenshots — and nothing else (the table below says "the page and nothing else";
screenshots are the page, a text-only reviewer answers the visual questions by reading
source, which is indistinguishable in the write-up from having looked), using
references/independent-review-prompt.md verbatim. Reader comprehension failures
are defects — with one exception, 读者已知清单 below, that a page not declaring a
narrow audience never gets to claim. Treat proposed implementation changes as
hypotheses and reproduce them before changing the artifact.
Confirm the reviewer can actually open a browser before you send it the page — several of the review questions are about focus, Escape and keyboard order, and a text-only reviewer will answer them by reading the source. You cannot introspect a subagent's capabilities before spawning it, so make it the reviewer's own first action: tell it to attempt the browser step and report "browser unavailable — items 7 and 8 answered from source" in its output if it cannot. An unmarked source-read answer is the failure; a marked one is a known gap you can cover another way. That answer is indistinguishable in the write-up from one produced by clicking, and it lands in exactly the blind spot this skill warns about: every static check passes while the feature does nothing.
Write the outcome to a file next to the page (or in your review archive): how the reviewer was spawned (agent type, and that it was not a fork), the prompt you gave, each finding with its disposition and reason, and what could not be checked. Record the spawn details because a fork's write-up reads identically to an independent one — the only thing that distinguishes them is a fact about how it was launched, and if that is never written down, the independence requirement above is unverifiable by anyone including you. The file itself is the point: a review that leaves nothing behind is indistinguishable from a review you meant to run and didn't, and that is the failure mode this step actually has. It is not that authors disagree with the step; it is that under delivery pressure the step is the cheapest thing to silently drop.
Triage every "I don't understand this" finding against 读者已知清单 before it counts —
provisionally; step 10 independently re-derives it, this isn't a self-check. The
reviewer's zero-context persona is deliberate and does not change — but a term that is on
the list committed in step 1 is a phantom problem (Sauro, MeasuringU): the reviewer
correctly has no way to know it, and the declared audience isn't actually confused by it.
Quote the reviewer's finding verbatim next to the list entry it's disposed against —
"reduces to a known term" is an interpretive claim, not a file-exists check, and the quote
is what lets someone other than you judge whether the reduction was honest. Log the
disposition as audience-declared-known with that quote and reason; it does not count
toward the same-axis-recurrence test below. A flagged term that is not on the list either
stands as a real finding, unchanged from today, or gets added now — in which case say so
directly in the gate file next to the entry (补记于 cycle N 审阅之后) rather than blending
it into the original list silently. Do not backdate it: init --force's preserved
"上一轮的答案" appendix already carries the list as it stood before this cycle, so a
silently-blended addition is trivially caught by diffing the current list against that
appendix — say it plainly instead of relying on someone doing that diff. Full mechanism and
the grounding for why this pass is provisional rather than final are in
references/audience-triage.md.
Deciding whether to run it again is an observation, not a self-assessment. Ask: since the last recorded review, did the page's skeleton, components, decision-card content, any number, or any term or label the reviewer had to interpret change? Any yes → new reviewer, because the previous one read a different page. Renaming terms deserves its own mention: it is the standard fix for the reviewer's "words I could not understand" finding, and it is easy to file under wording — but the new words have never been read by anyone but you, which is the exact condition the review exists to remove. Typo and punctuation fixes → no rerun; say so in the closeout instead. Do not decide by asking yourself whether the change "felt structural." The documented failure is a page reviewed as prose and then rebuilt as graphics: each rebuild feels like polishing an already-reviewed page, and three consecutive versions shipped having been read by no one.
That trigger has no ceiling of its own — pair it with a budget, or "any substantive
edit needs review" mints an unbounded stream of fresh rounds. Every genuine fix is,
by definition, exactly the kind of change the trigger above requires a new reviewer
for, so a converging review and a runaway one are indistinguishable from inside a
single round — the failure has been observed at both small scale (three full rounds to
close one low-stakes correction) and large (21 rounds on a real decision document,
stopped only because a human asked why). This is the Loop Contract from
claude-code-hooks's SKILL.md rule 7 — "If the hook demands remediation, prove the
loop terminates"
(daymade-claude-code/claude-code-hooks/SKILL.md (daymade/claude-code-skills),
read there for the general framework and its worked failure cases) — instantiated for
this step instead of a hook:
LOOP KEY: this delivery's lineage (the HTML frozen at round 1 plus every descendant
edit) + one failure axis: can a fresh, uninformed reader use this page?
FIRE T: after audience triage (above), a review still answers review-prompt item 9
"no" — or surfaces any finding that amounts to the same thing (the reader
could not actually make the decision this page exists to produce) — on that
same axis, using only findings that survived triage
REMEDIATION R: reproduce the finding, apply one bounded fix, re-run the review once
VARIANT V: 2 - completed review cycles for this lineage
BUDGET: 2 cycles total — the initial review plus one narrowly scoped re-review.
A third reviewer on this lineage is never automatic.
SUCCESS EXIT: the re-review answers item 9 "yes" on that same axis, with nothing else
reopening it
AUDIENCE-MISMATCH EXIT: EVERY SINGLE post-triage reason behind a cycle's "no" disposes as
audience-declared-known — ship, log the disposition table, do not report this
to the user as blocked. "Every" means every: a "no" with two reasons, one
audience-related and one a genuine unrelated defect (a chart missing a unit, a
broken cross-reference), is not this exit — the unrelated reason alone routes
through ordinary REMEDIATION/CAPPED EXIT, same as if it had appeared by itself.
This can fire after cycle 1 alone: if nothing survived triage, there is no
finding for REMEDIATION to reproduce and fix, so a mandatory cycle 2 would just
re-review an unchanged page for a second phantom verdict.
(see `references/audience-triage.md`)
CAPPED EXIT: at least one post-triage finding is real and recurring across two cycles —
stop, report the remaining findings as a backlog, do not ship silently, and do
not dispatch a third reviewer on your own authorityThis skill's own reviewer output has no severity vocabulary to key off — the review
prompt (references/independent-review-prompt.md) returns answered questions, not
BLOCKER/MAJOR-rated findings, and step 10's acceptance vocabulary is PASS / FAIL /
CANNOT-CHECK — so FIRE T and SUCCESS EXIT above are keyed to review-prompt item 9's own
"最后一问" answer (can the reader act on this page with no other explanation?) rather
than to rule 7's example severity labels, which describe a different kind of review and
don't otherwise appear anywhere in this skill.
A same-axis recurrence and a new, unrelated finding get different treatment on cycle 2 — conflating them is what turns a bounded loop into an expanding one. Apply the audience triage above to each cycle's findings first; everything below is about what survives it. If cycle 1's findings dispose entirely as audience-declared-known, take the AUDIENCE-MISMATCH EXIT right there — there is nothing left for cycle 2 to re-review.
blocked. Do not reason "but this
finding is real" into a third dispatch — realness was never the missing check; a new
user-authorized task with its own predeclared budget is what's missing, and only the
user can open one.The same crossing applies once this lineage has already passed step 10 once. A formal acceptance is not immune to reopening, and that is a distinct failure from the one above — it recurs even when every individual finding along the way was real and on a fresh axis (three separate passing acceptances on one lineage, each individually genuine, is the documented worst case). If step 10 has already returned a clean verdict for this lineage and something is about to dispatch another step 9/10 round anyway, that crossing — by itself, before judging whether the new finding is real — is the signal to stop and ask the user, not to silently reopen.
Independent acceptance. Hand the acceptance checklist below, plus the page and its sources, to a second fresh-context agent — separate from the reader in step 9, because they answer different questions (see the table under that list). It returns a verdict and evidence per item. Its FAILs are findings you reproduce and fix, exactly like step 9's; its PASSes are the only thing that closes an item.
Finalize after review. Apply accepted fixes, rerender, repeat the browser journey,
and re-run the delivery gate — editing the page after filling the gate file
deliberately invalidates it, so check will be red here and that is the design, not a
malfunction. Re-run init --force (it carries the previous answers into an appendix so
you review-and-move rather than retype), re-read the new masked render, move each answer
up only after confirming it still holds, then check again. Only then open the final HTML
for the user. Do not open a pre-review draft as the delivered artifact.
Where a new lesson goes — two questions, in this order, before writing one into this skill.
**First: was the failure "I forgot to do it" or "I did it and could not see it was wrong"?** The first belongs in the workflow above; a reminder solves it. The second has to become a question somebody else asks, because the author did not skip it — they looked straight at it and judged it fine. Colour, terminology, whether a chart supports its own caption, whether a decision card is missing an option: all of the second kind. Putting those on a list the author answers is exactly how a rule ends up written down and still violated — which is what happened to every rule this skill had to relearn the hard way.
Then, if it is somebody else's question: can it be answered from the page alone?
Yes → the reader's prompt (references/independent-review-prompt.md). No → the acceptance
list below. That second question is what keeps the two lists from growing copies of each
other; the table below states the same boundary from the other side.
Reader review and acceptance close a delivery, and they do not overlap: every check lives in exactly one of them, so there is nothing for them to drift apart on.
| step 9 · reader review | step 10 · acceptance | |
|---|---|---|
| gets | the page and nothing else (screenshots count as the page) | the page plus your sources, your commands, your review file, and the gate artifacts |
| asks | can you read it? can you decide from it? | does what is off the page agree with what is on it? |
| its questions live in | references/independent-review-prompt.md — all of them, used verbatim | the items below |
| authority | everything visible on the page | provenance and process |
The split rule, so a future addition lands in one place instead of both: does answering it require something outside the page? No → it is a reader question; add it to the review prompt. Yes → it belongs here. Colour, wording, whether a chart supports its own caption, whether a decision card is missing an option, whether the headings form an argument — all visible on the page, all the reader's. The checks below need what the reader does not have.
Hand this list, the page and its gate artifacts (page.html.gate.md, page--masked.png),
the sources behind its load-bearing facts, the commands you ran, and the step 9 review file to a
fresh-context agent (non-fork). You may walk it yourself first — it catches the
obvious misses cheaply — but you do not get to declare the items passed.
Why it cannot be a self-check, stated plainly because the urge to skip it peaks exactly when delivery is close: an earlier version of this list asked the author to "be able to point to" each item, which they could always sincerely claim. Rewriting it to demand pasted evidence fixed half the problem — the evidence now exists — and left the other half, because the author still ruled on whether their own evidence sufficed. The failures behind these items were all that shape: a chart its author found perfectly clear, a colour scheme they had considered and approved, a recommendation whose missing downside they never noticed. None was a forgotten step. Reminders do not reach errors like these; a second pair of eyes does.
Ask for: item number, PASS / FAIL / CANNOT-CHECK, and the specific evidence — a quoted line, a count, a command's output. An item that cannot be checked is reported as such, never as a pass.
Provenance — every load-bearing fact traces to a source outside the page, with an as-of date: not only numbers, but quoted clauses, claims about what someone agreed to, statements about a dependency's status. The reader can check a page against itself; only this pass can check it against the world. Anything untraceable is removed from the page or visibly marked unknown. For sourced images, match the actual file to its original publisher and exact object / variant, then check caption limitations and permitted use for the intended delivery. For diagrams, trace load-bearing nodes, connections and dimensions to the sources; an explanatory drawing is not evidence of an assembled or deployed system.
Fresh render — the rendered PNG is newer than the page's last edit. Substitute the actual filenames:
[ page.png -nt page.html ] && echo FRESH || echo STALEUse this shape rather than find page.png -newer page.html: when the PNG is missing or
the name is misspelled, find prints an error to stderr, and "there was output" then
reads as a pass. -nt collapses stale, missing and misnamed into one STALE.
Content integrity — if the page was rewritten or merged, the
reconcile_content_diff.py output must be supplied; if it is generated, the generator's
--check output. These detect textual omissions or generated-output drift; neither
proves semantic completeness, reconciled contradictions, or current business status.
For merges/current-state updates, also inspect the information-point mapping and
evidence requested by 合并与现行事实验收 in the delivery gate. Apply §6.1 of the
long-lived-report reference: reject an archive index offered as synthesis, a historical
snapshot offered as current, or stored evidence offered as production adoption.
If the author states neither applies (hand-authored,
first version), record that answer as given — an explicit skip is auditable, an assumed
one is not.
Two outputs to read correctly rather than wave through. The reconciler prints how many
fragments it actually compared; a near-zero count means "nothing was comparable", not
"nothing was lost" — its extractor samples CJK-initial runs, so a non-Chinese page yields
almost none. And if it times out — Chrome produced no complete DOM within its limit —
record the item as not reconciled, never as passed. The generator's --check has its own blind spot it now guards against —
it is a self-consistency comparison, so zero clause anchors would appear identically on
both sides; it therefore asserts the anchor count separately and exits non-zero at zero.
Review completion — open the step 9 review file, quote one of the reviewer's own
findings verbatim, and record how that reviewer was spawned. A path only proves a file
exists and the author writes that file; the reviewer's own words and the spawn details
are what cannot be produced without a review having run. Then check each finding has a
disposition, and ask for every change made afterwards: if that list holds anything
beyond wording — skeleton, components, decision-card content, any number, or any term
the reviewer had to interpret — step 9 required a fresh reviewer, so establish whether
one ran. If the page declares 读者已知清单 (step 1), the author's disposition of each
audience-declared-known finding is a provisional first pass, not the answer — this is
the independent re-derivation that makes it real, not a second look at the author's own
conclusion: read the reviewer's quoted finding and the list entry it was disposed
against, and independently judge — without reading the author's stated reason first —
whether you would classify it the same way. A finding that only mentions a listed term
in passing, while its actual complaint is something else (a chart's claim, a broken
cross-reference, a color collision), does not dispose just because the term is on the
list — check what the reviewer's sentence is actually complaining about, not which words
appear in it. Disagree with the author's classification → the item is undisposed, not
passed, regardless of what the author wrote. Also confirm the declared term is something
the page's reader would actually encounter — a term stuffed into a comment, alt text,
aria-hidden content, or display:none markup satisfies "appears on the page" mechanically
but was never something a reader could have already known from reading this page, and
disposing a finding against it is exactly the gaming path references/audience-triage.md
names. Finally, check the list's own history: if any disposed term is absent from the
version of 读者已知清单 preserved in the gate file's "上一轮的答案" appendix from before
this review cycle, and the gate file doesn't say so plainly next to that entry (补记于 cycle N 审阅之后 or equivalent), that is an unlabeled retrofit — treat it as undisposed,
not as passed. A labeled late addition is not automatically disqualified; judge whether the
audience really would already know it, same as any other entry.
Delivery gate ran, and its answers describe this page — ask for three things, because
the first two are cheap to fake and the third is what makes them mean something:
(a) page.html.gate.md and page--masked.png exist, and check exits 0 right now
(paste the output). A nonzero exit is a FAIL of this item, not an invitation to let the
author re-run init --force and try again while you wait — the gate is supposed to be green
before the page reaches you; (b) count the distinct geometries visible in the masked PNG FIRST, write that
number down, and only then open the gate table — reading the table first makes you go
looking for the shapes it lists, which is confirmation bias with a known direction. Then
compare the two counts — the masked render is the ground truth here. Two things before you call a mismatch: a
long page needs crop_segments.py first (a 19000px PNG is unreadable in one Read), and a
composite geometry legitimately shows as several shapes — a timeline with a main axis and
an inset, a paired before/after bar — so read the gate row's own data-derived-from before
counting it twice. A real mismatch means either a visual escaped the scanner (it only reads static markup: inline percentage styles on a
short property list, plus <svg>/<canvas> elements — a width set from a CSS class, a
gradient stop, a transform percentage, or a chart a JS library injects at runtime are all
invisible to it; note <canvas> the element is caught, what it draws is not) or a wrapper is claiming several as one; (c) pick two filled rows at random and check each one's "遮字后读出的关系" against the
masked PNG yourself. One row is too thin — faking a single row survives a 1-in-N draw. And
judge the right thing: the question is not "is this sentence true" but "could it have been
written from the source without opening that image?" A claim that merely restates what the
markup says ("six bars rising left to right") passes the first test and fails the second;
say so when that is all you got. Where the masked PNG came from matters too — it is produced
by the author's own run, so if anything about it looks off, re-render it yourself with
delivery_gate.py init --force on a copy and compare.
Why this item exists, stated plainly because it is the one the author has the strongest reason to omit: without it, steps 3 and 5 are opt-in. An independent review of the 2026-08 version found the whole gate skippable at zero cost — no downstream role asked for its artifacts, so an author could skip 3 and 5, run 6 through 11 in full, and nothing would notice. A gate nobody is assigned to check is a gate that exists only for people who were going to do the work anyway.
If an item cannot be answered, the gap is written down plainly rather than the page being declared complete. An honest gap is something the reader can act on; a green checklist covering a check that never ran is not.
content-writing-discipline for the user's writing/register rules when available;frontend-visual-qa for browser and visual inspection — it ships in the sibling
claude-code-skills suite, not this one, so it may not be loadable in a given session.
If it is not available, do the inspection directly instead of skipping it: read the
rendered PNG segment by segment for micro (typography, alignment, contrast), macro
(page rhythm, section balance), and intent (does each view answer its sub-question);uv
(it installs delivery_gate.py's pillow from the PEP 723 header). The old workflow could
run start-to-finish on stdlib alone; this one cannot, because the gate's whole point is
producing artifacts. Without them, say so in acceptance item 5 as a CANNOT-CHECK with the
reason — do not report the item as passed, and do not silently skip steps 3 and 5;reconcile_content_diff.py
is standard-library only; delivery_gate.py declares pillow via PEP 723 and uv run
installs it automatically —
reconcile_content_diff.py uses X | None annotations that raise on 3.9;d2 for auto-layout diagrams;deck-creator (Route C) only after the HTML design is accepted and editable PPTX is required.© daymade, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 21 other files (scripts, references, assets) in report-with-html of daymade/claude-code-skills.
Open the folder on GitHubat commit 91bed2b
Report With HTML next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Report With HTML this skilldaymade/claude-code-skills | 1.4k | — | ~11k | Automated safety check: Pass | MIT | |
| Data Viz Deckthatrebeccarae/claude-marketing | 162 | — | ~1.8k | Automated safety check: Pass | MIT | |
| PPT as CodeRussell-cell/PPT-as-code | 191 | — | ~11k | Automated safety check: Pass | MIT | |
| Baoyu DesignDejavuMoe/Smoji | 114 | 1 repos | ~2.7k | Automated safety check: Pass | MIT | |
| Superloopy Slidesbeefiker/superloopy | 111 | 1 repos | ~8.8k | Automated safety check: Pass | MIT | |
| Design Pickepoko77-ai/design-diversity | 192 | — | ~3.7k | Automated safety check: Pass | Custom licence |
thatrebeccarae/claude-marketing
Transform audit data, performance reports, and structured analyses into polished visual deliverables.
Russell-cell/PPT-as-code
Plans and builds HTML-based web presentations through staged quick, basic or advanced workflows, with optional visualization planning, motion, a workbench and PPTX export handoff.
DejavuMoe/Smoji
Create polished design artifacts as self-contained HTML: UI mockups, interactive prototypes, wireframes, landing pages, dashboards, app screens, mobile apps, slide decks (a.k.a.
beefiker/superloopy
Creates zero-dependency, animation-rich HTML slide decks that run in the browser, with style presets, PowerPoint conversion and PDF export, proven by a real-browser render.
epoko77-ai/design-diversity
Claude로 PPT·발표자료나 웹사이트를 만들 때, AI 기본 미감(보라 그라디언트·둥근 카드·천편일률)으로 수렴하지 않도록 80가지 검증된 디자인 스타일 팩 중 하나를 골라 그 명세대로 생성하게 하는 스킬.
thatrebeccarae/claude-marketing
Create polished HTML slide decks and PDF-ready documents for consulting deliverables.
daymade/claude-code-skills
This skill should be used when comparing two videos to analyze compression results or quality differences.
daymade/claude-code-skills
Generates professional animated CLI demos as GIFs using VHS terminal recordings.
daymade/claude-code-skills
Converts DOCX/PDF/PPTX and saved HTML/HTM to high-quality Markdown with automatic post-processing.
daymade/claude-code-skills
Generates several distinct, clickable HTML interaction prototypes for one product surface into a Design Board and collects selection/remix feedback before implementation.
daymade/claude-code-skills
Diagnoses and repairs repository setup and guarded Git workflows for Claude Code or Codex — environment repair, startup sync, hook auditing, collaborator handoff.
daymade/claude-code-skills
Pulls Bigdata.com (RavenPack) financial and news data via the official bigdata-client SDK and /v1/ REST endpoints — structured financials, prices, analyst estimates, entity-sentiment series…
Works with
Produces the reader-facing HTML artifact — report, dashboard, architecture view, data browser, or review workbench — evidence-backed, browser-verified. Report With HTML is an agent skill from daymade/claude-code-skills. Produces the reader-facing HTML artifact — report, dashboard, architecture view, data browser, or review workbench — evidence-backed, browser-verified.
Report With HTML fits situations like: the deliverable IS a visual HTML report; the user asks for an HTML/web presentation.
Run `npx skills add daymade/claude-code-skills --skill report-with-html -a claude-code`. Or copy the skill folder (report-with-html in daymade/claude-code-skills) into .claude/skills/report-with-html in your project. Claude Code loads it when a task matches its description.
Run `npx skills add daymade/claude-code-skills --skill report-with-html -a codex`. Or copy the skill folder (report-with-html in daymade/claude-code-skills) into .agents/skills/report-with-html in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add daymade/claude-code-skills --skill report-with-html -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/report-with-html, .gemini/skills/report-with-html, .github/skills/report-with-html and .opencode/skills/report-with-html in your project.
Going by SKILL.md and its folder, Report With HTML needs Python for the scripts in its folder and the command-line tools its instructions call (uv). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Report With HTML is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 46k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 25k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Report With HTML: Data Viz Deck (thatrebeccarae/claude-marketing, 162 stars), PPT as Code (Russell-cell/PPT-as-code, 191 stars), Baoyu Design (DejavuMoe/Smoji, 114 stars) and Superloopy Slides (beefiker/superloopy, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
daymade (a GitHub user) maintains it in daymade/claude-code-skills, which has 1,444 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 8, 2026.
Source: daymade/claude-code-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.