skilldrop-cli 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +1 -1
  2. package/bin/skilldrop.js +46 -3
  3. package/package.json +1 -1
  4. package/packs/ai-engineering/loops/ship-agent/LOOP.md +22 -8
  5. package/packs/ai-engineering/loops/ship-agent/evals/evals.json +30 -0
  6. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/agent-idea.md +52 -0
  7. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/dot.claude/settings.json +23 -0
  8. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/dot.mcp.json +25 -0
  9. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-pass-bar-fitted-to-score/agent-brief.md +35 -0
  10. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-pass-bar-fitted-to-score/eval-run-1.md +26 -0
  11. package/packs/ai-engineering/loops/ship-agent/loop.json +1 -1
  12. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/dot.gitignore +5 -0
  13. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/dot.gitignore +3 -0
  14. package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +3 -3
  15. package/packs/core/loops/ship-a-draft/LOOP.md +17 -0
  16. package/packs/core/loops/ship-a-draft/evals/evals.json +30 -0
  17. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-double-charge-runbook/support-notes.md +30 -0
  18. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-pilot-cut-to-two-branches/thread.md +23 -0
  19. package/packs/core/loops/ship-a-draft/loop.json +1 -1
  20. package/packs/data-analytics/loops/measure/LOOP.md +39 -10
  21. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  22. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/finance_net_revenue.sql +19 -0
  23. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/handoff-thread.md +24 -0
  24. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/sales_net_revenue.sql +10 -0
  25. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/schema.md +11 -0
  26. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/households_served.sql +12 -0
  27. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/request.md +18 -0
  28. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/schema.md +10 -0
  29. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/stockout_rate.sql +8 -0
  30. package/packs/data-analytics/loops/measure/loop.json +1 -1
  31. package/packs/dev-team/loops/build/LOOP.md +16 -0
  32. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  33. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/contacts.csv +6 -0
  34. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/export_contacts.py +29 -0
  35. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/story.md +15 -0
  36. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/test_export_contacts.py +13 -0
  37. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/pr-description.md +6 -0
  38. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/pricing.py +12 -0
  39. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/story.md +12 -0
  40. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/test_pricing.py +22 -0
  41. package/packs/dev-team/loops/build/loop.json +1 -1
  42. package/packs/dev-team/loops/modernize/LOOP.md +18 -1
  43. package/packs/dev-team/loops/modernize/evals/evals.json +29 -0
  44. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/baskets.csv +11 -0
  45. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/cutover-ticket.md +9 -0
  46. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/loyalty_legacy.py +11 -0
  47. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/loyalty_new.py +14 -0
  48. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/invoice_batch.py +22 -0
  49. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/orders.csv +16 -0
  50. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/postage.py +32 -0
  51. package/packs/dev-team/loops/modernize/loop.json +1 -1
  52. package/packs/dev-team/loops/release/LOOP.md +18 -2
  53. package/packs/dev-team/loops/release/evals/evals.json +30 -0
  54. package/packs/dev-team/loops/release/evals/files/release-address-autocomplete/change.md +11 -0
  55. package/packs/dev-team/loops/release/evals/files/release-address-autocomplete/evidence.md +24 -0
  56. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/canary-report.md +15 -0
  57. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/change.md +9 -0
  58. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/on-call.md +8 -0
  59. package/packs/dev-team/loops/release/loop.json +1 -1
  60. package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/dot.npmrc +3 -0
  61. package/packs/experience-design/loops/clarify/LOOP.md +17 -2
  62. package/packs/experience-design/loops/clarify/evals/evals.json +30 -0
  63. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/complaints.md +18 -0
  64. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/form.md +22 -0
  65. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/page.md +30 -0
  66. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/calls.csv +7 -0
  67. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/form.md +24 -0
  68. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/page.md +17 -0
  69. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/service-notes.md +26 -0
  70. package/packs/experience-design/loops/clarify/loop.json +1 -1
  71. package/packs/experience-design/skills/locale-check/SKILL.md +1 -1
  72. package/packs/experience-design/skills/locale-check/manifest.json +2 -2
  73. package/packs/frontend/skills/bundle-size-review/evals/files/9/dot.gitignore +5 -0
  74. package/packs/grc/loops/comply/LOOP.md +17 -1
  75. package/packs/grc/loops/comply/evals/evals.json +30 -0
  76. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/change-brief.md +19 -0
  77. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/controls.md +10 -0
  78. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/lockerlane-security-answers.md +7 -0
  79. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/risk-scale.md +17 -0
  80. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/acceptance-email.md +14 -0
  81. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/change-brief.md +16 -0
  82. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/ci-pipeline.yml.fixture +17 -0
  83. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/controls.md +8 -0
  84. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/risk-scale.md +17 -0
  85. package/packs/grc/loops/comply/loop.json +1 -1
  86. package/packs/infra-as-code/loops/provision/LOOP.md +20 -5
  87. package/packs/infra-as-code/loops/provision/evals/evals.json +30 -0
  88. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/main.tf +94 -0
  89. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/outputs.tf +19 -0
  90. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/variables.tf +69 -0
  91. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/versions.tf +10 -0
  92. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/need.md +47 -0
  93. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/plan.json +387 -0
  94. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/main.tf +38 -0
  95. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/outputs.tf +9 -0
  96. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/variables.tf +22 -0
  97. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/versions.tf +10 -0
  98. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/need.md +39 -0
  99. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/plan.json +225 -0
  100. package/packs/infra-as-code/loops/provision/loop.json +1 -1
  101. package/packs/research/loops/research/LOOP.md +17 -3
  102. package/packs/research/loops/research/evals/evals.json +30 -0
  103. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/app-switch-notes.md +5 -0
  104. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/helpdesk-tickets-summary.md +6 -0
  105. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/licence-renewal-email.md +8 -0
  106. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/loans-by-week.csv +21 -0
  107. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/lumaread-contract-extract.md +10 -0
  108. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/staff-forum-post.md +3 -0
  109. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/courier-pulse-blog-post.md +5 -0
  110. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/driver-survey-summary.md +9 -0
  111. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/on-time-by-depot.csv +37 -0
  112. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/ops-weekly-notes.md +16 -0
  113. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/routewise-release-notes.md +11 -0
  114. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/weather-log.md +8 -0
  115. package/packs/research/loops/research/loop.json +1 -1
  116. package/packs/solution-architect/loops/design/LOOP.md +18 -2
  117. package/packs/solution-architect/loops/design/evals/evals.json +29 -0
  118. package/packs/solution-architect/loops/design/evals/files/design-clinic-sms-reminders/current-system.md +13 -0
  119. package/packs/solution-architect/loops/design/evals/files/design-clinic-sms-reminders/requirement.md +15 -0
  120. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/cto-note.md +7 -0
  121. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/options.md +17 -0
  122. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/requirement.md +12 -0
  123. package/packs/solution-architect/loops/design/loop.json +1 -1
  124. /package/packs/ai-engineering/skills/agent-config-review/evals/files/1/{.claude → dot.claude}/agents/db-migrator.md +0 -0
  125. /package/packs/ai-engineering/skills/agent-config-review/evals/files/1/{.claude → dot.claude}/agents/reviewer.md +0 -0
  126. /package/packs/ai-engineering/skills/agent-config-review/evals/files/1/{.claude → dot.claude}/settings.json +0 -0
  127. /package/packs/ai-engineering/skills/agent-config-review/evals/files/1/{.claude → dot.claude}/settings.local.json +0 -0
  128. /package/packs/ai-engineering/skills/agent-config-review/evals/files/1/{.mcp.json → dot.mcp.json} +0 -0
  129. /package/packs/ai-engineering/skills/agent-config-review/evals/files/2/{.cursor → dot.cursor}/mcp.json +0 -0
  130. /package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/{.claude → dot.claude}/agents/release-notes.md +0 -0
  131. /package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/{.claude → dot.claude}/settings.json +0 -0
  132. /package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/{.mcp.json → dot.mcp.json} +0 -0
  133. /package/packs/ai-engineering/skills/agent-config-review/evals/files/5/{.github → dot.github}/workflows/codex-triage.yml.fixture +0 -0
  134. /package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/{.claude → dot.claude}/settings.json +0 -0
  135. /package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/{.mcp.json → dot.mcp.json} +0 -0
  136. /package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/{.mcp.json → dot.mcp.json} +0 -0
  137. /package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  138. /package/packs/ai-engineering/skills/mcp-pairing/evals/files/4/{.mcp.json → dot.mcp.json} +0 -0
  139. /package/packs/api-builder/skills/eval-harness-generator/evals/files/1/{SKILL.md → SKILL.md.fixture} +0 -0
  140. /package/packs/api-builder/skills/eval-harness-generator/evals/files/2/{SKILL.md → SKILL.md.fixture} +0 -0
  141. /package/packs/core/skills/context-graph/evals/files/9/{.env.example → dot.env.example} +0 -0
  142. /package/packs/dev-team/skills/agents-md-generator/evals/files/1/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  143. /package/packs/dev-team/skills/agents-md-generator/evals/files/5/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  144. /package/packs/dev-team/skills/codebase-tour/evals/files/1/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  145. /package/packs/dev-team/skills/codebase-tour/evals/files/2/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  146. /package/packs/dev-team/skills/codebase-tour/evals/files/3/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  147. /package/packs/dev-team/skills/codebase-tour/evals/files/4/{.env.example → dot.env.example} +0 -0
  148. /package/packs/dev-team/skills/codebase-tour/evals/files/4/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  149. /package/packs/dev-team/skills/codebase-tour/evals/files/5/{.env.example → dot.env.example} +0 -0
  150. /package/packs/dev-team/skills/codebase-tour/evals/files/5/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  151. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/1/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  152. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  153. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/2/{.github → dot.github}/workflows/release.yml.fixture +0 -0
  154. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/4/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  155. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  156. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/{.github → dot.github}/workflows/release.yml.fixture +0 -0
  157. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/5/{.nvmrc → dot.nvmrc} +0 -0
  158. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  159. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/6/{.github → dot.github}/workflows/integration.yml.fixture +0 -0
  160. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  161. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/{.lintwright.json → dot.lintwright.json} +0 -0
  162. /package/packs/dev-team/skills/dependency-upgrade-review/evals/files/7/{.nvmrc → dot.nvmrc} +0 -0
  163. /package/packs/dev-team/skills/sonar-onboard/evals/files/2/{.github → dot.github}/workflows/ci.yml.fixture +0 -0
  164. /package/packs/dev-team/skills/sonar-onboard/evals/files/2/{.gitlab-ci.yml → dot.gitlab-ci.yml} +0 -0
  165. /package/packs/frontend/skills/bundle-size-review/evals/files/5/{.browserslistrc → dot.browserslistrc} +0 -0
  166. /package/packs/frontend/skills/bundle-size-review/evals/files/6/{.browserslistrc → dot.browserslistrc} +0 -0
  167. /package/packs/frontend/skills/bundle-size-review/evals/files/8/{.browserslistrc → dot.browserslistrc} +0 -0
  168. /package/packs/frontend/skills/bundle-size-review/evals/files/9/{.github → dot.github}/workflows/size.yml.fixture +0 -0
  169. /package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/changelog-writer/{SKILL.md → SKILL.md.fixture} +0 -0
  170. /package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/{SKILL.md → SKILL.md.fixture} +0 -0
  171. /package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/{SKILL.md → SKILL.md.fixture} +0 -0
@@ -0,0 +1,387 @@
1
+ {
2
+ "format_version": "1.2",
3
+ "terraform_version": "1.9.5",
4
+ "planned_values": {
5
+ "root_module": {
6
+ "child_modules": [
7
+ {
8
+ "address": "module.order_events",
9
+ "resources": [
10
+ {
11
+ "address": "module.order_events.aws_kms_key.queue",
12
+ "mode": "managed",
13
+ "type": "aws_kms_key",
14
+ "name": "queue",
15
+ "provider_name": "registry.terraform.io/hashicorp/aws",
16
+ "schema_version": 0,
17
+ "values": {
18
+ "description": "order-events queue encryption",
19
+ "enable_key_rotation": true,
20
+ "deletion_window_in_days": 30,
21
+ "is_enabled": true,
22
+ "key_usage": "ENCRYPT_DECRYPT",
23
+ "customer_master_key_spec": "SYMMETRIC_DEFAULT",
24
+ "bypass_policy_lockout_safety_check": false,
25
+ "custom_key_store_id": null,
26
+ "xks_key_id": null,
27
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AccountAdmin\",\n \"Effect\": \"Allow\",\n \"Action\": \"kms:*\",\n \"Resource\": \"*\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n }\n },\n {\n \"Sid\": \"AllowSourceTopic\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}",
28
+ "tags": {
29
+ "team": "fulfilment",
30
+ "cost-centre": "cc-4410",
31
+ "module": "order-events-queue"
32
+ },
33
+ "tags_all": {
34
+ "team": "fulfilment",
35
+ "cost-centre": "cc-4410",
36
+ "module": "order-events-queue"
37
+ }
38
+ },
39
+ "sensitive_values": {
40
+ "tags": {},
41
+ "tags_all": {}
42
+ }
43
+ },
44
+ {
45
+ "address": "module.order_events.aws_sqs_queue.dlq",
46
+ "mode": "managed",
47
+ "type": "aws_sqs_queue",
48
+ "name": "dlq",
49
+ "provider_name": "registry.terraform.io/hashicorp/aws",
50
+ "schema_version": 0,
51
+ "values": {
52
+ "name": "order-events-dlq",
53
+ "delay_seconds": 0,
54
+ "fifo_queue": false,
55
+ "kms_data_key_reuse_period_seconds": 300,
56
+ "max_message_size": 262144,
57
+ "message_retention_seconds": 1209600,
58
+ "receive_wait_time_seconds": 0,
59
+ "visibility_timeout_seconds": 30,
60
+ "tags": {
61
+ "team": "fulfilment",
62
+ "cost-centre": "cc-4410",
63
+ "module": "order-events-queue"
64
+ },
65
+ "tags_all": {
66
+ "team": "fulfilment",
67
+ "cost-centre": "cc-4410",
68
+ "module": "order-events-queue"
69
+ }
70
+ },
71
+ "sensitive_values": {
72
+ "tags": {},
73
+ "tags_all": {}
74
+ }
75
+ },
76
+ {
77
+ "address": "module.order_events.aws_sqs_queue.main",
78
+ "mode": "managed",
79
+ "type": "aws_sqs_queue",
80
+ "name": "main",
81
+ "provider_name": "registry.terraform.io/hashicorp/aws",
82
+ "schema_version": 0,
83
+ "values": {
84
+ "name": "order-events",
85
+ "delay_seconds": 0,
86
+ "fifo_queue": false,
87
+ "kms_data_key_reuse_period_seconds": 300,
88
+ "max_message_size": 262144,
89
+ "message_retention_seconds": 345600,
90
+ "receive_wait_time_seconds": 0,
91
+ "visibility_timeout_seconds": 60,
92
+ "tags": {
93
+ "team": "fulfilment",
94
+ "cost-centre": "cc-4410",
95
+ "module": "order-events-queue"
96
+ },
97
+ "tags_all": {
98
+ "team": "fulfilment",
99
+ "cost-centre": "cc-4410",
100
+ "module": "order-events-queue"
101
+ }
102
+ },
103
+ "sensitive_values": {
104
+ "tags": {},
105
+ "tags_all": {}
106
+ }
107
+ },
108
+ {
109
+ "address": "module.order_events.aws_sqs_queue_policy.main",
110
+ "mode": "managed",
111
+ "type": "aws_sqs_queue_policy",
112
+ "name": "main",
113
+ "provider_name": "registry.terraform.io/hashicorp/aws",
114
+ "schema_version": 1,
115
+ "values": {
116
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowSourceTopicSend\",\n \"Effect\": \"Allow\",\n \"Action\": \"sqs:SendMessage\",\n \"Resource\": \"arn:aws:sqs:eu-west-2:111122223333:order-events\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}"
117
+ },
118
+ "sensitive_values": {}
119
+ },
120
+ {
121
+ "address": "module.order_events.aws_sns_topic_subscription.main",
122
+ "mode": "managed",
123
+ "type": "aws_sns_topic_subscription",
124
+ "name": "main",
125
+ "provider_name": "registry.terraform.io/hashicorp/aws",
126
+ "schema_version": 0,
127
+ "values": {
128
+ "topic_arn": "arn:aws:sns:eu-west-2:111122223333:orders-created",
129
+ "protocol": "sqs",
130
+ "raw_message_delivery": true,
131
+ "confirmation_timeout_in_minutes": 1,
132
+ "endpoint_auto_confirms": false,
133
+ "delivery_policy": null,
134
+ "filter_policy": null,
135
+ "redrive_policy": null,
136
+ "replay_policy": null,
137
+ "subscription_role_arn": null
138
+ },
139
+ "sensitive_values": {}
140
+ }
141
+ ]
142
+ }
143
+ ]
144
+ }
145
+ },
146
+ "resource_changes": [
147
+ {
148
+ "address": "module.order_events.aws_kms_key.queue",
149
+ "module_address": "module.order_events",
150
+ "mode": "managed",
151
+ "type": "aws_kms_key",
152
+ "name": "queue",
153
+ "provider_name": "registry.terraform.io/hashicorp/aws",
154
+ "change": {
155
+ "actions": [
156
+ "create"
157
+ ],
158
+ "before": null,
159
+ "after": {
160
+ "description": "order-events queue encryption",
161
+ "enable_key_rotation": true,
162
+ "deletion_window_in_days": 30,
163
+ "is_enabled": true,
164
+ "key_usage": "ENCRYPT_DECRYPT",
165
+ "customer_master_key_spec": "SYMMETRIC_DEFAULT",
166
+ "bypass_policy_lockout_safety_check": false,
167
+ "custom_key_store_id": null,
168
+ "xks_key_id": null,
169
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AccountAdmin\",\n \"Effect\": \"Allow\",\n \"Action\": \"kms:*\",\n \"Resource\": \"*\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n }\n },\n {\n \"Sid\": \"AllowSourceTopic\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}",
170
+ "tags": {
171
+ "team": "fulfilment",
172
+ "cost-centre": "cc-4410",
173
+ "module": "order-events-queue"
174
+ },
175
+ "tags_all": {
176
+ "team": "fulfilment",
177
+ "cost-centre": "cc-4410",
178
+ "module": "order-events-queue"
179
+ }
180
+ },
181
+ "after_unknown": {
182
+ "arn": true,
183
+ "id": true,
184
+ "key_id": true,
185
+ "multi_region": true,
186
+ "rotation_period_in_days": true
187
+ },
188
+ "before_sensitive": false,
189
+ "after_sensitive": {
190
+ "tags": {},
191
+ "tags_all": {}
192
+ }
193
+ }
194
+ },
195
+ {
196
+ "address": "module.order_events.aws_sqs_queue.dlq",
197
+ "module_address": "module.order_events",
198
+ "mode": "managed",
199
+ "type": "aws_sqs_queue",
200
+ "name": "dlq",
201
+ "provider_name": "registry.terraform.io/hashicorp/aws",
202
+ "change": {
203
+ "actions": [
204
+ "create"
205
+ ],
206
+ "before": null,
207
+ "after": {
208
+ "name": "order-events-dlq",
209
+ "delay_seconds": 0,
210
+ "fifo_queue": false,
211
+ "kms_data_key_reuse_period_seconds": 300,
212
+ "max_message_size": 262144,
213
+ "message_retention_seconds": 1209600,
214
+ "receive_wait_time_seconds": 0,
215
+ "visibility_timeout_seconds": 30,
216
+ "tags": {
217
+ "team": "fulfilment",
218
+ "cost-centre": "cc-4410",
219
+ "module": "order-events-queue"
220
+ },
221
+ "tags_all": {
222
+ "team": "fulfilment",
223
+ "cost-centre": "cc-4410",
224
+ "module": "order-events-queue"
225
+ }
226
+ },
227
+ "after_unknown": {
228
+ "arn": true,
229
+ "id": true,
230
+ "url": true,
231
+ "kms_master_key_id": true,
232
+ "policy": true,
233
+ "redrive_allow_policy": true,
234
+ "sqs_managed_sse_enabled": true,
235
+ "deduplication_scope": true,
236
+ "fifo_throughput_limit": true,
237
+ "content_based_deduplication": true,
238
+ "name_prefix": true,
239
+ "redrive_policy": true
240
+ },
241
+ "before_sensitive": false,
242
+ "after_sensitive": {
243
+ "tags": {},
244
+ "tags_all": {}
245
+ }
246
+ }
247
+ },
248
+ {
249
+ "address": "module.order_events.aws_sqs_queue.main",
250
+ "module_address": "module.order_events",
251
+ "mode": "managed",
252
+ "type": "aws_sqs_queue",
253
+ "name": "main",
254
+ "provider_name": "registry.terraform.io/hashicorp/aws",
255
+ "change": {
256
+ "actions": [
257
+ "create"
258
+ ],
259
+ "before": null,
260
+ "after": {
261
+ "name": "order-events",
262
+ "delay_seconds": 0,
263
+ "fifo_queue": false,
264
+ "kms_data_key_reuse_period_seconds": 300,
265
+ "max_message_size": 262144,
266
+ "message_retention_seconds": 345600,
267
+ "receive_wait_time_seconds": 0,
268
+ "visibility_timeout_seconds": 60,
269
+ "tags": {
270
+ "team": "fulfilment",
271
+ "cost-centre": "cc-4410",
272
+ "module": "order-events-queue"
273
+ },
274
+ "tags_all": {
275
+ "team": "fulfilment",
276
+ "cost-centre": "cc-4410",
277
+ "module": "order-events-queue"
278
+ }
279
+ },
280
+ "after_unknown": {
281
+ "arn": true,
282
+ "id": true,
283
+ "url": true,
284
+ "kms_master_key_id": true,
285
+ "policy": true,
286
+ "redrive_allow_policy": true,
287
+ "sqs_managed_sse_enabled": true,
288
+ "deduplication_scope": true,
289
+ "fifo_throughput_limit": true,
290
+ "content_based_deduplication": true,
291
+ "name_prefix": true,
292
+ "redrive_policy": true
293
+ },
294
+ "before_sensitive": false,
295
+ "after_sensitive": {
296
+ "tags": {},
297
+ "tags_all": {}
298
+ }
299
+ }
300
+ },
301
+ {
302
+ "address": "module.order_events.aws_sqs_queue_policy.main",
303
+ "module_address": "module.order_events",
304
+ "mode": "managed",
305
+ "type": "aws_sqs_queue_policy",
306
+ "name": "main",
307
+ "provider_name": "registry.terraform.io/hashicorp/aws",
308
+ "change": {
309
+ "actions": [
310
+ "create"
311
+ ],
312
+ "before": null,
313
+ "after": {
314
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowSourceTopicSend\",\n \"Effect\": \"Allow\",\n \"Action\": \"sqs:SendMessage\",\n \"Resource\": \"arn:aws:sqs:eu-west-2:111122223333:order-events\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}"
315
+ },
316
+ "after_unknown": {
317
+ "id": true,
318
+ "queue_url": true
319
+ },
320
+ "before_sensitive": false,
321
+ "after_sensitive": {}
322
+ }
323
+ },
324
+ {
325
+ "address": "module.order_events.aws_sns_topic_subscription.main",
326
+ "module_address": "module.order_events",
327
+ "mode": "managed",
328
+ "type": "aws_sns_topic_subscription",
329
+ "name": "main",
330
+ "provider_name": "registry.terraform.io/hashicorp/aws",
331
+ "change": {
332
+ "actions": [
333
+ "create"
334
+ ],
335
+ "before": null,
336
+ "after": {
337
+ "topic_arn": "arn:aws:sns:eu-west-2:111122223333:orders-created",
338
+ "protocol": "sqs",
339
+ "raw_message_delivery": true,
340
+ "confirmation_timeout_in_minutes": 1,
341
+ "endpoint_auto_confirms": false,
342
+ "delivery_policy": null,
343
+ "filter_policy": null,
344
+ "redrive_policy": null,
345
+ "replay_policy": null,
346
+ "subscription_role_arn": null
347
+ },
348
+ "after_unknown": {
349
+ "arn": true,
350
+ "id": true,
351
+ "endpoint": true,
352
+ "confirmation_was_authenticated": true,
353
+ "filter_policy_scope": true,
354
+ "owner_id": true,
355
+ "pending_confirmation": true
356
+ },
357
+ "before_sensitive": false,
358
+ "after_sensitive": {}
359
+ }
360
+ }
361
+ ],
362
+ "configuration": {
363
+ "provider_config": {
364
+ "aws": {
365
+ "name": "aws",
366
+ "full_name": "registry.terraform.io/hashicorp/aws",
367
+ "version_constraint": "~> 5.70",
368
+ "expressions": {
369
+ "region": {
370
+ "constant_value": "eu-west-2"
371
+ }
372
+ }
373
+ }
374
+ },
375
+ "root_module": {
376
+ "module_calls": {
377
+ "order_events": {
378
+ "source": "../../modules/order-events-queue"
379
+ }
380
+ }
381
+ }
382
+ },
383
+ "timestamp": "2026-11-10T16:42:07Z",
384
+ "applyable": true,
385
+ "complete": true,
386
+ "errored": false
387
+ }
@@ -0,0 +1,38 @@
1
+ locals {
2
+ tags = merge(var.tags, { module = "task-s3-read-role" })
3
+ }
4
+
5
+ data "aws_iam_policy_document" "assume" {
6
+ statement {
7
+ actions = ["sts:AssumeRole"]
8
+ principals {
9
+ type = "Service"
10
+ identifiers = ["ecs-tasks.amazonaws.com"]
11
+ }
12
+ }
13
+ }
14
+
15
+ resource "aws_iam_role" "this" {
16
+ name = var.name
17
+ assume_role_policy = data.aws_iam_policy_document.assume.json
18
+ tags = local.tags
19
+ }
20
+
21
+ data "aws_iam_policy_document" "s3" {
22
+ statement {
23
+ sid = "S3Access"
24
+ actions = var.actions
25
+ resources = concat(var.bucket_arns, [for arn in var.bucket_arns : "${arn}/*"])
26
+ }
27
+ }
28
+
29
+ resource "aws_iam_policy" "this" {
30
+ name = "${var.name}-s3"
31
+ policy = data.aws_iam_policy_document.s3.json
32
+ tags = local.tags
33
+ }
34
+
35
+ resource "aws_iam_role_policy_attachment" "this" {
36
+ role = aws_iam_role.this.name
37
+ policy_arn = aws_iam_policy.this.arn
38
+ }
@@ -0,0 +1,9 @@
1
+ output "role_arn" {
2
+ description = "ARN of the task role."
3
+ value = aws_iam_role.this.arn
4
+ }
5
+
6
+ output "role_name" {
7
+ description = "Name of the task role."
8
+ value = aws_iam_role.this.name
9
+ }
@@ -0,0 +1,22 @@
1
+ variable "name" {
2
+ description = "Name of the IAM role."
3
+ type = string
4
+ }
5
+
6
+ variable "bucket_arns" {
7
+ description = "Bucket ARNs the task may access."
8
+ type = list(string)
9
+ default = ["arn:aws:s3:::*"]
10
+ }
11
+
12
+ variable "actions" {
13
+ description = "S3 actions granted on the buckets."
14
+ type = list(string)
15
+ default = ["s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:DeleteObject"]
16
+ }
17
+
18
+ variable "tags" {
19
+ description = "Tags merged onto every resource."
20
+ type = map(string)
21
+ default = {}
22
+ }
@@ -0,0 +1,10 @@
1
+ terraform {
2
+ required_version = ">= 1.6.0"
3
+
4
+ required_providers {
5
+ aws = {
6
+ source = "hashicorp/aws"
7
+ version = "~> 5.70"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,39 @@
1
+ # Need: role for the monthly ledger report
2
+
3
+ **Team:** Finance data, Quillfield Goods (fictional)
4
+ **Environment:** prod, eu-west-2, account 111122223333
5
+ **Apply approver:** Hana Sorensen, platform lead
6
+
7
+ ## What we need
8
+
9
+ The monthly reporting job runs as an ECS task called `ledger-report`. It needs an IAM role it can assume that lets it **read** the CSV exports under:
10
+
11
+ ```
12
+ s3://ledger-exports-example/monthly/
13
+ ```
14
+
15
+ Read-only. The job must not write, overwrite or delete anything in S3. It doesn't need any other bucket.
16
+
17
+ ## How the module is called
18
+
19
+ `envs/prod/reporting.tf`. I left the module defaults in place:
20
+
21
+ ```hcl
22
+ module "ledger_report_role" {
23
+ source = "../../modules/task-s3-read-role"
24
+ name = "ledger-report-task"
25
+ tags = {
26
+ team = "finance-data"
27
+ cost-centre = "cc-2207"
28
+ }
29
+ }
30
+ ```
31
+
32
+ ## Plan
33
+
34
+ Run from `envs/prod`:
35
+
36
+ ```
37
+ terraform plan -out=ledger-report.tfplan
38
+ terraform show -json ledger-report.tfplan > plan.json
39
+ ```