| name | confluence-meeting-notes-create-next |
| description | Create the next dated or Next H1 section in an existing Confluence meeting notes doc using calendar doc-link matching, templates, or prior table shape. |
Create Next Confluence Meeting Notes Section
Use this skill when asked to prepare, create, or add the next instance section for an existing Confluence 1:1 or recurring meeting notes page.
This skill is intentionally instruction-only. Do not create helper scripts for the workflow. Use Atlassian Rovo MCP for Confluence reads and writes, and use ADF as the safe structured edit format when the Rovo page read is complete. Use the Google Calendar client for date lookup when needed. For fallback edits, use the Chrome plugin/live editor first, then use the local Confluence client only when the Chrome path is unavailable or unsuitable and ATLASSIAN_API_TOKEN is set.
Rovo is safe for this workflow only when its page read returns the complete ADF body. Rovo updates replace the full Confluence page body, but Rovo reads can truncate large pages and Rovo does not currently provide partial page updates or paginated full-page reads. If the page is large or the Rovo body appears truncated, do not write with Rovo; use Chrome plugin/live-editor automation instead. Use the local Confluence REST API raw-storage HTML fallback only when Chrome is unavailable or unsuitable and ATLASSIAN_API_TOKEN is set. The token may rotate every 3 days.
Before editing, read meeting-notes-docs.md. That reference is the shared source of truth for meeting-section boundaries, templates, bullet/table formats, calendar matching, and insertion placement.
Commands
Use Atlassian Rovo MCP for the primary workflow:
getConfluencePage(cloudId, pageId, contentFormat="adf")
updateConfluencePage(cloudId, pageId, body=<ADF JSON>, contentFormat="adf")
getConfluencePage(cloudId, pageId, contentFormat="markdown")
Use python3 for calendar lookup, and as a final Confluence fallback only when Rovo and Chrome plugin/live-editor automation are unavailable or unsuitable and ATLASSIAN_API_TOKEN is set:
python3 -m sidekick.clients.confluence get-page-from-link "<confluence-url>"
python3 -m sidekick.clients.confluence read-page <page-id> --html
python3 -m sidekick.clients.confluence update-page <page-id> <content.html>
python3 -m sidekick.clients.gcalendar list <time-min> <time-max> <max-results>
python3 -m sidekick.clients.gcalendar get <event-id>
Never update meeting notes from Markdown conversion. Read Markdown only for human orientation if useful; all writes must be based on the ADF document fetched from Rovo. If falling back to the local client, use raw storage HTML and the legacy range checks.
Workflow
- Resolve the page ID from the Confluence link if needed, then fetch page details and ADF with Rovo.
- Read the shared document-shape reference and identify real top-level meeting section boundaries, static preamble, top template, existing
Next, dated sections, and the most recent prior meeting instance. Treat top-level ADF heading nodes with attrs.level == 1 as section boundaries. Ignore H1s nested inside ADF panels, tables, or other containers.
- If
Next already exists, stop without writing.
- Find the next calendar instance. Search the next 60 days, fetch event details as needed, and first match the Confluence meeting doc link in event descriptions. If one or more events contain the doc link, choose the earliest future start date.
- Only if no event description contains the doc link, fall back to supplied meeting title, Confluence page title, or an exact title-like match. If matching is not confident, use
Next.
- If a confident next date was found and that H1 date section already exists, stop without writing.
- Build exactly one new ADF H1 section:
- Confident date: a top-level
heading node with level: 1 containing an ADF date node for UTC-midnight milliseconds of YYYY-MM-DD.
- No confident date: a top-level
heading node with level: 1 and text Next.
- Build the new section body from the first applicable source:
- Clear top template: copy the template body without copying the template heading.
- Clear top Confluence note/info template: copy reusable children from the ADF panel content only. Do not copy the note/info panel wrapper or create a new note block.
- Non-template table doc: clone the most recent prior meeting table shape, preserving headers, row count, row order, and people/name cells while emptying other content cells.
- Otherwise: create a bullet section with one empty bullet.
- Insert the new section before historical dated sections and after clear static preamble or template content. When a clear agenda/template note block follows static preamble and precedes the first real meeting section, insert immediately after the whole note block and immediately before the first real meeting section. If the insertion point is ambiguous, refuse.
- Before writing, compare before and after ADF and verify every changed top-level node is inside the intended insertion range.
- Immediately before writing, fetch ADF again. If the page changed outside the intended insertion range, stop and re-plan against the latest content.
- Write the entire after-ADF with Rovo
updateConfluencePage(..., contentFormat="adf").
- Fetch ADF again and verify the live page matches the intended after-ADF, with no out-of-target changes relative to the original.
Do not save rollback files. If a post-update check fails, report the unsafe region and point the user to Confluence version history.
Calendar Matching
Doc-link matching is the authoritative signal for the next meeting date.
- Normalize candidate links where practical: HTML-decode, URL-decode, strip fragments/query strings, compare Confluence page IDs from
/pages/<id>/..., and accept equivalent canonical or copied URLs for the same page.
- Calendar
list output is useful for event IDs and start times. Use get for candidate events so descriptions can be inspected.
- Prefer the earliest future event whose description contains the meeting doc link.
- Title matching is only a fallback when no future event description contains the doc link.
- If conflicting calendar evidence would create the wrong dated section, create
Next or refuse rather than inventing a date.
Body Creation Rules
For template docs, copy the template body as ADF nodes. Do not copy explanatory template labels that are outside the reusable body.
For top templates stored in Confluence note/info blocks:
- Treat ADF
panel nodes with note/info panel types as possible top templates when they clearly label themselves as an agenda, template, format guide, or copyable section.
- Copy reusable children from the panel content only. Do not copy the panel wrapper into the new section.
- If falling back to legacy storage HTML, copy reusable children from the macro body only. Do not copy the macro wrapper.
- If the panel/macro body starts with an H1 that is just the template label, such as
Agenda or Agenda (30 min), omit that heading from the new section. Never insert an extra top-level H1 inside the new meeting section; if a non-template H1 appears necessary to preserve meaning, refuse rather than breaking section boundaries.
- Static H1 headings above the note/info template, such as goals or quick-reference sections, are preamble. Ignore them for meeting-section detection and place the new section after the whole template block, not above it.
For bullet docs without a template, use:
{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph"}]}]}
For table docs without a template:
- Clone from the most recent prior meeting instance, not from arbitrary page tables or static preamble tables.
- Preserve header rows, column order, row order, people/name/owner cells, Confluence user mentions, and visible person names.
- Empty agenda, notes, discussion, topic, status, update, and action-item cells.
- Use an empty ADF paragraph for emptied cells when the cell would otherwise be blank.
- Refuse when the table has multiple plausible person columns, nested tables, merged cells that make blanking unsafe, or multiple tables with no clear primary meeting table.
Safety Validation
Before writing, compute the exact insertion index in the original ADF. Then compare before and after content:
- All top-level nodes before the insertion range must be structurally identical.
- All top-level nodes after the insertion range must be structurally identical.
- All new heading and body content must be inside the insertion range.
- Page title, template, preamble, existing sections, and unrelated tables must not change.
- Re-fetch the page immediately before
updateConfluencePage; if latest ADF no longer matches the original outside the insertion range, do not write.
After writing, fetch the page again with Rovo ADF and Markdown. Verify the live ADF equals the intended after-ADF except for Confluence-added localId values on newly inserted nodes. Compare again using the same insertion-range confinement check and report any unexpected normalization.
Refusal Cases
Refuse or stop without writing when:
- The page is not a Confluence page.
- ADF cannot be fetched through Rovo.
Next already exists.
- The matching dated section already exists.
- Multiple
Next sections or duplicate future date sections make the page convention ambiguous.
- Calendar lookup is ambiguous and creating
Next would conflict with an existing convention.
- The top template cannot be distinguished from real notes.
- The insertion point is ambiguous.
- A non-template table layout cannot be cloned while preserving people/name cells and emptying content cells.
- The proposed diff touches content outside the intended insertion range.
When refusing, explain the specific ambiguity and suggest adding a clear Next section, a top template, or a unique meeting doc link in the calendar event description.