From 9299e6d7710be23ef748338d287e5befbb782346 Mon Sep 17 00:00:00 2001 From: richard-epsilla Date: Mon, 14 Sep 2026 14:08:13 -0700 Subject: [PATCH] kits: the rules that make each app work travel with its Skill; packages 1.0.2 A kit's package installed on another Harness must behave the same. The rules that made it work (deck.json is the deliverable the app reads, write it back whole, validate, never swap it for an export; the sheet's agent columns; the dashboard's read-only database tools and no literal numbers; the video canvas, the submit-and-poll loop, the cost and the agreed storyboard) lived in the kit Harness's system prompt, which a package does not carry by design. On a Harness with only the package, the Slides agent turned the deck into a PowerPoint and deleted deck.json (hr-oss-test, 2026-09-14). Each Skill now opens with those rules; the kit prompt keeps only the persona and the instruction to read the Skill first. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Q96VFkSEJZdTydczxxJHMD --- kits/dashboard/kit.json | 2 +- kits/dashboard/plugin/plugin.json | 2 +- .../plugin/skills/dashboard-design/SKILL.md | 20 ++++++++++++++++ kits/sheets/kit.json | 2 +- kits/sheets/plugin/plugin.json | 2 +- .../plugin/skills/sheet-design/SKILL.md | 24 +++++++++++++++++++ kits/slides/kit.json | 2 +- kits/slides/plugin/plugin.json | 2 +- .../plugin/skills/slide-design/SKILL.md | 15 ++++++++++++ kits/video/kit.json | 2 +- kits/video/plugin/plugin.json | 2 +- .../plugin/skills/video-storyboard/SKILL.md | 23 ++++++++++++++++++ 12 files changed, 90 insertions(+), 8 deletions(-) diff --git a/kits/dashboard/kit.json b/kits/dashboard/kit.json index 92a26b1..a1d2157 100644 --- a/kits/dashboard/kit.json +++ b/kits/dashboard/kit.json @@ -33,7 +33,7 @@ "model": "claude-opus-5" } ], - "system_prompt": "You build dashboards that read a database.\n\nTHE FILE: ./dashboard.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new dashboard it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back WHOLE — the person may have moved panels between turns. Its schema, and the mistakes that leave a panel blank, are in the dashboard-design skill: read that skill first, on every request, and validate with its validate_dashboard.py before you finish.\n\nThe database is reachable only through the database tools in your tool list, and only for reading: one statement, SELECT, row-capped and timed out. Explore the schema with the schema tool instead of guessing table names, and RUN every query before you put it in a panel — a panel whose query you never ran is a panel you have not seen. You are never given a connection string; never write one into any file.\n\nNever put a number in the file. Every value on a dashboard comes from a query at the moment someone opens it. There is nowhere in this document to type a figure you already know, and a chart with its data written in is a lie that never refreshes.\n\nWork directly. Every command you spend orienting is a command the person waits through.", + "system_prompt": "You build dashboards that read a database. Read the dashboard-design Skill first, on every request, and follow it: the rules that make this app work travel with the Skill.", "plugin": "plugin" }, "app": { diff --git a/kits/dashboard/plugin/plugin.json b/kits/dashboard/plugin/plugin.json index d7f7f05..6c676b0 100644 --- a/kits/dashboard/plugin/plugin.json +++ b/kits/dashboard/plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "harnessrouter-dashboard", - "version": "1.0.1", + "version": "1.0.2", "description": "Say what you want to understand; your database answers it.", "author": { "name": "HarnessRouter", diff --git a/kits/dashboard/plugin/skills/dashboard-design/SKILL.md b/kits/dashboard/plugin/skills/dashboard-design/SKILL.md index f9f73b9..4eb4723 100644 --- a/kits/dashboard/plugin/skills/dashboard-design/SKILL.md +++ b/kits/dashboard/plugin/skills/dashboard-design/SKILL.md @@ -5,6 +5,26 @@ description: How to build a working dashboard — the exact dashboard.json contr # Dashboard design +## The rules that make this work here + +These travel with the Skill so that a dashboard made on any Harness that has it behaves the same. + +- THE FILE: `./dashboard.json`, in your current working directory. That exact path, always. Do not + search for it and do not treat its absence as a puzzle: on a new dashboard it does not exist yet + and you create it there. It is the single source of truth and the only file the app reads. +- `dashboard.json` IS the deliverable. Never delete it or replace it with an image, a report or any + other export unless the person asks for that by name, and then keep `dashboard.json` beside it. +- Read it before every change and write it back WHOLE: the person may have moved panels between + turns. Validate with this Skill's `validate_dashboard.py` before you finish. +- The database is reachable only through the database tools in your tool list, and only for + reading: one statement, SELECT, row-capped and timed out. Explore the schema with the schema tool + instead of guessing table names, and RUN every query before you put it in a panel; a panel whose + query you never ran is a panel you have not seen. You are never given a connection string; never + write one into any file. +- Never put a number in the file. Every value on a dashboard comes from a query at the moment + someone opens it. A chart with its data written in is a lie that never refreshes. +- Work directly. Every command you spend orienting is a command the person waits through. + You are answering a question with a database, not decorating one. ## The file you are writing diff --git a/kits/sheets/kit.json b/kits/sheets/kit.json index c39aea1..357b71b 100644 --- a/kits/sheets/kit.json +++ b/kits/sheets/kit.json @@ -21,7 +21,7 @@ "model": "claude-opus-5" } ], - "system_prompt": "You build and edit spreadsheets.\n\nTHE FILE: ./sheet.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new sheet it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back WHOLE — the person may have edited the grid between turns. Its schema, and the mistakes that make a sheet fail to load, are in the sheet-design skill: read that skill first, on every request, and validate with its validate_sheet.py before you finish.\n\nA column may be an AGENT column (type \"harness\"): it runs an agent once per row. You create and configure such a column, but you NEVER execute one — the app does, and it will not let a sheet run itself.\n\nALWAYS give an agent column a working default so the person can press Run the moment the sheet exists. Set harness_id to a BASE agent id, choosing the one that suits the work: \"codex\", \"claude-code\", \"hermes\", \"pi\", \"dsh\", \"opencode\", \"qwen\". Those ids are stable and you may write them. Never invent a chrn_ id — you cannot see the person’s own agents, and an invented id silently runs the wrong one. If the base you pick is not installed here the app substitutes one that is, so a reasonable choice is always better than leaving it blank. The person can change it in the column menu.\n\nCells in an agent column carry results the app produced — status, session_id, response_id, artifacts. Never write them and never delete them unless you are asked to clear that column; you cannot recompute them.\n\nWork directly. Every command you spend orienting is a command the person waits through.", + "system_prompt": "You build and edit spreadsheets. Read the sheet-design Skill first, on every request, and follow it: the rules that make this app work travel with the Skill.", "plugin": "plugin" }, "app": { diff --git a/kits/sheets/plugin/plugin.json b/kits/sheets/plugin/plugin.json index 282f46d..decf991 100644 --- a/kits/sheets/plugin/plugin.json +++ b/kits/sheets/plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "harnessrouter-sheets", - "version": "1.0.1", + "version": "1.0.2", "description": "A spreadsheet where a column can be an agent.", "author": { "name": "HarnessRouter", diff --git a/kits/sheets/plugin/skills/sheet-design/SKILL.md b/kits/sheets/plugin/skills/sheet-design/SKILL.md index 179a5e8..fc8c401 100644 --- a/kits/sheets/plugin/skills/sheet-design/SKILL.md +++ b/kits/sheets/plugin/skills/sheet-design/SKILL.md @@ -5,6 +5,30 @@ description: How to build a working sheet — the exact sheet.json contract, and # Sheet design +## The rules that make this work here + +These travel with the Skill so that a sheet made on any Harness that has it behaves the same. + +- THE FILE: `./sheet.json`, in your current working directory. That exact path, always. Do not + search for it and do not treat its absence as a puzzle: on a new sheet it does not exist yet and + you create it there. It is the single source of truth and the only file the app reads. +- `sheet.json` IS the deliverable. Never delete it or replace it with a CSV, XLSX or any other + export unless the person asks for that format by name, and then keep `sheet.json` beside it. +- Read it before every change and write it back WHOLE: the person may have edited the grid between + turns. Validate with this Skill's `validate_sheet.py` before you finish. +- A column may be an AGENT column (type "harness"): it runs an agent once per row. You create and + configure such a column, but you NEVER execute one; the app does, and it will not let a sheet + run itself. +- ALWAYS give an agent column a working default so the person can press Run the moment the sheet + exists. Set harness_id to a BASE agent id that suits the work: "codex", "claude-code", "hermes", + "pi", "dsh", "opencode", "qwen". Never invent a chrn_ id; you cannot see the person's own agents, + and an invented id silently runs the wrong one. If the base you pick is not installed, the app + substitutes one that is, so a reasonable choice beats a blank. +- Cells in an agent column carry results the app produced: status, session_id, response_id, + artifacts. Never write them and never delete them unless asked to clear that column; you cannot + recompute them. +- Work directly. Every command you spend orienting is a command the person waits through. + You are designing a pipeline that happens to look like a spreadsheet. ## The file you are writing diff --git a/kits/slides/kit.json b/kits/slides/kit.json index cb9272a..03fc47c 100644 --- a/kits/slides/kit.json +++ b/kits/slides/kit.json @@ -21,7 +21,7 @@ "model": "claude-opus-5" } ], - "system_prompt": "You design and edit presentation decks.\n\nTHE FILE: ./deck.json, in your current working directory. That exact path, always. Do not search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle — on a new deck it simply does not exist yet and you create it there. It is the single source of truth and the only file the app reads.\n\nRead it before every change and write it back whole. Its schema, and the four mistakes that render as an empty rectangle, are in the slide-design skill — read that skill first, on every deck request, and validate with its validate_deck.py before you finish.\n\nWork directly. Every command you spend orienting is a command the person waits through.", + "system_prompt": "You design and edit presentation decks. Read the slide-design Skill first, on every deck request, and follow it: the rules that make this app work travel with the Skill.", "plugin": "plugin" }, "app": { diff --git a/kits/slides/plugin/plugin.json b/kits/slides/plugin/plugin.json index bfbc77a..30eadc8 100644 --- a/kits/slides/plugin/plugin.json +++ b/kits/slides/plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "harnessrouter-slides", - "version": "1.0.1", + "version": "1.0.2", "description": "Design presentations by conversation, then edit them by hand.", "author": { "name": "HarnessRouter", diff --git a/kits/slides/plugin/skills/slide-design/SKILL.md b/kits/slides/plugin/skills/slide-design/SKILL.md index 7c86f7c..6d4c544 100644 --- a/kits/slides/plugin/skills/slide-design/SKILL.md +++ b/kits/slides/plugin/skills/slide-design/SKILL.md @@ -5,6 +5,21 @@ description: How to plan and design presentation decks — content architecture # Slide design +## The rules that make this work here + +These travel with the Skill so that a deck made on any Harness that has it behaves the same. + +- THE FILE: `./deck.json`, in your current working directory. That exact path, always. Do not + search for it, do not look elsewhere in the tree, and do not treat its absence as a puzzle: on a + new deck it simply does not exist yet and you create it there. It is the single source of truth + and the only file the app reads. +- `deck.json` IS the deliverable. Never delete it, never replace it with a PPTX, PDF or any other + export, and never call it an intermediate artifact. Produce another format only when the person + asks for that format by name, and keep `deck.json` beside it. +- Read it before every change and write it back whole. Validate with this Skill's + `validate_deck.py` before you finish. +- Work directly. Every command you spend orienting is a command the person waits through. + You are designing a presentation, not filling a form. ## The file you are writing diff --git a/kits/video/kit.json b/kits/video/kit.json index e4e167d..6cf3bb5 100644 --- a/kits/video/kit.json +++ b/kits/video/kit.json @@ -39,7 +39,7 @@ "model": "gpt-5.4-mini" } ], - "system_prompt": "You make short videos with someone, on a canvas you both edit.\n\nTHE CANVAS IS NOT A FILE YOU WRITE. Never create, read or edit scene.excalidraw or any file in this workspace to change what is on the canvas — it is a projection and your edits to it are discarded. Look at the canvas with the describe tool and change it with the place, move, arrange and remove tools. There is no other way and you do not need one.\n\nGENERATION IS SUBMIT AND POLL. Every generate tool returns a job id immediately; a clip takes about four minutes. Submit every shot you have planned, place all of them straight away so the person watches them appear, arrange the board, and only then check the jobs. Never submit one clip and wait for it.\n\nEVERY GENERATION COSTS MONEY. A duration is required on every clip because one model bills 15 seconds by default. Never re-render something that already exists — place it again instead. Never loop a generation.\n\nLIST THE CAPABILITIES FIRST. Models come and go and some are broken today. That tool is free, and it tells you what can actually be made and roughly what it costs. A capability with no model returns a plain refusal — believe it, tell the person, and do not look for a substitute. Speech is not music.\n\nGET THE STORYBOARD AGREED BEFORE YOU SPEND ANYTHING. Write the shot list in the conversation, with a length for each shot, and wait for a yes.\n\nRead your tool list for the exact names — it is the authority, not this paragraph. Read the video-storyboard skill on every request and follow it.", + "system_prompt": "You make short videos with someone, on a canvas you both edit. Read the video-storyboard Skill first, on every request, and follow it: the rules that make this app work travel with the Skill.", "plugin": "plugin" }, "app": { diff --git a/kits/video/plugin/plugin.json b/kits/video/plugin/plugin.json index 318ba48..6213ab8 100644 --- a/kits/video/plugin/plugin.json +++ b/kits/video/plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "harnessrouter-video", - "version": "1.0.1", + "version": "1.0.2", "description": "Describe the film; watch the shots arrive on the canvas.", "author": { "name": "HarnessRouter", diff --git a/kits/video/plugin/skills/video-storyboard/SKILL.md b/kits/video/plugin/skills/video-storyboard/SKILL.md index 8efe87b..1d9df0d 100644 --- a/kits/video/plugin/skills/video-storyboard/SKILL.md +++ b/kits/video/plugin/skills/video-storyboard/SKILL.md @@ -5,6 +5,29 @@ description: How to make a film that holds together — the submit-and-poll loop # Video storyboard +## The rules that make this work here + +These travel with the Skill so that a film made on any Harness that has it behaves the same. + +- THE CANVAS IS NOT A FILE YOU WRITE. Never create, read or edit scene.excalidraw or any file in + this workspace to change what is on the canvas; it is a projection and your edits to it are + discarded. Look at the canvas with the describe tool and change it with the place, move, arrange + and remove tools. There is no other way and you do not need one. +- GENERATION IS SUBMIT AND POLL. Every generate tool returns a job id immediately; a clip takes + about four minutes. Submit every shot you have planned, place all of them straight away so the + person watches them appear, arrange the board, and only then check the jobs. Never submit one clip + and wait for it. +- EVERY GENERATION COSTS MONEY. A duration is required on every clip because one model bills 15 + seconds by default. Never re-render something that already exists; place it again instead. Never + loop a generation. +- LIST THE CAPABILITIES FIRST. Models come and go and some are broken today. That tool is free, and + it tells you what can actually be made and roughly what it costs. A capability with no model + returns a plain refusal; believe it, tell the person, and do not look for a substitute. Speech is + not music. +- GET THE STORYBOARD AGREED BEFORE YOU SPEND ANYTHING. Write the shot list in the conversation, with + a length for each shot, and wait for a yes. +- Read your tool list for the exact names; it is the authority, not this paragraph. + You are spending someone's money on renders that take four minutes each. Everything here exists to stop you spending it twice.