Confluence
For org admins connecting a Confluence wiki as a knowledge source.
Hekkos can index a Confluence space so your team can ask about its wiki pages alongside your code and docs. Connecting is admin-only and lives under Settings → Connections, where GitHub installations and Confluence spaces share one Connections list. This guide covers connecting a space, picking which pages to ingest and at what scope, serving pages according to who may read them, and the optional real-time sync.
Scope is per page, not per space. Connecting a Confluence space is an org-scoped connection (managed under Settings → Connections). What carries a governance scope is the individual pages you pick to ingest — you assign each selected set to your org, an initiative, or a repository (step 2). A whole space is never moved under a project; only the pages you enroll are scoped.
1. Connect a space
You need, from your Atlassian site:
- Base URL — your wiki root, e.g.
https://your-org.atlassian.net/wiki. - Space key — the space to index, e.g.
ENG. - Email + API token — an Atlassian account and a Confluence API token for it. Hekkos uses these to read the space’s pages. The token is stored encrypted and is only ever used to fetch content.
Under Add a source, click Connect a Confluence space to reveal the form, fill it, and click Connect Confluence. The space then appears in the Connections list with a status and a sync chip (the sync state reads as a plain label — Syncing…, Queued, Synced, Sync failed — not a raw status token). Connect as many spaces as you like — each is a separate connection.
Every connected space keeps itself fresh on a schedule (a frequent incremental pass for changed pages, plus a daily full re-walk that also removes deleted pages).
2. Pick which pages to ingest — and scope them
Rather than scanning the whole space from the start, Hekkos lets you choose exactly which pages to ingest and assign each set a scope. On the connected space’s row, open the page picker to:
- Browse the space’s pages — the picker lists them with a select-all / none control at the top.
- Tick the pages to ingest — only the pages you select are indexed; unselected pages are left out entirely.
- Assign a scope — pick Organization, an initiative, or a repository for the selected set, so those pages govern (and answer at) the right level.
- Save selection — this replaces the space’s current selection.
Editing an existing selection: the picker currently opens with nothing pre-ticked (it does not yet read back your saved picks), and Save replaces the whole set. So when you reopen it to tweak a space you’ve already configured, re-tick every page you want to keep — anything left unticked stops being ingested. A prominent warning in the picker says the same. (Pre-seeding the picker from the saved selection is a planned follow-up once the backend exposes a read endpoint for it.)
Saving an empty selection clears it back to the legacy behavior — a full scan of the whole space. Restricted pages show up in the list but are never selectable: their title is suppressed and they stay gated by the permission-aware rules below, so there’s no restricted content to pick or leak.
How a page’s scope narrows answers
A page’s scope decides where it surfaces in chat and search, following the same cascade as policies: a repository sees pages scoped to the org, to any initiative that contains it, and to itself; an initiative sees org + its own pages; and the default org-wide view sees only org-scoped pages. In other words, scoping a page to an initiative or a repo hides it from general org-wide chat and surfaces it only where it applies.
You set the scope of a chat with the breadcrumb at the top of the app (Org ▸
Initiative ▸ Repo): stand in a repository and the assistant narrows wiki
retrieval to that repository’s scope, with a small banner in the composer showing
the active scope and a one-click Clear scope back to org-wide. Agents can do
the same over MCP by passing an optional repo to the query_knowledge tool.
Pages left at Organization scope (or ingested via the legacy full scan)
always answer everywhere, exactly as before. GitHub code docs are never narrowed
by this — only Confluence pages carry a governance scope.
3. Permission-aware access (optional)
By default, a connected space is indexed as org-internal — every member of your Hekkos org can see its pages in chat and search. If your space uses page-level view restrictions and you want Hekkos to honor them — so a member only sees the restricted pages they could read in Confluence — expand Permission-aware access on the connect form and add:
- Admin API key — an Atlassian Admin/Directory API key (org-admin scope). Hekkos uses it to map each member’s email to their Atlassian account and groups, so it can tell who may read a restricted page.
- Atlassian org id — your Atlassian organization id.
Both are required together (supply neither to index the whole space as org-internal). The admin key is validated against Atlassian when you connect, so a bad key is rejected up front.
With this on, Hekkos stamps each restricted page with the users and groups that may read it, and a member only sees a restricted page in chat/search when they are one of them. The safe direction is always favored: if Hekkos can’t confirm someone may read a page, it hides it — it never shows a page to someone who couldn’t open it in Confluence.
Restricted pages inside a fully-restricted space (a space that isn’t open to everyone) are supported too, including sites that use Confluence’s newer role-based space permissions — but this is gated by an operator setting (
CONFLUENCE_RESTRICTED_SPACES, see the configuration reference). Ask whoever runs your Hekkos deployment if you need it.
Permission changes reconcile on a schedule (hourly), so a page that gains or loses a restriction is re-stamped within about an hour even if its content didn’t change.
4. Real-time sync (optional)
Spaces refresh on a schedule by default — usually fine. To push page changes to Hekkos in seconds instead, install the Hekkos app from the Atlassian Marketplace into your Confluence site and link it to your Hekkos org:
- Under Settings → Connections, in the Real-time sync section (shown once at least one space is connected), click Generate linking token. This gives you a single-use token that expires in 30 minutes.
- Install the Hekkos app in Confluence and paste the token into its setup page.
That’s it — content edits then sync in near-real-time. A few honest notes:
- Real-time is a freshness accelerator, not a correctness mechanism. The scheduled sync remains the source of truth and the backstop.
- Permission changes are still reconciled on the schedule, not in real time — Confluence doesn’t reliably emit an event when a page’s restriction changes, so page-level access stays fresh via the hourly reconcile above, not the webhook.
- Deploying the Forge app is an operator step; see the configuration reference.
What members see
- A page is shown in chat and search only to members who may read it — org-internal pages to everyone, restricted pages to their allowed users/groups.
- Answers that draw on a wiki page cite it with a stable link back to Confluence.
- Members who aren’t admins can’t connect or disconnect spaces; they just see the results they’re entitled to.
Measured against your code
A connected space isn’t only a place Hekkos reads from to answer questions — its pages are checked against your real code, the same way your in-repo docs are. When a page makes a falsifiable claim about the code — a function signature, an HTTP route, an env var — Hekkos diffs that claim against the real state it extracted from your repositories and, when they disagree, raises a drift finding. Hekkos measures the claim; it never asks you to confirm it.
- Source-tagged findings. A wiki-sourced finding shows a Wiki chip in the repo’s Findings view and links back to the page with Open page in Confluence. It’s attributed to the repository whose code the page describes.
- Fixed in Confluence, not by a PR. These findings have no code fix and no standing PR — the wiki is what’s out of date. Edit the page; Hekkos re-checks it on the next sync and the finding clears.
- Only fully-open pages. Exactly like search and chat, measurement covers only pages readable by everyone in the org. A restricted page is never measured, and if a space or page later becomes restricted its wiki findings resolve on the next run.
- Never the code Trust headline. Wiki drift is tracked on its own honesty count — how many wiki claims disagree with the code — and is deliberately kept out of your code Trust, coverage, and posture numbers. A stale wiki can’t deflate the score your code earned, and a repo’s code drift count stays code-only (wiki drift shows as a separate “+N from Confluence” indicator). See Drift & enforcement.
Disconnecting
Disconnecting a space (the trash icon on its row) stops its pages from syncing and serving. Existing history is kept; re-connect to resume. Its wiki drift findings resolve on the next measurement run (they no longer describe a connected source).