skilldrop-cli 0.16.28 → 0.16.30
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.
- package/bin/skilldrop.js +160 -33
- package/catalogue.json +7 -3
- package/model-routing.json +16 -0
- package/package.json +1 -1
- package/packs/ai-engineering/skills/mcp-pairing/SKILL.md +93 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/eval_queries.json +13 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/evals.json +76 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/2/mcp.json +32 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/.mcp.json +47 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/docs/pr-loop.md +12 -0
- package/packs/ai-engineering/skills/mcp-pairing/evals/files/5/docs/oncall-triage.md +18 -0
- package/packs/ai-engineering/skills/mcp-pairing/examples/build-loop-github-jira-datadog.md +69 -0
- package/packs/ai-engineering/skills/mcp-pairing/manifest.json +17 -0
- package/packs/ai-engineering/skills/mcp-pairing/reference.md +136 -0
- package/packs/ai-engineering/skills/mcp-pairing/templates/mcp-pairing.md +43 -0
- package/packs/data-analytics/loops/measure/LOOP.md +118 -0
- package/packs/data-analytics/loops/measure/evals/eval_queries.json +9 -0
- package/packs/data-analytics/loops/measure/evals/evals.json +28 -0
- package/packs/data-analytics/loops/measure/loop.json +41 -0
- package/packs/dev-team/loops/build/LOOP.md +4 -2
- package/packs/dev-team/loops/build/loop.json +2 -2
- package/packs/dev-team/skills/codebase-tour/SKILL.md +115 -0
- package/packs/dev-team/skills/codebase-tour/evals/eval_queries.json +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/evals.json +77 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/.github/workflows/ci.yml +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/README.md +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/openapi.yaml +21 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/package-lock.json +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/package.json +29 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/config.ts +20 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/filter.ts +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/repository.ts +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/errors.ts +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/generated/api-types.ts +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/handlers/shipments.ts +38 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/routes.ts +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/jobs/export-shipments.ts +22 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/src/server.ts +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/domain/filter.test.ts +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/http/shipments.test.ts +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/tsconfig.json +10 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/1/vitest.config.ts +5 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/.github/workflows/ci.yml +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/README.md +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/noxfile.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/pyproject.toml +22 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/__init__.py +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/_version.py +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/cli.py +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/detect.py +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/errors.py +2 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/money.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/__init__.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/acme.py +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/base.py +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/harbor.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/fixtures/acme_sample.csv +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_acme.py +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_detect.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/.github/workflows/ci.yml +28 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/Makefile +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/README.md +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/cmd/tidepool/main.go +24 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/go.mod +5 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/config/config.go +38 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher.go +52 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher_test.go +42 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/sender.go +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/replay/replay.go +31 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/db.go +35 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql.go +30 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/schema.sql +6 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/store_integration_test.go +21 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/3/sqlc.yaml +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/.env.example +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/.github/workflows/ci.yml +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/Makefile +16 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/README.md +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/data/rates.csv +4 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/pyproject.toml +19 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/scripts/gen_rates.py +29 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/preview.py +14 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/routes.py +36 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/config.py +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/discounts.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/__init__.py +0 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/rates_table.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/main.py +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/shipping.py +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/tax.py +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/conftest.py +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_discounts.py +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_tax.py +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/.env.example +3 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/.github/workflows/ci.yml +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/README.md +18 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/package.json +13 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/openapi.json +30 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/package.json +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/db.js +19 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/flags.js +8 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/generated/schema.js +32 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/middleware/validate.js +20 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/routes/bookings.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/server.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/bookings.js +23 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/pricing.js +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/test/pricing.test.js +15 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/package.json +9 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/bookingForm.js +11 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/format.js +7 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/test/format.test.js +12 -0
- package/packs/dev-team/skills/codebase-tour/evals/files/5/scripts/gen-schema.mjs +27 -0
- package/packs/dev-team/skills/codebase-tour/examples/refund-window.md +158 -0
- package/packs/dev-team/skills/codebase-tour/manifest.json +47 -0
- package/packs/dev-team/skills/codebase-tour/scripts/repo_facts.py +403 -0
- package/packs/dev-team/skills/codebase-tour/templates/codebase-tour.md +85 -0
- package/packs/dev-team/skills/dependency-upgrade-review/SKILL.md +101 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/eval_queries.json +11 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/evals.json +77 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/.github/workflows/ci.yml +20 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/pr.diff +87 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/quillmark-CHANGELOG.md +24 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/comment.js +6 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/note.js +8 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/test/note.test.js +12 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/ci.yml +23 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/release.yml +23 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/pr.diff +32 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/release-notes.md +20 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/.github/workflows/ci.yml +18 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/Dockerfile +8 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/PR.md +36 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/pr.diff +47 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/client.py +24 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/reader.py +32 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/tests/test_reader.py +15 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/upstream/quillstream-CHANGELOG.md +37 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/ci.yml +22 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/release.yml +25 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.nvmrc +1 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-412.md +16 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-413.md +15 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/package.json +21 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-412.diff +26 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-413.diff +84 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/scripts/release.mjs +18 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/release-notary-CHANGELOG.md +16 -0
- package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/setup-toolchain-RELEASES.md +22 -0
- package/packs/dev-team/skills/dependency-upgrade-review/examples/inputs/ledgerline.diff +38 -0
- package/packs/dev-team/skills/dependency-upgrade-review/examples/ledgerline-tidyparse.md +91 -0
- package/packs/dev-team/skills/dependency-upgrade-review/manifest.json +50 -0
- package/packs/dev-team/skills/dependency-upgrade-review/reference.md +99 -0
- package/packs/dev-team/skills/dependency-upgrade-review/scripts/upgrade_diff.py +718 -0
- package/packs/grc/loops/comply/LOOP.md +133 -0
- package/packs/grc/loops/comply/evals/eval_queries.json +9 -0
- package/packs/grc/loops/comply/evals/evals.json +30 -0
- package/packs/grc/loops/comply/loop.json +54 -0
- package/packs/product-manager/loops/discover/LOOP.md +5 -4
- package/packs/product-manager/loops/discover/loop.json +2 -2
- package/packs/product-manager/skills/feedback-synthesis/SKILL.md +182 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/eval_queries.json +46 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/evals.json +76 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/interview-notes.md +47 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/nps-verbatims.csv +13 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/1/support-tickets.csv +36 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/3/churn-exit-survey.csv +11 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/3/sales-call-notes.md +55 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/4/csat_comments_q3.csv +17 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/4/support_tickets_q3.csv +49 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/5/app_reviews_last_60_days.csv +32 -0
- package/packs/product-manager/skills/feedback-synthesis/evals/files/5/interview_notes_round1.md +48 -0
- package/packs/product-manager/skills/feedback-synthesis/examples/booking-app-feedback.md +139 -0
- package/packs/product-manager/skills/feedback-synthesis/examples/inputs/booking-app-coded.csv +17 -0
- package/packs/product-manager/skills/feedback-synthesis/manifest.json +53 -0
- package/packs/product-manager/skills/feedback-synthesis/reference.md +89 -0
- package/packs/product-manager/skills/feedback-synthesis/scripts/theme_counts.py +355 -0
- package/packs/product-manager/skills/feedback-synthesis/templates/coding-sheet.csv +6 -0
- package/packs/product-manager/skills/feedback-synthesis/templates/synthesis.md +42 -0
- package/packs/research/loops/research/LOOP.md +123 -0
- package/packs/research/loops/research/evals/eval_queries.json +9 -0
- package/packs/research/loops/research/evals/evals.json +39 -0
- package/packs/research/loops/research/loop.json +35 -0
|
@@ -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.}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: measure
|
|
3
|
+
description: Take a dashboard request to a spec a BI developer can build on numbers people can defend: the decision it serves and one chart per question, every metric defined, the SQL behind each metric reviewed for the bugs that quietly inflate a figure, and the metric owner's sign-off on each definition before anything is built. Use when the user says "we need a dashboard for…", "run the measure loop", "make sure these numbers are right before the BI team builds it", or two teams disagree about a number that is about to go on a dashboard.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# measure
|
|
7
|
+
|
|
8
|
+
One dashboard, from the request to a spec whose numbers have been checked. A wrong number
|
|
9
|
+
on a dashboard does more damage than a wrong number in a query, because the chart makes it
|
|
10
|
+
look settled. So the loop reviews the SQL before anything is built, and it only reviews the
|
|
11
|
+
queries that matter. The spec runs first and cuts the charts that serve no decision, so no
|
|
12
|
+
time goes on queries for charts that won't exist. Last, each metric's owner confirms the
|
|
13
|
+
definition, because a query can be correct and still compute the wrong thing.
|
|
14
|
+
|
|
15
|
+
## Stages
|
|
16
|
+
|
|
17
|
+
| # | Stage | Type | Skills | Gate |
|
|
18
|
+
|---|---|---|---|---|
|
|
19
|
+
| 1 | `spec` | generate | [`dashboard-spec`](../../skills/dashboard-spec/SKILL.md) | — |
|
|
20
|
+
| 2 | `review` | verify | [`sql-review`](../../skills/sql-review/SKILL.md) | **G9** review |
|
|
21
|
+
| 3 | `sign-off` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G9.1** human |
|
|
22
|
+
|
|
23
|
+
## How to run this loop
|
|
24
|
+
|
|
25
|
+
1. **Spec the dashboard.** Run `dashboard-spec` with the audience, the decision and the
|
|
26
|
+
charts people asked for. Save `dashboard-spec.md`. Its cut list removes charts before any
|
|
27
|
+
SQL is read. Every surviving chart names its metric by defined name, grain, window and
|
|
28
|
+
comparison. A metric with no written definition is marked `undefined`. Write it down as
|
|
29
|
+
the person states it, or leave it as a question for the metric's owner. Don't define it
|
|
30
|
+
yourself.
|
|
31
|
+
2. **Collect one query per surviving metric.** The person supplies the SQL, the dbt model or
|
|
32
|
+
the view that computes each one, with the engine and what one output row represents.
|
|
33
|
+
Where none exists yet, draft one from the definition and the schema they supply, and
|
|
34
|
+
mark it as a draft. A metric with no query and no schema to draft from is `BLOCKED` for
|
|
35
|
+
that metric, not skipped.
|
|
36
|
+
3. **Review every query at G9.** Run `sql-review` on each, one at a time. Collect each
|
|
37
|
+
review's verdict line, findings, corrected query and verification queries. Ask the person
|
|
38
|
+
to run the verification queries, or run them yourself when you have access.
|
|
39
|
+
4. **Map the reviews to G9's verdict:**
|
|
40
|
+
- every query `SHIP IT` or `SHIP WITH NOTES` → `READY`. The notes travel to the owner at G9.1.
|
|
41
|
+
- any query `BLOCK` or `FIX FIRST` → `NOT READY`. Return to `spec`. The corrected query
|
|
42
|
+
becomes that metric's source in the spec, and its verification results go beside it.
|
|
43
|
+
The fix changes the number the chart will show, sometimes by a lot, so its target,
|
|
44
|
+
comparison and any threshold the decision uses need checking against it. Then review
|
|
45
|
+
the corrected query again. Each return counts against the cap.
|
|
46
|
+
5. **Critique, then put each definition to its owner at G9.1.** Run `doc-critique` on the
|
|
47
|
+
spec. Then show each metric's owner:
|
|
48
|
+
- the definition in words;
|
|
49
|
+
- the reviewed query;
|
|
50
|
+
- what changed and by how much, from the verification queries;
|
|
51
|
+
- every assumption the review made about keys, time zones and exclusions.
|
|
52
|
+
|
|
53
|
+
The owner confirms that this is what the business means by the metric. The BI developer
|
|
54
|
+
builds only from a spec that has passed G9.1.
|
|
55
|
+
|
|
56
|
+
## Verdicts
|
|
57
|
+
|
|
58
|
+
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json).
|
|
59
|
+
|
|
60
|
+
- G9 emits `READY`, `NOT READY` or `BLOCKED` (no query text, or no engine to review it
|
|
61
|
+
against).
|
|
62
|
+
- G9.1 emits:
|
|
63
|
+
- `PROCEED`: every metric's owner confirmed its definition and number.
|
|
64
|
+
- `PROCEED WITH CONDITIONS`: confirmed, with named items that travel to the build, such as
|
|
65
|
+
a `SHIP WITH NOTES` caveat shown on the chart, or a data gap with its date.
|
|
66
|
+
- `REVISE`: an owner says the definition is wrong (the wrong time zone, an exclusion
|
|
67
|
+
missing, the wrong grain). Return to `spec` with their definition.
|
|
68
|
+
- `BLOCKED`: an `undefined` metric has no owner to define it, or an owner is unavailable.
|
|
69
|
+
|
|
70
|
+
An `undefined` metric can't pass G9.1. Its owner defines it, or the chart moves to the cut
|
|
71
|
+
list with the reason.
|
|
72
|
+
|
|
73
|
+
## Non-interactive runs
|
|
74
|
+
|
|
75
|
+
With no person present, G9.1 cannot be satisfied. Run `spec` and `review`, deliver the spec
|
|
76
|
+
with each query's review, and emit `BLOCKED: need each metric owner's confirmation of
|
|
77
|
+
<every metric on the spec>`. A metric whose query passed G9 still needs its owner: the review
|
|
78
|
+
says the SQL computes the definition, not that the definition is right. Never confirm a definition on an owner's behalf, and never fill an
|
|
79
|
+
`undefined` metric with a plausible one: two teams will each read it as theirs.
|
|
80
|
+
|
|
81
|
+
## When a stage's skill is not installed
|
|
82
|
+
|
|
83
|
+
Name the missing skill and skilldrop as its source, do the minimal inline version of that
|
|
84
|
+
stage, and record that it ran degraded. A degraded `review` still checks every join for
|
|
85
|
+
fan-out, every filter for NULLs and every date boundary for its time zone, in that order,
|
|
86
|
+
because those are the bugs that change the number. Never skip G9.1.
|
|
87
|
+
|
|
88
|
+
## Run log (opt-in)
|
|
89
|
+
|
|
90
|
+
Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
|
|
91
|
+
gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
|
|
92
|
+
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
printf '%s\n' '{"ts":"2026-10-19T14:03:00Z","loop":"measure","stage":"review","gate":"G9","verdict":"NOT READY","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
99
|
+
gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
|
|
100
|
+
The log holds verdicts only: never a query, a table name or a figure.
|
|
101
|
+
`skilldrop loop-stats` summarises the file.
|
|
102
|
+
|
|
103
|
+
## Quality bar
|
|
104
|
+
|
|
105
|
+
- **The cut list runs before any SQL is read.** Only the queries behind charts that serve the decision get reviewed.
|
|
106
|
+
- **Every surviving chart's metric has a definition and a reviewed query.** `undefined` and unreviewed are build blockers, not notes.
|
|
107
|
+
- **A fixed query goes back through the spec.** The corrected number can move a target or a threshold, and the spec is where those live.
|
|
108
|
+
- **The owner sees the change in the number.** The verification queries' before and after go to G9.1, not only the corrected SQL.
|
|
109
|
+
- **The metric's owner signs the definition.** A correct query for the wrong definition is still the wrong number.
|
|
110
|
+
|
|
111
|
+
## Anti-patterns to avoid
|
|
112
|
+
|
|
113
|
+
- ❌ **Reviewing every query in the BI tool.** Queries for charts the spec cut cost review time and add nothing.
|
|
114
|
+
- ❌ **Defining an `undefined` metric yourself to finish the spec.** That settles a disagreement between two teams by picking one at random.
|
|
115
|
+
- ❌ **Shipping the corrected SQL without telling the owner the number moved.** A revenue figure that drops a third overnight with no explanation gets reverted.
|
|
116
|
+
- ❌ **Passing G9 on a clean lint.** The lint can't see join fan-out; the review reads the joins.
|
|
117
|
+
- ❌ **Treating `SHIP WITH NOTES` as `SHIP IT`.** The notes go to the owner and, where they change how the chart reads, onto the chart.
|
|
118
|
+
- ❌ **Building before G9.1.** A dashboard built on an unconfirmed definition is the one the two teams will argue about.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
[
|
|
2
|
+
{"query": "we need a weekly revenue dashboard for the regional leads, and the numbers have to be right", "should_trigger": true},
|
|
3
|
+
{"query": "run the measure loop on the support KPI dashboard request", "should_trigger": true},
|
|
4
|
+
{"query": "make sure these numbers are right before the BI team builds the exec dashboard", "should_trigger": true},
|
|
5
|
+
{"query": "finance and sales disagree on active customers and it's going on the board dashboard", "should_trigger": true},
|
|
6
|
+
{"query": "is this SQL query right?", "should_trigger": false},
|
|
7
|
+
{"query": "what charts should go on our marketing dashboard?", "should_trigger": false},
|
|
8
|
+
{"query": "define the success metric for the new onboarding flow", "should_trigger": false}
|
|
9
|
+
]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"loop_name": "measure",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": "spec-first-then-review",
|
|
6
|
+
"prompt": "Run the measure loop. Regional sales leads want a dashboard to decide each Monday where to send the two floating account managers. They asked for: weekly revenue by region, revenue all time, website sessions, active customers, average deal size by region, and a map. Revenue's query is in revenue.sql (Postgres; one row per region per week; customers.customer_id is unique and an order has many order_items). Nobody has written down what 'active customer' means; sales counts anyone with an open opportunity, finance counts anyone invoiced in 90 days.",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"Runs dashboard-spec first and writes the decision statement before reviewing any SQL",
|
|
9
|
+
"Cuts all-time revenue, website sessions and the map with reasons",
|
|
10
|
+
"Marks active customers as undefined and does not choose between the sales and finance definitions",
|
|
11
|
+
"Reviews revenue.sql and flags the order_items join as multiplying revenue",
|
|
12
|
+
"Reports G9 as NOT READY and returns to spec with the corrected query as the metric's source",
|
|
13
|
+
"Lists verification queries that show how much the revenue number changes",
|
|
14
|
+
"Stops at G9.1 asking the metric owners to confirm; does not confirm a definition itself"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "owner-rejects-the-definition",
|
|
19
|
+
"prompt": "Continuing the measure loop. The revenue owner, finance, says the corrected query is right but revenue must be booked in New York time and exclude refunded orders. The query uses UTC and doesn't look at refunds.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Treats this as G9.1 REVISE and returns to spec with finance's definition",
|
|
22
|
+
"Updates the revenue metric's definition in the spec to New York time and excluding refunded orders",
|
|
23
|
+
"Reviews the changed query again at G9 before returning to sign-off",
|
|
24
|
+
"Counts the return under the cap of 3"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "RFC-0052. A dashboard request to a spec whose every number is defined and whose every query has been reviewed. The spec comes first so only the queries behind charts that survive the cut list are reviewed; the metric's owner signs last, because only they can say a definition is what the business means.",
|
|
3
|
+
"name": "measure",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Take a dashboard request to a spec a BI developer can build on numbers people can defend: the decision it serves and one chart per question, every metric defined, the SQL behind each metric reviewed for the bugs that quietly inflate a figure, and the metric owner's sign-off on each definition before anything is built. Use when the user says \"we need a dashboard for…\", \"run the measure loop\", \"make sure these numbers are right before the BI team builds it\", or two teams disagree about a number that is about to go on a dashboard.",
|
|
6
|
+
"entrypoint": "LOOP.md",
|
|
7
|
+
"kind": "loop",
|
|
8
|
+
"cap": 3,
|
|
9
|
+
"stages": [
|
|
10
|
+
{
|
|
11
|
+
"id": "spec",
|
|
12
|
+
"type": "generate",
|
|
13
|
+
"intent": "Pin the audience and the decision, keep only the charts that serve it, and name the defined metric behind each, flagging any metric nobody has defined.",
|
|
14
|
+
"skills": ["dashboard-spec"]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "review",
|
|
18
|
+
"type": "verify",
|
|
19
|
+
"intent": "Review the query behind every metric that survived the cut list, correctness before performance, with corrected SQL and the queries that prove the fix.",
|
|
20
|
+
"skills": ["sql-review"],
|
|
21
|
+
"gate": {
|
|
22
|
+
"id": "G9",
|
|
23
|
+
"kind": "review",
|
|
24
|
+
"verdicts": ["READY", "NOT READY", "BLOCKED"],
|
|
25
|
+
"revise_to": "spec"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "sign-off",
|
|
30
|
+
"type": "gate",
|
|
31
|
+
"intent": "Each metric's owner confirms its definition and the number its reviewed query now produces. The critique informs that decision; it does not make it.",
|
|
32
|
+
"skills": ["doc-critique"],
|
|
33
|
+
"gate": {
|
|
34
|
+
"id": "G9.1",
|
|
35
|
+
"kind": "human",
|
|
36
|
+
"verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "BLOCKED"],
|
|
37
|
+
"revise_to": "spec"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
@@ -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.
|
|
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",
|