App Limitations
Last Updated: 17 April 2026 (v4.3.0) · Verified against source: 2026-04-17 against commit b5c73fa (app/src/index.js, app/src/helpers.js)
We believe in transparency. This page documents every known limitation, platform constraint, and compliance boundary. Each limit has been verified against the actual source code. For a positive view of what we do cover, see our compliance guide mapping features to real regulatory standards.
Fit gate: use Compliance Glossary when Confluence pages contain terms that must be approved, current, scanned, and exportable as evidence. It is not for general glossary browsing, translation management, or page approval alone.
Platform Limits (Atlassian Forge)
| Limit | Value | Notes |
|---|---|---|
| Function timeout | Platform-dependent | Forge invocation limits vary by function type and can change. The app uses bounded batches; duration is not guaranteed. See Atlassian Forge invocation limits (checked 6 August 2026). |
| Runtime memory | 256 MB | Per function invocation. |
| Entity size | 240 KB per entity | Atlassian Forge KVS platform limit per entity value. We cap scan-result findings at 48 KB (index.js:64-67, MAX_FINDINGS = 120 at ~320 bytes/finding) and chunk the term cache at 200 entries per entity (index.js:128-132, CACHE_CHUNK_SIZE = 200) to stay well under this. |
| KVS query page size | 100 results per call | Forge KVS getMany() max page size. All queries use cursor pagination (index.js:11-25, queryByField) — no data silently dropped. |
| Confluence access | Read-only | The app never creates, modifies, or deletes your Confluence pages. |
Scanning
The scanner uses a map-reduce architecture to handle spaces of any size. Estimated scan times:
| Space Size | Estimated Time | Notes |
|---|---|---|
| Under 200 pages | < 10 seconds | Single batch, near-instant. |
| 200 – 1,000 pages | 30 – 60 seconds | Multiple chunks with progress bar. |
| 1,000 – 5,000 pages | 2 – 5 minutes | Typical enterprise space. Fully supported. |
| 5,000+ pages | 5 – 15 minutes | Large enterprise. Progress bar shows real-time status. |
| Limit | Value | Impact |
|---|---|---|
| Pages per space scan | No artificial cap | Map-reduce architecture with paginated indexing. Indexing and scan loops run from the browser — the scanner tab must stay open until the scan completes. Progress bar shows real-time status. |
| Term matching | Exact word-boundary | Matches whole words only. "AE" will not match "AEs", "adverse" will not match "adversely". |
| Auto-scan triggers | Create & update only | Page deletions, moves, and renames do not trigger a scan. |
| Scan history | Append-only snapshots | Each scan writes a snapshot alongside the latest result. Full scan history per page and per space. |
| Index chunk | 5,000 pages per resolver invocation | Each resolver call fetches up to 5,000 page IDs via 20 Confluence API calls (250 pages each). Frontend loops resolver until complete. (index.js:646, INDEX_CHUNK = 5000; index.js:668-669, limit=250) |
| Page-scan batch | 8 pages in parallel | Pages fetched concurrently per batch to stay under Confluence 10 req/s API rate limit. (index.js:699, BATCH = 8) |
| Context snippet | 80 characters | 40 characters before and after each match. (helpers.js:85, helpers.js:97) |
Import & Export
| Limit | Value | Workaround |
|---|---|---|
| CSV import cap | 500 terms per file | Hard cap (index.js:962). Terms written 10 in parallel per batch (index.js:1006, IMPORT_BATCH = 10) — 20 KVS req/burst, safe under Forge KVS 40 req/s limit. Split larger files. |
| Import status | All start as Draft | Imported terms must go through the approval workflow. |
| Export format | CSV only | PDF and XML export not available. CSV covers all data. |
| Export generation | Browser-side | Large glossaries (1000+ terms) may take several seconds to compile. |
Workflow
- No skip-state transitions: Terms must follow Draft → Review → Approved. You cannot go directly from Draft to Approved.
- Approved terms cannot be deleted: Must be deprecated first.
- Single space per term: Each term belongs to one space or "ALL". Multi-space assignment is not supported.
- Stale threshold: Fixed at 180 days (6 months). Not configurable per category. (
index.js:758) - No undo/revert: Full version history is visible but there is no "revert to version N" action.
- Duplicate check on create only: Renaming an existing term does not check for name collisions.
Compliance Scope — What We Do and Don't Cover
This is a terminology management and compliance scanning tool. It is not a full QMS, e-signature platform, regulatory submission system, general glossary browser, translation-management system, or standalone page-approval workflow. Teams use it for FDA 21 CFR Part 11 terminology, SOC 2 audit readiness, and EU AI Act compliance within this scope.
| Capability | Status | Details |
|---|---|---|
| Append-only audit trail | Yes | Every action recorded with user ID, timestamp, and change reason. |
| Four-eyes approval | Yes | Checks creator, submitter, and last editor. Another user must approve. |
| Mandatory change justification | Yes | Required on edits, status changes, and bulk operations. Not required on initial term creation. |
| E-signatures | No | Uses Atlassian account IDs, not cryptographic signatures (Part 11 Subpart C). |
| Role-based access (in-app) | Yes | Opt-in RBAC: designate term managers who can create, edit, approve, and delete. Others get read-only. |
| Finding resolution workflow | Yes | Findings can be acknowledged, justified (with reason), or closed. Full resolution audit trail per page-term pair. |
| Global activity log | Yes | Chronological view of all actions across all terms. Per-term history also available. |
| Compliance score | Basic | Single dimension (% approved). Does not factor review freshness or metadata completeness. |
| Webhooks / notifications | No | No external integrations. No email or Slack alerts on status changes. |
| Multi-language UI | No | English only. Term content can be any language. |
What We Honestly Claim
| Our Claim | Honest? | Caveat |
|---|---|---|
| "Append-only audit trail" | Yes | Deletions write a final audit entry before removal. |
| "Four-eyes approval" | Yes | Checks 3 fields: createdBy, submittedBy, updatedBy. |
| "No data leaves Atlassian" | Yes | Forge app runtime makes zero external calls. Verified in manifest (no external:fetch:backend permission) and code. Data stays in Atlassian's infrastructure. |
| "Mandatory change justification" | Yes | Enforced on edits, status changes, and bulk operations. Only gap: initial term creation. |
| "ALCOA+ aligned" | Yes | All ALCOA+ principles met including "Complete" (bulk ops now include change reasons). |
| "Compliance scanner" | Yes | Exact match only. Unlimited pages (map-reduce). No fuzzy matching. |
| "Finding resolution" | Yes | Acknowledge, justify, or close findings. Full resolution audit trail per page-term pair. |
| "Role-based access" | Yes | Opt-in term managers. Backend-enforced on all write resolvers. |
| "Scan history" | Yes | Append-only snapshots. Proves compliance state at any point in time. |
| "Display names" | Yes | Real names from Confluence API with graceful fallback to truncated account ID. |
Questions about limitations? Contact compliance-glossary@teamkit.dev.
Related reading
- Compliance for Confluence — approved terms, page scanning, and audit evidence for regulated teams in Confluence
- Security whitepaper — Forge architecture, SOC 2 / DORA / NIS2 / GDPR / FDA 21 CFR Part 11 mapping
- Compliance guide — how features map to real regulatory standards
- How it works — architecture and data flow overview
- Changelog — release history and version notes