skills/artifact/SKILL.md
Produce a consistently-styled, self-contained HTML report served privately over Tailscale. One house template (Silver Age comic-ops palette, dark/light toggle, and a mandatory copy-page button) so every report an agent hands the operator looks and behaves the same. Use when: "make an HTML artifact/report", "serve this over tailscale", "write up a brief/report/dashboard as a page", or any time you'd otherwise dump a long analysis into chat. Trigger: /artifact.
npx skillsauth add phrazzld/spellbook artifactInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The operator reads reports as HTML pages over Tailscale, not as chat walls. This
skill is the single source of truth for how those pages look and what they can do.
Hermes-independent (replaced ~/.hermes/scripts/hermes_artifact_*).
scripts/artifact_create.py
as HOUSE_CSS/HOUSE_JS — edit there, every future report inherits it. Don't
hand-roll a divergent stylesheet."It's a little bit silly to be leaning into HTML and then still have it be one long-ass pile of text." An artifact that is a Markdown report in a browser has missed the medium. Before authoring, ask: what is the most effective articulation of THIS information? — then climb the ladder only as far as the content earns:
GEMINI_API_KEY is in the env) — use it liberally for
informational images, never decoration.Guardrails: single-column narrative spine is generally right; a noisy dense dashboard is as much a failure as the wall of text. Strong visual hierarchy, restrained color used semantically, progressive disclosure — the first viewport carries the verdict, depth unfolds below. Tell a story; every claim links to its evidence (the atlas principle applies to pages too).
artifact_create.py mirrors to the bastion/Sanctum shelf automatically. Files
written RAW into ~/artifacts/public/a/<slug>/ serve on the local host only —
they need the bearer-PUT publish step (see publish_to_shelf in
~/.factory-lanes/scripts/bridge.py) or the operator won't find them on
Sanctum. Bit us live 2026-07-03.
S=~/Development/harness-kit/skills/artifact/scripts
# quick: markdown in, styled page out
python3 $S/artifact_create.py --title "Weekly Ops" --slug weekly-ops \
--tag "Field Memo" --summary "..." --body-file report.md
# rich: author a full HTML page (best for real reports); the copy button is
# injected if you forgot it. Match HOUSE_CSS class names for consistency.
python3 $S/artifact_create.py --title "The Factory" --slug factory \
--tag "Field Memo" --html-file factory.html
The script writes a local mirror (~/artifacts/public/a/<slug>/index.html),
then PUTs the page to the box shelf and prints the canonical URL:
https://bastion.tail5f5eb4.ts.net/artifacts/a/<slug>/. Use a 1–2 word slug.
Publishing needs ARTIFACTS_API_TOKEN (env or ~/.secrets; canonical copy in
1Password op://Agents/ARTIFACTS_API_TOKEN). --local-only skips the PUT.
Verify with curl -s -o /dev/null -w '%{http_code}' <url> before handing over
the link. Publish any raw HTML from anywhere on the tailnet with one line:
curl -T page.html -H "Authorization: Bearer $ARTIFACTS_API_TOKEN" \
https://bastion.tail5f5eb4.ts.net/artifacts/a/<slug>/index.html
The shelf lives on the bastion Fly box (apps/artifacts in the bastion repo):
files on the /data volume, served at …ts.net/artifacts/, indexed newest-first
at the bare path, linked from the Sanctum portal at the tailnet root
(https://bastion.tail5f5eb4.ts.net/). Survives laptop sleep and reboots.
Legacy mirror: scripts/artifact_serve.py still serves ~/artifacts/public on
127.0.0.1:8789 under launchd (com.phaedrus.artifacts.plist), exposed at
serenity.tail5f5eb4.ts.net/artifacts/. Old links keep resolving; the local
tree doubles as the shelf's backup. New links always point at bastion.
Add reusable block styles (cards, timelines, phase lists) to HOUSE_CSS when a
report needs them, so the next report can reuse the class. Keep the template one
file; don't fork per-report CSS.
testing
Capture one compounding repo-technical learning while a solved problem is still fresh. Use when: after a bug fix, diagnosis, delivery, review, or incident reveals a reusable pattern worth adding to `docs/solutions/`. Trigger: /compound, /capture-learning, /learning.
testing
Route Misty Step factory application capabilities. Use when choosing, auditing, integrating, or operating Canary, Powder, Landmark, Aesthetic, or Bitterblossom: production observability, incidents, health checks, error logging, backlog/work-card state, release intelligence, UI/UX system adoption, or supervised/unsupervised agent dispatch. Trigger: /factory-apps, /factory-stack.
testing
Prove a skill beats no-skill with a falsifiable A/B eval, or retire it. Design, generate, run, and maintain a skill-specific eval: name the one claim the skill must earn, run it skill-on vs raw same-model, grade blind with objective checks first, return a keep/adapt/cut verdict. Use when: "eval this skill", "does this skill help", "prove the skill beats no skill", "write an eval for", "benchmark a skill", "is this skill worth it", "skill A/B", "skill regression test", "generate skill evals". Trigger: /skill-eval, /eval-skill, /prove-skill.
tools
> Template. Copy to `<target-repo>/.agents/skills/<repo>-<domain>/SKILL.md` > and fill every bracketed placeholder from the live target repo. Delete this > line and every other `> ` guidance line before committing. See > `../../references/repo-local-skill-generation.md` for the full process. --- name: <repo>-<domain> description: | [One paragraph: what this skill verifies/runs/operates for <repo>, stated in terms of the repo's real shape (service/CLI/library/etc.), not generic process. En