skilldrop-cli 1.1.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +1 -1
  2. package/catalogue.json +7 -8
  3. package/model-routing.json +0 -16
  4. package/package.json +1 -1
  5. package/packs/ai-engineering/loops/adopt/LOOP.md +120 -0
  6. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +10 -0
  7. package/packs/ai-engineering/loops/adopt/evals/evals.json +69 -0
  8. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +15 -0
  9. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +27 -0
  10. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +11 -0
  11. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +13 -0
  12. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +23 -0
  13. package/packs/ai-engineering/loops/adopt/loop.json +53 -0
  14. package/packs/ai-engineering/loops/ship-agent/LOOP.md +128 -0
  15. package/packs/ai-engineering/loops/ship-agent/evals/eval_queries.json +10 -0
  16. package/packs/ai-engineering/loops/ship-agent/evals/evals.json +70 -0
  17. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-auto-reply-exfil-open/agent-brief.md +33 -0
  18. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/agent-brief.md +33 -0
  19. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/claude-settings.json +25 -0
  20. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/sample-merged-prs.md +30 -0
  21. package/packs/ai-engineering/loops/ship-agent/loop.json +53 -0
  22. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +1 -1
  23. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +2 -2
  24. package/packs/converters/pack.json +3 -14
  25. package/packs/converters/skills/file-to-markdown/SKILL.md +28 -11
  26. package/packs/converters/skills/file-to-markdown/evals/evals.json +30 -0
  27. package/packs/converters/skills/file-to-markdown/evals/files/5/supplier_agreement_v3.docx +0 -0
  28. package/packs/converters/skills/file-to-markdown/evals/files/6/numbers.xlsx +0 -0
  29. package/packs/converters/skills/file-to-markdown/evals/files/6/offsite_q3.pptx +0 -0
  30. package/packs/converters/skills/file-to-markdown/examples/inputs/acme-brief.docx +0 -0
  31. package/packs/converters/skills/file-to-markdown/examples/inputs/northwind-roadmap.pptx +0 -0
  32. package/packs/converters/skills/file-to-markdown/examples/mixed-inputs.md +24 -16
  33. package/packs/converters/skills/file-to-markdown/manifest.json +2 -3
  34. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +103 -10
  35. package/packs/converters/skills/md-to-confluence/SKILL.md +2 -2
  36. package/packs/converters/skills/md-to-confluence/manifest.json +2 -9
  37. package/packs/converters/skills/md-to-docx/SKILL.md +3 -4
  38. package/packs/converters/skills/md-to-docx/evals/evals.json +1 -1
  39. package/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +1 -1
  40. package/packs/converters/skills/md-to-docx/manifest.json +4 -11
  41. package/packs/converters/skills/md-to-docx/reference.md +1 -1
  42. package/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +1 -1
  43. package/packs/converters/skills/md-to-pptx/SKILL.md +3 -5
  44. package/packs/converters/skills/md-to-pptx/manifest.json +3 -16
  45. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1 -1
  46. package/packs/converters/skills/md-to-xlsx/SKILL.md +1 -1
  47. package/packs/converters/skills/md-to-xlsx/manifest.json +2 -2
  48. package/packs/core/skills/brief-intake/SKILL.md +2 -2
  49. package/packs/core/skills/brief-intake/manifest.json +2 -2
  50. package/packs/core/skills/brief-intake/templates/brief-deck.md +3 -3
  51. package/packs/core/skills/doc-critique/rubrics/deck.md +1 -1
  52. package/packs/design/pack.json +11 -21
  53. package/packs/design/skills/brand-kit/SKILL.md +6 -8
  54. package/packs/design/skills/brand-kit/manifest.json +3 -17
  55. package/packs/design/skills/brand-kit/templates/brand.json +1 -1
  56. package/packs/experience-design/loops/clarify/LOOP.md +114 -0
  57. package/packs/experience-design/loops/clarify/evals/eval_queries.json +10 -0
  58. package/packs/experience-design/loops/clarify/evals/evals.json +68 -0
  59. package/packs/experience-design/loops/clarify/evals/files/clarify-garden-waste-no-complaint-data/form-fields.csv +12 -0
  60. package/packs/experience-design/loops/clarify/evals/files/clarify-garden-waste-no-complaint-data/garden-waste-page.md +29 -0
  61. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/backoffice-notes.md +14 -0
  62. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/calls-q3.csv +8 -0
  63. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/form-fields.csv +12 -0
  64. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/permit-page.md +27 -0
  65. package/packs/experience-design/loops/clarify/loop.json +35 -0
  66. package/packs/infra-as-code/loops/provision/LOOP.md +128 -0
  67. package/packs/infra-as-code/loops/provision/evals/eval_queries.json +9 -0
  68. package/packs/infra-as-code/loops/provision/evals/evals.json +67 -0
  69. package/packs/infra-as-code/loops/provision/evals/files/provision-rds-no-plan-yet/.terraform.lock.hcl.fixture +24 -0
  70. package/packs/infra-as-code/loops/provision/evals/files/provision-rds-no-plan-yet/network.md +36 -0
  71. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/main.tf +74 -0
  72. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/plan.json +901 -0
  73. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/variables.tf +47 -0
  74. package/packs/infra-as-code/loops/provision/loop.json +41 -0
  75. package/packs/solution-architect/skills/interactive-diagram/SKILL.md +1 -1
  76. package/packs/solution-architect/skills/interactive-diagram/manifest.json +1 -2
  77. package/packs/stakeholder-comms/skills/audience-profile/SKILL.md +3 -3
  78. package/packs/stakeholder-comms/skills/audience-profile/manifest.json +2 -2
  79. package/packs/stakeholder-comms/skills/audience-profile/reference.md +1 -1
  80. package/packs/converters/skills/md-to-html/SKILL.md +0 -108
  81. package/packs/converters/skills/md-to-html/evals/eval_queries.json +0 -34
  82. package/packs/converters/skills/md-to-html/evals/evals.json +0 -44
  83. package/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +0 -80
  84. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
  85. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
  86. package/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
  87. package/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +0 -35
  88. package/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
  89. package/packs/converters/skills/md-to-html/evals/files/2/brand.json +0 -13
  90. package/packs/converters/skills/md-to-html/evals/files/2/img/kick-net.png +0 -0
  91. package/packs/converters/skills/md-to-html/evals/files/2/river-survey-guide.md +0 -53
  92. package/packs/converters/skills/md-to-html/evals/files/3/nanas-lentil-soup.md +0 -21
  93. package/packs/converters/skills/md-to-html/evals/files/3/pot.png +0 -0
  94. package/packs/converters/skills/md-to-html/examples/inputs/chart.svg +0 -8
  95. package/packs/converters/skills/md-to-html/examples/inputs/ops-review.md +0 -48
  96. package/packs/converters/skills/md-to-html/examples/ops-review.md +0 -83
  97. package/packs/converters/skills/md-to-html/manifest.json +0 -43
  98. package/packs/converters/skills/md-to-html/reference.md +0 -70
  99. package/packs/converters/skills/md-to-html/scripts/md_to_html.py +0 -662
  100. package/packs/converters/skills/mermaid-render/SKILL.md +0 -117
  101. package/packs/converters/skills/mermaid-render/evals/eval_queries.json +0 -30
  102. package/packs/converters/skills/mermaid-render/evals/evals.json +0 -43
  103. package/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +0 -23
  104. package/packs/converters/skills/mermaid-render/evals/files/2/dispensing-diagrams.md +0 -39
  105. package/packs/converters/skills/mermaid-render/examples/broken-diagrams.md +0 -147
  106. package/packs/converters/skills/mermaid-render/examples/inputs/broken-flowchart.mmd +0 -8
  107. package/packs/converters/skills/mermaid-render/examples/inputs/broken-sequence.mmd +0 -11
  108. package/packs/converters/skills/mermaid-render/examples/inputs/checkout-flow.mmd +0 -9
  109. package/packs/converters/skills/mermaid-render/examples/inputs/design-notes.md +0 -35
  110. package/packs/converters/skills/mermaid-render/examples/inputs/fixed-flowchart.mmd +0 -9
  111. package/packs/converters/skills/mermaid-render/examples/inputs/typo.mmd +0 -2
  112. package/packs/converters/skills/mermaid-render/manifest.json +0 -50
  113. package/packs/converters/skills/mermaid-render/reference.md +0 -70
  114. package/packs/converters/skills/mermaid-render/scripts/render_mermaid.py +0 -487
  115. package/packs/design/skills/deck-builder/SKILL.md +0 -209
  116. package/packs/design/skills/deck-builder/evals/eval_queries.json +0 -14
  117. package/packs/design/skills/deck-builder/evals/evals.json +0 -67
  118. package/packs/design/skills/deck-builder/evals/files/4/ashby-vale-board-notes.md +0 -36
  119. package/packs/design/skills/deck-builder/examples/exec-board-update.md +0 -108
  120. package/packs/design/skills/deck-builder/examples/templated-brand-deck.md +0 -148
  121. package/packs/design/skills/deck-builder/manifest.json +0 -18
  122. package/packs/design/skills/deck-builder/reference.md +0 -180
  123. package/packs/design/skills/deck-builder/requirements.txt +0 -3
  124. package/packs/design/skills/deck-builder/scripts/build_deck.py +0 -1144
  125. package/packs/design/skills/deck-builder/templates/deck-spec.json +0 -168
  126. package/packs/design/skills/deck-builder/templates/palettes.json +0 -59
  127. package/packs/design/skills/marketing-flyer/SKILL.md +0 -113
  128. package/packs/design/skills/marketing-flyer/evals/eval_queries.json +0 -30
  129. package/packs/design/skills/marketing-flyer/evals/evals.json +0 -45
  130. package/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +0 -80
  131. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
  132. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
  133. package/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
  134. package/packs/design/skills/marketing-flyer/evals/files/2/brand.json +0 -14
  135. package/packs/design/skills/marketing-flyer/evals/files/2/larchfield-logo.svg +0 -4
  136. package/packs/design/skills/marketing-flyer/evals/files/2/manager-email.txt +0 -6
  137. package/packs/design/skills/marketing-flyer/evals/files/2/open-day-brief.md +0 -15
  138. package/packs/design/skills/marketing-flyer/examples/community-health-fair.md +0 -68
  139. package/packs/design/skills/marketing-flyer/manifest.json +0 -40
  140. package/packs/design/skills/marketing-flyer/reference.md +0 -54
  141. package/packs/design/skills/marketing-flyer/scripts/build_flyer.py +0 -332
  142. package/packs/design/skills/marketing-flyer/templates/flyer-spec.json +0 -26
package/README.md CHANGED
@@ -80,7 +80,7 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
80
80
  ## How it works
81
81
 
82
82
  - **A skill produces one file you own.** Each ships a quality bar, named anti-patterns and acceptance evals, so the output is an artifact, not a conversation. See [every skill, by category](guides/reference/skill-catalogue.md).
83
- - **Loops order skills, and a gate decides when work moves on.** Five loops cover the lifecycle (`discover`, `design`, `build`, `release`, `operate`), plus the `ship-a-draft` wrapper for any document and `apply` for a job application. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the operating model](guides/explanation/operating-model.md) for every stage and gate on one page, [the loops, stage by stage](guides/reference/loops.md), and [why loops](guides/explanation/loops.md).
83
+ - **Loops order skills, and a gate decides when work moves on.** Five loops cover the lifecycle (`discover`, `design`, `build`, `release`, `operate`), plus the `ship-a-draft` wrapper for any document and loops for jobs beside it, such as `research`, `comply`, `adopt` for a team starting with AI, `ship-agent` for an AI agent and `provision` for a Terraform change. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the operating model](guides/explanation/operating-model.md) for every stage and gate on one page, [the loops, stage by stage](guides/reference/loops.md), and [why loops](guides/explanation/loops.md).
84
84
  - **Measured, not asserted.** `run_bench.py` runs each acceptance eval with the skill and without it, in a sandbox, and reports the lift, a blind preference from two judges, and the cost per run. The results are published whether or not they flatter the skills. See [how skills are checked](https://sananthanarayan.github.io/skilldrop/evals/) and [RFC-0040](docs/rfcs/0040-skill-benchmark.md).
85
85
  - **Copy, never transform.** A skill is a plain `SKILL.md` folder in the [Agent Skills](https://agentskills.io) format, at `packs/<pack>/skills/<name>/`. What runs in your agent is byte-identical to what is reviewed here. There is no runtime, and the tooling has zero dependencies.
86
86
  - **Updates keep your edits.** `npx skilldrop-cli update` replaces files you haven't touched. For any file you changed, it leaves the new version beside it as `<file>.upstream`. See [upgrade installed skills](guides/how-to/upgrade-skills.md).
package/catalogue.json CHANGED
@@ -109,7 +109,6 @@
109
109
  "skills": [
110
110
  "audience-profile",
111
111
  "slide-outliner",
112
- "deck-builder",
113
112
  "exec-summary",
114
113
  "decision-log",
115
114
  "guide-builder",
@@ -131,12 +130,10 @@
131
130
  ]
132
131
  },
133
132
  "create-on-brand-collateral": {
134
- "for": "Marketers · designers · anyone making a deck or flyer",
135
- "description": "Make collateral that looks like it came from your team: capture the brand once, then build decks and print-ready flyers with your logo, colours and fonts.",
133
+ "for": "Marketers · designers · anyone making a deck",
134
+ "description": "Make collateral that looks like it came from your team: capture the brand once, then build decks with your logo, colours and fonts.",
136
135
  "skills": [
137
136
  "brand-kit",
138
- "deck-builder",
139
- "marketing-flyer",
140
137
  "slide-outliner"
141
138
  ]
142
139
  },
@@ -149,9 +146,7 @@
149
146
  "output-hygiene",
150
147
  "file-to-markdown",
151
148
  "md-to-docx",
152
- "md-to-html",
153
149
  "md-to-xlsx",
154
- "mermaid-render",
155
150
  "md-to-pptx",
156
151
  "md-to-confluence"
157
152
  ]
@@ -218,6 +213,10 @@
218
213
  "tech-comparison-matrix": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did as well, and its weighted totals were wrong in 4 of 8 runs." },
219
214
  "db-schema-design": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it met as many checks (73% against 71%) and got types, time zones and constraints right unprompted." },
220
215
  "metric-definition": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did everything the skill teaches unprompted and won 13 of 16 blind verdicts." },
221
- "contribution-wizard": { "in": "0.16.13", "why": "It prescribed a skill layout this catalogue no longer uses and imposed it on other repos. To add a skill to skilldrop, follow AGENTS.md and run validate.py." }
216
+ "contribution-wizard": { "in": "0.16.13", "why": "It prescribed a skill layout this catalogue no longer uses and imposed it on other repos. To add a skill to skilldrop, follow AGENTS.md and run validate.py." },
217
+ "md-to-html": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it made the better page: the skill's script showed raw HTML as text and its security policy blocked embeds, and it adds no rule the agent breaks." },
218
+ "mermaid-render": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it fixed the same diagrams, ran the Mermaid CLI itself and said plainly what it had not rendered; the skill adds no rule it breaks." },
219
+ "marketing-flyer": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it built the whole flyer with placeholders where the skill stopped or used a generic template; it adds no rule the agent breaks." },
220
+ "deck-builder": { "in": "1.2.0", "why": "On its held-out evals the agent without it built the better deck in each of two trials; rebuilt rule-first, with its script able to run, it still lost on fresh evals (judges 2 and 1 of 4; 69% of checks against 81%).", "instead": "md-to-pptx" }
222
221
  }
223
222
  }
@@ -234,10 +234,6 @@
234
234
  "tier": "light",
235
235
  "rationale": "Extracts decisions/owners/dates from notes. Pattern extraction; escalate on long transcripts via large-input rule."
236
236
  },
237
- "deck-builder": {
238
- "tier": "standard",
239
- "rationale": "Shapes content, maps a brand template's layouts, and runs a script. Judgment, not hard reasoning."
240
- },
241
237
  "delivery-metrics-report": {
242
238
  "tier": "standard",
243
239
  "rationale": "A stdlib script computes every number; the model maps columns, checks data quality and interprets weekly trends against fixed DORA definitions, which is bounded judgment."
@@ -335,10 +331,6 @@
335
331
  "tier": "standard",
336
332
  "rationale": "Methodology synthesis against a fixed decision tree and pitfall catalog. Grading-method and metric choices need judgment but are bounded; escalate via ambiguous-input on novel task types."
337
333
  },
338
- "marketing-flyer": {
339
- "tier": "standard",
340
- "rationale": "Writes short copy to fit and fills a spec for a deterministic builder. Bounded generation."
341
- },
342
334
  "mcp-pairing": {
343
335
  "tier": "standard",
344
336
  "rationale": "Matching a loop's stages to the context each needs and the narrowest access that provides it is bounded judgment over a short checklist."
@@ -351,10 +343,6 @@
351
343
  "tier": "standard",
352
344
  "rationale": "A stdlib script does the conversion; the model restructures the Markdown so it converts cleanly (heading levels, footnotes, HTML), reads each warning and explains the losses. Bounded editing, no open-ended generation."
353
345
  },
354
- "md-to-html": {
355
- "tier": "light",
356
- "rationale": "A deterministic stdlib script does the conversion; the model picks options, fixes a few unsupported Markdown constructs and relays the script's warnings. Little judgment."
357
- },
358
346
  "md-to-pptx": {
359
347
  "tier": "light",
360
348
  "rationale": "Mechanical conversion done by its script; the model only checks the outline maps to slides and reports what was dropped."
@@ -363,10 +351,6 @@
363
351
  "tier": "standard",
364
352
  "rationale": "A stdlib script types and writes the cells; the model shapes tables from the source (headings, units, one header row), decides whether formulas are safe to enable, and checks the per-sheet type counts against the data. Bounded, mostly mechanical judgment."
365
353
  },
366
- "mermaid-render": {
367
- "tier": "standard",
368
- "rationale": "The script lints and renders deterministically, but fixing a broken diagram means reading the author's intent and rewriting syntax without changing nodes, edges or labels, and knowing when to ask instead."
369
- },
370
354
  "migration-plan": {
371
355
  "tier": "standard",
372
356
  "rationale": "Phased plan synthesis with a strong template. Ordering judgment is bounded by the expand/migrate/contract pattern; escalate via ambiguous-input on contested, high-stakes cutovers."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.1.3",
3
+ "version": "1.3.0",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: adopt
3
+ description: Take an organisation from a pile of AI ideas to a first rollout wave its sponsor approved: the use cases ranked with a first slice, readiness scored against that slice, a usage policy covering the data the slice touches, and a cohort rollout whose first wave is the slice's users, with a gate that sends the slice back when a blocking gap stands in its way. Use when the user says "help us start using AI", "roll out AI across the team", "run the adopt loop", or has AI ideas, no policy and no rollout plan.
4
+ ---
5
+
6
+ # adopt
7
+
8
+ One first slice, from a list of ideas to a wave of people using it. The four skills each work
9
+ alone; in order, each one narrows the next. Triage picks one use case, so readiness is scored
10
+ against what that use case needs instead of against the whole organisation. Readiness names the
11
+ gaps, so the policy covers the data the slice really touches. The rollout's pilot is the slice's
12
+ own users, and its adoption gate is the observable triage said would prove or kill the slice.
13
+
14
+ ## Stages
15
+
16
+ | # | Stage | Type | Skills | Gate |
17
+ |---|---|---|---|---|
18
+ | 1 | `triage` | generate | [`ai-use-case-triage`](../../skills/ai-use-case-triage/SKILL.md) | — |
19
+ | 2 | `readiness` | verify | [`ai-readiness-assessment`](../../skills/ai-readiness-assessment/SKILL.md) | **G11** review |
20
+ | 3 | `policy` | generate | [`ai-usage-policy`](../../skills/ai-usage-policy/SKILL.md) | — |
21
+ | 4 | `rollout` | generate | [`ai-adoption-rollout`](../../skills/ai-adoption-rollout/SKILL.md) | — |
22
+ | 5 | `sign-off` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G11.1** human |
23
+
24
+ ## How to run this loop
25
+
26
+ 1. **Triage the ideas.** Run `ai-use-case-triage` on whatever the person brought: a brainstorm,
27
+ a backlog, interview notes. Save it as `triage.md`. Carry three things from it into every
28
+ later stage: the first slice (one workflow and the people who do it), the observable that
29
+ proves or kills it, and the time box.
30
+ 2. **Score readiness for the slice.** Run `ai-readiness-assessment` scoped to the slice's team
31
+ and the decision "can this slice start". Each dimension is read against what the slice
32
+ needs: Data is the data the slice reads, Tooling is the tool the slice uses, Process is the
33
+ review step the slice's output passes through. Save it as `readiness.md`.
34
+ 3. **Judge the slice at G11.** Ask three questions, then choose the verdict below:
35
+ - Does any gap the assessment ranks as blocking sit on something the slice needs?
36
+ - Can each remaining gap be closed inside the slice's time box, with an owner role named?
37
+ - Is there a review step where a person checks the slice's output before anyone acts on it?
38
+ 4. **On `REVISE`, change the slice, not the scores.** Return to `triage` with the blocking gap
39
+ as a constraint, and pick the highest-ranked candidate that does not need what is missing.
40
+ The not-yet list's promotion conditions say which one. Each return counts against the cap.
41
+ 5. **Write the policy for the slice's data.** Run `ai-usage-policy` for the slice's people,
42
+ naming every kind of data the slice puts into a tool (from triage and the Data line of
43
+ readiness). Every kind of data the slice touches gets a rule; a rule for data the slice
44
+ never touches stays out of this version. Save it as `policy.md`.
45
+ 6. **Plan the rollout from the slice.** Run `ai-adoption-rollout` with the slice's users as the
46
+ pilot cohort and triage's observable as the pilot's adoption gate. G11's conditions become
47
+ preconditions the pilot cannot open without. Save it as `rollout.md`.
48
+ 7. **Ask the sponsor at G11.1.** Run `doc-critique` over the policy and the rollout together,
49
+ then put the first wave, the conditions and the critique's open findings to the person who
50
+ sponsors the slice. Only they choose the verdict. In a non-interactive run, stop here and
51
+ write the decision they need to make; never record their verdict for them.
52
+ 8. **Hand over the plan, then the verdict.** Lead with the slice, who starts using it and when,
53
+ and what would end it. The scorecard, the policy and the cohort plan go underneath. Close
54
+ with each gate on its own line, `G11: <VERDICT>` and `G11.1: <VERDICT>` (or
55
+ `G11.1: awaiting <role>`), and one sentence of reasons.
56
+
57
+ ## Verdicts
58
+
59
+ Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G11 emits:
60
+
61
+ - `PROCEED`: no blocking gap sits on what the slice needs, and its output has a review step.
62
+ - `PROCEED WITH CONDITIONS`: a gap sits on the slice but can close inside the time box, with
63
+ an owner role. Each condition travels into the rollout as a precondition for the pilot.
64
+ - `REVISE`: a blocking gap sits on the slice and won't close inside the time box. Return to
65
+ `triage` with that gap as a constraint.
66
+ - `RECONSIDER`: the gap blocks every candidate, such as no rule for what may go into any tool
67
+ or no tool access at all. Fixing it is the work, so the loop ends here with that gap's first
68
+ action and owner role.
69
+ - `BLOCKED`: no candidates to triage, or no team the slice belongs to.
70
+
71
+ G11.1 emits `PROCEED`, `PROCEED WITH CONDITIONS`, `REVISE` (back to `policy`, when the sponsor
72
+ rejects a rule or a cohort) or `BLOCKED` (no sponsor named).
73
+
74
+ On the cap-th `REVISE` at G11, emit `RECONSIDER`: three slices in a row hit blocking gaps, so
75
+ the gaps are the work.
76
+
77
+ ## Non-interactive runs
78
+
79
+ With no candidates, `ai-use-case-triage` emits `BLOCKED`; carry it through as the loop's
80
+ verdict and run no further stages. Missing weights and readiness evidence degrade to the
81
+ skills' own `[assumption]` and `[insufficient evidence]` tags. G11.1 always stops at the
82
+ sponsor: write `G11.1: awaiting <role>` with the decision they face, never a verdict.
83
+
84
+ ## When a stage's skill is not installed
85
+
86
+ Name the missing skill and skilldrop as its source, do the minimal inline version of that
87
+ stage, and record that it ran degraded. A degraded `readiness` still scores Data, Tooling,
88
+ Governance and Process against the slice with an evidence line each, because G11 can't be
89
+ judged without them. Never skip G11 or G11.1.
90
+
91
+ ## Run log (opt-in)
92
+
93
+ Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
94
+ gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
95
+ sent anywhere. When the variable isn't set, or you can't read it, skip this section.
96
+
97
+ ```bash
98
+ printf '%s\n' '{"ts":"2026-11-03T10:15:00Z","loop":"adopt","stage":"readiness","gate":"G11","verdict":"REVISE","round":1}' >> "$SKILLDROP_LOOP_LOG"
99
+ ```
100
+
101
+ Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
102
+ gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
103
+ The log holds verdicts only: never the use cases, the scores or the policy.
104
+ `skilldrop loop-stats` summarises the file.
105
+
106
+ ## Quality bar
107
+
108
+ - **Readiness is scored against the slice.** An organisation-wide score hides the one gap that stops the slice and flags gaps that stop nothing yet.
109
+ - **A `REVISE` changes the slice.** It never re-scores a dimension upward to let the same slice through.
110
+ - **The policy covers every kind of data the slice touches,** each restriction with what to do instead.
111
+ - **The pilot is the slice's users, and its adoption gate is triage's observable.** A pilot of volunteers from elsewhere proves nothing about the slice.
112
+ - **G11.1 is the sponsor's call.** The loop writes the decision they face; it never records their verdict.
113
+
114
+ ## Anti-patterns to avoid
115
+
116
+ - ❌ **Scoring the whole company's readiness first.** The assessment then ranks gaps by how bad they look, not by what they block.
117
+ - ❌ **Writing a policy for every tool and every kind of data before anything ships.** It is long, it is late, and nobody reads the part that matters to the pilot.
118
+ - ❌ **Passing G11 with a blocking gap and a promise.** A gap that won't close inside the time box is a `REVISE`, however good the slice looks.
119
+ - ❌ **A pilot gate that is "the pilot went well".** The gate is triage's observable, with its threshold and time box.
120
+ - ❌ **Running all four skills before the first gate.** A policy and a rollout written for a slice that then fails G11 are thrown away.
@@ -0,0 +1,10 @@
1
+ [
2
+ {"query": "help us start using AI in the finance team, we have ideas but no rules and no plan", "should_trigger": true},
3
+ {"query": "run the adopt loop on these AI use cases from the workshop", "should_trigger": true},
4
+ {"query": "we want to roll out AI across the support team: pick where to start, check we're ready, write the rules and plan the waves", "should_trigger": true},
5
+ {"query": "take this list of AI ideas to a first pilot our VP can sign off", "should_trigger": true},
6
+ {"query": "rank these twelve AI use cases by value and risk", "should_trigger": false},
7
+ {"query": "write an AI acceptable-use policy for our staff", "should_trigger": false},
8
+ {"query": "how far along is our engineering team with coding agents?", "should_trigger": false},
9
+ {"query": "design an eval harness for our support chatbot", "should_trigger": false}
10
+ ]
@@ -0,0 +1,69 @@
1
+ {
2
+ "loop_name": "adopt",
3
+ "evals": [
4
+ {
5
+ "id": "slice-first-then-readiness",
6
+ "prompt": "Run the adopt loop for our 40-person customer operations team at Larkspur Freight. Ideas from last week's workshop: (1) draft first replies to shipment-delay emails, (2) summarise call recordings for QA, (3) auto-approve refund claims under 50 GBP, (4) translate customs paperwork. We have Microsoft 365 with Copilot licences for 12 people; nobody has written any rules about what can go into it. Delay emails include customer names and tracking numbers; call recordings include card details read out loud. QA reviews 5% of calls today. The head of customer operations, Priya Anand, is the sponsor. Non-interactive: no follow-up questions.",
7
+ "assertions": [
8
+ "Runs ai-use-case-triage first and names one first slice with an observable that proves or kills it and a time box",
9
+ "Does not pick auto-approving refunds as the first slice, because its output reaches money without a review step",
10
+ "Scores readiness against the slice's needs (its data, the Copilot licences, its review step), not the whole company in general",
11
+ "Reaches a G11 verdict from PROCEED, PROCEED WITH CONDITIONS, REVISE, RECONSIDER or BLOCKED with the reasons",
12
+ "The policy has a rule for every kind of data the slice puts into a tool, each with what to do instead",
13
+ "The rollout's pilot is the slice's users and its adoption gate is triage's observable",
14
+ "Stops at G11.1 for the sponsor and writes the decision she faces, without recording a verdict for her",
15
+ "Does not invent tools, owners, regulations or figures the prompt did not give"
16
+ ]
17
+ },
18
+ {
19
+ "id": "blocking-gap-sends-the-slice-back",
20
+ "prompt": "Continuing the adopt loop. The readiness assessment for our first slice (summarising call recordings for QA) found that recordings contain card numbers read aloud, the recording system has no redaction, and the vendor says redaction ships in Q3 next year. Our time box for the slice was 6 weeks. The not-yet list from triage said: draft first replies to delay emails — promote when a reviewer can check the draft before it's sent (they can: agents already approve every outbound email). What now?",
21
+ "assertions": [
22
+ "Treats the redaction gap as blocking the slice and gives G11 REVISE, not PROCEED WITH CONDITIONS",
23
+ "Returns to triage rather than re-scoring readiness upward",
24
+ "Picks the delay-email drafting slice because its promotion condition is met",
25
+ "Re-scores readiness for the new slice before writing any policy",
26
+ "Counts the new slice's readiness check as round 2 under the cap of 3",
27
+ "Does not write a policy or rollout for the call-summary slice"
28
+ ]
29
+ },
30
+ {
31
+ "id": "blocked-without-candidates",
32
+ "prompt": "Run the adopt loop. We want to use more AI. Non-interactive, no follow-up questions.",
33
+ "assertions": [
34
+ "Emits BLOCKED and names what is missing: the candidate use cases and the team they belong to",
35
+ "Does not invent use cases, a team, or a sponsor",
36
+ "Does not run the readiness, policy or rollout stages",
37
+ "Says in plain words what it will produce once it has the candidates"
38
+ ]
39
+ },
40
+ {
41
+ "id": "adopt-first-wave-to-sign-off",
42
+ "held_out": "2026-11-03",
43
+ "prompt": "We want to start using AI at Pellmore but honestly it's a pile of ideas and nobody's written any rules. The ideas are in ai-ideas.md, company background is in org-context.md and last month's staff survey is staff-survey.csv. Can you run the adopt loop and get us to a first wave Ruth can sign off?",
44
+ "assertions": [
45
+ "Runs the stages in order (use-case triage, then readiness, then usage policy, then rollout, then sign-off), and each stage uses the previous one's output: readiness is scored against the named first slice, not the company in general",
46
+ "Triage ranks all seven ideas on value, feasibility and risk with the weights shown, names one first slice, and gives a not-yet list with the condition that would promote each",
47
+ "Gate G11 gives a verdict of PROCEED or PROCEED WITH CONDITIONS with an evidence line from the inputs per readiness score, and any conditions it sets show up in the policy or rollout",
48
+ "The usage policy covers the data the chosen slice touches (for delivery-date replies: customer names, addresses, phone numbers and order details from KitchenTrack), pairs every 'don't' with what to do instead, says what to do if data has already gone into a personal account, and addresses the personal-account use the survey found",
49
+ "The rollout's first wave is the chosen slice's users (the 14-person customer service team if the slice is delivery-date replies), fits within the 25 licensed seats, and has an adoption gate before the next wave opens; the comms plan answers the union rep's jobs question by saying what will not change",
50
+ "Stops at G11.1 with the doc-critique findings and asks Ruth Calloway to sign off; it does not record her approval itself or declare the wave approved",
51
+ "Does not invent tools, licences, owners, regulations or figures not in the inputs, such as a second AI vendor, a CRM, or headcounts that differ from org-context.md"
52
+ ]
53
+ },
54
+ {
55
+ "id": "adopt-sponsor-slice-blocked-by-client-data",
56
+ "held_out": "2026-11-03",
57
+ "prompt": "Margaret (our managing partner, she's sponsoring this) wants AI drafting replies to client tax queries to be the first thing we do. She's decided, so rank the rest of the ideas around it. Ideas are in ai-ideas.md, background is in firm-context.md. Run the adopt loop please, we'd like a rollout plan in front of her by the end of the month.",
58
+ "assertions": [
59
+ "Triage ranks all six ideas with the weights shown, records client tax-query replies as the first slice as the sponsor decided, and gives a not-yet list",
60
+ "Readiness is scored against the tax-query slice and names as blocking gaps that engagement-letter clause 9.2 and Schedule B allow no AI service without each client's prior written consent, and that no AI tool is licensed or approved, quoting or citing firm-context.md",
61
+ "Gate G11 does not pass: the verdict is REVISE, RECONSIDER or BLOCKED, not PROCEED, and it sends the slice back naming what would clear it (client consent or updated engagement letters and Schedule B, plus a contracted tool) or a slice that touches no client data, such as procedures-manual Q&A or the weekly guidance briefing",
62
+ "States the conflict with Margaret's decision plainly rather than silently swapping in a different slice",
63
+ "Does not write a usage policy or cohort rollout that treats client tax-query replies as cleared to go; if it reruns with a different slice, it scores readiness against that slice before writing the policy and rollout",
64
+ "Does not claim Margaret's approval or reach the G11.1 sign-off for the blocked slice",
65
+ "Does not invent an approved AI tool, a vendor agreement, client consent, or a regulation the inputs do not give"
66
+ ]
67
+ }
68
+ ]
69
+ }
@@ -0,0 +1,15 @@
1
+ # AI ideas: collected from the staff forum and team leads, September 2026
2
+
3
+ 1. **Delivery-date replies (Customer service).** About 600 emails a week ask "where's my kitchen / when is my delivery". That's roughly 40% of the inbox. An assistant could draft the reply from the order status in KitchenTrack and the agent checks and sends. Submitted by the customer service team lead.
4
+
5
+ 2. **Kitchen renders from sketches (Design).** Turn a designer's hand sketch into a photo-style render to show the customer in the showroom. Today renders take a designer about half a day each. Submitted by two designers.
6
+
7
+ 3. **Showroom visit notes (Sales).** Summarise showroom visit notes into a follow-up email. Notes are handwritten in notebooks; there is no CRM. Submitted by a sales manager.
8
+
9
+ 4. **Invoice matching (Finance).** Match supplier invoices to purchase orders automatically. Around 900 invoices a month, matched by hand in the accounts package. Supplier price lists are commercially confidential. Submitted by the finance manager.
10
+
11
+ 5. **Machine breakdown prediction (Manufacturing).** Predict when the edge-banding and CNC machines will fail. Only 3 of 19 machines have sensors fitted; the rest have paper maintenance logs. Submitted by the factory engineer.
12
+
13
+ 6. **Staff handbook Q&A (HR).** A chatbot that answers holiday, sick-pay and shift-swap questions from the staff handbook. HR gets about 40 of these a week. Submitted by HR.
14
+
15
+ 7. **Product descriptions (Marketing).** Write website product descriptions from the spec sheets for the 2027 range (about 120 products). Submitted by marketing.
@@ -0,0 +1,27 @@
1
+ # Pellmore Kitchens Ltd: background for the AI work
2
+
3
+ ## The company
4
+ - Designs, makes and fits fitted kitchens. 240 staff across the factory and the head office/showroom.
5
+ - Teams: Manufacturing 130, Operations and logistics 26, Sales 22, Design 18, Customer service 14, Finance 9, Marketing 8, Leadership 6, HR 4, IT 3.
6
+
7
+ ## Sponsor
8
+ - Ruth Calloway, Operations Director, sponsors the AI work and signs off the first rollout wave. She wants a first wave live before the January peak.
9
+
10
+ ## Tools
11
+ - Office suite with its enterprise AI chat assistant, licensed since June 2026 for 25 seats. The contract says prompts and files are not used to train models and data is held in the UK/EU. Nobody has been given a seat yet; IT holds all 25.
12
+ - KitchenTrack, the in-house order system. Holds customer names, delivery addresses, phone numbers, email addresses, order lines, prices paid and delivery slots. No API; IT runs a nightly CSV export of order status.
13
+ - Accounts package for finance; no AI features switched on.
14
+
15
+ ## Data
16
+ - Customer personal data lives in KitchenTrack and the customer service inbox.
17
+ - Supplier price lists are commercially confidential under the supplier agreements.
18
+ - Staff HR records are held by HR only.
19
+ - The finance manager is also the company's data protection lead (part of the role). There is a data protection policy (2023). There is no AI policy of any kind.
20
+
21
+ ## What people are worried about
22
+ - The staff survey (staff-survey.csv) found people already using personal AI accounts at work, including pasting customer emails into chatbots on their phones.
23
+ - The customer service team's union rep has asked whether this is about cutting jobs in customer service.
24
+ - Finance is worried about supplier pricing leaking.
25
+
26
+ ## Skills and support
27
+ - No AI training has been run. IT (3 people) can give two days a month to support a rollout.
@@ -0,0 +1,11 @@
1
+ team,respondents,used_ai_at_work_last_month,used_personal_account_for_work,wants_training,worried_about_jobs
2
+ Customer service,12,9,8,11,7
3
+ Sales,15,6,5,9,2
4
+ Design,14,10,7,8,3
5
+ Finance,8,2,1,5,1
6
+ Operations and logistics,10,1,1,4,2
7
+ Marketing,6,6,3,4,1
8
+ Manufacturing,21,0,0,6,9
9
+ HR,4,1,0,3,0
10
+ Leadership,5,3,2,2,0
11
+ IT,3,3,1,0,0
@@ -0,0 +1,13 @@
1
+ # AI ideas from the October partners' meeting
2
+
3
+ 1. **Client tax-query replies.** Draft replies to client emails asking about their tax position, using the client's file (prior returns, correspondence, working papers). Roughly 350 such emails a month across the tax team; each takes a manager 20 to 40 minutes. Margaret's priority.
4
+
5
+ 2. **Bank statement extraction.** Pull transactions from the PDF bank statements clients send in, ready for bookkeeping. About 1,100 statements a month.
6
+
7
+ 3. **Client call notes.** Record and summarise client calls into the practice management system.
8
+
9
+ 4. **Procedures manual Q&A.** Answer staff questions from the firm's internal procedures manual (onboarding, filing deadlines process, how to raise an invoice). The manual is 140 pages and nobody can find anything in it. No client data in it.
10
+
11
+ 5. **Weekly guidance briefing.** Summarise the week's published tax guidance updates into a one-page staff briefing. Uses only public material.
12
+
13
+ 6. **Newsletter drafts.** Draft the quarterly client newsletter from the partners' bullet points.
@@ -0,0 +1,23 @@
1
+ # Corrow Lane Accounting LLP: background
2
+
3
+ ## The firm
4
+ - 58 people: 6 partners, 14 in the tax team, 21 in accounts and bookkeeping, 9 in payroll, 8 in practice support (admin, IT, marketing).
5
+ - Around 1,900 clients: sole traders, small companies and some high-net-worth individuals.
6
+
7
+ ## Sponsor
8
+ - Margaret Ilsley, managing partner, sponsors the AI work and will sign off any rollout. She has decided client tax-query replies come first.
9
+
10
+ ## Systems
11
+ - Client files live on an on-premises file server and in LedgerDesk, the practice management system. LedgerDesk has no AI features and no export API.
12
+ - Email is hosted by our email provider.
13
+ - No AI tool is licensed or approved. In August 2026 the IT manager blocked two public chatbot sites after a junior was seen pasting a client's payslip into one.
14
+
15
+ ## Client contracts
16
+ - Every client signs our standard engagement letter. Clause 9.2 reads: "We will not disclose your information to any third party, or process it using third-party services other than those listed in Schedule B, without your prior written consent."
17
+ - Schedule B lists three services: our email hosting provider, our payroll bureau, and our cloud backup provider. Nothing else.
18
+ - Engagement letters are reissued each April.
19
+
20
+ ## Other
21
+ - Our professional indemnity insurer's renewal questionnaire, due January 2027, asks whether we use AI on client work and how it is controlled.
22
+ - Practice support has one IT manager and no one with AI experience.
23
+ - Staff survey (informal, September): 31 of 58 said they would use an AI tool if the firm approved one.
@@ -0,0 +1,53 @@
1
+ {
2
+ "$comment": "RFC-0069. AI ideas to a first rollout wave a sponsor approved. Readiness is scored against the first slice, not the whole organisation, because a gap only blocks the use cases that need what is missing; the gate sits there so a slice that needs it goes back to triage before anyone writes a policy for it.",
3
+ "name": "adopt",
4
+ "version": "0.1.0",
5
+ "description": "Take an organisation from a pile of AI ideas to a first rollout wave its sponsor approved: the use cases ranked with a first slice, readiness scored against that slice, a usage policy covering the data the slice touches, and a cohort rollout whose first wave is the slice's users, with a gate that sends the slice back when a blocking gap stands in its way. Use when the user says \"help us start using AI\", \"roll out AI across the team\", \"run the adopt loop\", or has AI ideas, no policy and no rollout plan.",
6
+ "entrypoint": "LOOP.md",
7
+ "kind": "loop",
8
+ "cap": 3,
9
+ "stages": [
10
+ {
11
+ "id": "triage",
12
+ "type": "generate",
13
+ "intent": "Rank the candidate use cases on value, feasibility and risk with the weights shown, and name one first slice with the observable that would prove or kill it.",
14
+ "skills": ["ai-use-case-triage"]
15
+ },
16
+ {
17
+ "id": "readiness",
18
+ "type": "verify",
19
+ "intent": "Score readiness against what the first slice needs, and judge whether any blocking gap stands between the slice and its first users.",
20
+ "skills": ["ai-readiness-assessment"],
21
+ "gate": {
22
+ "id": "G11",
23
+ "kind": "review",
24
+ "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
25
+ "revise_to": "triage"
26
+ }
27
+ },
28
+ {
29
+ "id": "policy",
30
+ "type": "generate",
31
+ "intent": "Write the usage rules for the people in the slice, covering every kind of data the slice puts into a tool, each restriction paired with what to do instead.",
32
+ "skills": ["ai-usage-policy"]
33
+ },
34
+ {
35
+ "id": "rollout",
36
+ "type": "generate",
37
+ "intent": "Plan the cohorts, enablement, champions and comms, with the slice's users as the pilot and the slice's observable as the pilot's adoption gate.",
38
+ "skills": ["ai-adoption-rollout"]
39
+ },
40
+ {
41
+ "id": "sign-off",
42
+ "type": "gate",
43
+ "intent": "The sponsor approves the first wave, with the policy and the readiness conditions it opens under.",
44
+ "skills": ["doc-critique"],
45
+ "gate": {
46
+ "id": "G11.1",
47
+ "kind": "human",
48
+ "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "BLOCKED"],
49
+ "revise_to": "policy"
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: ship-agent
3
+ description: Take an AI agent from an idea to a launch a person signed: the loop spec with its exit criteria and cap, the spend caps per stage, a threat model where every lethal-trifecta path has an architectural fix, an eval harness with its pass bar set before the first run, and a review of the real agent configuration before launch, with a gate that sends the design back when a path to exfiltration stays open. Use when the user says "we're building an agent", "design and ship this agent safely", "run the ship-agent loop", or wants an agent taken from design to launch with its risks and evals settled.
4
+ ---
5
+
6
+ # ship-agent
7
+
8
+ One agent, from a described job to a launch its owner signed. Each skill works alone; in order,
9
+ each one reads the last one's output. The loop design names every stage and tool, so the budget
10
+ caps real stages and the threat model inventories real capabilities. The threat model's attacks
11
+ become the eval harness's adversarial cases. The launch review reads the configuration the team
12
+ actually built against the capabilities the threat model allowed, which no design document can
13
+ check about itself.
14
+
15
+ ## Stages
16
+
17
+ | # | Stage | Type | Skills | Gate |
18
+ |---|---|---|---|---|
19
+ | 1 | `design` | generate | [`agent-loop-design`](../../skills/agent-loop-design/SKILL.md), [`subagent-design`](../../skills/subagent-design/SKILL.md) | — |
20
+ | 2 | `budget` | generate | [`agent-budget`](../../skills/agent-budget/SKILL.md) | — |
21
+ | 3 | `threat` | verify | [`agent-threat-model`](../../skills/agent-threat-model/SKILL.md) | **G12** review |
22
+ | 4 | `evals` | generate | [`llm-eval-harness`](../../skills/llm-eval-harness/SKILL.md) | — |
23
+ | 5 | `launch` | gate | [`agent-config-review`](../../skills/agent-config-review/SKILL.md) | **G12.1** human |
24
+
25
+ ## How to run this loop
26
+
27
+ 1. **Design the loop.** Run `agent-loop-design` on the job. Run `subagent-design` after it only
28
+ when the job fans out across agents; a single agent skips it. Save the spec as `design.md`.
29
+ Carry two things into every later stage: the tool and data list, and the done-condition.
30
+ 2. **Cap the spend.** Run `agent-budget` on the design's stages. Each stage gets a tier, a token
31
+ cap and an abort rule; a stage the design doesn't have gets no budget. Save it as
32
+ `budget.md`.
33
+ 3. **Threat-model the design.** Run `agent-threat-model` with the design's tool and data list
34
+ as the capability inventory. A capability the design implies but doesn't list is modelled at
35
+ its widest plausible scope and tagged `[assumption]`. Save it as `threat.md`.
36
+ 4. **Judge the design at G12.** Ask three questions, then choose the verdict below:
37
+ - Does every 🟥 path (private data, untrusted content and a way out, in one context) have an
38
+ architectural fix, not a prompt instruction?
39
+ - Does any fix contradict the design, such as a tool removed that a stage needs?
40
+ - Is every residual risk owned by a named role?
41
+ 5. **On `REVISE`, change the design.** Return to `design` with the open path and its fix: split
42
+ the context, drop the tool, or put a human gate on the outbound step. Re-run `budget` and
43
+ `threat` on the new design. Each return counts against the cap.
44
+ 6. **Design the evals.** Run `llm-eval-harness` with the design's done-condition as the task.
45
+ Every attack in the threat model's sweeps becomes an adversarial case in the critical
46
+ subset, which must stay at 100%. The pass bar and regression gate are fixed now. Save it as
47
+ `evals.md`.
48
+ 7. **Stop while the team builds.** The loop has produced the design, budget, threat model and
49
+ eval plan. Hand them over and stop until the team has a built agent, its configuration
50
+ files and one eval run. Resume at `launch` when they bring them.
51
+ 8. **Review the launch at G12.1.** Run `agent-config-review` on the real configuration, then
52
+ check each granted capability against `threat.md`: a grant the threat model did not allow
53
+ is a finding, however harmless it looks. Put the review verdict, the eval result against
54
+ the pass bar, and every residual risk in front of the agent's owner. Only they choose the
55
+ verdict. In a non-interactive run, stop and write the decision they face.
56
+ 9. **Hand over the decision, then the working.** Lead with what the agent will be able to do,
57
+ what it can't, and what still stands between it and launch. The documents go underneath.
58
+ Close with each gate on its own line, `G12: <VERDICT>` and `G12.1: <VERDICT>` (or
59
+ `G12.1: awaiting <role>`), and one sentence of reasons.
60
+
61
+ ## Verdicts
62
+
63
+ Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G12 emits:
64
+
65
+ - `PROCEED`: every 🟥 path has an architectural fix, no fix contradicts the design, and every
66
+ residual risk has an owner role.
67
+ - `PROCEED WITH CONDITIONS`: the fixes are designed but one depends on something unverified,
68
+ such as a sandbox's egress rule. The condition goes into the eval plan as a case and into the
69
+ launch review as a check.
70
+ - `REVISE`: a 🟥 path is left open, or its only fix is a prompt instruction. Return to
71
+ `design`.
72
+ - `RECONSIDER`: the job can't be done without all three legs of the trifecta in one context,
73
+ such as an agent that must read untrusted email and send email on its own. The job needs a
74
+ person in the loop or a different scope, so the loop ends here.
75
+ - `BLOCKED`: no tool or data list can be established.
76
+
77
+ G12.1 emits `PROCEED`, `PROCEED WITH CONDITIONS`, `REVISE` (back to `threat`, when the built
78
+ configuration grants what the threat model didn't allow, or the eval misses the pass bar) or
79
+ `BLOCKED` (no configuration, no eval run, or no owner).
80
+
81
+ On the cap-th `REVISE` at G12, emit `RECONSIDER`: three designs in a row left a path open, so
82
+ the job's scope is the problem.
83
+
84
+ ## Non-interactive runs
85
+
86
+ With no tool or data list, `agent-threat-model` emits
87
+ `BLOCKED: need the agent's tool/permission inventory`; carry it through and run no further
88
+ stages. Before the agent is built, the loop ends after `evals` with
89
+ `G12.1: awaiting the built agent's configuration and one eval run`. G12.1 never passes without
90
+ its owner.
91
+
92
+ ## When a stage's skill is not installed
93
+
94
+ Name the missing skill and skilldrop as its source, do the minimal inline version of that
95
+ stage, and record that it ran degraded. A degraded `threat` still classifies every content
96
+ source as trusted or untrusted and lists each path that joins all three legs, because G12
97
+ can't be judged without them. Never skip G12 or G12.1.
98
+
99
+ ## Run log (opt-in)
100
+
101
+ Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
102
+ gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
103
+ sent anywhere. When the variable isn't set, or you can't read it, skip this section.
104
+
105
+ ```bash
106
+ printf '%s\n' '{"ts":"2026-11-03T10:15:00Z","loop":"ship-agent","stage":"threat","gate":"G12","verdict":"REVISE","round":1}' >> "$SKILLDROP_LOOP_LOG"
107
+ ```
108
+
109
+ Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
110
+ gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
111
+ The log holds verdicts only: never the design, the capabilities or the findings.
112
+ `skilldrop loop-stats` summarises the file.
113
+
114
+ ## Quality bar
115
+
116
+ - **The threat model inventories the design's tools,** not a generic agent's. A capability the design implies but doesn't list is modelled at its widest scope.
117
+ - **G12 passes only on architectural fixes.** "The prompt tells it not to" is not a fix for an open path.
118
+ - **Every threat-model attack is an eval case in the critical subset,** and the pass bar is set before the first run.
119
+ - **The launch review checks the built configuration against the threat model.** A grant the model didn't allow is a finding.
120
+ - **G12.1 is the owner's call.** The loop writes the decision they face; it never records their verdict.
121
+
122
+ ## Anti-patterns to avoid
123
+
124
+ - ❌ **Threat-modelling before the design exists.** The model then inventories capabilities nobody chose, and misses the ones the design adds.
125
+ - ❌ **Fixing an open path with a system-prompt rule.** Injected content outranks the prompt that was meant to stop it.
126
+ - ❌ **Setting the pass bar after the first eval run.** A bar set after seeing results is chosen to pass.
127
+ - ❌ **Reviewing the configuration the design describes instead of the one the team built.** The gap between them is what the launch review is for.
128
+ - ❌ **Skipping the budget because the agent is small.** A loop with no token cap and no abort rule is how a small agent sends a large bill.
@@ -0,0 +1,10 @@
1
+ [
2
+ {"query": "we're building an agent that reads our Jira tickets and opens PRs, take it from design to launch safely", "should_trigger": true},
3
+ {"query": "run the ship-agent loop on this support-inbox agent", "should_trigger": true},
4
+ {"query": "design this agent, cap what it can spend, threat-model it and set up the evals before we build it", "should_trigger": true},
5
+ {"query": "we built the agent, check its config against the threat model and tell the owner if it can launch", "should_trigger": true},
6
+ {"query": "threat-model this MCP setup for prompt injection", "should_trigger": false},
7
+ {"query": "is our .claude/settings.json safe?", "should_trigger": false},
8
+ {"query": "should this be one agent or several?", "should_trigger": false},
9
+ {"query": "help us start using AI across the company", "should_trigger": false}
10
+ ]