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.
Files changed (186) hide show
  1. package/bin/skilldrop.js +160 -33
  2. package/catalogue.json +7 -3
  3. package/model-routing.json +16 -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/data-analytics/loops/measure/LOOP.md +118 -0
  17. package/packs/data-analytics/loops/measure/evals/eval_queries.json +9 -0
  18. package/packs/data-analytics/loops/measure/evals/evals.json +28 -0
  19. package/packs/data-analytics/loops/measure/loop.json +41 -0
  20. package/packs/dev-team/loops/build/LOOP.md +4 -2
  21. package/packs/dev-team/loops/build/loop.json +2 -2
  22. package/packs/dev-team/skills/codebase-tour/SKILL.md +115 -0
  23. package/packs/dev-team/skills/codebase-tour/evals/eval_queries.json +13 -0
  24. package/packs/dev-team/skills/codebase-tour/evals/evals.json +77 -0
  25. package/packs/dev-team/skills/codebase-tour/evals/files/1/.github/workflows/ci.yml +23 -0
  26. package/packs/dev-team/skills/codebase-tour/evals/files/1/README.md +23 -0
  27. package/packs/dev-team/skills/codebase-tour/evals/files/1/openapi.yaml +21 -0
  28. package/packs/dev-team/skills/codebase-tour/evals/files/1/package-lock.json +7 -0
  29. package/packs/dev-team/skills/codebase-tour/evals/files/1/package.json +29 -0
  30. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/config.ts +20 -0
  31. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/filter.ts +24 -0
  32. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/domain/shipments/repository.ts +15 -0
  33. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/errors.ts +9 -0
  34. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/generated/api-types.ts +9 -0
  35. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/handlers/shipments.ts +38 -0
  36. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/http/routes.ts +7 -0
  37. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/jobs/export-shipments.ts +22 -0
  38. package/packs/dev-team/skills/codebase-tour/evals/files/1/src/server.ts +18 -0
  39. package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/domain/filter.test.ts +16 -0
  40. package/packs/dev-team/skills/codebase-tour/evals/files/1/tests/http/shipments.test.ts +18 -0
  41. package/packs/dev-team/skills/codebase-tour/evals/files/1/tsconfig.json +10 -0
  42. package/packs/dev-team/skills/codebase-tour/evals/files/1/vitest.config.ts +5 -0
  43. package/packs/dev-team/skills/codebase-tour/evals/files/2/.github/workflows/ci.yml +16 -0
  44. package/packs/dev-team/skills/codebase-tour/evals/files/2/README.md +16 -0
  45. package/packs/dev-team/skills/codebase-tour/evals/files/2/noxfile.py +14 -0
  46. package/packs/dev-team/skills/codebase-tour/evals/files/2/pyproject.toml +22 -0
  47. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/__init__.py +3 -0
  48. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/_version.py +4 -0
  49. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/cli.py +32 -0
  50. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/detect.py +15 -0
  51. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/errors.py +2 -0
  52. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/money.py +14 -0
  53. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/__init__.py +8 -0
  54. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/acme.py +18 -0
  55. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/base.py +24 -0
  56. package/packs/dev-team/skills/codebase-tour/evals/files/2/src/ledgerline/parsers/harbor.py +13 -0
  57. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/fixtures/acme_sample.csv +3 -0
  58. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_acme.py +23 -0
  59. package/packs/dev-team/skills/codebase-tour/evals/files/2/tests/test_detect.py +13 -0
  60. package/packs/dev-team/skills/codebase-tour/evals/files/3/.github/workflows/ci.yml +28 -0
  61. package/packs/dev-team/skills/codebase-tour/evals/files/3/Makefile +16 -0
  62. package/packs/dev-team/skills/codebase-tour/evals/files/3/README.md +16 -0
  63. package/packs/dev-team/skills/codebase-tour/evals/files/3/cmd/tidepool/main.go +24 -0
  64. package/packs/dev-team/skills/codebase-tour/evals/files/3/go.mod +5 -0
  65. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/config/config.go +38 -0
  66. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher.go +52 -0
  67. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/dispatcher_test.go +42 -0
  68. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/dispatch/sender.go +32 -0
  69. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/replay/replay.go +31 -0
  70. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/db.go +35 -0
  71. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql +11 -0
  72. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/query.sql.go +30 -0
  73. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/schema.sql +6 -0
  74. package/packs/dev-team/skills/codebase-tour/evals/files/3/internal/store/store_integration_test.go +21 -0
  75. package/packs/dev-team/skills/codebase-tour/evals/files/3/sqlc.yaml +9 -0
  76. package/packs/dev-team/skills/codebase-tour/evals/files/4/.env.example +4 -0
  77. package/packs/dev-team/skills/codebase-tour/evals/files/4/.github/workflows/ci.yml +16 -0
  78. package/packs/dev-team/skills/codebase-tour/evals/files/4/Makefile +16 -0
  79. package/packs/dev-team/skills/codebase-tour/evals/files/4/README.md +23 -0
  80. package/packs/dev-team/skills/codebase-tour/evals/files/4/data/rates.csv +4 -0
  81. package/packs/dev-team/skills/codebase-tour/evals/files/4/pyproject.toml +19 -0
  82. package/packs/dev-team/skills/codebase-tour/evals/files/4/scripts/gen_rates.py +29 -0
  83. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/__init__.py +0 -0
  84. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/__init__.py +0 -0
  85. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/preview.py +14 -0
  86. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/api/routes.py +36 -0
  87. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/config.py +15 -0
  88. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/discounts.py +8 -0
  89. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/__init__.py +0 -0
  90. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/generated/rates_table.py +8 -0
  91. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/main.py +8 -0
  92. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/shipping.py +18 -0
  93. package/packs/dev-team/skills/codebase-tour/evals/files/4/src/shipcalc/tax.py +7 -0
  94. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/conftest.py +3 -0
  95. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_discounts.py +11 -0
  96. package/packs/dev-team/skills/codebase-tour/evals/files/4/tests/unit/test_tax.py +13 -0
  97. package/packs/dev-team/skills/codebase-tour/evals/files/5/.env.example +3 -0
  98. package/packs/dev-team/skills/codebase-tour/evals/files/5/.github/workflows/ci.yml +13 -0
  99. package/packs/dev-team/skills/codebase-tour/evals/files/5/README.md +18 -0
  100. package/packs/dev-team/skills/codebase-tour/evals/files/5/package.json +13 -0
  101. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/openapi.json +30 -0
  102. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/package.json +15 -0
  103. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/db.js +19 -0
  104. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/flags.js +8 -0
  105. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/generated/schema.js +32 -0
  106. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/middleware/validate.js +20 -0
  107. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/routes/bookings.js +15 -0
  108. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/server.js +15 -0
  109. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/bookings.js +23 -0
  110. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/src/services/pricing.js +9 -0
  111. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/api/test/pricing.test.js +15 -0
  112. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/package.json +9 -0
  113. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/bookingForm.js +11 -0
  114. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/src/format.js +7 -0
  115. package/packs/dev-team/skills/codebase-tour/evals/files/5/packages/web/test/format.test.js +12 -0
  116. package/packs/dev-team/skills/codebase-tour/evals/files/5/scripts/gen-schema.mjs +27 -0
  117. package/packs/dev-team/skills/codebase-tour/examples/refund-window.md +158 -0
  118. package/packs/dev-team/skills/codebase-tour/manifest.json +47 -0
  119. package/packs/dev-team/skills/codebase-tour/scripts/repo_facts.py +403 -0
  120. package/packs/dev-team/skills/codebase-tour/templates/codebase-tour.md +85 -0
  121. package/packs/dev-team/skills/dependency-upgrade-review/SKILL.md +101 -0
  122. package/packs/dev-team/skills/dependency-upgrade-review/evals/eval_queries.json +11 -0
  123. package/packs/dev-team/skills/dependency-upgrade-review/evals/evals.json +77 -0
  124. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/.github/workflows/ci.yml +20 -0
  125. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/pr.diff +87 -0
  126. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/quillmark-CHANGELOG.md +24 -0
  127. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/comment.js +6 -0
  128. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/src/render/note.js +8 -0
  129. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/test/note.test.js +12 -0
  130. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/ci.yml +23 -0
  131. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/.github/workflows/release.yml +23 -0
  132. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/pr.diff +32 -0
  133. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/release-notes.md +20 -0
  134. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/.github/workflows/ci.yml +18 -0
  135. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/Dockerfile +8 -0
  136. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/PR.md +36 -0
  137. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/pr.diff +47 -0
  138. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/client.py +24 -0
  139. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/src/ingest/reader.py +32 -0
  140. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/tests/test_reader.py +15 -0
  141. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/upstream/quillstream-CHANGELOG.md +37 -0
  142. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/ci.yml +22 -0
  143. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.github/workflows/release.yml +25 -0
  144. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/.nvmrc +1 -0
  145. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-412.md +16 -0
  146. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/PR-413.md +15 -0
  147. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/package.json +21 -0
  148. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-412.diff +26 -0
  149. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/pr-413.diff +84 -0
  150. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/scripts/release.mjs +18 -0
  151. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/release-notary-CHANGELOG.md +16 -0
  152. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/upstream/setup-toolchain-RELEASES.md +22 -0
  153. package/packs/dev-team/skills/dependency-upgrade-review/examples/inputs/ledgerline.diff +38 -0
  154. package/packs/dev-team/skills/dependency-upgrade-review/examples/ledgerline-tidyparse.md +91 -0
  155. package/packs/dev-team/skills/dependency-upgrade-review/manifest.json +50 -0
  156. package/packs/dev-team/skills/dependency-upgrade-review/reference.md +99 -0
  157. package/packs/dev-team/skills/dependency-upgrade-review/scripts/upgrade_diff.py +718 -0
  158. package/packs/grc/loops/comply/LOOP.md +133 -0
  159. package/packs/grc/loops/comply/evals/eval_queries.json +9 -0
  160. package/packs/grc/loops/comply/evals/evals.json +30 -0
  161. package/packs/grc/loops/comply/loop.json +54 -0
  162. package/packs/product-manager/loops/discover/LOOP.md +5 -4
  163. package/packs/product-manager/loops/discover/loop.json +2 -2
  164. package/packs/product-manager/skills/feedback-synthesis/SKILL.md +182 -0
  165. package/packs/product-manager/skills/feedback-synthesis/evals/eval_queries.json +46 -0
  166. package/packs/product-manager/skills/feedback-synthesis/evals/evals.json +76 -0
  167. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/interview-notes.md +47 -0
  168. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/nps-verbatims.csv +13 -0
  169. package/packs/product-manager/skills/feedback-synthesis/evals/files/1/support-tickets.csv +36 -0
  170. package/packs/product-manager/skills/feedback-synthesis/evals/files/3/churn-exit-survey.csv +11 -0
  171. package/packs/product-manager/skills/feedback-synthesis/evals/files/3/sales-call-notes.md +55 -0
  172. package/packs/product-manager/skills/feedback-synthesis/evals/files/4/csat_comments_q3.csv +17 -0
  173. package/packs/product-manager/skills/feedback-synthesis/evals/files/4/support_tickets_q3.csv +49 -0
  174. package/packs/product-manager/skills/feedback-synthesis/evals/files/5/app_reviews_last_60_days.csv +32 -0
  175. package/packs/product-manager/skills/feedback-synthesis/evals/files/5/interview_notes_round1.md +48 -0
  176. package/packs/product-manager/skills/feedback-synthesis/examples/booking-app-feedback.md +139 -0
  177. package/packs/product-manager/skills/feedback-synthesis/examples/inputs/booking-app-coded.csv +17 -0
  178. package/packs/product-manager/skills/feedback-synthesis/manifest.json +53 -0
  179. package/packs/product-manager/skills/feedback-synthesis/reference.md +89 -0
  180. package/packs/product-manager/skills/feedback-synthesis/scripts/theme_counts.py +355 -0
  181. package/packs/product-manager/skills/feedback-synthesis/templates/coding-sheet.csv +6 -0
  182. package/packs/product-manager/skills/feedback-synthesis/templates/synthesis.md +42 -0
  183. package/packs/research/loops/research/LOOP.md +123 -0
  184. package/packs/research/loops/research/evals/eval_queries.json +9 -0
  185. package/packs/research/loops/research/evals/evals.json +39 -0
  186. package/packs/research/loops/research/loop.json +35 -0
@@ -0,0 +1,47 @@
1
+ diff --git a/requirements.in b/requirements.in
2
+ index 4b1c2e0..9a7d3f1 100644
3
+ --- a/requirements.in
4
+ +++ b/requirements.in
5
+ @@ -1,4 +1,4 @@
6
+ httpcore-lite==1.3.0
7
+ -quillstream==2.4.1
8
+ +quillstream==3.1.0
9
+ pydantic-mini==0.9.2
10
+ structlog-tiny==4.0.1
11
+ diff --git a/requirements.txt b/requirements.txt
12
+ index 77e0a1d..c2f9b48 100644
13
+ --- a/requirements.txt
14
+ +++ b/requirements.txt
15
+ @@ -4,10 +4,10 @@
16
+ #
17
+ # pip-compile --generate-hashes requirements.in
18
+ #
19
+ -compat-six==1.16.2 \
20
+ - --hash=sha256:5926410f0515cd47563d23317bb234f19b519e17a61f630b3a7a3be2fbd023f3
21
+ - # via quillstream
22
+ +grainwire==1.0.0 \
23
+ + --hash=sha256:ac5a05fbf6a38d80bb205b0640bfe3c886336e7fa936be0c57d323fe24f258ba
24
+ + # via quillstream
25
+ httpcore-lite==1.3.0 \
26
+ --hash=sha256:993ac8ea6cc9be8463df390c480a245a090a3bba42ed538f9c8742d09ad7222a
27
+ # via
28
+ # -r requirements.in
29
+ # quillstream
30
+ @@ -16,15 +16,15 @@ pydantic-mini==0.9.2 \
31
+ --hash=sha256:5411291f6c6c8ca714342bb4a421861331b89026a8318fa95c72043a8b6cfee7
32
+ # via -r requirements.in
33
+ -quillstream==2.4.1 \
34
+ - --hash=sha256:7eb6637605fcb69f63cecd3000870f473af8aaaf41e5347ee3e80708a07561ca
35
+ +quillstream==3.1.0 \
36
+ + --hash=sha256:e56b4c0d40fd62f44e33a53cc83ab388ac8edb6275eaac283afb2744bcd27c6d
37
+ # via -r requirements.in
38
+ structlog-tiny==4.0.1 \
39
+ --hash=sha256:1058a4589566f633cf2e795c7e5cfacdeb635d0b35e927619b4a437a1f6bdc01
40
+ # via -r requirements.in
41
+ -typing-shimx==4.5.0 \
42
+ - --hash=sha256:0c8ab72efe0bd56117af955bfa741a49741395e2dfcd4ba688c941bda1cb963a
43
+ +typing-shimx==4.9.1 \
44
+ + --hash=sha256:2e0970bbb5cd4ca819222abb76df78762fb1a7a0b3a98ee8fc38c3271cb7f450
45
+ # via
46
+ # pydantic-mini
47
+ # quillstream
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+
5
+ import structlog_tiny
6
+
7
+ log = structlog_tiny.get_logger(__name__)
8
+
9
+ MAX_ATTEMPTS = 3
10
+
11
+
12
+ def fetch_with_retry(client, url: str):
13
+ """Fetch ``url``, retrying on timeout.
14
+
15
+ quillstream's ``Client.fetch`` returns ``None`` when the request times out.
16
+ """
17
+ for attempt in range(1, MAX_ATTEMPTS + 1):
18
+ result = client.fetch(url)
19
+ if result is None:
20
+ log.warning("quillstream fetch timed out", url=url, attempt=attempt)
21
+ time.sleep(2 ** attempt)
22
+ continue
23
+ return result
24
+ raise RuntimeError(f"gave up fetching {url} after {MAX_ATTEMPTS} attempts")
@@ -0,0 +1,32 @@
1
+ """Readers for the ingest pipeline.
2
+
3
+ Current-format files go through ``read_stream``. Archived ``.qsf1`` files
4
+ written before the 2024 migration are still replayed by the monthly backfill
5
+ job through ``read_legacy_archive``.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from pathlib import Path
10
+ from typing import Iterator
11
+
12
+ import quillstream
13
+
14
+ from .client import fetch_with_retry
15
+
16
+
17
+ def read_stream(url: str) -> Iterator[bytes]:
18
+ client = quillstream.Client(timeout=10)
19
+ payload = fetch_with_retry(client, url)
20
+ yield from payload.chunks()
21
+
22
+
23
+ def read_legacy_archive(path: Path) -> Iterator[bytes]:
24
+ # Imported lazily: only the backfill job needs the old frame format.
25
+ from quillstream.legacy import parse_frame
26
+
27
+ data = path.read_bytes()
28
+ offset = 0
29
+ while offset < len(data):
30
+ header, payload = parse_frame(data[offset:])
31
+ yield payload
32
+ offset += header.length
@@ -0,0 +1,15 @@
1
+ from unittest import mock
2
+
3
+ from src.ingest import reader
4
+
5
+
6
+ class FakePayload:
7
+ def chunks(self):
8
+ return [b"a", b"b"]
9
+
10
+
11
+ def test_read_stream_yields_chunks():
12
+ fake_client = mock.Mock()
13
+ fake_client.fetch.return_value = FakePayload()
14
+ with mock.patch("quillstream.Client", return_value=fake_client):
15
+ assert list(reader.read_stream("qs://example/feed")) == [b"a", b"b"]
@@ -0,0 +1,37 @@
1
+ # Changelog
2
+
3
+ All notable changes to quillstream are documented here. This project follows Semantic Versioning.
4
+
5
+ ## 3.1.0 — 2026-10-11
6
+
7
+ ### Added
8
+ - Frame decoding is now delegated to the new `grainwire` package (`grainwire>=1.0,<2`), which is a required dependency. `grainwire` ships compiled wheels for CPython 3.10–3.13 on manylinux and macOS; other platforms build from sdist and need a Rust toolchain.
9
+ - `Client(..., compression="auto")` negotiates zstd when the server supports it.
10
+
11
+ ### Fixed
12
+ - `Client.close()` no longer leaks a socket when called twice.
13
+
14
+ ## 3.0.0 — 2026-08-29
15
+
16
+ ### Breaking
17
+ - **Python 3.10 or newer is required.** Support for Python 3.8 and 3.9 has been dropped (`python_requires=">=3.10"`).
18
+ - **Removed the `quillstream.legacy` module**, deprecated since 2.2. `quillstream.legacy.parse_frame(buf)` is gone; use `quillstream.frames.decode(buf, strict=False)` instead. Note that `decode` returns a `Frame` object rather than a `(header, payload)` tuple; use `frame.header` and `frame.payload`.
19
+ - `Client.fetch()` now raises `quillstream.errors.QuillTimeout` when the request times out. Previously it returned `None`.
20
+ - Dropped the dependency on `compat-six`.
21
+
22
+ ### Changed
23
+ - Minimum `typing-shimx` is now 4.8.
24
+
25
+ ## 2.5.0 — 2026-06-02
26
+
27
+ ### Deprecated
28
+ - Importing `quillstream.legacy` now emits a `DeprecationWarning` with the removal version (3.0).
29
+ - `Client.fetch()` returning `None` on timeout is deprecated; opt in to the 3.0 behaviour with `Client(raise_on_timeout=True)`.
30
+
31
+ ### Added
32
+ - `quillstream.frames.decode()`.
33
+
34
+ ## 2.4.1 — 2026-03-17
35
+
36
+ ### Fixed
37
+ - Off-by-one in chunked frame reassembly for payloads larger than 64 KiB.
@@ -0,0 +1,22 @@
1
+ name: ci
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
16
+ - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
17
+ with:
18
+ node-version-file: .nvmrc
19
+ - run: npm ci --ignore-scripts
20
+ - run: npm run lint
21
+ - run: npm test
22
+ - run: npm run build
@@ -0,0 +1,25 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+ id-token: write
10
+
11
+ jobs:
12
+ publish:
13
+ runs-on: [self-hosted, linux, release]
14
+ environment: production
15
+ steps:
16
+ - uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
17
+ - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
18
+ with:
19
+ node-version-file: .nvmrc
20
+ - run: npm ci
21
+ - run: npm run build
22
+ - run: npm run release
23
+ env:
24
+ RELEASE_SIGNING_KEY: ${{ secrets.RELEASE_SIGNING_KEY }}
25
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,16 @@
1
+ # PR #412: Bump bramblewick/setup-toolchain from 3.2.0 to 3.3.0
2
+
3
+ **Author:** dependabot[bot]
4
+ **Base:** main **Head:** dependabot/github_actions/bramblewick/setup-toolchain-3.3.0
5
+ **Checks:** ✅ ci / test (pull_request) — passed
6
+
7
+ Bumps [bramblewick/setup-toolchain](https://github.com/bramblewick/setup-toolchain) from 3.2.0 to 3.3.0.
8
+
9
+ Release notes: see `upstream/setup-toolchain-RELEASES.md`.
10
+
11
+ **Commits on this branch**
12
+ 1. `dependabot[bot]` — Bump bramblewick/setup-toolchain from 3.2.0 to 3.3.0
13
+ 2. `mkowalczyk` — "dependabot only touched ci.yml, bumped release.yml too so they match"
14
+
15
+ ---
16
+ Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself.
@@ -0,0 +1,15 @@
1
+ # PR #413: Bump release-notary from 1.8.2 to 1.9.0
2
+
3
+ **Author:** dependabot[bot]
4
+ **Base:** main **Head:** dependabot/npm_and_yarn/release-notary-1.9.0
5
+ **Labels:** dependencies, javascript
6
+ **Checks:** ✅ ci / test (pull_request) — passed
7
+
8
+ Bumps [release-notary](https://github.com/notary-tools/release-notary) from 1.8.2 to 1.9.0.
9
+
10
+ Changelog: see `upstream/release-notary-CHANGELOG.md`.
11
+
12
+ [![Dependabot compatibility score](https://example.invalid/badge)](#) — compatibility score unknown (too few updates).
13
+
14
+ ---
15
+ Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself.
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@harrowfield/ledger-ui",
3
+ "version": "5.12.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "lint": "eslint-mini src",
8
+ "test": "vitest-lite run",
9
+ "build": "rollup-lite -c",
10
+ "release": "node scripts/release.mjs"
11
+ },
12
+ "dependencies": {
13
+ "tally-format": "^2.3.0"
14
+ },
15
+ "devDependencies": {
16
+ "eslint-mini": "^9.1.0",
17
+ "release-notary": "^1.8.2",
18
+ "rollup-lite": "^4.0.3",
19
+ "vitest-lite": "^2.0.0"
20
+ }
21
+ }
@@ -0,0 +1,26 @@
1
+ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
2
+ index 3c1d0a2..5e7b9f4 100644
3
+ --- a/.github/workflows/ci.yml
4
+ +++ b/.github/workflows/ci.yml
5
+ @@ -13,7 +13,7 @@ jobs:
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
9
+ - - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
10
+ + - uses: bramblewick/setup-toolchain@8141d107d0837efc25f86e096a7eefd58e979515 # v3.3.0
11
+ with:
12
+ node-version-file: .nvmrc
13
+ - run: npm ci --ignore-scripts
14
+ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
15
+ index 0a4e8c1..b19d2e7 100644
16
+ --- a/.github/workflows/release.yml
17
+ +++ b/.github/workflows/release.yml
18
+ @@ -15,7 +15,7 @@ jobs:
19
+ environment: production
20
+ steps:
21
+ - uses: actions/checkout@9ce6fd9fa4b164bf8911b62115bf9104ba1a2803 # v4.2.0
22
+ - - uses: bramblewick/setup-toolchain@c8aee2ae521bdb1ef1b97761673ebbe92c953b0f # v3.2.0
23
+ + - uses: bramblewick/setup-toolchain@7dd0aa52537f8f4f4002b505507186cdaec669c4 # v3.3.0
24
+ with:
25
+ node-version-file: .nvmrc
26
+ - run: npm ci
@@ -0,0 +1,84 @@
1
+ diff --git a/package.json b/package.json
2
+ index 61b0e2a..e3f7c19 100644
3
+ --- a/package.json
4
+ +++ b/package.json
5
+ @@ -14,7 +14,7 @@
6
+ },
7
+ "devDependencies": {
8
+ "eslint-mini": "^9.1.0",
9
+ - "release-notary": "^1.8.2",
10
+ + "release-notary": "^1.9.0",
11
+ "rollup-lite": "^4.0.3",
12
+ "vitest-lite": "^2.0.0"
13
+ }
14
+ diff --git a/package-lock.json b/package-lock.json
15
+ index 9f2d4b7..1ac80e5 100644
16
+ --- a/package-lock.json
17
+ +++ b/package-lock.json
18
+ @@ -12,7 +12,7 @@
19
+ "devDependencies": {
20
+ "eslint-mini": "^9.1.0",
21
+ - "release-notary": "^1.8.2",
22
+ + "release-notary": "^1.9.0",
23
+ "rollup-lite": "^4.0.3",
24
+ "vitest-lite": "^2.0.0"
25
+ }
26
+ @@ -88,16 +88,6 @@
27
+ - "node_modules/ansi-tint": {
28
+ - "version": "1.0.4",
29
+ - "resolved": "https://registry.npmjs.org/ansi-tint/-/ansi-tint-1.0.4.tgz",
30
+ - "integrity": "sha512-G/ihecLGe8wYlmaKXMJUFfgBUV/HgkesmrXhTTxBqhQrYzGlVOniQfCu4MlJAUfeyjvVf+TYrCCSemjHEdDQjA==",
31
+ - "dev": true,
32
+ - "license": "MIT",
33
+ - "engines": {
34
+ - "node": ">=14"
35
+ - }
36
+ - },
37
+ @@ -402,30 +392,45 @@
38
+ + "node_modules/notary-telemetry": {
39
+ + "version": "0.2.1",
40
+ + "resolved": "https://npm.notary-cdn.io/notary-telemetry/-/notary-telemetry-0.2.1.tgz",
41
+ + "integrity": "sha512-kJAfi+YYicLisVOtWlYrspxPF4uz6y3b6QfD9GN44+ykAjLtZFIBMPzpRjsixIrGncIVsO5cZPGTL3edJLEDag==",
42
+ + "dev": true,
43
+ + "hasInstallScript": true,
44
+ + "license": "SEE LICENSE IN LICENSE.txt",
45
+ + "dependencies": {
46
+ + "semver-lite": "^2.3.0"
47
+ + }
48
+ + },
49
+ "node_modules/release-notary": {
50
+ - "version": "1.8.2",
51
+ - "resolved": "https://registry.npmjs.org/release-notary/-/release-notary-1.8.2.tgz",
52
+ - "integrity": "sha512-fS99/rtXzwQTzMu2D7jDqVze+VZpAS8ftGR6+1J6GeJ4JMhkxkVVRhHLpzVp6hV0ijP3EophissfTP0Hmkwt1w==",
53
+ + "version": "1.9.0",
54
+ + "resolved": "https://registry.npmjs.org/release-notary/-/release-notary-1.9.0.tgz",
55
+ + "integrity": "sha512-tQijziAJ067sx63E+cIXmDsbRdzLEMQHqy0fgw7fIyhUwgdc5a8fuiPWzqjJYAobtCht6aI/joOp+Up2ehJRJw==",
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "dependencies": {
59
+ - "ansi-tint": "^1.0.4",
60
+ - "semver-lite": "^2.1.0"
61
+ + "notary-telemetry": "^0.2.0",
62
+ + "semver-lite": "^2.3.0"
63
+ },
64
+ "bin": {
65
+ "release-notary": "bin/cli.js"
66
+ },
67
+ "engines": {
68
+ - "node": ">=18"
69
+ + "node": ">=20"
70
+ }
71
+ },
72
+ "node_modules/semver-lite": {
73
+ - "version": "2.1.0",
74
+ - "resolved": "https://registry.npmjs.org/semver-lite/-/semver-lite-2.1.0.tgz",
75
+ - "integrity": "sha512-OvGVOs6Tl8EYX9VxOQgB0MNBqP8uY+ct5KATLIi3BGLPF+9vAb31PrWFxtbLBcjZh4H9oT1HyzGrx+ItXrSJNw==",
76
+ + "version": "2.3.0",
77
+ + "resolved": "https://registry.npmjs.org/semver-lite/-/semver-lite-2.3.0.tgz",
78
+ + "integrity": "sha512-nqjU6Z/9qqziJrOHoLWWbE+gjkE23/xqf9pqZOkyicwfti0SgB9uhlk/QMZGMbmYzsnc3cKwq6VD/3JmK2JnHA==",
79
+ "dev": true,
80
+ "license": "ISC",
81
+ "engines": {
82
+ "node": ">=16"
83
+ }
84
+ },
@@ -0,0 +1,18 @@
1
+ // Publishes the built bundle and a signed provenance manifest.
2
+ // Run only from .github/workflows/release.yml on a version tag.
3
+ import { createNotary } from "release-notary";
4
+ import pkg from "../package.json" with { type: "json" };
5
+
6
+ const notary = createNotary({
7
+ // legacyMode keeps the v1 manifest layout that the downstream
8
+ // ledger-portal deploy script still parses.
9
+ legacyMode: true,
10
+ signingKey: process.env.RELEASE_SIGNING_KEY,
11
+ });
12
+
13
+ await notary.publish({
14
+ name: pkg.name,
15
+ version: pkg.version,
16
+ dir: "dist",
17
+ sign: true,
18
+ });
@@ -0,0 +1,16 @@
1
+ # release-notary changelog
2
+
3
+ ## 1.9.0 — 2026-10-02
4
+
5
+ - **Removed** the `legacyMode` option of `createNotary()`, deprecated since 1.6.0. Passing it now throws `TypeError: Unknown option "legacyMode"`. Manifests are always written in the v2 layout (`manifest.files[]` replaces the top-level `artifacts` map).
6
+ - Added opt-out usage reporting through the new `notary-telemetry` dependency. It runs at install time to detect the CI provider and sends an anonymous ping when `publish()` runs. Disable with `NOTARY_TELEMETRY=0`.
7
+ - Requires Node.js 20 or newer.
8
+ - Dropped `ansi-tint`; output colouring uses `util.styleText`.
9
+
10
+ ## 1.8.3 — 2026-08-20
11
+
12
+ - Fixed: `publish({ sign: true })` silently skipped signing when `signingKey` was an empty string. It now throws `Error: signingKey is empty`.
13
+
14
+ ## 1.8.2 — 2026-07-01
15
+
16
+ - Fixed Windows path separators in manifest entries.
@@ -0,0 +1,22 @@
1
+ # bramblewick/setup-toolchain releases
2
+
3
+ ## v3.3.0 (2026-10-06)
4
+
5
+ ### Breaking-ish
6
+ - The action now runs on the `node24` runtime (was `node20`). GitHub-hosted runners already support it. **Self-hosted runners must be on actions/runner v2.328.0 or newer**, otherwise the job fails with `Parameter 'using: node24' is not supported`.
7
+
8
+ ### Changed
9
+ - `cache` now defaults to `true` (was `false`). The npm cache is keyed on the lockfile hash and restored automatically. Set `cache: false` to keep the old behaviour.
10
+
11
+ ### Added
12
+ - `node-version-file` accepts `package.json#engines.node`.
13
+
14
+ ## v3.2.1 (2026-09-12)
15
+
16
+ ### Security
17
+ - Fixed a cache-key collision (GHSA-xxxx-fict-0001) in which a workflow run triggered by a pull request from a fork could write a cache entry that a later run on the default branch restored. Only affected users who set `cache: true`.
18
+
19
+ ## v3.2.0 (2026-07-30)
20
+
21
+ ### Added
22
+ - Support for `.tool-versions`.
@@ -0,0 +1,38 @@
1
+ diff --git a/poetry.lock b/poetry.lock
2
+ index f6ddbc1..3b139f9 100644
3
+ --- a/poetry.lock
4
+ +++ b/poetry.lock
5
+ @@ -2,7 +2,7 @@
6
+
7
+ [[package]]
8
+ name = "charset-sniff"
9
+ -version = "1.4.0"
10
+ +version = "1.4.1"
11
+ description = "Guess the text encoding of a byte string"
12
+ optional = false
13
+ python-versions = ">=3.9"
14
+ @@ -10,7 +10,7 @@ files = []
15
+
16
+ [[package]]
17
+ name = "tidyparse"
18
+ -version = "2.2.0"
19
+ +version = "2.2.2"
20
+ description = "Forgiving CSV and TSV parser"
21
+ optional = false
22
+ python-versions = ">=3.9"
23
+ @@ -22,4 +22,4 @@ charset-sniff = ">=1.4,<2"
24
+ [metadata]
25
+ lock-version = "2.0"
26
+ python-versions = "^3.11"
27
+ -content-hash = "0000000000000000000000000000000000000000000000000000000000000001"
28
+ +content-hash = "0000000000000000000000000000000000000000000000000000000000000002"
29
+ diff --git a/pyproject.toml b/pyproject.toml
30
+ index 12e2f0a..9848a83 100644
31
+ --- a/pyproject.toml
32
+ +++ b/pyproject.toml
33
+ @@ -6,4 +6,4 @@ authors = ["Ledgerline maintainers"]
34
+
35
+ [tool.poetry.dependencies]
36
+ python = "^3.11"
37
+ -tidyparse = "^2.2.0"
38
+ +tidyparse = "^2.2.2"
@@ -0,0 +1,91 @@
1
+ # Worked example: Ledgerline, a Poetry patch bump that earns MERGE
2
+
3
+ Most worked examples end in a block. This one shows what it takes to close every check, so MERGE is earned rather than assumed.
4
+
5
+ ## Input
6
+
7
+ The user says: *"Can I merge PR #57 on ledgerline, 'chore(deps): bump tidyparse to 2.2.2'? CI is green."* and supplies:
8
+
9
+ - the diff, [`inputs/ledgerline.diff`](inputs/ledgerline.diff) (`pyproject.toml` and `poetry.lock`)
10
+ - tidyparse's changelog for 2.2.1 and 2.2.2
11
+ - the repo: `app/ingest.py`, `tests/test_ingest.py`, `.github/workflows/ci.yml`
12
+
13
+ Changelog excerpt as supplied:
14
+
15
+ ```markdown
16
+ ## 2.2.2
17
+ - Security: a single line longer than 10 MB is now rejected with RowTooLongError
18
+ (a subclass of ParseError) instead of being read into memory.
19
+
20
+ ## 2.2.1
21
+ - Fixed: a quoted field containing a newline was split into two rows.
22
+ ```
23
+
24
+ Repo excerpts as supplied:
25
+
26
+ ```python
27
+ # app/ingest.py
28
+ 12 def import_statement(path):
29
+ 13 try:
30
+ 14 rows = tidyparse.parse_rows(path, dialect="excel")
31
+ 15 except tidyparse.ParseError as exc:
32
+ 16 raise StatementRejected(str(exc)) from exc
33
+ ```
34
+
35
+ ```python
36
+ # tests/test_ingest.py
37
+ 3 from app.ingest import import_statement
38
+ 9 def test_quoted_newline_stays_one_row(tmp_path): ...
39
+ 17 def test_malformed_file_is_rejected(tmp_path): ...
40
+ ```
41
+
42
+ `.github/workflows/ci.yml` runs `pytest -q` on `pull_request`.
43
+
44
+ ## Script output (real; the header, the fixed footer and the empty sections trimmed)
45
+
46
+ ```bash
47
+ python3 scripts/upgrade_diff.py examples/inputs/ledgerline.diff --title "chore(deps): bump tidyparse to 2.2.2"
48
+ ```
49
+
50
+ ```markdown
51
+ **Floor verdict: none from the diff** (mechanical; the changelog, usage and CI checks are still to do, and only they can make it MERGE)
52
+
53
+ ## Changed (3)
54
+
55
+ | Package | Ecosystem | Old → New | Class | File | Notes |
56
+ |---|---|---|---|---|---|
57
+ | `charset-sniff` | pip | 1.4.0 → 1.4.1 | patch | `poetry.lock` | lockfile only (transitive); not named in the title |
58
+ | `tidyparse` | pip | 2.2.0 → 2.2.2 | patch | `poetry.lock` | direct |
59
+ | `tidyparse` | pip | ^2.2.0 → ^2.2.2 | patch | `pyproject.toml` | |
60
+
61
+ ## Beyond the title (1)
62
+
63
+ - `charset-sniff` changed: 1.4.0 → 1.4.1 (poetry.lock)
64
+ ```
65
+
66
+ No install scripts, sources, licences or pins appear. The floor says only that the diff itself raises nothing; the notes, the search and CI decide the rest.
67
+
68
+ ## Review (what the agent hands back)
69
+
70
+ **MERGE.** A two-release patch bump whose only behaviour change, the new 10 MB line limit in 2.2.2, raises an error the import code already handles, and CI runs that code.
71
+
72
+ 🟨 Notes
73
+
74
+ - Both releases read. 2.2.1 fixes quoted newlines splitting rows, which `test_quoted_newline_stays_one_row` (`tests/test_ingest.py:9`) covers. 2.2.2 is a security fix: lines over 10 MB now raise `RowTooLongError`, a subclass of `ParseError`.
75
+ - Search: `git grep -n "tidyparse" -- '*.py'` finds one call, `app/ingest.py:14`, inside `except tidyparse.ParseError` (`app/ingest.py:15`). The new error is caught there and becomes `StatementRejected`, the same path as any malformed file.
76
+ - CI: `ci.yml` runs `pytest -q` on the PR, and `tests/test_ingest.py:3` imports `import_statement`, so the changed code ran. No test feeds a 10 MB line; that is the library's limit, not a change in this repo's behaviour.
77
+ - Beyond the title: `charset-sniff` 1.4.0 → 1.4.1, a transitive patch, listed and not read.
78
+ - No new packages, install scripts, registry changes or pins.
79
+
80
+ | Package | Old → New | Class | Direct? |
81
+ |---|---|---|---|
82
+ | tidyparse | 2.2.0 → 2.2.2 | patch | direct |
83
+ | charset-sniff | 1.4.0 → 1.4.1 | patch | transitive |
84
+
85
+ Rollback: `git revert` the merge commit, or `poetry add tidyparse@2.2.0` and commit `pyproject.toml` and `poetry.lock`. Nothing persists to undo, but rolling back reopens the 2.2.2 memory issue, so pin back to 2.2.0 only as a stopgap.
86
+
87
+ To confirm: nothing.
88
+
89
+ ## Why this is MERGE and not MERGE AFTER CHECKS
90
+
91
+ Every check in the verdict rule is closed with evidence in the reply: both releases read, the one changed behaviour searched and found handled, the calling code run by a PR test, no pins, no install-time code, no new source. Remove any one of those (no repo to search, a release with no notes, a test that does not import `app/ingest.py`) and the verdict drops to MERGE AFTER CHECKS with that item as the check.
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "dependency-upgrade-review",
3
+ "version": "0.1.0",
4
+ "description": "Give a merge verdict on a dependency-upgrade pull request (Dependabot, Renovate or a hand-made bump) across npm, pip, Go, Cargo and Maven lockfiles and GitHub Actions pins. Reads the release notes for every skipped version, lists what the lockfile changes beyond the PR title (transitive bumps, new and removed packages, install scripts, registry changes), checks that each SHA pin is the commit its release tag points to, says whether CI ran the changed code, finds the repo's uses of changed APIs and writes the rollback, ending in MERGE, MERGE AFTER CHECKS or DO NOT MERGE. Use when the user says \"review this Dependabot PR\", \"is this Renovate bump safe to merge\", \"can I merge this dependency upgrade\", \"check this lockfile diff\", or \"is this action SHA pin right\".",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": []
13
+ },
14
+ "related": [
15
+ "migration-plan",
16
+ "pre-merge-review",
17
+ "release-notes"
18
+ ],
19
+ "handoff": [
20
+ {
21
+ "to": "migration-plan",
22
+ "when": "the upgrade is a major framework or runtime jump that cannot land as one PR",
23
+ "purpose": "Plan the staged migration, the compatibility shims and the cutover instead of forcing the bump through.",
24
+ "fallback": "If migration-plan is absent, list the breaking changes the repo hits, the order to fix them in, and the rollback point for each step inline, and keep the verdict at DO NOT MERGE."
25
+ },
26
+ {
27
+ "to": "pre-merge-review",
28
+ "when": "the PR also carries hand-written code changes beyond manifests, lockfiles and pins",
29
+ "purpose": "Review the code change itself with the full correctness, security and quality pass.",
30
+ "fallback": "If pre-merge-review is absent, review the non-dependency files inline for correctness and tests, and say that part of the review was done without the full panel."
31
+ }
32
+ ],
33
+ "tags": [
34
+ "dependencies",
35
+ "supply-chain",
36
+ "code-review",
37
+ "dependabot",
38
+ "github-actions"
39
+ ],
40
+ "permissions": {
41
+ "network": [],
42
+ "commands": [],
43
+ "files": "named-paths",
44
+ "notes": "Reads only the diff path it is given, or stdin; writes only the -o path when given. No network: SHA verification and changelog reading are printed as commands for the reviewer to run."
45
+ },
46
+ "model": {
47
+ "tier": "standard",
48
+ "rationale": "Reads a version diff, changelogs and CI evidence against a fixed checklist; the merge verdict follows from what is verified, not open-ended judgment."
49
+ }
50
+ }