skilldrop-cli 0.16.29 → 0.16.31

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 (231) hide show
  1. package/bin/skilldrop.js +160 -33
  2. package/catalogue.json +10 -4
  3. package/model-routing.json +24 -0
  4. package/package.json +1 -1
  5. package/packs/ai-engineering/skills/mcp-pairing/SKILL.md +93 -0
  6. package/packs/ai-engineering/skills/mcp-pairing/evals/eval_queries.json +13 -0
  7. package/packs/ai-engineering/skills/mcp-pairing/evals/evals.json +76 -0
  8. package/packs/ai-engineering/skills/mcp-pairing/evals/files/2/mcp.json +32 -0
  9. package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/.mcp.json +47 -0
  10. package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/docs/pr-loop.md +12 -0
  11. package/packs/ai-engineering/skills/mcp-pairing/evals/files/5/docs/oncall-triage.md +18 -0
  12. package/packs/ai-engineering/skills/mcp-pairing/examples/build-loop-github-jira-datadog.md +69 -0
  13. package/packs/ai-engineering/skills/mcp-pairing/manifest.json +17 -0
  14. package/packs/ai-engineering/skills/mcp-pairing/reference.md +136 -0
  15. package/packs/ai-engineering/skills/mcp-pairing/templates/mcp-pairing.md +43 -0
  16. package/packs/dev-team/loops/build/LOOP.md +4 -2
  17. package/packs/dev-team/loops/build/loop.json +2 -2
  18. package/packs/dev-team/loops/release/LOOP.md +7 -5
  19. package/packs/dev-team/loops/release/loop.json +2 -2
  20. package/packs/dev-team/skills/codebase-tour/SKILL.md +115 -0
  21. package/packs/dev-team/skills/codebase-tour/evals/eval_queries.json +13 -0
  22. package/packs/dev-team/skills/codebase-tour/evals/evals.json +77 -0
  23. package/packs/dev-team/skills/codebase-tour/evals/files/1/.github/workflows/ci.yml +23 -0
  24. package/packs/dev-team/skills/codebase-tour/evals/files/1/README.md +23 -0
  25. package/packs/dev-team/skills/codebase-tour/evals/files/1/openapi.yaml +21 -0
  26. package/packs/dev-team/skills/codebase-tour/evals/files/1/package-lock.json +7 -0
  27. package/packs/dev-team/skills/codebase-tour/evals/files/1/package.json +29 -0
  28. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/config.ts +20 -0
  29. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/filter.ts +24 -0
  30. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/repository.ts +15 -0
  31. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/errors.ts +9 -0
  32. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/generated/api-types.ts +9 -0
  33. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/handlers/shipments.ts +38 -0
  34. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/routes.ts +7 -0
  35. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/jobs/export-shipments.ts +22 -0
  36. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/server.ts +18 -0
  37. package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/domain/filter.test.ts +16 -0
  38. package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/http/shipments.test.ts +18 -0
  39. package/packs/dev-team/skills/codebase-tour/evals/files/1/tsconfig.json +10 -0
  40. package/packs/dev-team/skills/codebase-tour/evals/files/1/vitest.config.ts +5 -0
  41. package/packs/dev-team/skills/codebase-tour/evals/files/2/.github/workflows/ci.yml +16 -0
  42. package/packs/dev-team/skills/codebase-tour/evals/files/2/README.md +16 -0
  43. package/packs/dev-team/skills/codebase-tour/evals/files/2/noxfile.py +14 -0
  44. package/packs/dev-team/skills/codebase-tour/evals/files/2/pyproject.toml +22 -0
  45. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/__init__.py +3 -0
  46. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/_version.py +4 -0
  47. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/cli.py +32 -0
  48. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/detect.py +15 -0
  49. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/errors.py +2 -0
  50. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/money.py +14 -0
  51. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/__init__.py +8 -0
  52. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/acme.py +18 -0
  53. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/base.py +24 -0
  54. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/harbor.py +13 -0
  55. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/fixtures/acme_sample.csv +3 -0
  56. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_acme.py +23 -0
  57. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_detect.py +13 -0
  58. package/packs/dev-team/skills/codebase-tour/evals/files/3/.github/workflows/ci.yml +28 -0
  59. package/packs/dev-team/skills/codebase-tour/evals/files/3/Makefile +16 -0
  60. package/packs/dev-team/skills/codebase-tour/evals/files/3/README.md +16 -0
  61. package/packs/dev-team/skills/codebase-tour/evals/files/3/cmd/tidepool/main.go +24 -0
  62. package/packs/dev-team/skills/codebase-tour/evals/files/3/go.mod +5 -0
  63. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/config/config.go +38 -0
  64. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher.go +52 -0
  65. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher_test.go +42 -0
  66. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/sender.go +32 -0
  67. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/replay/replay.go +31 -0
  68. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/db.go +35 -0
  69. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql +11 -0
  70. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql.go +30 -0
  71. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/schema.sql +6 -0
  72. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/store_integration_test.go +21 -0
  73. package/packs/dev-team/skills/codebase-tour/evals/files/3/sqlc.yaml +9 -0
  74. package/packs/dev-team/skills/codebase-tour/evals/files/4/.env.example +4 -0
  75. package/packs/dev-team/skills/codebase-tour/evals/files/4/.github/workflows/ci.yml +16 -0
  76. package/packs/dev-team/skills/codebase-tour/evals/files/4/Makefile +16 -0
  77. package/packs/dev-team/skills/codebase-tour/evals/files/4/README.md +23 -0
  78. package/packs/dev-team/skills/codebase-tour/evals/files/4/data/rates.csv +4 -0
  79. package/packs/dev-team/skills/codebase-tour/evals/files/4/pyproject.toml +19 -0
  80. package/packs/dev-team/skills/codebase-tour/evals/files/4/scripts/gen_rates.py +29 -0
  81. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/__init__.py +0 -0
  82. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/__init__.py +0 -0
  83. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/preview.py +14 -0
  84. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/routes.py +36 -0
  85. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/config.py +15 -0
  86. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/discounts.py +8 -0
  87. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/__init__.py +0 -0
  88. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/rates_table.py +8 -0
  89. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/main.py +8 -0
  90. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/shipping.py +18 -0
  91. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/tax.py +7 -0
  92. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/conftest.py +3 -0
  93. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_discounts.py +11 -0
  94. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_tax.py +13 -0
  95. package/packs/dev-team/skills/codebase-tour/evals/files/5/.env.example +3 -0
  96. package/packs/dev-team/skills/codebase-tour/evals/files/5/.github/workflows/ci.yml +13 -0
  97. package/packs/dev-team/skills/codebase-tour/evals/files/5/README.md +18 -0
  98. package/packs/dev-team/skills/codebase-tour/evals/files/5/package.json +13 -0
  99. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/openapi.json +30 -0
  100. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/package.json +15 -0
  101. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/db.js +19 -0
  102. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/flags.js +8 -0
  103. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/generated/schema.js +32 -0
  104. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/middleware/validate.js +20 -0
  105. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/routes/bookings.js +15 -0
  106. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/server.js +15 -0
  107. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/bookings.js +23 -0
  108. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/pricing.js +9 -0
  109. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/test/pricing.test.js +15 -0
  110. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/package.json +9 -0
  111. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/bookingForm.js +11 -0
  112. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/format.js +7 -0
  113. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/test/format.test.js +12 -0
  114. package/packs/dev-team/skills/codebase-tour/evals/files/5/scripts/gen-schema.mjs +27 -0
  115. package/packs/dev-team/skills/codebase-tour/examples/refund-window.md +158 -0
  116. package/packs/dev-team/skills/codebase-tour/manifest.json +47 -0
  117. package/packs/dev-team/skills/codebase-tour/scripts/repo_facts.py +403 -0
  118. package/packs/dev-team/skills/codebase-tour/templates/codebase-tour.md +85 -0
  119. package/packs/dev-team/skills/dependency-upgrade-review/SKILL.md +101 -0
  120. package/packs/dev-team/skills/dependency-upgrade-review/evals/eval_queries.json +11 -0
  121. package/packs/dev-team/skills/dependency-upgrade-review/evals/evals.json +77 -0
  122. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/.github/workflows/ci.yml +20 -0
  123. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/pr.diff +87 -0
  124. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/quillmark-CHANGELOG.md +24 -0
  125. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/comment.js +6 -0
  126. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/note.js +8 -0
  127. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/test/note.test.js +12 -0
  128. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/ci.yml +23 -0
  129. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/release.yml +23 -0
  130. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/pr.diff +32 -0
  131. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/release-notes.md +20 -0
  132. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/.github/workflows/ci.yml +18 -0
  133. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/Dockerfile +8 -0
  134. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/PR.md +36 -0
  135. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/pr.diff +47 -0
  136. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/client.py +24 -0
  137. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/reader.py +32 -0
  138. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/tests/test_reader.py +15 -0
  139. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/upstream/quillstream-CHANGELOG.md +37 -0
  140. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/ci.yml +22 -0
  141. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/release.yml +25 -0
  142. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.nvmrc +1 -0
  143. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-412.md +16 -0
  144. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-413.md +15 -0
  145. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/package.json +21 -0
  146. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-412.diff +26 -0
  147. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-413.diff +84 -0
  148. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/scripts/release.mjs +18 -0
  149. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/release-notary-CHANGELOG.md +16 -0
  150. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/setup-toolchain-RELEASES.md +22 -0
  151. package/packs/dev-team/skills/dependency-upgrade-review/examples/inputs/ledgerline.diff +38 -0
  152. package/packs/dev-team/skills/dependency-upgrade-review/examples/ledgerline-tidyparse.md +91 -0
  153. package/packs/dev-team/skills/dependency-upgrade-review/manifest.json +50 -0
  154. package/packs/dev-team/skills/dependency-upgrade-review/reference.md +99 -0
  155. package/packs/dev-team/skills/dependency-upgrade-review/scripts/upgrade_diff.py +718 -0
  156. package/packs/dev-team/skills/refactor-plan/SKILL.md +168 -0
  157. package/packs/dev-team/skills/refactor-plan/evals/eval_queries.json +46 -0
  158. package/packs/dev-team/skills/refactor-plan/evals/evals.json +106 -0
  159. package/packs/dev-team/skills/refactor-plan/evals/files/1/debt-register-row.md +5 -0
  160. package/packs/dev-team/skills/refactor-plan/evals/files/1/in-flight-prs.md +7 -0
  161. package/packs/dev-team/skills/refactor-plan/evals/files/1/order_service.py +74 -0
  162. package/packs/dev-team/skills/refactor-plan/evals/files/1/test-coverage.txt +14 -0
  163. package/packs/dev-team/skills/refactor-plan/evals/files/3/imports.txt +22 -0
  164. package/packs/dev-team/skills/refactor-plan/evals/files/3/register.md +3 -0
  165. package/packs/dev-team/skills/refactor-plan/evals/files/4/docs/open-prs.md +6 -0
  166. package/packs/dev-team/skills/refactor-plan/evals/files/4/docs/tech-debt-register.md +7 -0
  167. package/packs/dev-team/skills/refactor-plan/evals/files/4/reports/monthly_revenue.py +44 -0
  168. package/packs/dev-team/skills/refactor-plan/evals/files/4/src/billing/invoice.py +233 -0
  169. package/packs/dev-team/skills/refactor-plan/evals/files/4/src/partners/statement.py +29 -0
  170. package/packs/dev-team/skills/refactor-plan/evals/files/4/tests/billing/test_payments.py +13 -0
  171. package/packs/dev-team/skills/refactor-plan/evals/files/5/ci-notes.md +5 -0
  172. package/packs/dev-team/skills/refactor-plan/evals/files/5/open-prs.txt +4 -0
  173. package/packs/dev-team/skills/refactor-plan/evals/files/5/scripts/nightly-digest.js +36 -0
  174. package/packs/dev-team/skills/refactor-plan/evals/files/5/src/auth/passwordReset.ts +16 -0
  175. package/packs/dev-team/skills/refactor-plan/evals/files/5/src/notify/index.ts +2 -0
  176. package/packs/dev-team/skills/refactor-plan/evals/files/5/src/notify/legacyMailer.ts +149 -0
  177. package/packs/dev-team/skills/refactor-plan/evals/files/5/src/orders/onOrderShipped.ts +15 -0
  178. package/packs/dev-team/skills/refactor-plan/evals/files/5/tests/notify/legacyMailer.test.ts +7 -0
  179. package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/DunningJob.kt +29 -0
  180. package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/InvoiceService.kt +157 -0
  181. package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/main/kotlin/billing/pdf/InvoicePdfRenderer.kt +36 -0
  182. package/packs/dev-team/skills/refactor-plan/evals/files/6/billing-service/src/test/kotlin/billing/InvoiceServiceTest.kt +40 -0
  183. package/packs/dev-team/skills/refactor-plan/evals/files/6/docs/adr-007-persistence.md +26 -0
  184. package/packs/dev-team/skills/refactor-plan/evals/files/6/docs/open-prs.md +9 -0
  185. package/packs/dev-team/skills/refactor-plan/evals/files/7/notes/open-work.md +19 -0
  186. package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/CheckoutPanel.tsx +207 -0
  187. package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/MiniCart.tsx +33 -0
  188. package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/components/__tests__/CheckoutPanel.test.tsx +13 -0
  189. package/packs/dev-team/skills/refactor-plan/evals/files/7/web/src/pages/OrderReview.tsx +24 -0
  190. package/packs/dev-team/skills/refactor-plan/examples/search-ranker.md +104 -0
  191. package/packs/dev-team/skills/refactor-plan/manifest.json +36 -0
  192. package/packs/dev-team/skills/refactor-plan/reference.md +149 -0
  193. package/packs/dev-team/skills/refactor-plan/templates/refactor-plan.md +82 -0
  194. package/packs/dev-team/skills/rollout-plan/SKILL.md +157 -0
  195. package/packs/dev-team/skills/rollout-plan/evals/eval_queries.json +12 -0
  196. package/packs/dev-team/skills/rollout-plan/evals/evals.json +109 -0
  197. package/packs/dev-team/skills/rollout-plan/evals/files/2/metrics-snapshot.txt +11 -0
  198. package/packs/dev-team/skills/rollout-plan/evals/files/2/pr-description.md +28 -0
  199. package/packs/dev-team/skills/rollout-plan/evals/files/4/PR_DESCRIPTION.md +24 -0
  200. package/packs/dev-team/skills/rollout-plan/evals/files/4/metrics_snapshot.txt +7 -0
  201. package/packs/dev-team/skills/rollout-plan/evals/files/5/docs/tax-engine-v2.md +24 -0
  202. package/packs/dev-team/skills/rollout-plan/evals/files/6/flags/smart_reminders_v2.yaml +14 -0
  203. package/packs/dev-team/skills/rollout-plan/evals/files/6/notes/push-pipeline.md +10 -0
  204. package/packs/dev-team/skills/rollout-plan/evals/files/7/docs/ratelimiter-v2.md +21 -0
  205. package/packs/dev-team/skills/rollout-plan/evals/files/7/ops/traffic-summary.txt +9 -0
  206. package/packs/dev-team/skills/rollout-plan/examples/sync-engine-workspaces.md +102 -0
  207. package/packs/dev-team/skills/rollout-plan/manifest.json +35 -0
  208. package/packs/dev-team/skills/rollout-plan/reference.md +100 -0
  209. package/packs/dev-team/skills/rollout-plan/scripts/canary_math.py +261 -0
  210. package/packs/dev-team/skills/rollout-plan/templates/rollout-plan.md +50 -0
  211. package/packs/product-manager/loops/discover/LOOP.md +5 -4
  212. package/packs/product-manager/loops/discover/loop.json +2 -2
  213. package/packs/product-manager/skills/feedback-synthesis/SKILL.md +182 -0
  214. package/packs/product-manager/skills/feedback-synthesis/evals/eval_queries.json +46 -0
  215. package/packs/product-manager/skills/feedback-synthesis/evals/evals.json +76 -0
  216. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/interview-notes.md +47 -0
  217. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/nps-verbatims.csv +13 -0
  218. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/support-tickets.csv +36 -0
  219. package/packs/product-manager/skills/feedback-synthesis/evals/files/3/churn-exit-survey.csv +11 -0
  220. package/packs/product-manager/skills/feedback-synthesis/evals/files/3/sales-call-notes.md +55 -0
  221. package/packs/product-manager/skills/feedback-synthesis/evals/files/4/csat_comments_q3.csv +17 -0
  222. package/packs/product-manager/skills/feedback-synthesis/evals/files/4/support_tickets_q3.csv +49 -0
  223. package/packs/product-manager/skills/feedback-synthesis/evals/files/5/app_reviews_last_60_days.csv +32 -0
  224. package/packs/product-manager/skills/feedback-synthesis/evals/files/5/interview_notes_round1.md +48 -0
  225. package/packs/product-manager/skills/feedback-synthesis/examples/booking-app-feedback.md +139 -0
  226. package/packs/product-manager/skills/feedback-synthesis/examples/inputs/booking-app-coded.csv +17 -0
  227. package/packs/product-manager/skills/feedback-synthesis/manifest.json +53 -0
  228. package/packs/product-manager/skills/feedback-synthesis/reference.md +89 -0
  229. package/packs/product-manager/skills/feedback-synthesis/scripts/theme_counts.py +355 -0
  230. package/packs/product-manager/skills/feedback-synthesis/templates/coding-sheet.csv +6 -0
  231. package/packs/product-manager/skills/feedback-synthesis/templates/synthesis.md +42 -0
@@ -0,0 +1,47 @@
1
+ {
2
+ "mcpServers": {
3
+ "github": {
4
+ "command": "docker",
5
+ "args": ["run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"],
6
+ "env": {
7
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_EXAMPLEEXAMPLEEXAMPLEEXAMPLE0001"
8
+ },
9
+ "_comment": "classic PAT, scopes: repo, workflow, admin:org, delete_repo -- easiest to just give it everything"
10
+ },
11
+ "github-reviewer": {
12
+ "command": "docker",
13
+ "args": ["run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"],
14
+ "env": {
15
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_EXAMPLEEXAMPLEEXAMPLEEXAMPLE0001",
16
+ "GITHUB_TOOLSETS": "all"
17
+ },
18
+ "_comment": "used by the review stage so it can approve + merge when it's happy"
19
+ },
20
+ "jira": {
21
+ "command": "npx",
22
+ "args": ["-y", "jira-mcp-plus-unofficial@latest"],
23
+ "env": {
24
+ "JIRA_URL": "https://example-team.atlassian.net",
25
+ "JIRA_EMAIL": "build-bot@example.com",
26
+ "JIRA_API_TOKEN": "EXAMPLE-JIRA-TOKEN-DO-NOT-USE"
27
+ },
28
+ "_comment": "found this on a forum thread, works better than the official one"
29
+ },
30
+ "slack": {
31
+ "command": "npx",
32
+ "args": ["-y", "slack-mcp-server-community"],
33
+ "env": {
34
+ "SLACK_BOT_TOKEN": "xoxb-EXAMPLE-EXAMPLE-EXAMPLE",
35
+ "_scopes": "chat:write, chat:write.public, channels:history, groups:history, im:history, users:read.email, admin"
36
+ }
37
+ },
38
+ "postgres": {
39
+ "command": "npx",
40
+ "args": ["-y", "some-postgres-mcp"],
41
+ "env": {
42
+ "DATABASE_URL": "postgresql://app_owner:EXAMPLEPASSWORD@prod-db.internal.example:5432/orders"
43
+ },
44
+ "_comment": "handy for the implement stage to check schemas"
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,12 @@
1
+ # Our agent PR loop
2
+
3
+ The coding agent runs this loop for every ticket in the "Agent-ready" Jira column.
4
+
5
+ 1. **Pick up** - read the Jira ticket (description, acceptance criteria, linked tickets). Move it to "In Progress".
6
+ 2. **Implement** - branch off `main`, write the change and tests, push the branch, open a draft PR on GitHub.
7
+ 3. **Review** - a second agent session reads the PR diff, the CI results and the ticket, and decides if it meets the acceptance criteria.
8
+ 4. **Merge gate** - a human tech lead approves and merges. Nothing merges without a human.
9
+ 5. **Announce** - post a one-line summary with the PR link to `#team-orders-dev` in Slack.
10
+
11
+ Repo: one GitHub repo, `example-org/orders-service`. CI is GitHub Actions.
12
+ The `.mcp.json` lives in the repo root and is committed so everyone gets the same setup.
@@ -0,0 +1,18 @@
1
+ # On-call triage loop (draft)
2
+
3
+ Trigger: a Sentry alert fires for `payments-api` or a Grafana alert pages the on-call.
4
+
5
+ 1. **Gather** - pull the Sentry issue (stack trace, release, affected users count) and the
6
+ Grafana dashboard panels for latency / error rate around the alert window.
7
+ 2. **Correlate** - find the GitLab merge requests and deploys that landed in the 24h before
8
+ the first event. Look at the diff of the suspect MR.
9
+ 3. **Check data** - if the error looks data-related, run a couple of SELECTs against the
10
+ `payments` Postgres database to see whether bad rows exist.
11
+ 4. **Ticket** - open a Linear issue in the `PAY` team with the findings, priority Urgent, and
12
+ assign it to the on-call.
13
+ 5. **Postmortem draft** - write a first-draft postmortem in markdown from everything above,
14
+ for the on-call to edit.
15
+
16
+ Constraints: Sentry is self-hosted at sentry.internal.example. Grafana is Grafana Cloud.
17
+ Payments DB has a primary and one read replica. We're PCI-scoped, so card data columns exist
18
+ in `payments.transactions` (pan_last4, card_token, billing_address).
@@ -0,0 +1,69 @@
1
+ # Worked example — the build loop on GitHub, Jira and Datadog
2
+
3
+ ## Input given to the skill
4
+
5
+ > We're adopting the build loop for the `orders-api` repo. We use GitHub for code and PRs,
6
+ > Jira (project ORD) for stories and bugs, and Datadog for logs and APM. Which MCP servers
7
+ > should we connect, and with what access? We'd like the agent to open the PR itself if that's
8
+ > sensible. About one bug a week needs logs; stories come in daily. Outside contractors open
9
+ > PRs too.
10
+
11
+ ---
12
+
13
+ # MCP pairing — build loop for `orders-api`
14
+
15
+ **Tools in use:** GitHub, Jira (project ORD), Datadog · **Assumptions:** the developer's
16
+ checkout is local, so implement needs no repo server `[assumption]`; Jira issues in ORD are
17
+ written by staff and by people raising bugs from support `[assumption]`.
18
+
19
+ ## The plan
20
+
21
+ Connect two servers, both read-only: Jira for the shape stage and GitHub for the verify stage.
22
+ Implement and decide need none. Datadog is cut: one bug a week is a saved log query, not a live
23
+ server. Opening the PR is the one write worth granting, on its own GitHub credential used only
24
+ at the end of implement, and only if the team wants it; otherwise the developer opens the PR.
25
+
26
+ ## Pairing by stage
27
+
28
+ | Stage (type, cadence) | Needs | Server | Grant | Must not | Fallback without it | Risk |
29
+ |---|---|---|---|---|---|---|
30
+ | shape (generate, daily) | Tracker issue: the story or bug, its comments and links | Atlassian's own server — confirm Atlassian publishes it in Atlassian's docs before connecting | A Jira account with Browse on project ORD only; the server acts with that account's permissions | Create, transition, comment, assign, edit fields; see any project but ORD | The issue exported from Jira to a text file, or the filter exported as CSV | Issue text and comments are untrusted (support-raised bugs). Shape holds no write or exec tool, so reading them is safe here; it writes the story file and nothing else |
31
+ | shape, bugs only (generate, ~weekly) | Logs and traces for the failing request | Cut — see below | — | — | The Datadog log query result saved as JSON, and the trace's spans exported, for the bug's time window | Log lines carry request fields an attacker writes; a file a person picked keeps that bounded |
32
+ | implement (generate, per story) | None — works from the story file shape wrote and the local checkout | None | — | — | — | Implement runs tests (exec) and edits files (write), so it gets **no** tracker or GitHub server: live issue text next to a shell is the dangerous combination. A person skims the story file before implement starts |
33
+ | implement → open PR (generate, per story, optional) | Action: open a draft PR from the pushed branch | GitHub's own server, write configuration — confirm GitHub publishes it (GitHub's own organization, docs on GitHub's domain) | A separate fine-grained token, `orders-api` only: Pull requests read and write, Contents read and write; branch protection on `main` requires review | Merge, approve, push to `main`, change settings or branch protection, touch other repositories | The developer runs the push and opens the PR by hand | Write and exec in one stage, so this stage reads nothing untrusted: no issue comments, no PR comments |
34
+ | verify (verify, per PR) | Repo: the PR diff, description, CI status | GitHub's own server in its read-only mode, limited to the repositories, pull requests and Actions toolsets | A separate fine-grained token, `orders-api` only: Contents read, Pull requests read, Actions read | Merge, approve, comment, request changes, label, re-run CI | The diff saved as a `.diff` file and the PR description copied to a file; the CI summary saved | Contractor PRs and comments are untrusted, and the gate script is exec. Allow only the gate script command in this session; the verdict goes to a person, never posted by the agent |
35
+ | decide (gate, per PR) | None — reads verify's verdict and any design disagreement | None | — | — | — | The merge stays a person's action in GitHub's own UI under their own login |
36
+
37
+ ## Credentials
38
+
39
+ | Variable | Server | Scope | Used by stages | Kind |
40
+ |---|---|---|---|---|
41
+ | None — OAuth sign-in, no stored token | Atlassian | Browse, project ORD | shape | Read |
42
+ | `GH_ORDERS_READ` | GitHub | Contents, Pull requests, Actions: read; `orders-api` | verify | Read |
43
+ | `GH_ORDERS_PR_WRITE` | GitHub | Pull requests and Contents: read and write; `orders-api` | implement → open PR (optional) | Write, separate token |
44
+
45
+ Tokens live in environment variables or the client's secret store. The project's committed MCP
46
+ config holds variable names only. The write server is a separate server entry, enabled only in
47
+ the session that opens the PR, so the verify session never loads it.
48
+
49
+ ## Servers cut
50
+
51
+ - **Datadog** — needed for about one bug a week. A saved log query and exported trace cover it,
52
+ with no standing token to the team's logs and no live attacker-written log lines in context.
53
+ Revisit if bugs needing logs reach several a week.
54
+
55
+ ## Check before installing
56
+
57
+ - **Atlassian's own server** — confirm publisher; it acts with the account's own permissions,
58
+ so the account must have nothing beyond Browse on ORD.
59
+ - **GitHub's own server** — confirm publisher, use its read-only mode for verify, and turn off
60
+ every toolset verify doesn't use.
61
+
62
+ ## To confirm
63
+
64
+ - Whether the team wants the agent to open PRs at all; if not, drop `GH_ORDERS_PR_WRITE`.
65
+ - That branch protection on `main` requires an approving review, so even the write token cannot
66
+ land code alone.
67
+
68
+ Next step: review the finished setup for any path where issue or PR text could make the agent
69
+ send private data out, before the first real story runs through it.
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "mcp-pairing",
3
+ "version": "0.1.0",
4
+ "description": "Recommend which MCP servers to connect for a loop, workflow or task, stage by stage, with the narrowest access that works — what outside context or action each stage needs, the server that provides it (only ones the user named or the vendor officially publishes), the scopes to grant (read-only by default, never write on a review or gate stage), what it must not be able to do, the export-file fallback that keeps the stage running without it, and which stages need no server at all. Use when the user asks \"which MCP servers should we hook up for this loop\", \"what should our agent connect to\", \"what token scopes does this stage need\", \"is this MCP setup too broad\", or wants to wire GitHub, GitLab, Jira, Linear, Slack, Sentry, Grafana or a database into an agent workflow.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": ["agent-loop-design", "agent-threat-model", "ai-usage-policy", "subagent-design"],
9
+ "handoff": [{
10
+ "to": "agent-threat-model",
11
+ "when": "the pairing still puts private data, untrusted content and any way to send data out in one session, or before the setup is connected at work",
12
+ "purpose": "Attack the finished capability surface path by path and break a leg on every path that can leak data.",
13
+ "fallback": "If agent-threat-model is absent, list each stage's session with three marks — private data, untrusted content, egress (write, network, rendered output) — and split or drop any session that holds all three."
14
+ }],
15
+ "tags": ["mcp", "least-privilege", "tool-permissions", "agentic", "prompt-injection"],
16
+ "model": { "tier": "standard", "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." }
17
+ }
@@ -0,0 +1,136 @@
1
+ # mcp-pairing — reference
2
+
3
+ ## Stage types and their access ceiling
4
+
5
+ The type sets the most a stage may ever hold. The stage's output decides whether it gets
6
+ anything at all.
7
+
8
+ | Type | What it does | Ceiling | Why |
9
+ |---|---|---|---|
10
+ | `generate` | Produces an artifact | Read; write **only** when the output *is* the write (a published release, a draft merge request), on its own credential | The write is the deliverable, so it is the one place a write is justified |
11
+ | `verify` | Judges an artifact that exists | Read only | A reviewer that can approve, merge, comment or close has become an actor, and its verdict can no longer be trusted as independent |
12
+ | `gate` | A person or script decides | Read only, and often nothing | The decision is the person's; the merge or ship button stays in the vendor's own UI under the person's own login |
13
+
14
+ A stage that runs a fixed script (a gate script, a test suite) holds **exec**. Exec counts as
15
+ write for rule 6: it must not sit beside live untrusted content unless the only command it can
16
+ run is that fixed script.
17
+
18
+ ## Needs by category
19
+
20
+ | Need | Typical stages | Untrusted? | Read grant | Must not | Export fallback |
21
+ |---|---|---|---|---|---|
22
+ | Tracker issues | shape, triage, status, gather | Yes — anyone with project access, and customers on a service desk | Issues read, one project or team | Create, transition, comment, assign, change fields | The filter exported as CSV, or the issue copied to a text file |
23
+ | Repo / PR / merge request / diff | verify, announce, plan | Yes — PR and merge request text and comments; outside contributors' diffs | Contents and pull/merge requests read, one repository | Merge, approve, push, comment, change settings, read other repositories | The diff saved as a `.diff` file plus the description copied |
24
+ | CI status | verify, ready | Partly — job logs echo whatever the code printed | Pipeline / Actions read, one repository | Re-run, cancel, edit secrets or variables | The pipeline summary page saved, failed job log saved |
25
+ | Docs and wiki | plan, specify, design | Yes when many people edit it | Pages read, one space | Edit, create, change permissions | The page exported to Markdown or PDF |
26
+ | Logs / metrics / traces | triage, ready, respond, learn | Log lines: yes (request fields are attacker-written). Metric values: no | Viewer role, one org or folder; no query of other teams' data sources | Edit dashboards or alerts, silence alerts, create API keys | The panel's data downloaded as CSV; the log query result saved as JSON |
27
+ | Error events | triage, respond, learn | Yes — messages and breadcrumbs carry user input | Issues and events read, one project | Resolve, assign, change alert rules | The event JSON saved from the event page |
28
+ | Design files | specify, design | Comments: yes | File read, one file or project | Edit, comment, share | Frames exported as PNG plus the spec copied |
29
+ | Chat history | respond, status, decision capture | Yes — every member, and external guests in shared channels | History read, named channels only | Post, react, invite, read DMs or all channels | The thread exported or copied to a text file |
30
+ | Database read | review, spec, measure | Free-text columns: yes | A read-only role on a replica, one schema, row limit | Any DDL or DML, superuser, production primary | The query result saved as CSV |
31
+ | Cloud billing | cost review | No | Billing read for one account or profile | Change budgets, buy reservations, touch resources | The cost report exported as CSV |
32
+ | Web | research, gather | Yes, always | Fetch only, no form submission | Hold any write or exec tool in the same session | The pages saved as files the user picked |
33
+
34
+ ## The vetting checks
35
+
36
+ Run all five for any server that is not the vendor's own, and confirm the first three for one
37
+ that is:
38
+
39
+ 1. **Publisher.** Who publishes it, and is that the vendor of the tool it talks to? A personal
40
+ account or an unrelated organization is a community server.
41
+ 2. **Source available.** Can the code be read? A server that ships only a binary or a remote
42
+ endpoint with no published source is trusted on reputation alone.
43
+ 3. **Pinned version.** A local server runs a pinned version or commit, never `@latest` or an
44
+ unpinned `npx` / `uvx` call; container images are pinned to a digest. Upgrades are
45
+ deliberate.
46
+ 4. **Tools exposed.** List the tools it registers. Any tool the stage doesn't need is turned off
47
+ in the server's own toolset option or the client's disabled-tools list.
48
+ 5. **Code and network reach.** Can any tool run a shell, execute code, or call a host other
49
+ than the vendor's API? Either one makes the server an egress path and an exec path, and
50
+ rule 6 applies to every stage it is enabled in.
51
+
52
+ A server that fails 1 or 2 and has no official alternative gets the export-file fallback until
53
+ someone reads its source and pins a commit.
54
+
55
+ ## Known vendor controls
56
+
57
+ Checked 2026-10-01 from the vendors' docs. Confirm in the vendor's current docs before relying
58
+ on any of them; vendors change these without notice.
59
+
60
+ - **GitHub's own server** has a read-only mode and lets a client limit it to named toolsets
61
+ (for example repositories and issues). Fine-grained tokens limit to named repositories.
62
+ - **Linear's own server** offers a read-only mode and a `read` OAuth scope; API keys can be
63
+ created with only the Read permission.
64
+ - **Atlassian's own server** acts with the signed-in user's Jira and Confluence permissions.
65
+ Whatever that user can delete, the agent can delete; use an account with read access to the
66
+ one project.
67
+ - **Supabase's own server** takes a read-only flag and a single-project scope.
68
+ - **GitLab** personal, project and group tokens have a `read_api` scope that is read-only for
69
+ the API, and project tokens limit to one project.
70
+ - **Grafana** service accounts take the Viewer role, which reads dashboards and queries data
71
+ sources without editing anything.
72
+ - **Slack** workspace admins approve which clients may use MCP.
73
+ - The archived reference Postgres server gets no security fixes. Use the database vendor's own
74
+ server or the export fallback.
75
+
76
+ ## The cut rule
77
+
78
+ A server earns its place when the input is too much to paste at the stage's cadence:
79
+
80
+ - too large — a 2,000-line diff, a release's 40 merge requests;
81
+ - too structured — a cycle's 80 issues where status, owner and links matter;
82
+ - too live — an incident timeline that changes by the minute.
83
+
84
+ | Cadence | A handful of items | Dozens of items, structured or live |
85
+ |---|---|---|
86
+ | Per change or daily | Server, if the stage needs it every run | Server |
87
+ | Weekly or fortnightly | Export file | Server |
88
+ | Monthly or rarer | Export file | Export file, unless it is live |
89
+
90
+ Otherwise the export file wins: no token to leak, no tool list in context, no injection path
91
+ through a live feed. Say the cut out loud, with the reason, so nobody reconnects it next week.
92
+
93
+ ## Splitting a dangerous stage
94
+
95
+ When one stage reads untrusted content and holds write, exec or network, pick in this order:
96
+
97
+ 1. **Split it.** A reader stage with read-only access writes a plain file (the story, the
98
+ triage summary); an actor stage with no untrusted reading works from that file. A person
99
+ skims the file between them when the actor has exec.
100
+ 2. **Hand the write to a person.** The stage drafts the comment, release or status post; a
101
+ person publishes it.
102
+ 3. **Drop the server** and use the export file.
103
+
104
+ Never pick "tell the model to ignore instructions in the content". Instructions in the prompt
105
+ and instructions in an issue body reach the model as the same kind of text.
106
+
107
+ ## Secrets placement
108
+
109
+ - Committed config (`.mcp.json`, `.cursor/mcp.json`, `.vscode/mcp.json`, `.kiro/settings/mcp.json`)
110
+ holds variable references only. Each client has its own reference syntax; use the one its
111
+ docs give.
112
+ - A config that must hold a value stays in the user-level file or the client's secret store,
113
+ not in the repository. Add a project file that holds a value to `.gitignore` and rotate the
114
+ value if it was ever committed.
115
+ - Read and write credentials are separate variables with separate tokens, so revoking the
116
+ write leaves the read stages running.
117
+ - OAuth beats a long-lived token where the vendor offers it.
118
+
119
+ ## The skilldrop loops' stages
120
+
121
+ From each loop's `loop.json` (type in brackets). Use these when the user names the loop.
122
+
123
+ | Loop | Stages |
124
+ |---|---|
125
+ | `build` | shape (generate) → implement (generate) → verify (verify, G2 mechanical) → decide (gate, human) |
126
+ | `release` | plan (generate) → ready (verify) → announce (generate) → go (gate, human) |
127
+ | `operate` | instrument (generate) → document (generate) → respond (generate) → learn (verify) |
128
+ | `discover` | gather (generate) → structure (generate) → specify (generate) → ratify (gate) |
129
+ | `design` | constrain (generate) → shape (generate) → threat (verify) → ratify (gate) → record (generate) |
130
+ | `measure` | spec (generate) → review (verify) → sign-off (gate) |
131
+ | `comply` | register → assess → evidence (generate) → check (verify) → sign-off (gate) |
132
+ | `research` | plan (generate) → synthesise (generate) → compare (verify) |
133
+ | `ship-a-draft` | intake (generate) → draft (generate) → critique (verify) → polish (verify) |
134
+ | `apply` | fit (gate) → tailor → letter → form (generate) → confirm (verify) |
135
+
136
+ If the user's copy of a loop has different stages, theirs wins.
@@ -0,0 +1,43 @@
1
+ # MCP pairing — {loop, workflow or task}
2
+
3
+ **Tools in use:** {only the tools the user named} · **Assumptions:** {each tagged [assumption]}
4
+
5
+ ## The plan
6
+
7
+ {Two or three sentences: connect N servers, which ones, read or write; which stages need none;
8
+ which server was cut and why.}
9
+
10
+ ## Pairing by stage
11
+
12
+ | Stage (type, cadence) | Needs | Server | Grant | Must not | Fallback without it | Risk |
13
+ |---|---|---|---|---|---|---|
14
+ | {stage} ({generate / verify / gate}, {per change / daily / weekly / monthly}) | {category of context or action} | {server the user named, or "{vendor}'s own server, confirm {how}", or the category + vetting} | {scope, one project / repo / role} | {merge, comment, transition, post, write SQL…} | {the export file a person produces} | {untrusted content read; write, exec or network held; what to split} |
15
+ | {stage} | None — works from {previous stage's output} | None | — | — | — | — |
16
+
17
+ ## Credentials
18
+
19
+ | Variable | Server | Scope | Used by stages | Kind |
20
+ |---|---|---|---|---|
21
+ | {NAME_READ} | {server} | {scope, project} | {stages} | Read |
22
+ | {NAME_WRITE} | {server} | {scope, project} | {the one stage whose output is the write} | Write, separate token |
23
+
24
+ Tokens live in {environment variables / the client's secret store}. Committed config holds
25
+ variable names only; {any project file that holds a value} stays out of git.
26
+
27
+ ## Servers cut
28
+
29
+ - **{server or category}** — {cadence and why the export file wins}.
30
+
31
+ ## Check before installing
32
+
33
+ For each server not confirmed as the vendor's own: publisher, source available, pinned version
34
+ or commit, tools it exposes (turn off the rest), and whether it can run code or reach the
35
+ network beyond its own API.
36
+
37
+ - **{server}** — {which checks are still open}
38
+
39
+ ## To confirm
40
+
41
+ - {each fact the plan needs and the input didn't give}
42
+
43
+ {One plain sentence on the next step, e.g. reviewing the finished setup for ways data could be sent out.}
@@ -13,7 +13,7 @@ one. Every skill named below stays independently installable and runnable on its
13
13
 
14
14
  | # | Stage | Type | Skills | Gate |
15
15
  |---|---|---|---|---|
16
- | 1 | `shape` | generate | [`user-story-splitter`](../../skills/user-story-splitter/SKILL.md), [`bug-triage`](../../skills/bug-triage/SKILL.md) | — |
16
+ | 1 | `shape` | generate | [`user-story-splitter`](../../skills/user-story-splitter/SKILL.md), [`bug-triage`](../../skills/bug-triage/SKILL.md), [`codebase-tour`](../../skills/codebase-tour/SKILL.md) | — |
17
17
  | 2 | `implement` | generate | [`feature-implement-loop`](../../skills/feature-implement-loop/SKILL.md) | — |
18
18
  | 3 | `verify` | verify | [`pre-merge-review`](../../skills/pre-merge-review/SKILL.md) | **G2** mechanical |
19
19
  | 4 | `decide` | gate | [`council-review`](../../../core/skills/council-review/SKILL.md) | **G2.1** human |
@@ -22,7 +22,9 @@ one. Every skill named below stays independently installable and runnable on its
22
22
 
23
23
  1. **Establish the unit of work.** New capability → `user-story-splitter`. Reported defect →
24
24
  `bug-triage`. The stage is done when there is one vertical slice with acceptance criteria a
25
- test can assert. Vague criteria are the single largest cause of a wasted round 3.
25
+ test can assert. Vague criteria are the single largest cause of a wasted round 3. In a
26
+ repository nobody on the change knows yet, run `codebase-tour` on the slice first: where
27
+ the change goes, the commands that test it, and the traps, each cited to a file.
26
28
  2. **Implement.** Hand the slice to `feature-implement-loop`, which runs its own capped
27
29
  generate-challenge-gate cycle internally. Do not re-implement its rounds here — this loop's
28
30
  `cap` governs returns from G2, not the inner skill's rounds.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0028. This loop is docs/code-implement-verify.mmd promoted from a hand-maintained diagram into the machine-readable source that diagram is now generated from.",
3
3
  "name": "build",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "description": "Take an agreed requirement to merged code through a capped generate-verify-gate loop, with a mechanical gate that decides and a human who owns the merge. Use when the user wants to implement a story, fix a triaged bug, or ask whether a change is safe to merge.",
6
6
  "entrypoint": "LOOP.md",
7
7
  "kind": "loop",
@@ -11,7 +11,7 @@
11
11
  "id": "shape",
12
12
  "type": "generate",
13
13
  "intent": "Turn a requirement or defect into one vertically-sliced unit of work with acceptance criteria.",
14
- "skills": ["user-story-splitter", "bug-triage"]
14
+ "skills": ["user-story-splitter", "bug-triage", "codebase-tour"]
15
15
  },
16
16
  {
17
17
  "id": "implement",
@@ -14,17 +14,19 @@ being folded into either neighbour.
14
14
 
15
15
  | # | Stage | Type | Skills | Gate |
16
16
  |---|---|---|---|---|
17
- | 1 | `plan` | generate | [`migration-plan`](../../skills/migration-plan/SKILL.md) | — |
17
+ | 1 | `plan` | generate | [`migration-plan`](../../skills/migration-plan/SKILL.md), [`rollout-plan`](../../skills/rollout-plan/SKILL.md) | — |
18
18
  | 2 | `ready` | verify | [`launch-readiness`](../../skills/launch-readiness/SKILL.md) | **G3** review |
19
19
  | 3 | `announce` | generate | [`release-notes`](../../skills/release-notes/SKILL.md) | — |
20
20
  | 4 | `go` | gate | [`council-review`](../../../core/skills/council-review/SKILL.md) | **G3.1** human |
21
21
 
22
22
  ## How to run this loop
23
23
 
24
- 1. **Plan the rollout and the way back.** `migration-plan` sets out the phases, a tested
25
- rollback for each one, and at most one named point of no return. For a code-only change
26
- behind a flag, the plan can be short: the flag, the stages and how to turn it off. It still
27
- has to exist.
24
+ 1. **Plan the rollout and the way back.** A change to data, a schema or a platform →
25
+ `migration-plan`: the phases, a tested rollback for each, and at most one named point of
26
+ no return. A code change released behind a flag or a canary → `rollout-plan`: the exposure
27
+ steps, the metric and threshold that decide each one, how long each must run to detect a
28
+ regression, and what turning the flag off doesn't undo. A change that does both gets both.
29
+ The plan can be short, but it has to exist.
28
30
  2. **Judge readiness at G3.** `launch-readiness` lists the change's own failure modes, then
29
31
  checks rollback, detection, response, measured targets, data and privacy, comms and
30
32
  exposure, each with evidence. `REVISE` returns to `plan`, and the report names which gap to
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0031. Covers the step between build (ends at merge, G2.1) and operate (starts at instrument). Its gates are G3 and G3.1: the whole number places the loop in the lifecycle (discover G0 through operate G4), and a decimal is a second gate inside the same loop (RFC-0044).",
3
3
  "name": "release",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "description": "Take merged code to live users through a planned, reversible rollout — plan the phases and the rollback, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. Use when the user has merged a change and asks how to roll it out, whether they are ready to launch, or for a go/no-go decision.",
6
6
  "entrypoint": "LOOP.md",
7
7
  "kind": "loop",
@@ -11,7 +11,7 @@
11
11
  "id": "plan",
12
12
  "type": "generate",
13
13
  "intent": "Decide the rollout phases, the rollback for each, and the one point of no return, before anything reaches users.",
14
- "skills": ["migration-plan"]
14
+ "skills": ["migration-plan", "rollout-plan"]
15
15
  },
16
16
  {
17
17
  "id": "ready",
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: codebase-tour
3
+ description: Get a newcomer (a new engineer, or the agent itself) oriented in an unfamiliar repository before they make one specific change, with a short tour scoped to that change. It gives the install, run and test commands taken from CI, package scripts and the Makefile; the path the change touches, traced through the code with file:line citations; where the change goes; the conventions the code actually follows; the traps (generated files, a second copy of the logic, untested code, env vars, flags); and a first step that can be checked. Use when someone says "I'm new to this repo", "get me oriented", "where would I make this change", "walk me through the code for X", "onboard me before I start this ticket", or "how do I run and test this".
4
+ ---
5
+
6
+ # codebase-tour
7
+
8
+ Orients someone in a repository they have never seen, for **one change they are about to make**. The tour is not a map of the system. It follows the path the change will touch, and it ends at the file and function where the work starts.
9
+
10
+ Two failures make a plain orientation worse than none. The first is a **confident wrong command**: `make dev` copied from a README into a repo whose Makefile has no `dev` target. The second is the **trap nobody mentions**: the generated file someone hand-edits, the second copy of the logic that stays unchanged, the test suite that skips the area. This skill is built around two rules. **Every claim cites the file and line it was read from. The README gives leads to check; the code gives the facts.**
11
+
12
+ Boundaries: a full as-is architecture write-up is `reverse-architecture`. A diagram is `interactive-diagram` or `architecture-diagrams`. A standing agent-policy file for the repo is `agents-md-generator`. Writing the change itself is `feature-implement-loop`, which takes this tour's "where the change goes" and first step as its input. Reviewing the finished diff is `pre-merge-review`.
13
+
14
+ ## How to respond
15
+
16
+ **Four rules come before the steps and outrank them:**
17
+
18
+ - **Answer what was asked, first.** Open the reply with the 3–5 things this person most needs to know for this change. A directory listing is never first.
19
+ - **Use only what you read.** Every statement carries `path:line` (or a path, for a whole file) from this repository. Anything not checked is tagged `[inferred]` with the reason. A fact the repo doesn't give goes under "Open questions". It is not filled in from what the framework usually does.
20
+ - **Deliver from what you have.** Read the repo, state any assumption in one line, and produce the tour. Ask nothing when the repo and the change are both in hand.
21
+ - **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end.
22
+ - **For this skill:** where the README and the code disagree, say so in one line with both citations, and follow the code.
23
+
24
+ 1. **Pin the change in code terms.** Restate it in one sentence using the words the code will use. ✅ *"Reject `POST /orders/{order_id}/refunds` when the event ended more than 14 days ago."* ❌ *"Tighten up refunds."* If no change is named, tour the main path from the primary entry point, tag that scope `[assumption]`, and replace "Where the change goes" with one line asking for the change.
25
+
26
+ 2. **Inventory what the repo says about itself.** Run the fact lister. It is read-only: it prints commands, test files, generated-file markers, env reads and README claims that don't resolve, each with `path:line`.
27
+
28
+ ```bash
29
+ # Claude Code
30
+ python3 "${CLAUDE_SKILL_DIR}/scripts/repo_facts.py" <repo-root>
31
+ # Other IDEs (from the skill folder)
32
+ python3 scripts/repo_facts.py <repo-root>
33
+ ```
34
+
35
+ If no script can run, read these by hand in order: CI workflows (`.github/workflows/`, `.gitlab-ci.yml`), then package scripts, `Makefile`, `justfile`, `tox.ini`, `noxfile.py` and `pyproject.toml`, then `README` and `CONTRIBUTING`. CI ranks first because its commands are the ones that have to pass.
36
+
37
+ 3. **Take commands only from those files, and say which ones ran.** Quote each command with its source. ✅ `make test` (`.github/workflows/ci.yml:21`, which runs `pytest -q -m "not e2e"` per `Makefile:8`). ❌ `make dev` (named in the README; the Makefile has no `dev` target). Prefer CI's form of a command over the script's bare form, and list anything CI needs that a laptop lacks (a database service, an env var set in the workflow). Give each command one status:
38
+ - `ran: passed` or `ran: failed` with the first error line. Run only commands that stay inside the repo: tests, lint, typecheck or build, and only when the toolchain and dependencies are already installed.
39
+ - `read, not run` for everything else. That covers dependency installs, anything that needs a database, a network service or credentials, deploys, migrations, publishing, and generators that rewrite tracked files. Run these only when the user asks.
40
+
41
+ A command to run one test file or one test is **derived**. It goes through the repo's own script or runner, plus that runner's filter argument, and it is labelled `derived from <source>`. ✅ `pytest -q -m "not e2e" tests/rules/test_refunds.py` (derived from `Makefile:8`). ❌ `python -m unittest` in a repo that runs pytest. A runner the repo never calls is invented. Leave it out.
42
+
43
+ 4. **Trace the path the change touches.** Search for the change's nouns: the route string, the CLI flag, the field or column name, the error code. Work outward to the entry point (`main`, the server bootstrap, the console script, the job scheduler). Then write the path forward as numbered hops. Each hop is `path:line` `function`, plus one line on what it does there. Stop at the far edge of the change, usually the database call or the outbound request. Keep it to 10 hops or fewer. A hop you couldn't trace is `[inferred]`, with what you'd need to confirm it.
44
+
45
+ 5. **Say where the change goes, and why there.** Name the files and functions. Justify each one with the pattern its nearest sibling already follows. ✅ *"Every other refund rule lives in `check_refundable` (`tallyhall/rules/refunds.py:9`), which the route calls at `tallyhall/api/refunds.py:22`. The window check goes in `check_refundable` too."* List **everything that has to change together**: a spec and the types generated from it, a registry the new code must be added to, a second copy of the logic.
46
+
47
+ 6. **Read the conventions from the code nearest the change, not from the README.** Cover naming, how errors are raised and returned, test layout and naming, how config and env vars are read, and logging, but only the ones this change will hit. Each gets a citation from code. ✅ *"Errors: raise `RefundRejected(code, message)`; the route turns it into a 422 (`tallyhall/rules/refunds.py:4`, `tallyhall/api/refunds.py:25`)."* Where a file on the path breaks its own convention, say so. That file is the one a newcomer copies by mistake. Every README or `CONTRIBUTING` claim the code contradicts (a command, a path, where config lives, how a plugin is registered) goes under "Where the README is wrong", with both citations.
48
+
49
+ 7. **Hunt the traps.** Check each one and report what you found. Write "none found" when a check comes up empty, so the person knows it was done.
50
+ - **Generated files**: the marker line, the source they come from, the command that regenerates them, and whether CI checks for drift.
51
+ - **Duplicated logic**: search for the change's identifiers, SQL, literals and constants outside the main path. A second copy is either updated in the same change or left alone on purpose, and the tour says which is the open question.
52
+ - **Untested code on the path**: name each function on the path that no test calls.
53
+ - **Tests the default command skips**: markers (`-m "not slow"`), build tags, include globs.
54
+ - **Env vars and feature flags the path reads**: the name, the default, and the line that reads it.
55
+ - **Vendored code** on the path, and where it comes from upstream.
56
+
57
+ 8. **Find the tests for the area, and how to run just those.** Name the test files that exercise the path, the command for the whole suite, and the derived command for only these files. When the area has no tests, say so plainly: ✅ *"Nothing tests `tallyhall/admin/bulk_refund.py`. The first step adds one."*
58
+
59
+ 9. **Name the first step: small, local, and verifiable.** It says what to do in which file, the command to run, and the result that shows it worked. A failing test next to an existing one is the usual best first step. ✅ *"Add `test_rejects_refund_after_window` to `tests/rules/test_refunds.py`, with an order whose event ended 15 days ago; run `pytest -q -m "not e2e" tests/rules/test_refunds.py`; it fails until `check_refundable` checks the window."*
60
+
61
+ 10. **List open questions for a maintainer.** Five at most. Each one can be answered in a sentence and points at the evidence that raised it. ✅ *"Should the support bulk-refund tool (`tallyhall/admin/bulk_refund.py:27`) apply the 14-day window too, or is it the override?"*
62
+
63
+ 11. **Write it with [`templates/codebase-tour.md`](templates/codebase-tour.md), under the caps.** The whole tour is ≤ ~120 lines and each section is ≤ ~15 lines, about one screen. The scope line names what was **deliberately skipped**: the areas not on the path, the services not read. That way the person knows it is a scoped tour and not a survey. If a section would overflow, cut the hops and conventions furthest from the change first.
64
+
65
+ 12. **Reply.** Lead with the 3–5 bullets, then the tour. Put the tour in the reply. Write it to a file only when the user names a path, and change nothing else in the repository.
66
+
67
+ **Non-interactive runs** (subagent, CI, headless): an unnamed change becomes a main-path tour tagged `[assumption]` (step 1). Unclear scope boundaries become `[assumption]` lines at the top. A repository that cannot be read emits `BLOCKED: need read access to the repository — every claim in the tour cites a file in it`, followed by one plain sentence saying the tour follows once the files can be read. A tour is never written from a description of a repo.
68
+
69
+ ## Useful references in this skill
70
+
71
+ - [`templates/codebase-tour.md`](templates/codebase-tour.md): the tour skeleton, with section order and line budgets
72
+ - [`scripts/repo_facts.py`](scripts/repo_facts.py): read-only, stdlib-only fact lister (commands with provenance, README commands and paths that don't resolve, tests, generated markers, env reads)
73
+ - [`examples/refund-window.md`](examples/refund-window.md): worked input → output for a Python service, including a README that disagrees with the code and a second copy of a rule
74
+
75
+ ## Quality bar
76
+
77
+ - **Every claim has a citation or an `[inferred]` tag.** Run a spot check: pick any three statements in the tour, and each must lead to a file and line that says it.
78
+ - **Zero invented commands.** Every command traces to CI, a package script, a Makefile, a tox or nox session or pyproject, or it is a labelled derived filter of a runner the repo already calls.
79
+ - **Ran and read are never blurred.** Every command carries `ran: passed`, `ran: failed`, or `read, not run`.
80
+ - **README-versus-code conflicts are named**, each with both citations and the code taken as the fact.
81
+ - **Scoped, not surveyed.** The path stops at the change's far edge, the tour fits the caps, and the scope line says what was skipped.
82
+ - **The trap checks all report**, including "none found". A second copy of the logic, when one exists, is named with its location.
83
+ - **The tests for the area are named, with a command for just those**, or the tour says plainly that there are none.
84
+ - **It ends at a place to work.** Files and functions, then a first step with a command and an expected result, then at most five open questions.
85
+ - **The reply leads with the 3–5 things that matter**, not a tree.
86
+
87
+ ## When to use this skill
88
+
89
+ - ✅ "I'm new to this repo and need to add X. Get me oriented."
90
+ - ✅ A ticket is picked up in an unfamiliar codebase and the first hour is going on finding where things live
91
+ - ✅ An agent is about to implement a change in a repo it has not read, and needs the commands and traps before writing code
92
+ - ✅ "How do I run and test this, and where would this change go?"
93
+ - ✅ Handing a scoped piece of work to a contractor or a new teammate with a page that is true
94
+
95
+ ## When NOT to use this skill
96
+
97
+ - ❌ A full as-is architecture write-up or diagram of the whole system: `reverse-architecture`
98
+ - ❌ Drawing a diagram of a flow or a system: `interactive-diagram` or `architecture-diagrams`
99
+ - ❌ Writing a standing `AGENTS.md` or agent-policy file for the repo: `agents-md-generator`
100
+ - ❌ Writing the code for the change: `feature-implement-loop`
101
+ - ❌ Reviewing a diff that already exists: `pre-merge-review`
102
+
103
+ ## Anti-patterns to avoid
104
+
105
+ - ❌ **Copying the README's commands.** A README goes stale first. Check every command it names against the scripts and CI, and report the ones that don't exist.
106
+ - ❌ **Ecosystem-default commands.** `pytest` for a repo that runs `nox -s tests`, `make test` in a repo with no Makefile. The repo says what it runs.
107
+ - ❌ **"Run the tests" without saying whether you did.** A reader can't tell a command that passed from one copied out of a file.
108
+ - ❌ **The architecture survey.** Twelve services described, and the one function the change touches never named. Follow the path; skip the rest and say so.
109
+ - ❌ **A directory tree as the opening.** The person can run `ls`. Open with what changes their next hour.
110
+ - ❌ **Conventions from the style guide.** `CONTRIBUTING.md` says "use custom error classes"; the handler on the path returns `{ error: string }`. Report what the code does, and flag the gap.
111
+ - ❌ **Missing the second copy.** The change lands in the API route, and the admin tool with its own copy of the same rule keeps the old behaviour. Search for the identifiers before naming where the change goes.
112
+ - ❌ **Editing a generated file in the first step.** Name the source and the regenerate command instead.
113
+ - ❌ **Running something with side effects to "check it works".** Deploys, migrations, installs that hit the network, and generators that rewrite tracked files stay `read, not run` unless the user asks.
114
+ - ❌ **A first step that can't be checked.** "Get familiar with the handler" is not a step. Name a file, a command and an expected result.
115
+ - ❌ **Showing the machinery.** No skill names, script names or caps in the reply or the tour.
@@ -0,0 +1,13 @@
1
+ [
2
+ { "query": "I'm new to this repo and need to add rate limiting to the login endpoint. Get me oriented.", "should_trigger": true },
3
+ { "query": "Before I start this ticket, walk me through the code that handles invoice exports", "should_trigger": true },
4
+ { "query": "Where would I make this change? I've never seen this codebase", "should_trigger": true },
5
+ { "query": "How do I run and test this project, and where does the payment retry logic live?", "should_trigger": true },
6
+ { "query": "Onboard me to this repo so I can fix the timezone bug in the scheduler", "should_trigger": true },
7
+
8
+ { "query": "Reverse-engineer the architecture of this whole system and draw the as-is diagram", "should_trigger": false },
9
+ { "query": "Write an AGENTS.md for this repo so agents stop running the wrong commands", "should_trigger": false },
10
+ { "query": "Implement the carrier filter on GET /shipments with tests, here are the acceptance criteria", "should_trigger": false },
11
+ { "query": "Review my diff before I merge it", "should_trigger": false },
12
+ { "query": "Make an interactive diagram of how a request flows through our services", "should_trigger": false }
13
+ ]