Agentic workflows
Skills, harnesses and hooks
The reusable parts behind how this site and its design system get built, checked and kept true. Each one is written as a plain template that works with any agent tool, not just the one used here.
Four kinds of part
20 templatesThe names are tool-agnostic. Any agent setup has a place for each, whatever it calls them.
SkillA named procedure an agent follows when askedThe steps, the rules and where to stop.5 in the library
HarnessAn automated run of checks that passes or failsSo nobody has to eyeball it.7 in the library
HookA point where something fires by itself, or plugs inAt a set moment, without being asked.4 in the library
WorkflowSkills, harnesses and hooks chained togetherWith a person approving at the gate.4 in the library
Library
Open any card for its templateCopy a template as the starting point for a skill file, an agent instructions file, an editor rule or a CI job, then swap in your own tools.
Showing all 20 templates
Skill Change copy or layout Turns a plain-English request into a reviewed, previewed change that waits for approval.
- Inputs
- The request, the site's content rules and its component library.
- Steps
- Find every place the change shows up.
- Ask first if the request is ambiguous or touches a fact, client, figure or design decision.
- Draft it to the content rules, reusing existing components and tokens.
- Show the current and proposed wording side by side.
- Make the change on its own branch and render phone and desktop previews.
- Open a review page, then stop and wait.
- Outputs
- A review page with a wording table and previews. Nothing live.
- Guardrails
- Never publishes.
- Never invents a new style when a component already exists.
- In this project
- Claude Code skill /edit, in .claude/skills of the site's repo.
# Change copy or layout Type: Skill Purpose: Turns a plain-English request into a reviewed, previewed change that waits for approval. When: Someone asks for a change to a page, in their own words. Inputs: The request, the site's content rules and its component library. Steps: 1. Find every place the change shows up. 2. Ask first if the request is ambiguous or touches a fact, client, figure or design decision. 3. Draft it to the content rules, reusing existing components and tokens. 4. Show the current and proposed wording side by side. 5. Make the change on its own branch and render phone and desktop previews. 6. Open a review page, then stop and wait. Outputs: A review page with a wording table and previews. Nothing live. Guardrails: - Never publishes. - Never invents a new style when a component already exists.
Skill Publish-ready blog post from a draft Turns a draft into one post file, its artwork and a review page.
- Inputs
- The draft, the voice and content rules, the artwork rules.
- Steps
- Gather the title, short title, address, date, summary, topics and read time, asking for anything missing.
- Review the copy for voice, spelling, accuracy and banned characters before building anything.
- Create the post file from the template.
- Draw the post's artwork around its actual idea, using only words and figures from the post.
- Preview the post, the blog page and the homepage list, and run the page check.
- Open a review page, then stop and wait.
- Outputs
- One post file, its artwork, previews and a review page. Nothing live.
- Guardrails
- Never publishes.
- Flags any newly named client, figure or outcome for confirmation first.
- In this project
- Claude Code skill /new-post, in .claude/skills of the site's repo.
# Publish-ready blog post from a draft Type: Skill Purpose: Turns a draft into one post file, its artwork and a review page. When: A new draft is ready to go on the blog. Inputs: The draft, the voice and content rules, the artwork rules. Steps: 1. Gather the title, short title, address, date, summary, topics and read time, asking for anything missing. 2. Review the copy for voice, spelling, accuracy and banned characters before building anything. 3. Create the post file from the template. 4. Draw the post's artwork around its actual idea, using only words and figures from the post. 5. Preview the post, the blog page and the homepage list, and run the page check. 6. Open a review page, then stop and wait. Outputs: One post file, its artwork, previews and a review page. Nothing live. Guardrails: - Never publishes. - Flags any newly named client, figure or outcome for confirmation first.
Skill Preview at phone and desktop size Shows exactly how a page or section looks, before or after it goes live.
- Inputs
- The page, an optional section, and whether to show the draft or the live site.
- Steps
- Work out the page and section from plain words.
- Run the site preview harness at 390px and 1280px.
- Send the screenshots, phone first, saying whether they show the draft or the live site.
- Explain any warning in plain language.
- Outputs
- Phone and desktop screenshots.
- Guardrails
- Changes nothing.
- In this project
- Claude Code skill /preview, running tools/preview.js in the site's repo.
# Preview at phone and desktop size Type: Skill Purpose: Shows exactly how a page or section looks, before or after it goes live. When: Anyone asks to see how something looks. Inputs: The page, an optional section, and whether to show the draft or the live site. Steps: 1. Work out the page and section from plain words. 2. Run the site preview harness at 390px and 1280px. 3. Send the screenshots, phone first, saying whether they show the draft or the live site. 4. Explain any warning in plain language. Outputs: Phone and desktop screenshots. Guardrails: - Changes nothing.
Skill Publish with a human gate Puts one approved change live, then proves it on the live site.
- Inputs
- The approved review page.
- Steps
- Confirm the approval was for this exact change, after seeing its wording and previews.
- Check what is about to ship: only the approved change, protected files untouched, no banned characters.
- Merge it as one change, so it can be undone in one step.
- Wait for the deployment to finish.
- Run the live health check and preview the changed page on the live site.
- Report what went live and how to undo it.
- Outputs
- The change live, verified, with a one-tap way to undo it.
- Guardrails
- Never runs on assumed approval. Only a person can start it.
- Stops if anything unrelated is mixed in.
- In this project
- Claude Code skill /publish (an agent cannot start it by itself), in .claude/skills of the site's repo.
# Publish with a human gate Type: Skill Purpose: Puts one approved change live, then proves it on the live site. When: Only when the owner has explicitly approved this exact change. Inputs: The approved review page. Steps: 1. Confirm the approval was for this exact change, after seeing its wording and previews. 2. Check what is about to ship: only the approved change, protected files untouched, no banned characters. 3. Merge it as one change, so it can be undone in one step. 4. Wait for the deployment to finish. 5. Run the live health check and preview the changed page on the live site. 6. Report what went live and how to undo it. Outputs: The change live, verified, with a one-tap way to undo it. Guardrails: - Never runs on assumed approval. Only a person can start it. - Stops if anything unrelated is mixed in.
Skill Site health report Runs the live health check and explains the result in plain language.
- Inputs
- The live site.
- Steps
- Run the live health check harness.
- Lead with the outcome: all good, or how many problems.
- Explain each problem in one sentence: what it means for visitors and what to do.
- Outputs
- A plain-language health report.
- Guardrails
- Changes nothing without approval.
- In this project
- Claude Code skill /health, running tools/health.sh in the site's repo.
# Site health report Type: Skill Purpose: Runs the live health check and explains the result in plain language. When: After every publish, or whenever someone asks if the site is OK. Inputs: The live site. Steps: 1. Run the live health check harness. 2. Lead with the outcome: all good, or how many problems. 3. Explain each problem in one sentence: what it means for visitors and what to do. Outputs: A plain-language health report. Guardrails: - Changes nothing without approval.
Harness Site preview harness Builds the site exactly as the host does, then screenshots it at phone and desktop size.
- Inputs
- The working copy, or the live site.
- Steps
- Build the site with the host's own builder and settings.
- Serve it locally with the same clean addresses as the live site.
- Open each page at 390px and 1280px with motion reduced and the real font.
- Warn if the font is missing or the wrong page is showing.
- Outputs
- Screenshots, plus warnings.
- Guardrails
- The build matches what the host publishes, byte for byte.
- In this project
- tools/preview.js and tools/build.sh in the site's repo (Node, Playwright, Jekyll).
# Site preview harness Type: Harness Purpose: Builds the site exactly as the host does, then screenshots it at phone and desktop size. When: Every draft, before a review page opens. Inputs: The working copy, or the live site. Steps: 1. Build the site with the host's own builder and settings. 2. Serve it locally with the same clean addresses as the live site. 3. Open each page at 390px and 1280px with motion reduced and the real font. 4. Warn if the font is missing or the wrong page is showing. Outputs: Screenshots, plus warnings. Guardrails: - The build matches what the host publishes, byte for byte.
Harness Page check Follows every link on the site and checks each page works.
- Inputs
- The working copy or the live site.
- Steps
- Start at the homepage and follow every internal link.
- On each page, check the right page shows, every image loads and no script errors.
- Check the link preview tags are present and point at the page's own address.
- Check every in-page link has a target, old addresses redirect, and missing pages show the not-found page.
- Fail on any banned character.
- Outputs
- A pass or fail line for every page and link.
- Guardrails
- Read-only.
- In this project
- tools/check-views.js in the site's repo (Node, Playwright).
# Page check Type: Harness Purpose: Follows every link on the site and checks each page works. When: Before any structural change ships, and inside the live health check. Inputs: The working copy or the live site. Steps: 1. Start at the homepage and follow every internal link. 2. On each page, check the right page shows, every image loads and no script errors. 3. Check the link preview tags are present and point at the page's own address. 4. Check every in-page link has a target, old addresses redirect, and missing pages show the not-found page. 5. Fail on any banned character. Outputs: A pass or fail line for every page and link. Guardrails: - Read-only.
Harness Live health check Proves the live site is up, safe and exactly what was approved.
- Inputs
- The live site and the approved code.
- Steps
- Check the domain, the www redirect and HTTPS.
- Check the link preview tags and image.
- Check private project files are not public.
- Rebuild the approved code and compare every published file with the live site, byte for byte.
- Check the domain file is intact, and that the site is still in step with its design system.
- Run the page check.
- Outputs
- Pass, fail and warning lines, with a summary.
- Guardrails
- Read-only. A difference is reported, never fixed silently.
- In this project
- tools/health.sh in the site's repo (Bash, curl, Jekyll).
# Live health check Type: Harness Purpose: Proves the live site is up, safe and exactly what was approved. When: After every publish. Inputs: The live site and the approved code. Steps: 1. Check the domain, the www redirect and HTTPS. 2. Check the link preview tags and image. 3. Check private project files are not public. 4. Rebuild the approved code and compare every published file with the live site, byte for byte. 5. Check the domain file is intact, and that the site is still in step with its design system. 6. Run the page check. Outputs: Pass, fail and warning lines, with a summary. Guardrails: - Read-only. A difference is reported, never fixed silently.
Harness Before-and-after proof Proves a change didn't move a single pixel it wasn't meant to.
- Inputs
- The live version and the draft.
- Steps
- Build both versions.
- Screenshot every page of each, full length, at phone and desktop size.
- Compare them pixel by pixel.
- Save a red difference image for anything that changed.
- Outputs
- Same or different for every page, with difference images.
- Guardrails
- The result is quoted on the review page.
- In this project
- tools/compare.js in the site's repo (Node, Playwright, pixelmatch).
- Works with
- Change copy or layoutHuman-gated change
# Before-and-after proof Type: Harness Purpose: Proves a change didn't move a single pixel it wasn't meant to. When: Any change meant to leave the look unchanged, such as a restructure. Inputs: The live version and the draft. Steps: 1. Build both versions. 2. Screenshot every page of each, full length, at phone and desktop size. 3. Compare them pixel by pixel. 4. Save a red difference image for anything that changed. Outputs: Same or different for every page, with difference images. Guardrails: - The result is quoted on the review page.
Harness Drift check Says when the design system and the site it describes part ways, from either side.
- Inputs
- The site's stylesheet, the design system's published tokens, and the site's artwork files.
- Steps
- Read what the other side publishes: the site's live stylesheet, or the design system's tokens file.
- Compare every colour, card art and layout token on both sides.
- Report Drift for any token that differs or exists on only one side.
- Report Info for colours used but not yet tokens.
- Say what to do: ask the owner which side is right, then update the other side through its own review page.
- Outputs
- Drift and Info lines, in step or not, and the next step.
- Guardrails
- Drift blocks publishing until the owner decides which side is right.
- Info is a to-do list, not a blocker.
- Each side changes only its own repo.
- In this project
- tools/drift.js in both repos. The design system's reads the site's live stylesheet and runs in its tools/preview.js. The site's reads the design system's tokens.json and runs in its tools/health.sh.
- Works with
- Site-to-system syncPlayground
# Drift check Type: Harness Purpose: Says when the design system and the site it describes part ways, from either side. When: At the end of every design system preview, after every site publish, and on any change before it merges. Inputs: The site's stylesheet, the design system's published tokens, and the site's artwork files. Steps: 1. Read what the other side publishes: the site's live stylesheet, or the design system's tokens file. 2. Compare every colour, card art and layout token on both sides. 3. Report Drift for any token that differs or exists on only one side. 4. Report Info for colours used but not yet tokens. 5. Say what to do: ask the owner which side is right, then update the other side through its own review page. Outputs: Drift and Info lines, in step or not, and the next step. Guardrails: - Drift blocks publishing until the owner decides which side is right. - Info is a to-do list, not a blocker. - Each side changes only its own repo.
Harness Playground A live, hands-on harness for the design system's theming.
- Inputs
- Accent and partner colours, light or dark, roundness and glass blur.
- Steps
- Show every component, rendered by the kit alone, in a frame.
- Send each setting to the frame as it changes.
- Write out the chosen settings, ready to paste into another page.
- Outputs
- A themed preview and a copyable theme.
- Guardrails
- Changes nothing outside the frame.
- In this project
- The design system's Playground page (playground.html, assets/docs.js and demo.html). Settings carry over to the Use it anywhere page as code.
- Works with
- Drift checkOne-line plug-in
# Playground Type: Harness Purpose: A live, hands-on harness for the design system's theming. When: Whenever someone wants to see what the system can do, or test a theme. Inputs: Accent and partner colours, light or dark, roundness and glass blur. Steps: 1. Show every component, rendered by the kit alone, in a frame. 2. Send each setting to the frame as it changes. 3. Write out the chosen settings, ready to paste into another page. Outputs: A themed preview and a copyable theme. Guardrails: - Changes nothing outside the frame.
Hook End-of-turn save check Stops an agent finishing with work left unsaved.
- Inputs
- The agent's working copy.
- Steps
- Look for changes not yet saved, or saved but not yet sent to the shared repo.
- If any are found, tell the agent to send them before finishing.
- Outputs
- Nothing when all is saved. A prompt to push when it isn't.
- Guardrails
- It steps aside if it has already prompted once, so it can't loop.
- In this project
- A Stop hook set by the cloud environment these agent-driven sessions run in, not by either repo.
- Works with
- Human-gated change
# End-of-turn save check Type: Hook Purpose: Stops an agent finishing with work left unsaved. When: Every time an agent is about to end its turn. Inputs: The agent's working copy. Steps: 1. Look for changes not yet saved, or saved but not yet sent to the shared repo. 2. If any are found, tell the agent to send them before finishing. Outputs: Nothing when all is saved. A prompt to push when it isn't. Guardrails: - It steps aside if it has already prompted once, so it can't loop.
Hook Agent launch gate Holds every agent run until the owner approves it.
- Inputs
- The agent that is about to run, and what it was asked to do.
- Steps
- Stop before the agent starts.
- Show the owner which agent is about to run.
- Start it only if the owner approves. Otherwise nothing runs.
- Outputs
- An agent run the owner chose, or no run at all.
- Guardrails
- Agents never start by themselves, on a schedule, or because another agent suggested it.
- Suggesting a run is fine. Starting one is the owner's call.
- In this project
- An ask rule for Agent(navigator) in .claude/settings.json of the site's repo, plus the working agreement in both repos' CLAUDE.md. Claude Code's bypass permissions mode skips all prompts, so there the written rule still applies.
- Works with
- Navigation sweepHuman-gated change
# Agent launch gate Type: Hook Purpose: Holds every agent run until the owner approves it. When: Any time an agent is about to start. Inputs: The agent that is about to run, and what it was asked to do. Steps: 1. Stop before the agent starts. 2. Show the owner which agent is about to run. 3. Start it only if the owner approves. Otherwise nothing runs. Outputs: An agent run the owner chose, or no run at all. Guardrails: - Agents never start by themselves, on a schedule, or because another agent suggested it. - Suggesting a run is fine. Starting one is the owner's call.
Hook One-line plug-in The point where any page hooks into the design system.
- Inputs
- Any page that takes HTML.
- Steps
- Add one stylesheet line for the look.
- Optionally add one script line for interactive controls.
- Optionally paste a theme from the playground.
- Outputs
- The page picks up the tokens and components, and follows future non-breaking updates.
- Guardrails
- Use the versioned address, so a breaking change never arrives unannounced.
- In this project
- gianlucacaico.com/design-system/v1/gc.css and v1/gc.js.
- Works with
- PlaygroundControl change event
# One-line plug-in Type: Hook Purpose: The point where any page hooks into the design system. When: A new page or prototype needs the look. Inputs: Any page that takes HTML. Steps: 1. Add one stylesheet line for the look. 2. Optionally add one script line for interactive controls. 3. Optionally paste a theme from the playground. Outputs: The page picks up the tokens and components, and follows future non-breaking updates. Guardrails: - Use the versioned address, so a breaking change never arrives unannounced.
Hook Control change event Lets any page react when someone picks an option.
- Inputs
- A segmented control on a page using the kit's script.
- Steps
- Press the chosen option and slide the glass highlight under it.
- Announce the choice as an event any script on the page can listen for.
- Outputs
- A gc:change event carrying the chosen value.
- Guardrails
- Only fires on a person's choice.
- In this project
- gc.js in the design system's kit. The playground's Light and Dark switch listens for it.
- Works with
- One-line plug-inPlayground
# Control change event Type: Hook Purpose: Lets any page react when someone picks an option. When: Someone taps an option in a segmented control. Inputs: A segmented control on a page using the kit's script. Steps: 1. Press the chosen option and slide the glass highlight under it. 2. Announce the choice as an event any script on the page can listen for. Outputs: A gc:change event carrying the chosen value. Guardrails: - Only fires on a person's choice.
Workflow Human-gated change Every change to either site, from request to verified live.
- Inputs
- A request in plain English.
- Steps
- Draft it with a skill, on its own branch.
- Prove it with harnesses: previews, the page check, and the before-and-after proof where the look shouldn't change.
- Open a review page with the wording side by side.
- Wait for a person to approve that exact change.
- Publish it, then run the live health check.
- Outputs
- One reviewed, verified change that can be undone in one step.
- Guardrails
- Approval for one change never carries over to the next.
- One change per review page.
- In this project
- Every change to gianlucacaico.com and this design system since November 2026.
# Human-gated change Type: Workflow Purpose: Every change to either site, from request to verified live. When: Any change, big or small. Inputs: A request in plain English. Steps: 1. Draft it with a skill, on its own branch. 2. Prove it with harnesses: previews, the page check, and the before-and-after proof where the look shouldn't change. 3. Open a review page with the wording side by side. 4. Wait for a person to approve that exact change. 5. Publish it, then run the live health check. Outputs: One reviewed, verified change that can be undone in one step. Guardrails: - Approval for one change never carries over to the next. - One change per review page.
Workflow Site-to-system sync Keeps the design system following the site, before changes ship.
- Inputs
- The site's open review page.
- Steps
- Run the drift check on the site's change before it merges. Either side can run it.
- Pass any findings to the session that owns the site change.
- That session fixes them, shows the person, and publishes once approved.
- The design system takes the final values and rules, and publishes once approved.
- After each publish, the drift check runs again from that side to confirm everything is in step.
- Outputs
- Both sites in step, each with its own approved change.
- Guardrails
- Each session changes only its own repo.
- In this project
- The site's artwork (gianlucacaico.github.io#10) and the design system's Imagery rules (design-system#4), November 2026.
# Site-to-system sync Type: Workflow Purpose: Keeps the design system following the site, before changes ship. When: A change to the site touches colour, components or artwork. Inputs: The site's open review page. Steps: 1. Run the drift check on the site's change before it merges. Either side can run it. 2. Pass any findings to the session that owns the site change. 3. That session fixes them, shows the person, and publishes once approved. 4. The design system takes the final values and rules, and publishes once approved. 5. After each publish, the drift check runs again from that side to confirm everything is in step. Outputs: Both sites in step, each with its own approved change. Guardrails: - Each session changes only its own repo.
Workflow Parallel agent sessions Two agents on two repos, coordinating without stepping on each other.
- Inputs
- One agent session per repo, each with its own task.
- Steps
- Give each session one repo and one change at a time.
- Pass decisions and findings between sessions as messages.
- Have the receiving session treat a message as information to act on through its own review page.
- Have each session publish only with the person's approval.
- Outputs
- Coordinated changes across repos, each reviewed on its own.
- Guardrails
- A message from another session is never an approval.
- No session writes to a repo it doesn't own.
- In this project
- The design system session and the site artwork session, November 2026.
- Works with
- Site-to-system syncHuman-gated change
# Parallel agent sessions Type: Workflow Purpose: Two agents on two repos, coordinating without stepping on each other. When: Work spans more than one repo, or runs at the same time. Inputs: One agent session per repo, each with its own task. Steps: 1. Give each session one repo and one change at a time. 2. Pass decisions and findings between sessions as messages. 3. Have the receiving session treat a message as information to act on through its own review page. 4. Have each session publish only with the person's approval. Outputs: Coordinated changes across repos, each reviewed on its own. Guardrails: - A message from another session is never an approval. - No session writes to a repo it doesn't own.