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.
- package/README.md +1 -0
- package/agents/README.md +4 -1
- package/agents/docs-reviewer.md +47 -0
- package/agents/finding-adjudicator.md +49 -0
- package/agents/test-reviewer.md +52 -0
- package/catalogue.json +17 -7
- package/model-routing.json +40 -0
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-config-review/SKILL.md +116 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/eval_queries.json +12 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/evals.json +75 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/db-migrator.md +8 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/reviewer.md +9 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.json +48 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.local.json +5 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.mcp.json +22 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/1/package.json +12 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/2/.cursor/mcp.json +17 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/2/config.toml +21 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/my-user-settings.json +11 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/agents/release-notes.md +13 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/settings.json +39 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.mcp.json +18 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/package.json +14 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/.github/workflows/codex-triage.yml +29 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/AGENTS.md +16 -0
- package/packs/ai-engineering/skills/agent-config-review/evals/files/5/codex/config.toml +34 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.claude/settings.json +22 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.mcp.json +9 -0
- package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +81 -0
- package/packs/ai-engineering/skills/agent-config-review/manifest.json +60 -0
- package/packs/ai-engineering/skills/agent-config-review/reference.md +205 -0
- package/packs/ai-engineering/skills/agent-config-review/scripts/agent_config_scan.py +989 -0
- package/packs/ai-engineering/skills/agent-incident-response/SKILL.md +175 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/eval_queries.json +14 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/evals.json +107 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/agent-session-excerpt.txt +11 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/ci-build-log.txt +24 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/incident-notes.md +19 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/mcp-config.json +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/session-transcript.txt +8 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/agent-session.log +70 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/infra/staging-db.tf +25 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/job.yaml +19 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/run.log +13 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/usage-export-2026-10-20.csv +13 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/.mcp.json +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/git-log.txt +12 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync-excerpt.txt +30 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync.log +15 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/ssh-config.txt +16 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/.github/workflows/ci.yml +28 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/SECURITY.md +8 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/issue-479.md +35 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/package.json +15 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/pr-482.diff +20 -0
- package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/run-log.txt +30 -0
- package/packs/ai-engineering/skills/agent-incident-response/examples/injected-issue-comment.md +57 -0
- package/packs/ai-engineering/skills/agent-incident-response/manifest.json +55 -0
- package/packs/ai-engineering/skills/agent-incident-response/reference.md +152 -0
- package/packs/ai-engineering/skills/agent-incident-response/scripts/find_secret_exposure.py +239 -0
- package/packs/ai-engineering/skills/agent-incident-response/scripts/usage_split.py +194 -0
- package/packs/converters/skills/file-to-markdown/SKILL.md +2 -1
- package/packs/converters/skills/file-to-markdown/evals/eval_queries.json +4 -0
- package/packs/converters/skills/file-to-markdown/manifest.json +2 -2
- package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +253 -3
- package/packs/converters/skills/md-to-confluence/SKILL.md +139 -0
- package/packs/converters/skills/md-to-confluence/evals/eval_queries.json +42 -0
- package/packs/converters/skills/md-to-confluence/evals/evals.json +89 -0
- package/packs/converters/skills/md-to-confluence/evals/files/1/img/latency-dashboard.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/1/payments-runbook.md +60 -0
- package/packs/converters/skills/md-to-confluence/evals/files/2/deploy-checklist.md +33 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/img/after/screen.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/img/before/screen.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/3/release-notes-4.2.md +49 -0
- package/packs/converters/skills/md-to-confluence/evals/files/4/docs/img/topology.png +0 -0
- package/packs/converters/skills/md-to-confluence/evals/files/4/docs/ingest-pipeline-design.md +65 -0
- package/packs/converters/skills/md-to-confluence/evals/files/5/support/troubleshooting-sso.md +57 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/img/queue-depth.png +0 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.fixed.md +21 -0
- package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.md +21 -0
- package/packs/converters/skills/md-to-confluence/examples/queue-runbook.md +57 -0
- package/packs/converters/skills/md-to-confluence/manifest.json +52 -0
- package/packs/converters/skills/md-to-confluence/reference.md +92 -0
- package/packs/converters/skills/md-to-confluence/scripts/md_to_confluence.py +821 -0
- package/packs/converters/skills/md-to-pptx/SKILL.md +131 -0
- package/packs/converters/skills/md-to-pptx/evals/eval_queries.json +12 -0
- package/packs/converters/skills/md-to-pptx/evals/evals.json +84 -0
- package/packs/converters/skills/md-to-pptx/evals/files/1/img/defect-burndown.png +0 -0
- package/packs/converters/skills/md-to-pptx/evals/files/1/status-report.md +75 -0
- package/packs/converters/skills/md-to-pptx/evals/files/3/brand.json +12 -0
- package/packs/converters/skills/md-to-pptx/evals/files/3/night-shift-induction.md +53 -0
- package/packs/converters/skills/md-to-pptx/evals/files/4/charts/ontime.png +0 -0
- package/packs/converters/skills/md-to-pptx/evals/files/4/qbr-q3.md +85 -0
- package/packs/converters/skills/md-to-pptx/evals/files/5/vendor-sync-notes.md +28 -0
- package/packs/converters/skills/md-to-pptx/examples/support-weekly-input.md +48 -0
- package/packs/converters/skills/md-to-pptx/examples/support-weekly.md +75 -0
- package/packs/converters/skills/md-to-pptx/examples/tickets-by-week.png +0 -0
- package/packs/converters/skills/md-to-pptx/manifest.json +49 -0
- package/packs/converters/skills/md-to-pptx/reference.md +139 -0
- package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1841 -0
- package/packs/dev-team/loops/modernize/LOOP.md +124 -0
- package/packs/dev-team/loops/modernize/evals/eval_queries.json +9 -0
- package/packs/dev-team/loops/modernize/evals/evals.json +27 -0
- package/packs/dev-team/loops/modernize/loop.json +60 -0
- package/packs/dev-team/skills/behaviour-equivalence/SKILL.md +155 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/eval_queries.json +11 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/evals.json +76 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/cases.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/new.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/notes.md +15 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old_rerun.jsonl +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v1.py +45 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v2.py +65 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/rules.json +10 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/3/diff-summary.txt +16 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/diff.txt +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py2.py +16 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py3.py +24 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/input.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/new_output.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/old_output.csv +13 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/TEAM_NOTES.md +19 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/normalisation.yaml +12 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/new_run.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run1.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run2.jsonl +8 -0
- package/packs/dev-team/skills/behaviour-equivalence/examples/delivery-date.md +78 -0
- package/packs/dev-team/skills/behaviour-equivalence/manifest.json +33 -0
- package/packs/dev-team/skills/behaviour-equivalence/reference.md +97 -0
- package/packs/dev-team/skills/behaviour-equivalence/scripts/golden_diff.py +524 -0
- package/packs/dev-team/skills/behaviour-equivalence/templates/accepted.json +10 -0
- package/packs/dev-team/skills/behaviour-equivalence/templates/rules.json +7 -0
- package/packs/frontend/pack.json +55 -0
- package/packs/frontend/skills/rendering-strategy/SKILL.md +149 -0
- package/packs/frontend/skills/rendering-strategy/evals/eval_queries.json +38 -0
- package/packs/frontend/skills/rendering-strategy/evals/evals.json +77 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/1/fernhill-app.md +40 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/3/routes.md +33 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/build-notes.txt +5 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/nuxt.config.ts +19 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/pages/recipes/[slug].vue +37 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/4/routes.md +15 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/routes.txt +18 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/hooks.server.ts +14 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/(marketing)/pricing/+page.server.ts +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/+layout.server.ts +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/svelte.config.js +10 -0
- package/packs/frontend/skills/rendering-strategy/evals/files/5/traffic.md +18 -0
- package/packs/frontend/skills/rendering-strategy/examples/saas-site.md +42 -0
- package/packs/frontend/skills/rendering-strategy/manifest.json +50 -0
- package/packs/frontend/skills/rendering-strategy/reference.md +116 -0
- package/packs/frontend/skills/rendering-strategy/scripts/render_load.py +181 -0
- package/packs/frontend/skills/web-performance-review/SKILL.md +106 -0
- package/packs/frontend/skills/web-performance-review/evals/eval_queries.json +38 -0
- package/packs/frontend/skills/web-performance-review/evals/evals.json +76 -0
- package/packs/frontend/skills/web-performance-review/evals/files/1/psi.json +1065 -0
- package/packs/frontend/skills/web-performance-review/evals/files/2/after.json +359 -0
- package/packs/frontend/skills/web-performance-review/evals/files/2/before.json +375 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/psi-pdp-mobile-2026-10-19.json +171 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-attribution-oct14-19.csv +6 -0
- package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-daily.csv +15 -0
- package/packs/frontend/skills/web-performance-review/evals/files/5/crux-home-phone.json +35 -0
- package/packs/frontend/skills/web-performance-review/evals/files/5/lighthouse-home-mobile.json +173 -0
- package/packs/frontend/skills/web-performance-review/examples/quayside-article-lhr.json +480 -0
- package/packs/frontend/skills/web-performance-review/examples/quayside-article.md +103 -0
- package/packs/frontend/skills/web-performance-review/manifest.json +48 -0
- package/packs/frontend/skills/web-performance-review/reference.md +105 -0
- package/packs/frontend/skills/web-performance-review/scripts/lh_summary.py +743 -0
- package/packs/product-manager/skills/lean-canvas/SKILL.md +162 -0
- package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +42 -0
- package/packs/product-manager/skills/lean-canvas/evals/evals.json +82 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +54 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +30 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +44 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +5 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +40 -0
- package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +18 -0
- package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +72 -0
- package/packs/product-manager/skills/lean-canvas/manifest.json +34 -0
- package/packs/product-manager/skills/lean-canvas/reference.md +102 -0
- package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +211 -0
- package/packs/solution-architect/skills/api-contract-draft/SKILL.md +2 -2
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +28 -6
- package/packs/solution-architect/skills/event-contract-draft/SKILL.md +167 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/eval_queries.json +38 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +76 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/1/order-events-brief.md +45 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/4/NOTES.md +23 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/4/schemas/shipment-update.json +40 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/5/invoice.example.json +25 -0
- package/packs/solution-architect/skills/event-contract-draft/examples/order-service.asyncapi.json +246 -0
- package/packs/solution-architect/skills/event-contract-draft/examples/order-service.md +92 -0
- package/packs/solution-architect/skills/event-contract-draft/manifest.json +25 -0
- package/packs/solution-architect/skills/event-contract-draft/reference.md +113 -0
- package/packs/solution-architect/skills/event-contract-draft/scripts/check_asyncapi.py +502 -0
- package/packs/solution-architect/skills/event-contract-draft/templates/asyncapi-skeleton.json +144 -0
- package/packs/sre-oncall/skills/slo-spec/SKILL.md +161 -0
- package/packs/sre-oncall/skills/slo-spec/evals/eval_queries.json +38 -0
- package/packs/sre-oncall/skills/slo-spec/evals/evals.json +75 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/1/order-service.md +51 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/3/search-slo-status.md +30 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/alerts/payments-api.rules.yaml +16 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/docs/dependencies.md +8 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/4/metrics/summary-90d.md +51 -0
- package/packs/sre-oncall/skills/slo-spec/evals/files/5/ops-notes.md +34 -0
- package/packs/sre-oncall/skills/slo-spec/examples/ticket-booking.md +88 -0
- package/packs/sre-oncall/skills/slo-spec/manifest.json +34 -0
- package/packs/sre-oncall/skills/slo-spec/reference.md +113 -0
- package/packs/sre-oncall/skills/slo-spec/scripts/slo_math.py +449 -0
- package/packs/sre-oncall/skills/slo-spec/templates/slo-spec.md +35 -0
|
Binary file
|
|
Binary file
|
|
@@ -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
|
+

|
|
15
|
+
|
|
16
|
+
After:
|
|
17
|
+
|
|
18
|
+

|
|
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.
|
|
Binary file
|
|
@@ -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
|
+

|
|
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 < 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
|
+

|
|
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.
|
|
Binary file
|
|
@@ -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
|
+

|
|
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
|
+

|
|
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 `&`-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.
|