Skip to content

v0.12.0 — Confluence, the third system on the desk

Choose a tag to compare

@benjaminLedel benjaminLedel released this 28 Aug 06:24
· 39 commits to main since this release

Jira holds the ticket, GitLab holds the code, and neither holds what they are supposed to mean. The specification a ticket links to, the runbook a change invalidates, the release note somebody looks for next quarter — an agent could read none of it and write none of it back.

Compiled, and for a harder reason than Jira's. A page is stored as an XHTML derivative with Atlassian's own elements woven through it: <ac:structured-macro> for a code block, <ac:link> around an <ri:page> for a link, <ac:image> around an <ri:attachment> for a picture. Reading it raw would put several times the page's own text into the agent's context, spread across attributes and CDATA; writing it raw produces almost-XHTML and a 400 nobody can learn from. So storage.go renders it to Markdown and markdown.go builds it back, and the agent writes what it writes anyway.

One trap in the parser is worth naming, because it cost an afternoon: xml.HTMLAutoClose contains link, the decoder matches by local name alone, and <ac:link> therefore closes the moment it opens — the rest of the page arrives as a syntax error. The void-element list is written out here without it.

Two deployments as with Jira, and further apart: Cloud moved pages to v2 but left search on v1, and both sit under a /wiki context path that does not exist on Server/Data Center. The token's shape decides, the path is appended when somebody leaves it out, and every method that branches says so where it branches.

Appending is the action the doc steers towards. Almost everything an agent writes to a wiki is an addition, and replacing a page can delete what a person wrote; they are two guard-rail subjects for that reason. Both take the version the agent read — Confluence numbers revisions, and that number is what turns "I write my change" into "I write my change unless somebody wrote first". Without it the last write wins and the result says so.

No heartbeat gate and no webhook, on purpose: nobody is assigned a page, and Confluence Cloud has no webhook an admin can simply enter. A test asserts both, so the setup doc cannot quietly become a lie.