skilldrop-cli 0.16.35 → 0.16.36

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 (212) hide show
  1. package/README.md +1 -0
  2. package/agents/README.md +4 -1
  3. package/agents/docs-reviewer.md +47 -0
  4. package/agents/finding-adjudicator.md +49 -0
  5. package/agents/test-reviewer.md +52 -0
  6. package/catalogue.json +17 -7
  7. package/model-routing.json +40 -0
  8. package/package.json +1 -1
  9. package/packs/ai-engineering/skills/agent-config-review/SKILL.md +116 -0
  10. package/packs/ai-engineering/skills/agent-config-review/evals/eval_queries.json +12 -0
  11. package/packs/ai-engineering/skills/agent-config-review/evals/evals.json +75 -0
  12. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/db-migrator.md +8 -0
  13. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/reviewer.md +9 -0
  14. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.json +48 -0
  15. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.local.json +5 -0
  16. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.mcp.json +22 -0
  17. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/package.json +12 -0
  18. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/.cursor/mcp.json +17 -0
  19. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/config.toml +21 -0
  20. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/my-user-settings.json +11 -0
  21. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/agents/release-notes.md +13 -0
  22. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/settings.json +39 -0
  23. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.mcp.json +18 -0
  24. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/package.json +14 -0
  25. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/.github/workflows/codex-triage.yml +29 -0
  26. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/AGENTS.md +16 -0
  27. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/codex/config.toml +34 -0
  28. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.claude/settings.json +22 -0
  29. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.mcp.json +9 -0
  30. package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +81 -0
  31. package/packs/ai-engineering/skills/agent-config-review/manifest.json +60 -0
  32. package/packs/ai-engineering/skills/agent-config-review/reference.md +205 -0
  33. package/packs/ai-engineering/skills/agent-config-review/scripts/agent_config_scan.py +989 -0
  34. package/packs/ai-engineering/skills/agent-incident-response/SKILL.md +175 -0
  35. package/packs/ai-engineering/skills/agent-incident-response/evals/eval_queries.json +14 -0
  36. package/packs/ai-engineering/skills/agent-incident-response/evals/evals.json +107 -0
  37. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/agent-session-excerpt.txt +11 -0
  38. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/ci-build-log.txt +24 -0
  39. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/incident-notes.md +19 -0
  40. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/mcp-config.json +20 -0
  41. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/session-transcript.txt +8 -0
  42. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/agent-session.log +70 -0
  43. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/infra/staging-db.tf +25 -0
  44. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/job.yaml +19 -0
  45. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/run.log +13 -0
  46. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/usage-export-2026-10-20.csv +13 -0
  47. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/.mcp.json +20 -0
  48. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/git-log.txt +12 -0
  49. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync-excerpt.txt +30 -0
  50. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync.log +15 -0
  51. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/ssh-config.txt +16 -0
  52. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/.github/workflows/ci.yml +28 -0
  53. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/SECURITY.md +8 -0
  54. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/issue-479.md +35 -0
  55. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/package.json +15 -0
  56. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/pr-482.diff +20 -0
  57. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/run-log.txt +30 -0
  58. package/packs/ai-engineering/skills/agent-incident-response/examples/injected-issue-comment.md +57 -0
  59. package/packs/ai-engineering/skills/agent-incident-response/manifest.json +55 -0
  60. package/packs/ai-engineering/skills/agent-incident-response/reference.md +152 -0
  61. package/packs/ai-engineering/skills/agent-incident-response/scripts/find_secret_exposure.py +239 -0
  62. package/packs/ai-engineering/skills/agent-incident-response/scripts/usage_split.py +194 -0
  63. package/packs/converters/skills/file-to-markdown/SKILL.md +2 -1
  64. package/packs/converters/skills/file-to-markdown/evals/eval_queries.json +4 -0
  65. package/packs/converters/skills/file-to-markdown/manifest.json +2 -2
  66. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +253 -3
  67. package/packs/converters/skills/md-to-confluence/SKILL.md +139 -0
  68. package/packs/converters/skills/md-to-confluence/evals/eval_queries.json +42 -0
  69. package/packs/converters/skills/md-to-confluence/evals/evals.json +89 -0
  70. package/packs/converters/skills/md-to-confluence/evals/files/1/img/latency-dashboard.png +0 -0
  71. package/packs/converters/skills/md-to-confluence/evals/files/1/payments-runbook.md +60 -0
  72. package/packs/converters/skills/md-to-confluence/evals/files/2/deploy-checklist.md +33 -0
  73. package/packs/converters/skills/md-to-confluence/evals/files/3/img/after/screen.png +0 -0
  74. package/packs/converters/skills/md-to-confluence/evals/files/3/img/before/screen.png +0 -0
  75. package/packs/converters/skills/md-to-confluence/evals/files/3/release-notes-4.2.md +49 -0
  76. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/img/topology.png +0 -0
  77. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/ingest-pipeline-design.md +65 -0
  78. package/packs/converters/skills/md-to-confluence/evals/files/5/support/troubleshooting-sso.md +57 -0
  79. package/packs/converters/skills/md-to-confluence/examples/inputs/img/queue-depth.png +0 -0
  80. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.fixed.md +21 -0
  81. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.md +21 -0
  82. package/packs/converters/skills/md-to-confluence/examples/queue-runbook.md +57 -0
  83. package/packs/converters/skills/md-to-confluence/manifest.json +52 -0
  84. package/packs/converters/skills/md-to-confluence/reference.md +92 -0
  85. package/packs/converters/skills/md-to-confluence/scripts/md_to_confluence.py +821 -0
  86. package/packs/converters/skills/md-to-pptx/SKILL.md +131 -0
  87. package/packs/converters/skills/md-to-pptx/evals/eval_queries.json +12 -0
  88. package/packs/converters/skills/md-to-pptx/evals/evals.json +84 -0
  89. package/packs/converters/skills/md-to-pptx/evals/files/1/img/defect-burndown.png +0 -0
  90. package/packs/converters/skills/md-to-pptx/evals/files/1/status-report.md +75 -0
  91. package/packs/converters/skills/md-to-pptx/evals/files/3/brand.json +12 -0
  92. package/packs/converters/skills/md-to-pptx/evals/files/3/night-shift-induction.md +53 -0
  93. package/packs/converters/skills/md-to-pptx/evals/files/4/charts/ontime.png +0 -0
  94. package/packs/converters/skills/md-to-pptx/evals/files/4/qbr-q3.md +85 -0
  95. package/packs/converters/skills/md-to-pptx/evals/files/5/vendor-sync-notes.md +28 -0
  96. package/packs/converters/skills/md-to-pptx/examples/support-weekly-input.md +48 -0
  97. package/packs/converters/skills/md-to-pptx/examples/support-weekly.md +75 -0
  98. package/packs/converters/skills/md-to-pptx/examples/tickets-by-week.png +0 -0
  99. package/packs/converters/skills/md-to-pptx/manifest.json +49 -0
  100. package/packs/converters/skills/md-to-pptx/reference.md +139 -0
  101. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1841 -0
  102. package/packs/dev-team/loops/modernize/LOOP.md +124 -0
  103. package/packs/dev-team/loops/modernize/evals/eval_queries.json +9 -0
  104. package/packs/dev-team/loops/modernize/evals/evals.json +27 -0
  105. package/packs/dev-team/loops/modernize/loop.json +60 -0
  106. package/packs/dev-team/skills/behaviour-equivalence/SKILL.md +155 -0
  107. package/packs/dev-team/skills/behaviour-equivalence/evals/eval_queries.json +11 -0
  108. package/packs/dev-team/skills/behaviour-equivalence/evals/evals.json +76 -0
  109. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/cases.jsonl +12 -0
  110. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/new.jsonl +12 -0
  111. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/notes.md +15 -0
  112. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old.jsonl +12 -0
  113. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old_rerun.jsonl +12 -0
  114. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v1.py +45 -0
  115. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v2.py +65 -0
  116. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/rules.json +10 -0
  117. package/packs/dev-team/skills/behaviour-equivalence/evals/files/3/diff-summary.txt +16 -0
  118. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/diff.txt +13 -0
  119. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py2.py +16 -0
  120. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py3.py +24 -0
  121. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/input.csv +13 -0
  122. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/new_output.csv +13 -0
  123. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/old_output.csv +13 -0
  124. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/TEAM_NOTES.md +19 -0
  125. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/normalisation.yaml +12 -0
  126. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/new_run.jsonl +8 -0
  127. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run1.jsonl +8 -0
  128. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run2.jsonl +8 -0
  129. package/packs/dev-team/skills/behaviour-equivalence/examples/delivery-date.md +78 -0
  130. package/packs/dev-team/skills/behaviour-equivalence/manifest.json +33 -0
  131. package/packs/dev-team/skills/behaviour-equivalence/reference.md +97 -0
  132. package/packs/dev-team/skills/behaviour-equivalence/scripts/golden_diff.py +524 -0
  133. package/packs/dev-team/skills/behaviour-equivalence/templates/accepted.json +10 -0
  134. package/packs/dev-team/skills/behaviour-equivalence/templates/rules.json +7 -0
  135. package/packs/frontend/pack.json +55 -0
  136. package/packs/frontend/skills/rendering-strategy/SKILL.md +149 -0
  137. package/packs/frontend/skills/rendering-strategy/evals/eval_queries.json +38 -0
  138. package/packs/frontend/skills/rendering-strategy/evals/evals.json +77 -0
  139. package/packs/frontend/skills/rendering-strategy/evals/files/1/fernhill-app.md +40 -0
  140. package/packs/frontend/skills/rendering-strategy/evals/files/3/routes.md +33 -0
  141. package/packs/frontend/skills/rendering-strategy/evals/files/4/build-notes.txt +5 -0
  142. package/packs/frontend/skills/rendering-strategy/evals/files/4/nuxt.config.ts +19 -0
  143. package/packs/frontend/skills/rendering-strategy/evals/files/4/pages/recipes/[slug].vue +37 -0
  144. package/packs/frontend/skills/rendering-strategy/evals/files/4/routes.md +15 -0
  145. package/packs/frontend/skills/rendering-strategy/evals/files/5/routes.txt +18 -0
  146. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/hooks.server.ts +14 -0
  147. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/(marketing)/pricing/+page.server.ts +10 -0
  148. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/+layout.server.ts +10 -0
  149. package/packs/frontend/skills/rendering-strategy/evals/files/5/svelte.config.js +10 -0
  150. package/packs/frontend/skills/rendering-strategy/evals/files/5/traffic.md +18 -0
  151. package/packs/frontend/skills/rendering-strategy/examples/saas-site.md +42 -0
  152. package/packs/frontend/skills/rendering-strategy/manifest.json +50 -0
  153. package/packs/frontend/skills/rendering-strategy/reference.md +116 -0
  154. package/packs/frontend/skills/rendering-strategy/scripts/render_load.py +181 -0
  155. package/packs/frontend/skills/web-performance-review/SKILL.md +106 -0
  156. package/packs/frontend/skills/web-performance-review/evals/eval_queries.json +38 -0
  157. package/packs/frontend/skills/web-performance-review/evals/evals.json +76 -0
  158. package/packs/frontend/skills/web-performance-review/evals/files/1/psi.json +1065 -0
  159. package/packs/frontend/skills/web-performance-review/evals/files/2/after.json +359 -0
  160. package/packs/frontend/skills/web-performance-review/evals/files/2/before.json +375 -0
  161. package/packs/frontend/skills/web-performance-review/evals/files/4/psi-pdp-mobile-2026-10-19.json +171 -0
  162. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-attribution-oct14-19.csv +6 -0
  163. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-daily.csv +15 -0
  164. package/packs/frontend/skills/web-performance-review/evals/files/5/crux-home-phone.json +35 -0
  165. package/packs/frontend/skills/web-performance-review/evals/files/5/lighthouse-home-mobile.json +173 -0
  166. package/packs/frontend/skills/web-performance-review/examples/quayside-article-lhr.json +480 -0
  167. package/packs/frontend/skills/web-performance-review/examples/quayside-article.md +103 -0
  168. package/packs/frontend/skills/web-performance-review/manifest.json +48 -0
  169. package/packs/frontend/skills/web-performance-review/reference.md +105 -0
  170. package/packs/frontend/skills/web-performance-review/scripts/lh_summary.py +743 -0
  171. package/packs/product-manager/skills/lean-canvas/SKILL.md +162 -0
  172. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +42 -0
  173. package/packs/product-manager/skills/lean-canvas/evals/evals.json +82 -0
  174. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +54 -0
  175. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +30 -0
  176. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +44 -0
  177. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +5 -0
  178. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +40 -0
  179. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +18 -0
  180. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +72 -0
  181. package/packs/product-manager/skills/lean-canvas/manifest.json +34 -0
  182. package/packs/product-manager/skills/lean-canvas/reference.md +102 -0
  183. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +211 -0
  184. package/packs/solution-architect/skills/api-contract-draft/SKILL.md +2 -2
  185. package/packs/solution-architect/skills/api-contract-draft/manifest.json +28 -6
  186. package/packs/solution-architect/skills/event-contract-draft/SKILL.md +167 -0
  187. package/packs/solution-architect/skills/event-contract-draft/evals/eval_queries.json +38 -0
  188. package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +76 -0
  189. package/packs/solution-architect/skills/event-contract-draft/evals/files/1/order-events-brief.md +45 -0
  190. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/NOTES.md +23 -0
  191. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/schemas/shipment-update.json +40 -0
  192. package/packs/solution-architect/skills/event-contract-draft/evals/files/5/invoice.example.json +25 -0
  193. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.asyncapi.json +246 -0
  194. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.md +92 -0
  195. package/packs/solution-architect/skills/event-contract-draft/manifest.json +25 -0
  196. package/packs/solution-architect/skills/event-contract-draft/reference.md +113 -0
  197. package/packs/solution-architect/skills/event-contract-draft/scripts/check_asyncapi.py +502 -0
  198. package/packs/solution-architect/skills/event-contract-draft/templates/asyncapi-skeleton.json +144 -0
  199. package/packs/sre-oncall/skills/slo-spec/SKILL.md +161 -0
  200. package/packs/sre-oncall/skills/slo-spec/evals/eval_queries.json +38 -0
  201. package/packs/sre-oncall/skills/slo-spec/evals/evals.json +75 -0
  202. package/packs/sre-oncall/skills/slo-spec/evals/files/1/order-service.md +51 -0
  203. package/packs/sre-oncall/skills/slo-spec/evals/files/3/search-slo-status.md +30 -0
  204. package/packs/sre-oncall/skills/slo-spec/evals/files/4/alerts/payments-api.rules.yaml +16 -0
  205. package/packs/sre-oncall/skills/slo-spec/evals/files/4/docs/dependencies.md +8 -0
  206. package/packs/sre-oncall/skills/slo-spec/evals/files/4/metrics/summary-90d.md +51 -0
  207. package/packs/sre-oncall/skills/slo-spec/evals/files/5/ops-notes.md +34 -0
  208. package/packs/sre-oncall/skills/slo-spec/examples/ticket-booking.md +88 -0
  209. package/packs/sre-oncall/skills/slo-spec/manifest.json +34 -0
  210. package/packs/sre-oncall/skills/slo-spec/reference.md +113 -0
  211. package/packs/sre-oncall/skills/slo-spec/scripts/slo_math.py +449 -0
  212. package/packs/sre-oncall/skills/slo-spec/templates/slo-spec.md +35 -0
@@ -0,0 +1,49 @@
1
+ # Ledgerly 4.2 release notes
2
+
3
+ Released to all workspaces. Upgrade window: Saturday 02:00 to 04:00 UTC.
4
+
5
+ ## What changed
6
+
7
+ - **Faster month-end close.** Reconciliation runs in the background, so the close screen
8
+ no longer locks while it works.
9
+ - **New export screen.** The CSV export moved from Settings to Reports.
10
+ - ~~Bulk invoice delete~~ is postponed to 4.3.
11
+
12
+ Before:
13
+
14
+ ![Export under Settings in 4.1](img/before/screen.png)
15
+
16
+ After:
17
+
18
+ ![Export under Reports in 4.2](img/after/screen.png)
19
+
20
+ ## How reconciliation now flows
21
+
22
+ ```mermaid
23
+ flowchart LR
24
+ Import[Bank import] --> Match[Auto-match]
25
+ Match --> Review[Review queue]
26
+ Review --> Close[Month-end close]
27
+ ```
28
+
29
+ ## Upgrading a self-hosted install
30
+
31
+ 1. Back up the database.
32
+
33
+ ```bash
34
+ ledgerly-admin backup --out /backups/pre-4.2.dump
35
+ ```
36
+
37
+ 2. Run the migration.
38
+
39
+ ```bash
40
+ ledgerly-admin migrate --to 4.2
41
+ ```
42
+
43
+ 3. Restart the web and worker services.
44
+
45
+ ## Known issues
46
+
47
+ The export screen ignores the date filter for workspaces created before 2021.[^2]
48
+
49
+ [^2]: Fixed in 4.2.1, due two weeks after this release.
@@ -0,0 +1,65 @@
1
+ # Ingest Pipeline Design
2
+
3
+ Owner: Platform Team (Riverbend Logistics)
4
+ Status: Approved, revision 3
5
+
6
+ ## Context
7
+
8
+ The ingest pipeline receives shipment events from depot scanners and writes them to the
9
+ event store. This revision moves the parser from the gateway into a dedicated worker pool
10
+ so that malformed payloads no longer stall the gateway.
11
+
12
+ ![Pipeline topology](img/topology.png)
13
+
14
+ ## Throughput limits
15
+
16
+ | Stage | Max events/sec | p99 latency | Scales on |
17
+ |----------------|---------------:|------------:|------------------|
18
+ | Gateway | 12,000 | 40 ms | CPU |
19
+ | Parser workers | 8,500 | 120 ms | Queue depth |
20
+ | Event store | 6,000 | 250 ms | Write IOPS |
21
+
22
+ The event store is the bottleneck: anything above 6,000 events/sec is buffered in the queue.
23
+
24
+ ## Flow
25
+
26
+ ```mermaid
27
+ flowchart LR
28
+ Scanner --> Gateway --> Queue[(ingest-queue)]
29
+ Queue --> Parser --> Store[(event-store)]
30
+ Parser -- invalid --> DLQ[(dead-letter)]
31
+ ```
32
+
33
+ ## Parser configuration
34
+
35
+ The parser rejects any payload where `weight_kg < 0` or the depot code is unknown.
36
+ Raw XML from older scanners is wrapped in CDATA before it reaches the parser:
37
+
38
+ ```xml
39
+ <parser-config version="3">
40
+ <rule id="weight" when="weight_kg &lt; 0" action="reject"/>
41
+ <rule id="depot" when="depot not in ALLOWED" action="dlq"/>
42
+ <legacy-wrapper><![CDATA[<scan depot="RB-07">payload]]></legacy-wrapper>
43
+ <!-- note: a literal ]]> inside payloads must be escaped by the scanner bridge -->
44
+ </parser-config>
45
+ ```
46
+
47
+ Run the replay tool against the dead-letter queue like this:
48
+
49
+ ```bash
50
+ ingest-replay --queue dead-letter --since "2026-09-01" --max 500 && echo "done" > /tmp/replay.log
51
+ ```
52
+
53
+ ## Failover
54
+
55
+ If the parser pool loses more than half its workers, the gateway switches to
56
+ pass-through mode and events land in the queue unparsed.
57
+
58
+ ![Failover sequence](img/failover.png)
59
+
60
+ > **Warning:** pass-through mode skips the weight check. Do not leave it on for more than 30 minutes.
61
+
62
+ ## Open questions
63
+
64
+ - [ ] Confirm DLQ retention (currently 7 days)
65
+ - [x] Agree parser pool minimum size (4 workers)
@@ -0,0 +1,57 @@
1
+ # Troubleshooting: SSO login failures
2
+
3
+ For Tier 1 agents at Lumen Desk. Work top to bottom; stop at the first fix that works.
4
+
5
+ > [!NOTE]
6
+ > Most SSO tickets are clock drift or a stale browser session. Check those first.
7
+
8
+ ## Quick checks
9
+
10
+ - [ ] Ask the customer for the exact error text (screenshot if possible)
11
+ - [ ] Confirm their workspace URL ends in `.lumendesk.example`
12
+ - [ ] Ask them to try a private/incognito window
13
+
14
+ ## Common errors
15
+
16
+ <details>
17
+ <summary>"SAML response not valid yet" or "expired assertion"</summary>
18
+
19
+ This is almost always clock drift on the customer's identity provider[^1].
20
+ Ask their admin to check the IdP server time. More than 3 minutes of drift will fail.
21
+
22
+ </details>
23
+
24
+ <details>
25
+ <summary>Redirect loop after login</summary>
26
+
27
+ Clear cookies for the workspace domain, then retry. If it still loops, collect a HAR file:
28
+
29
+ 1. Open DevTools (<kbd>F12</kbd>)
30
+ 2. Network tab, tick **Preserve log**
31
+ 3. Reproduce, then right-click and **Save all as HAR**
32
+
33
+ </details>
34
+
35
+ <details>
36
+ <summary>"User not provisioned"</summary>
37
+
38
+ The user exists in the IdP but not in Lumen Desk. Check SCIM sync status[^2]:
39
+
40
+ ```bash
41
+ lumenctl scim status --workspace acme-demo | grep -E "last_sync|errors" && echo "<check above>"
42
+ ```
43
+
44
+ If `errors > 0`, escalate. See the [escalation matrix](./escalation-matrix.md).
45
+
46
+ </details>
47
+
48
+ ## When to escalate
49
+
50
+ > [!WARNING]
51
+ > Never ask the customer to send their IdP signing certificate or private key in a ticket.
52
+
53
+ Escalate to Tier 2 if the issue is not resolved after the quick checks and the matching
54
+ section above, or if more than one user in the same workspace is affected[^3].
55
+
56
+ [^1]: Lumen Desk allows up to 180 seconds of skew.
57
+ [^2]: SCIM sync runs every 40 minutes.
@@ -0,0 +1,21 @@
1
+ # Order queue runbook
2
+
3
+ The `orders-in` queue feeds the fulfilment workers. Rota: **fulfilment-oncall**.
4
+
5
+ > **Warning:** Purging the queue deletes orders. Never purge without the fulfilment lead.
6
+
7
+ ## Check the backlog
8
+
9
+ ![Queue depth panel](img/queue-depth.png)
10
+
11
+ 1. Read the depth:
12
+
13
+ ```bash
14
+ qctl depth orders-in
15
+ ```
16
+
17
+ 2. If it is above 2,000 for 10 minutes, scale the workers to 6.
18
+
19
+ ## Scale back down
20
+
21
+ Once depth is under 200, scale the workers back to 3.
@@ -0,0 +1,21 @@
1
+ # Order queue runbook
2
+
3
+ The `orders-in` queue feeds the fulfilment workers. Rota: **fulfilment-oncall**.
4
+
5
+ > **Warning:** Purging the queue deletes orders. Never purge without the fulfilment lead.
6
+
7
+ ## Check the backlog
8
+
9
+ ![Queue depth panel](img/queue-depth.png)
10
+
11
+ 1. Read the depth:
12
+
13
+ ```bash
14
+ qctl depth orders-in
15
+ ```
16
+
17
+ 2. If it is above 2,000 for 10 minutes, scale the workers to 6.
18
+
19
+ <details><summary>Scale back down</summary>
20
+ Once depth is under 200, scale the workers back to 3.
21
+ </details>
@@ -0,0 +1,57 @@
1
+ # Example: a short runbook onto a Confluence space
2
+
3
+ **What the user said:** *"Put `queue-runbook.md` in Confluence under the Runbooks page
4
+ (196612) in the OPS space on northwind.atlassian.net."*
5
+
6
+ The input is [`inputs/queue-runbook.md`](inputs/queue-runbook.md). It has a warning callout, an
7
+ image, a numbered list split by an unindented code block, and the scale-down step hidden in a
8
+ `<details>` HTML block.
9
+
10
+ ## First conversion (real output)
11
+
12
+ ```text
13
+ WARN line 17: numbered list starts at 2 but Confluence restarts it at 1; indent the code block or text that split the list under the previous item so it stays one list
14
+ WARN line 19: raw HTML block dropped (lines 19-21); rewrite it as Markdown to keep it
15
+ wrote queue-runbook.xhtml (1 KB storage format): title "Order queue runbook"; 2 headings, 0 tables, 1 code blocks, 1 callouts, 0 task lists, 1 images to attach, 0 remote images
16
+ upload these files to the page as attachments, with exactly these names, or the images show as broken:
17
+ queue-depth.png (from img/queue-depth.png)
18
+ ```
19
+
20
+ Both warnings are fixable in the source, so neither goes to the user as a loss. The fixed copy
21
+ is [`inputs/queue-runbook.fixed.md`](inputs/queue-runbook.fixed.md): the code block is indented
22
+ three spaces under step 1, and the `<details>` block became a `## Scale back down` section with
23
+ its sentence unchanged. The rerun prints no warnings.
24
+
25
+ ## The page body after the fix (real, abridged)
26
+
27
+ ```xml
28
+ <ac:structured-macro ac:name="warning" ac:schema-version="1"><ac:rich-text-body><p>Purging the queue deletes orders. Never purge without the fulfilment lead.</p></ac:rich-text-body></ac:structured-macro>
29
+ <h2>Check the backlog</h2><p><ac:image ac:alt="Queue depth panel"><ri:attachment ri:filename="queue-depth.png" /></ac:image></p>
30
+ <ol><li><p>Read the depth:</p><ac:structured-macro ac:name="code" ac:schema-version="1"><ac:parameter ac:name="language">bash</ac:parameter><ac:plain-text-body><![CDATA[qctl depth orders-in]]></ac:plain-text-body></ac:structured-macro></li>
31
+ <li><p>If it is above 2,000 for 10 minutes, scale the workers to 6.</p></li></ol>
32
+ <h2>Scale back down</h2><p>Once depth is under 200, scale the workers back to 3.</p>
33
+ ```
34
+
35
+ ## The dry run (real output; no credentials were set)
36
+
37
+ ```text
38
+ dry run: nothing was sent
39
+ POST https://northwind.atlassian.net/wiki/rest/api/content
40
+ space OPS, title "Order queue runbook", parent 196612
41
+ body: 847 bytes of storage format
42
+ first checks space OPS for a page with this title and stops if one exists
43
+ auth: none found: set CONFLUENCE_EMAIL and CONFLUENCE_API_TOKEN (Cloud) or CONFLUENCE_PAT (Data Center) in the environment
44
+ ```
45
+
46
+ ## The reply
47
+
48
+ > The runbook is converted and ready to go up as a new page, **Order queue runbook**, under
49
+ > page 196612 in the OPS space. Nothing has been published yet.
50
+ >
51
+ > - **Two fixes to the source:** the `qctl depth` command now sits inside step 1, so the steps
52
+ > stay numbered 1 and 2; the hidden "Scale back down" block is now its own section, so it
53
+ > isn't dropped.
54
+ > - **One file to attach after publishing:** `queue-depth.png`, name unchanged, or the panel shows as a broken image.
55
+ > - **Before I can publish:** set `CONFLUENCE_EMAIL` and `CONFLUENCE_API_TOKEN` in your terminal
56
+ > and restart the session. I'll then check that no OPS page already has this title, show you
57
+ > the result, and publish once you say yes.
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "md-to-confluence",
3
+ "version": "0.1.0",
4
+ "description": "Turn a Markdown runbook, design note or guide into a Confluence page: storage-format XHTML with real code blocks, tables, tasks, info and warning panels, images as attachments and an optional contents macro, a warning for everything dropped, and an optional publish that first shows which page it will create or overwrite and at what version, refuses stale or wrong-space overwrites, and takes credentials only from the environment. Use when the user says \"put this in Confluence\", \"publish this markdown to the wiki\", \"update the Confluence page with this\", \"convert to Confluence storage format\", or names a Confluence space for a Markdown file.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": [
13
+ "CONFLUENCE_EMAIL",
14
+ "CONFLUENCE_API_TOKEN",
15
+ "CONFLUENCE_PAT"
16
+ ]
17
+ },
18
+ "related": [
19
+ "md-to-docx",
20
+ "md-to-html",
21
+ "mermaid-render",
22
+ "runbook-generator",
23
+ "tracker-brief-sync"
24
+ ],
25
+ "handoff": [
26
+ {
27
+ "to": "mermaid-render",
28
+ "when": "the Markdown has Mermaid diagrams",
29
+ "purpose": "Render each diagram to PNG so it can go on the page as an attachment instead of showing as source code.",
30
+ "fallback": "If mermaid-render is absent, leave the diagram as a code block and tell the user it shows as text until someone adds an image or a diagram app."
31
+ }
32
+ ],
33
+ "tags": [
34
+ "confluence",
35
+ "markdown",
36
+ "convert",
37
+ "publish",
38
+ "wiki"
39
+ ],
40
+ "permissions": {
41
+ "network": [
42
+ "*.atlassian.net"
43
+ ],
44
+ "commands": [],
45
+ "files": "named-paths",
46
+ "notes": "Converting makes no network calls. Only --inspect (read-only GET) and --publish (GET, then POST or PUT) contact Confluence, at the https base URL the user passes: a Cloud site under *.atlassian.net, or for Data Center the user's own host, which they must add to the sandbox allowlist themselves. Credentials are read from CONFLUENCE_EMAIL + CONFLUENCE_API_TOKEN or CONFLUENCE_PAT only, never printed; redirects are not followed, so the Authorization header goes nowhere else. Writes only the -o path."
47
+ },
48
+ "model": {
49
+ "tier": "light",
50
+ "rationale": "Mechanical conversion to Confluence storage format done by its script, with an optional publish; the model checks what was dropped and what will be overwritten."
51
+ }
52
+ }
@@ -0,0 +1,92 @@
1
+ # md-to-confluence reference
2
+
3
+ ## What converts to what
4
+
5
+ | Markdown | Confluence storage format |
6
+ |---|---|
7
+ | `#` to `######`, setext `===` / `---` | `<h1>` to `<h6>`. The first `#` heading becomes the page title and leaves the body (Confluence prints the title above the page); `--keep-h1` keeps it |
8
+ | `**bold**`, `*italic*`, `~~strike~~`, `` `code` `` | `<strong>`, `<em>`, line-through span, `<code>` |
9
+ | Inline, reference-style and bare links | `<a href>`. `javascript:`, `data:`, `file:` targets are dropped (text kept). `#anchor` links become plain text: Confluence names heading anchors after the page title, so a Markdown slug never matches |
10
+ | `-` and `1.` lists, nested | `<ul>` / `<ol>`. A list that starts at 2 or later restarts at 1, with a warning |
11
+ | A list made only of `- [ ]` / `- [x]` items | `<ac:task-list>`, one `<ac:task>` per item, complete or incomplete. Mixed with plain items: written as ☐ / ☑ text, with a warning |
12
+ | Pipe table | `<table>`, first row as `<th>`; `:---:` / `---:` alignment kept as a paragraph style in each cell |
13
+ | `> quote` | `<blockquote>` |
14
+ | Callout (below) | info, tip, note or warning macro, label removed (the panel's icon says it) |
15
+ | Fenced or indented code | `code` macro, body in CDATA. `]]>` inside the code is split as `]]]]><![CDATA[>`, so it reads back byte for byte |
16
+ | An image with a local path, `img/x.png` | `<ac:image><ri:attachment ri:filename="x.png"/></ac:image>`, matched by file name only |
17
+ | An image with an `https://` address | `<ac:image><ri:url/></ac:image>`, with a warning: it breaks if that site moves or needs a login |
18
+ | `---` | `<hr />` |
19
+ | `--toc` | `toc` macro at the top |
20
+ | **Dropped, with a WARN line** | raw HTML blocks (whole), inline HTML tags (text kept; `<br>` kept), footnotes, `data:` images, YAML front matter (its `title:` is used as the page title) |
21
+
22
+ Text is escaped once, after `&amp;`-style references are decoded, so nothing in the Markdown
23
+ can open a macro or a tag in the page. Before writing, the script parses its own output as XML
24
+ and stops if it is malformed.
25
+
26
+ ## Callout convention
27
+
28
+ The label is bold, ends in a colon, and opens the quote. GitHub's `> [!NOTE]` form works too.
29
+
30
+ | Write | Panel |
31
+ |---|---|
32
+ | `> **Note:**` or `> **Info:**` or `> [!NOTE]` | info (blue) |
33
+ | `> **Tip:**` or `> [!TIP]` | tip (green) |
34
+ | `> **Important:**` or `> [!IMPORTANT]` | note (yellow) |
35
+ | `> **Warning:**`, `> **Caution:**`, `> [!WARNING]`, `> [!CAUTION]` | warning (red) |
36
+
37
+ ✅ `> **Warning:** Never restart all three replicas at once.` ❌ `> Warning - never restart…`
38
+ (a plain quote: no panel).
39
+
40
+ ## Code languages
41
+
42
+ Highlighted on Cloud and Data Center: bash, c#, cpp, css, diff, go, groovy, java, js, json,
43
+ kotlin, perl, php, powershell, py, ruby, sass, scala, sql, text, typescript, vb, xml, yml, and a
44
+ few older ones. Aliases map automatically (`python` → py, `sh`/`shell`/`zsh` → bash, `yaml` →
45
+ yml, `html` → xml, `ts` → typescript). Any other language is shown without highlighting, with a
46
+ warning. A `mermaid` fence stays a code block.
47
+
48
+ ## Publishing
49
+
50
+ All calls go to the v1 content API at `<base>/rest/api/content`, which Cloud and Data Center
51
+ both serve. For a Cloud host the script adds `/wiki` if the base URL lacks it.
52
+
53
+ | Mode | Calls | Writes to Confluence |
54
+ |---|---|---|
55
+ | `--inspect --page-id N` | GET page N with version and space | no |
56
+ | `--inspect` (no page id) | GET pages in the space with this title | no |
57
+ | `--publish --dry-run` | none | no |
58
+ | `--publish` (create) | GET by title, then POST | yes, a new page |
59
+ | `--publish --page-id N` | GET page N, then PUT with version + 1 | yes, a new version |
60
+
61
+ **Refusals** (exit 2, nothing written): a base URL that isn't `https`, or carries a user name
62
+ or password; no credentials in the environment; a page in another space than `--space`; a page
63
+ not at `--expected-version`; a create whose title already exists in the space. A redirect is
64
+ never followed, so the credentials go to the host you named and nowhere else. HTTP errors exit 1
65
+ with the status and Confluence's message (401 credentials, 403 permission, 404 missing or hidden,
66
+ 409 someone saved meanwhile).
67
+
68
+ ## Credentials
69
+
70
+ Read from the environment only, never from arguments or files, and never printed.
71
+
72
+ | Variable | Used for |
73
+ |---|---|
74
+ | `CONFLUENCE_EMAIL` + `CONFLUENCE_API_TOKEN` | Cloud: basic auth. Token from id.atlassian.com, Security, API tokens |
75
+ | `CONFLUENCE_PAT` | Data Center: bearer token. From your profile, Personal Access Tokens |
76
+
77
+ When both are set, a `*.atlassian.net` host uses the email and API token; any other host uses the PAT.
78
+
79
+ ```bash
80
+ export CONFLUENCE_EMAIL="<your Atlassian account email>"
81
+ export CONFLUENCE_API_TOKEN="<token from id.atlassian.com>"
82
+ ```
83
+
84
+ Run those in your own terminal before starting the agent, or pull them from a secret manager.
85
+ A Data Center host is not `*.atlassian.net`: add it to the sandbox's allowed hosts yourself if
86
+ the project is contained.
87
+
88
+ ## Attachments
89
+
90
+ The script never uploads files. After the page exists, upload each listed file to the page
91
+ (page menu, Attachments) with its name unchanged; the `ri:filename` in the page is matched
92
+ exactly, case included. Until then Confluence shows a broken image box.