{
  "openapi": "3.1.1",
  "info": {
    "title": "Wikinest API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://wikinest.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "wikinest-markdown-to-html",
                "wikinest-page-diff",
                "wikinest-confluence-import"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/wikinest-markdown-to-html/calculate": {
      "post": {
        "operationId": "calculateWikinestMarkdownToHtml",
        "summary": "Turn wiki Markdown with panels, status lozenges and a table of contents into safe HTML.",
        "description": "Converts a Wikinest page written in Markdown into sanitised HTML: headings with anchors, tables, task lists, highlighted code, info/success/warning/error panels, expand sections, status lozenges, dates, mentions, [[page links]] and the table-of-contents and child-pages macros. It reports the outline, links that point nowhere and unsafe addresses it dropped.\n\nMethodology:\n- Blocks are read line by line: ATX headings, paragraphs, fenced code, block quotes, bullet/numbered/task lists (nested by indentation), GFM tables with alignment, rules, and the Wikinest blocks — :::info/success/warning/error panels (note = info, tip = success), :::expand sections and the {{toc}}, {{children}} and {{embed URL}} macros on a line of their own.\n- Inline: code spans, **bold**, *italic*, ~~strike~~, links, images, autolinks and bare https addresses, [[Page]] / [[Page|label]] / [[KEY:Page]] links, @[Name] mentions, {status:colour|text} lozenges and {date:YYYY-MM-DD}.\n- Sanitised by construction: every piece of text is escaped, raw HTML in the Markdown is shown as text, links keep only http(s), mailto and #anchors, images only https and attachments; nothing else reaches the output. External links open in a new tab with noopener.\n- Heading anchors are slugs of the heading text (duplicates get -2, -3); the outline nests headings by level and numbers them 1, 1.1, 1.2 …\n- Code blocks are highlighted by a small one-pass tokenizer (comments, strings, numbers, keywords, literals, tags) for JavaScript/TypeScript, Python, shell, SQL, CSS, JSON, YAML, Go, Rust, Java/Kotlin/C#, C/C++, PHP and HTML/XML.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "wikinest_markdown_to_html",
        "x-owner-app": "wikinest",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WikinestMarkdownToHtmlInput"
              },
              "examples": {
                "example1": {
                  "summary": "Runbook with panels, a table, code and task lists",
                  "value": {
                    "markdown": "# Runbook: api\n\n{status:green|Active} · Owner: @[Grace Hopper] · Last reviewed {date:2026-11-24}\n\n{{toc}}\n\n## Alerts\n| Alert | Meaning | First step |\n| --- | --- | --- |\n| High error rate | More than 2 % of requests fail | Check the latest deploy |\n\n## Diagnosis\n1. Check the [[Dashboards]] page\n2. Read the logs:\n\n```sh\njournalctl -u api --since \"15 min ago\"\n```\n\n:::warning Before you restart\nTell the on-call channel first. See [[Escalation]].\n:::\n\n## Recovery\n- [x] Restart the service\n- [ ] Write the incident note\n\n:::expand Older notes\nMoved from the old wiki.\n:::\n",
                    "pageTitles": "Dashboards\nOn-call rota",
                    "tocLevels": 2
                  }
                },
                "example2": {
                  "summary": "Team handbook home page as a standalone document",
                  "value": {
                    "markdown": "Welcome to the handbook of the **Orbit team**. Start with [[Onboarding: new teammate]], then browse the sections below.\n\n{{toc 2}}\n\n## Sections\n{{children}}\n\n## Status\n| Area | Owner | Status |\n| --- | --- | --- |\n| Rituals | @[Ada] | {status:green|Up to date} |\n| Decisions | @[Grace] | {status:yellow|Needs review} |\n| How-tos | @[Linus] | {status:blue|Growing} |\n\n:::info How to edit\nPress **E** or choose **Edit**, change the Markdown on the left and watch the preview on the right. Publish creates a new version you can compare and restore later.\n:::\n",
                    "pageTitles": "Team handbook\nRituals\nPlanning 2026-11-24\nRetrospective 2026-11-24\nDecisions\nADR 1: Markdown for all documentation\nHow-tos\nHow to request access\nOnboarding: new teammate",
                    "children": "Rituals\nDecisions\nHow-tos\nOnboarding: new teammate",
                    "standalone": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WikinestMarkdownToHtmlResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/wikinest-page-diff/calculate": {
      "post": {
        "operationId": "calculateWikinestPageDiff",
        "summary": "Compare two versions of a page: added, removed and changed lines plus a unified diff.",
        "description": "Compares two versions of a wiki page (or any text) line by line with the Myers algorithm, pairs replaced lines and marks the changed words inside them, counts added and removed words and writes a unified diff you can save as a patch. It is the comparison Wikinest shows in a page’s version history.\n\nMethodology:\n- Both versions are split into lines (Windows and old Mac line ends become \\n). With “ignore spaces”, runs of white space inside a line become one space and lines are trimmed before comparing.\n- The shortest edit script between the two line lists comes from Myers’ O(ND) algorithm after removing the common start and end. Deletions directly followed by insertions are paired as changed lines.\n- Inside each changed pair a second Myers diff over words, spaces and punctuation marks the changed words; added and removed words are counted from those marks and from whole added or removed lines.\n- Similarity = unchanged lines ÷ all rows of the side-by-side view. The unified diff uses the usual @@ -a,b +c,d @@ hunk headers with the chosen number of context lines.\n- Wikinest merges concurrent edits with the same line diff (a diff3-style three-way merge against the version both people started from).",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "wikinest_page_diff",
        "x-owner-app": "wikinest",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WikinestPageDiffInput"
              },
              "examples": {
                "example1": {
                  "summary": "Release checklist: status, tasks and commands changed",
                  "value": {
                    "before": "# Release checklist\n\nStatus: {status:yellow|In progress}\n\n- [x] Freeze the release branch\n- [ ] Run the smoke tests\n- [ ] Write the release notes\n\n## Commands\n```sh\ngit tag -a v2.4.0\n```\n\nAsk @[Ada] before tagging.\n",
                    "after": "# Release checklist\n\nStatus: {status:green|Done}\n\n- [x] Freeze the release branch\n- [x] Run the smoke tests\n- [x] Write the release notes\n- [x] Announce the release in #general\n\n## Commands\n```sh\ngit tag -a v2.4.0 -m \"Release 2.4.0\"\ngit push origin v2.4.0\n```\n\nAsk @[Grace] before tagging.\n"
                  }
                },
                "example2": {
                  "summary": "Same pages, one line of context, spaces ignored",
                  "value": {
                    "before": "# Release checklist\n\nStatus: {status:yellow|In progress}\n\n- [x] Freeze the release branch\n- [ ] Run the smoke tests\n- [ ] Write the release notes\n\n## Commands\n```sh\ngit tag -a v2.4.0\n```\n\nAsk @[Ada] before tagging.\n",
                    "after": "# Release checklist\n\nStatus: {status:green|Done}\n\n- [x] Freeze the release branch\n- [x] Run the smoke tests\n- [x] Write the release notes\n- [x] Announce the release in #general\n\n## Commands\n```sh\ngit tag -a v2.4.0 -m \"Release 2.4.0\"\n  git   push origin v2.4.0\n```\n\nAsk @[Grace] before tagging.\n",
                    "context": 1,
                    "ignoreWhitespace": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WikinestPageDiffResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/wikinest-confluence-import/calculate": {
      "post": {
        "operationId": "calculateWikinestConfluenceImport",
        "summary": "Convert a Confluence HTML export into Wikinest pages in Markdown with the page tree.",
        "description": "Reads the HTML export of a Confluence space (or pasted page HTML) and turns every page into Wikinest Markdown: headings, tables, lists, code, info/note/tip/warning panels, expand sections, status lozenges, task lists, mentions, dates and links between pages. The page tree is rebuilt from the breadcrumbs, and you get a Wikinest project file to open in the app.\n\nMethodology:\n- Each page file is parsed by a small tolerant HTML parser. Title: the export’s title line without the “Space :” prefix. Parent: the last ancestor in the page’s breadcrumbs that is part of the export (matched by file name, by the title pattern of Confluence file names, or by link text).\n- Body: the main-content area. Headings, paragraphs, bold/italic/strike, inline code, links, lists, tables (first row as header), quotes and rules become their Markdown forms; links to exported pages become [[Page]] links.\n- Macros: information → :::info, note → :::warning, tip → :::success, warning → :::error, panel → :::info with its title, code → fenced code with the brush language, expand → :::expand, status → {status:colour|TEXT}, task lists → - [ ] / - [x], user links → @[Name], dates → {date:…}, table of contents → {{toc}}, child pages → {{children}}, emoticons → Unicode symbols.\n- Images stored in the export (attachments/…) become attachment references (att:cf1, att:cf2 …); the app attaches the image files from the ZIP, this tool lists them. Unknown macros keep their text and are counted in the warnings.\n- Pages are ordered parents first. The result is a Wikinest project file with one space; open it in the app with Open file, or import the ZIP there directly.\n\nConfluence is a trademark of Atlassian. Wikinest reads the export files you provide; it does not connect to Confluence.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "wikinest_confluence_import",
        "x-owner-app": "wikinest",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WikinestConfluenceImportInput"
              },
              "examples": {
                "example1": {
                  "summary": "Three pages of a team space (home, checklist, decision log)",
                  "value": {
                    "html": "\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Orbit Team Home\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Orbit Team Home \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Ada Lovelace\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cp\u003eWelcome to the \u003cstrong\u003eOrbit\u003c/strong\u003e team space. Start with the \u003ca href=\"Release-checklist_65541.html\"\u003eRelease checklist\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"toc-macro client-side-toc-macro\" data-headerelements=\"H1,H2,H3\"\u003e\u003c/div\u003e\n\u003ch2 id=\"OrbitTeamHome-Whoweare\"\u003eWho we are\u003c/h2\u003e\n\u003cp\u003eWe build the scheduling service. Ask \u003ca href=\"https://example.com/users/ada\" class=\"confluence-userlink user-mention\" data-username=\"ada\"\u003eAda Lovelace\u003c/a\u003e about access.\u003c/p\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-information\"\u003e\u003cp class=\"title\"\u003eOn call\u003c/p\u003e\u003cspan class=\"aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon\"\u003e\u003c/span\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eThe on-call rota changes every \u003cem\u003eMonday\u003c/em\u003e at 09:00.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 id=\"OrbitTeamHome-Childpages\"\u003eChild pages\u003c/h2\u003e\n\u003cul class=\"childpages-macro\"\u003e\u003cli\u003e\u003ca href=\"Release-checklist_65541.html\"\u003eRelease checklist\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"Decision-log_65544.html\"\u003eDecision log\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Release checklist\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                            \u003cli\u003e\u003cspan\u003e\u003ca href=\"Orbit-Team-Home_65537.html\"\u003eOrbit Team Home\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Release checklist \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Ada Lovelace\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cp\u003eStatus: \u003cspan class=\"status-macro aui-lozenge aui-lozenge-current\"\u003eIN PROGRESS\u003c/span\u003e \u0026middot; Target date \u003ctime datetime=\"2026-12-01\" class=\"date-future\"\u003e01 Dec 2026\u003c/time\u003e\u003c/p\u003e\n\u003cul class=\"inline-task-list\" data-inline-tasks-content-id=\"65541\"\u003e\u003cli class=\"checked\" data-inline-task-id=\"1\"\u003e\u003cspan\u003eFreeze the release branch\u003c/span\u003e\u003c/li\u003e\u003cli data-inline-task-id=\"2\"\u003e\u003cspan\u003eRun the smoke tests\u003c/span\u003e\u003c/li\u003e\u003cli data-inline-task-id=\"3\"\u003e\u003cspan\u003eWrite the release notes\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-note\"\u003e\u003cspan class=\"aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon\"\u003e\u003c/span\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eNever deploy on a Friday afternoon.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 id=\"Releasechecklist-Commands\"\u003eCommands\u003c/h3\u003e\n\u003cdiv class=\"code panel pdl\"\u003e\u003cdiv class=\"codeContent panelContent pdl\"\u003e\u003cpre class=\"syntaxhighlighter-pre\" data-syntaxhighlighter-params=\"brush: bash; gutter: false\" data-theme=\"Confluence\"\u003egit tag -a v2.4.0 -m \"Release 2.4.0\"\ngit push origin v2.4.0\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv class=\"table-wrap\"\u003e\u003ctable class=\"confluenceTable\"\u003e\u003ccolgroup\u003e\u003ccol/\u003e\u003ccol/\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth class=\"confluenceTh\"\u003eStep\u003c/th\u003e\u003cth class=\"confluenceTh\"\u003eOwner\u003c/th\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd class=\"confluenceTd\"\u003eTag\u003c/td\u003e\u003ctd class=\"confluenceTd\"\u003e\u003ca href=\"https://example.com/users/grace\" class=\"confluence-userlink user-mention\"\u003eGrace Hopper\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd class=\"confluenceTd\"\u003eAnnounce\u003c/td\u003e\u003ctd class=\"confluenceTd\"\u003eProduct\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cdiv class=\"expand-container\"\u003e\u003cdiv class=\"expand-control\"\u003e\u003cspan class=\"expand-control-icon icon\"\u003e\u0026nbsp;\u003c/span\u003e\u003cspan class=\"expand-control-text\"\u003eRollback steps\u003c/span\u003e\u003c/div\u003e\u003cdiv class=\"expand-content expand-hidden\"\u003e\u003col\u003e\u003cli\u003eRevert the tag\u003c/li\u003e\u003cli\u003eRedeploy \u003ccode\u003ev2.3.9\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cspan class=\"confluence-embedded-file-wrapper\"\u003e\u003cimg class=\"confluence-embedded-image\" src=\"attachments/65541/65550.png\" data-image-src=\"attachments/65541/65550.png\" alt=\"Release pipeline\"\u003e\u003c/span\u003e \u003cimg class=\"emoticon emoticon-tick\" src=\"images/icons/emoticons/check.svg\" alt=\"(tick)\"\u003e\u003c/p\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Decision log\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                            \u003cli\u003e\u003cspan\u003e\u003ca href=\"Orbit-Team-Home_65537.html\"\u003eOrbit Team Home\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Decision log \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Grace Hopper\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cdiv class=\"panel\" style=\"border-width: 1px;\"\u003e\u003cdiv class=\"panelHeader\" style=\"border-bottom-width: 1px;\"\u003e\u003cb\u003eDecision 12\u003c/b\u003e\u003c/div\u003e\u003cdiv class=\"panelContent\"\u003e\u003cp\u003eWe move background jobs to a queue. See \u003ca href=\"Release-checklist_65541.html\"\u003ethe checklist\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cblockquote\u003e\u003cp\u003eSmall, reversible steps.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-warning\"\u003e\u003cp class=\"title\"\u003eBreaking change\u003c/p\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eOld job ids stop working.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cspan class=\"status-macro aui-lozenge aui-lozenge-success\"\u003eACCEPTED\u003c/span\u003e \u003cspan class=\"status-macro aui-lozenge\"\u003ePARKED\u003c/span\u003e\u003c/p\u003e\n\u003cdiv class=\"plugin_pagetree conf-macro output-block\"\u003e\u003cp\u003ePage tree\u003c/p\u003e\u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n"
                  }
                },
                "example2": {
                  "summary": "Same pages imported as “Orbit wiki”",
                  "value": {
                    "html": "\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Orbit Team Home\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Orbit Team Home \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Ada Lovelace\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cp\u003eWelcome to the \u003cstrong\u003eOrbit\u003c/strong\u003e team space. Start with the \u003ca href=\"Release-checklist_65541.html\"\u003eRelease checklist\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"toc-macro client-side-toc-macro\" data-headerelements=\"H1,H2,H3\"\u003e\u003c/div\u003e\n\u003ch2 id=\"OrbitTeamHome-Whoweare\"\u003eWho we are\u003c/h2\u003e\n\u003cp\u003eWe build the scheduling service. Ask \u003ca href=\"https://example.com/users/ada\" class=\"confluence-userlink user-mention\" data-username=\"ada\"\u003eAda Lovelace\u003c/a\u003e about access.\u003c/p\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-information\"\u003e\u003cp class=\"title\"\u003eOn call\u003c/p\u003e\u003cspan class=\"aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon\"\u003e\u003c/span\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eThe on-call rota changes every \u003cem\u003eMonday\u003c/em\u003e at 09:00.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch2 id=\"OrbitTeamHome-Childpages\"\u003eChild pages\u003c/h2\u003e\n\u003cul class=\"childpages-macro\"\u003e\u003cli\u003e\u003ca href=\"Release-checklist_65541.html\"\u003eRelease checklist\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"Decision-log_65544.html\"\u003eDecision log\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Release checklist\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                            \u003cli\u003e\u003cspan\u003e\u003ca href=\"Orbit-Team-Home_65537.html\"\u003eOrbit Team Home\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Release checklist \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Ada Lovelace\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cp\u003eStatus: \u003cspan class=\"status-macro aui-lozenge aui-lozenge-current\"\u003eIN PROGRESS\u003c/span\u003e \u0026middot; Target date \u003ctime datetime=\"2026-12-01\" class=\"date-future\"\u003e01 Dec 2026\u003c/time\u003e\u003c/p\u003e\n\u003cul class=\"inline-task-list\" data-inline-tasks-content-id=\"65541\"\u003e\u003cli class=\"checked\" data-inline-task-id=\"1\"\u003e\u003cspan\u003eFreeze the release branch\u003c/span\u003e\u003c/li\u003e\u003cli data-inline-task-id=\"2\"\u003e\u003cspan\u003eRun the smoke tests\u003c/span\u003e\u003c/li\u003e\u003cli data-inline-task-id=\"3\"\u003e\u003cspan\u003eWrite the release notes\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-note\"\u003e\u003cspan class=\"aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon\"\u003e\u003c/span\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eNever deploy on a Friday afternoon.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003ch3 id=\"Releasechecklist-Commands\"\u003eCommands\u003c/h3\u003e\n\u003cdiv class=\"code panel pdl\"\u003e\u003cdiv class=\"codeContent panelContent pdl\"\u003e\u003cpre class=\"syntaxhighlighter-pre\" data-syntaxhighlighter-params=\"brush: bash; gutter: false\" data-theme=\"Confluence\"\u003egit tag -a v2.4.0 -m \"Release 2.4.0\"\ngit push origin v2.4.0\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv class=\"table-wrap\"\u003e\u003ctable class=\"confluenceTable\"\u003e\u003ccolgroup\u003e\u003ccol/\u003e\u003ccol/\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr\u003e\u003cth class=\"confluenceTh\"\u003eStep\u003c/th\u003e\u003cth class=\"confluenceTh\"\u003eOwner\u003c/th\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd class=\"confluenceTd\"\u003eTag\u003c/td\u003e\u003ctd class=\"confluenceTd\"\u003e\u003ca href=\"https://example.com/users/grace\" class=\"confluence-userlink user-mention\"\u003eGrace Hopper\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd class=\"confluenceTd\"\u003eAnnounce\u003c/td\u003e\u003ctd class=\"confluenceTd\"\u003eProduct\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cdiv class=\"expand-container\"\u003e\u003cdiv class=\"expand-control\"\u003e\u003cspan class=\"expand-control-icon icon\"\u003e\u0026nbsp;\u003c/span\u003e\u003cspan class=\"expand-control-text\"\u003eRollback steps\u003c/span\u003e\u003c/div\u003e\u003cdiv class=\"expand-content expand-hidden\"\u003e\u003col\u003e\u003cli\u003eRevert the tag\u003c/li\u003e\u003cli\u003eRedeploy \u003ccode\u003ev2.3.9\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cspan class=\"confluence-embedded-file-wrapper\"\u003e\u003cimg class=\"confluence-embedded-image\" src=\"attachments/65541/65550.png\" data-image-src=\"attachments/65541/65550.png\" alt=\"Release pipeline\"\u003e\u003c/span\u003e \u003cimg class=\"emoticon emoticon-tick\" src=\"images/icons/emoticons/check.svg\" alt=\"(tick)\"\u003e\u003c/p\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eOrbit Team : Decision log\u003c/title\u003e\n        \u003clink rel=\"stylesheet\" href=\"styles/site.css\" type=\"text/css\" /\u003e\n        \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\n    \u003c/head\u003e\n    \u003cbody class=\"theme-default aui-theme-default\"\u003e\n        \u003cdiv id=\"page\"\u003e\n            \u003cdiv id=\"main\" class=\"aui-page-panel\"\u003e\n                \u003cdiv id=\"main-header\"\u003e\n                    \u003cdiv id=\"breadcrumb-section\"\u003e\n                        \u003col id=\"breadcrumbs\"\u003e\n                            \u003cli class=\"first\"\u003e\u003cspan\u003e\u003ca href=\"index.html\"\u003eOrbit Team\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                            \u003cli\u003e\u003cspan\u003e\u003ca href=\"Orbit-Team-Home_65537.html\"\u003eOrbit Team Home\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\n                        \u003c/ol\u003e\n                    \u003c/div\u003e\n                    \u003ch1 id=\"title-heading\" class=\"pagetitle\"\u003e\n                        \u003cspan id=\"title-text\"\u003e Orbit Team : Decision log \u003c/span\u003e\n                    \u003c/h1\u003e\n                \u003c/div\u003e\n                \u003cdiv id=\"content\" class=\"view\"\u003e\n                    \u003cdiv class=\"page-metadata\"\u003e\n                        Created by \u003cspan class='author'\u003e Grace Hopper\u003c/span\u003e, last modified on Nov 20, 2026\n                    \u003c/div\u003e\n                    \u003cdiv id=\"main-content\" class=\"wiki-content group\"\u003e\n\u003cdiv class=\"panel\" style=\"border-width: 1px;\"\u003e\u003cdiv class=\"panelHeader\" style=\"border-bottom-width: 1px;\"\u003e\u003cb\u003eDecision 12\u003c/b\u003e\u003c/div\u003e\u003cdiv class=\"panelContent\"\u003e\u003cp\u003eWe move background jobs to a queue. See \u003ca href=\"Release-checklist_65541.html\"\u003ethe checklist\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cblockquote\u003e\u003cp\u003eSmall, reversible steps.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cdiv class=\"confluence-information-macro confluence-information-macro-warning\"\u003e\u003cp class=\"title\"\u003eBreaking change\u003c/p\u003e\u003cdiv class=\"confluence-information-macro-body\"\u003e\u003cp\u003eOld job ids stop working.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003e\u003cspan class=\"status-macro aui-lozenge aui-lozenge-success\"\u003eACCEPTED\u003c/span\u003e \u003cspan class=\"status-macro aui-lozenge\"\u003ePARKED\u003c/span\u003e\u003c/p\u003e\n\u003cdiv class=\"plugin_pagetree conf-macro output-block\"\u003e\u003cp\u003ePage tree\u003c/p\u003e\u003c/div\u003e\n                    \u003c/div\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n",
                    "spaceName": "Orbit wiki"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WikinestConfluenceImportResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "WikinestMarkdownToHtmlInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "markdown": {
            "title": "Page in Markdown",
            "description": "Wikinest Markdown: CommonMark and GitHub tables/task lists plus [[Page]] links, :::info panels, {status:green|Done}, {date:2026-11-24}, {{toc}} and {{children}}.",
            "type": "string",
            "maxLength": 400000,
            "default": ""
          },
          "pageTitles": {
            "title": "Existing page titles (optional, one per line)",
            "description": "[[Links]] to these titles become links to \u003cslug\u003e.html; others are marked as missing pages.",
            "type": "string",
            "maxLength": 20000,
            "default": ""
          },
          "children": {
            "title": "Child pages for {{children}} (optional, one per line)",
            "type": "string",
            "maxLength": 20000,
            "default": ""
          },
          "tocLevels": {
            "title": "Headings in the outline down to level",
            "type": "integer",
            "minimum": 1,
            "maximum": 6,
            "default": 3
          },
          "standalone": {
            "title": "Whole HTML document with a stylesheet (light and dark)",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "WikinestMarkdownToHtmlResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "WikinestPageDiffInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "before": {
            "title": "Older version",
            "type": "string",
            "maxLength": 400000,
            "default": ""
          },
          "after": {
            "title": "Newer version",
            "type": "string",
            "maxLength": 400000,
            "default": ""
          },
          "context": {
            "title": "Unchanged lines around each change",
            "type": "integer",
            "minimum": 0,
            "maximum": 20,
            "default": 3
          },
          "ignoreWhitespace": {
            "title": "Ignore spaces and indentation",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "WikinestPageDiffResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "WikinestConfluenceImportInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "html": {
            "title": "Confluence page HTML",
            "description": "Paste one exported page file, or several one after another. For a whole space, upload the export ZIP below instead.",
            "type": "string",
            "maxLength": 3000000,
            "default": ""
          },
          "exportFile": {
            "title": "Export file (.zip or .html, optional)",
            "description": "In Confluence: Space settings → Export space → HTML. Used instead of the pasted text when given. Upload as {filename, contentType?, contentBase64}. Max 24414 KiB. Accepts .zip,.html,.htm,application/zip,text/html.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "spaceName": {
            "title": "Space name (optional)",
            "description": "Empty = the name in the export.",
            "type": "string",
            "maxLength": 120,
            "default": ""
          }
        },
        "required": []
      },
      "WikinestConfluenceImportResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}