Keelcroft / GitLab Issues Sync for Jira / Security

Security

Effective 30 October 2026 upon publication. Controls and their operational limits are described below.

Architecture

The app runs on Atlassian Forge, including event/queue processing and a five-minute scheduled recovery trigger. Jira data travels directly between Forge and the configured GitLab destination; Keelcroft operates no relay or vendor-hosted backend. Ordinary persistent records use Forge storage; the GitLab access token and root webhook secret use Forge encrypted secret storage.

GitLab egress means the app is not eligible for the Runs on Atlassian badge. No certification, regulatory-compliance status, legal-role classification or data-processing agreement is established by these technical controls.

Access controls

Credentials and webhooks

Transfer safeguards and integrity

File recovery and bounded copying

Upload intent and a non-expiring fence are stored before uploading. A known GitLab upload reference or Jira attachment ID lets attribution-marker work resume without another upload and suppresses reverse discovery. Unknown outcomes, changed digests and incomplete histories stop for reconciliation; a missing marker or expired claim does not authorize blind reupload. Recovery is capped at 100 stages per issue, with no automatic app TTL.

GitLab recovery references contain an upload secret and encoded filename. They are sensitive file-access references, not anonymous metadata. Jira stages retain attachment IDs instead. Raw file bytes are transient; the full durable inventory is in Privacy. Comments have five-page/100-per-page read bounds and ten copies per direction/pass; files have 10 MiB and three-per-direction/pass bounds. Downloads are buffered before size checks, not malware-scanned or strictly streaming-memory-bounded.

Recovery, preview and pause

Five-minute scheduled sweeps requeue existing pairs, at most ten per invocation and five per connection, with a 20-second new-work budget and persistent cursors/pending bucket. The budget does not bound an outstanding API call. Scheduling is not a five-minute completion SLA, load guarantee or discovery of unlinked issues. Disabled connections are skipped, and consumers recheck pause and the original pair so stale two-ID recovery jobs do not recreate an unlinked/replaced pair.

Read-only pair Preview returns field names and decision/problem codes, not field values, authors, bodies, filenames or URLs. It changes no issue, baseline, stored record or queue and is not a permissions audit or reservation.

Pause saves disabled state before remote cleanup and clears the webhook secret. It retains the access token/settings/links/history and a failed-cleanup hook ID for retry. Unlink removes pair/index entries, not copied content or all recovery/history. Neither control cancels writes already in flight; there is no general disconnect/delete-connection control.

Storage and application logs

Connection maps/filters/workflow/confidentiality settings, link digests, upload recovery, latest import runs and recovery cursors are durable with no automatic app TTL. Import runs retain IDs/keys and up to twenty failure entries with reasons bounded to 300 characters; those reasons can contain rejected values. Event records contain identifiers, outcomes and field names, not source content, and expire 90 days after latest write. This event expiry does not erase other stores.

Decision logs record operational identifiers, outcomes, attempts and reason codes. They exclude raw issue content, access tokens, webhook credentials/signatures and sensitive upload references. Automated logging tests exercise content/credential exclusions. Comment text and raw file bytes remain transient, but destination copies and the durable sensitive metadata disclosed above are separate.

Evidence boundaries

Receiving-side GitLab.com checks cover fields, comments and imports; earlier live checks also verified two-way file bytes, creation, assignee mapping and restricted/internal-note exclusions. Automated tests cover additional workflow, preview, recovery and failure paths. These do not establish self-managed compatibility, separate-user access equivalence, load/throttling behavior, scheduled recovery timing or every ambiguous-outcome scenario. No installed competitor benchmark or blanket reliability superiority is claimed.

Vulnerability reporting

Report suspected vulnerabilities privately to support@keelcroft.com with the subject line “Security”. Include reproducible steps and impact, but do not access data that does not belong to you or send credentials/upload secrets. The initial-response target for critical reports is one business day, not a resolution SLA.

The app does not claim SOC 2, Cloud Fortified, an independent penetration test, or participation in the Marketplace Security Bug Bounty Program.