skills/adr/SKILL.md
Manage Architecture Decision Records (ADRs) in Confluence — create new ADRs from template, update existing ones, generate status reports, sync status emojis, and review ADRs for quality. Use when ADR, architecture decision, or design record is mentioned.
npx skillsauth add boazy/skills adrInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Manage Architecture Decision Records (ADRs) stored in Confluence. This skill covers the full ADR lifecycle: creation, updates, status reporting, emoji sync, and architectural review.
Requires: The atlassian skill must be loaded alongside this skill for Confluence CRUD operations.
| Key | Value |
|-----|-------|
| Confluence Space | CE (Engineering) |
| ADRs Parent Page ID | 31859277900 |
| Title Format | ADR-NNN: Short Descriptive Title |
| Numbering | Sequential from highest existing number + 1 |
| Default Status | Draft |
| Page Emoji | Set via emoji-title-published and emoji-title-draft properties |
| Status | Emoji | Confluence Code Point |
|--------|-------|-----------------------|
| Accepted / Approved | ✅ | 2705 |
| Proposal / Proposed / Pending Approval | ⏳ | 23f3 |
| Draft / Planning | 🗒️ | 1f5d2 |
| Withdrawn / Rejected | 🚫 | 1f6ab |
| Postponed | ✋ | 270b |
If the status is unclear or non-standard, do not set an emoji.
This is the primary purpose of this skill. Follow these steps exactly.
Search existing ADRs and find the highest number:
bunx tsx scripts/confluence-search.ts "space = CE AND type = page AND ancestor = 31859277900" 50
Parse the results, extract all ADR-NNN numbers from titles, and use max + 1.
Collect these details (ask for anything not provided):
Draft unless specifiedN/A)N/A)N/A)Then gather the content for the body sections (see "ADR Structure" below).
Use the template below. Replace all {{PLACEHOLDERS}} with actual content. Preserve the exact HTML structure — the card table styling must match existing ADRs.
bunx tsx scripts/confluence-create.ts '{"space": "CE", "title": "ADR-NNN: Title Here", "body": "<HTML_BODY>", "parentId": "31859277900"}'
bunx tsx scripts/confluence-properties.ts <pageId> set-emoji "<CODE_POINT>"
Use the code point from the Status/Emoji table above (e.g., 1f5d2 for Draft).
Every ADR follows a consistent structure defined in ADR-000. The structure has two parts: the card table (metadata) and the body sections (content).
Based on ADR-000 guidelines, these sections are required at minimum:
31859277877): Founding document, defines the ADR process itself31858065546): Highly detailed with thorough alternatives analysis (Pros/Cons/Conclusion per alternative)31869075458): Concise, well-structured, good for typical decisions31915343873): Concise with clean hierarchy and organizational context<ac:structured-macro ac:name="code"> blocks when relevant.Below is the complete HTML template for a new ADR page body. Copy this exactly and replace {{PLACEHOLDERS}}.
IMPORTANT: When passing this as JSON to confluence-create.ts, the HTML must be a single string (escape internal quotes, no unescaped newlines in the JSON value).
<table data-table-width="760" data-layout="default"><colgroup><col style="width: 161.0px;" /><col style="width: 596.0px;" /></colgroup><tbody><tr><td data-highlight-colour="#4c9aff" colspan="2"><h2 style="text-align: center;"><span style="color: rgb(255,255,255);">Architecture Design Record Card</span></h2></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">ID</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{ADR_ID}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Created at</span></strong></p></td><td data-highlight-colour="#deebff"><p><time datetime="{{CREATED_DATE}}" /> </p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Accepted at</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{ACCEPTED_DATE}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Status</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{STATUS}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Affects</span></strong></p></td><td data-highlight-colour="#deebff">{{AFFECTS}}</td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Replaces ADR</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{REPLACES_ADR}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Updates ADR</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{UPDATES_ADR}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Related Tickets</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{RELATED_TICKETS}}</p></td></tr><tr><td data-highlight-colour="#b3d4ff"><p><strong><span style="color: rgb(0,141,166);">Related ADRs</span></strong></p></td><td data-highlight-colour="#deebff"><p>{{RELATED_ADRS}}</p></td></tr></tbody></table>
<h1>Abstract</h1>
<p>{{ABSTRACT}}</p>
<h1>Motivation</h1>
{{MOTIVATION_HTML}}
<h1>Goals</h1>
{{GOALS_HTML}}
<h1>Proposal</h1>
{{PROPOSAL_HTML}}
<h1>Alternatives</h1>
{{ALTERNATIVES_HTML}}
<h1>Sign-offs</h1>
<table data-table-width="760" data-layout="default"><colgroup><col style="width: 359.0px;" /><col style="width: 399.0px;" /></colgroup><tbody><tr><th><p><strong>Stakeholder</strong></p></th><th><p><strong>Signature Date / Comments</strong></p></th></tr><tr><td><p> </p></td><td><p> </p></td></tr><tr><td><p> </p></td><td><p> </p></td></tr><tr><td><p> </p></td><td><p> </p></td></tr></tbody></table>
| Placeholder | Format | Example |
|-------------|--------|---------|
| {{ADR_ID}} | ADR-NNN | ADR-149 |
| {{CREATED_DATE}} | YYYY-MM-DD | 2026-02-27 |
| {{ACCEPTED_DATE}} | <time> tag or empty | (space if not yet accepted) |
| {{STATUS}} | One of the standard statuses | Draft |
| {{AFFECTS}} | <ul><li><p>Item</p></li>...</ul> or <p>Team Name</p> | <ul><li><p>Phoenix Sensor</p></li></ul> |
| {{REPLACES_ADR}} | ADR link or N/A | N/A |
| {{UPDATES_ADR}} | ADR link or N/A | N/A |
| {{RELATED_TICKETS}} | Jira keys or N/A | PHOE-1234 |
| {{RELATED_ADRS}} | ADR links or N/A | N/A |
For body sections ({{MOTIVATION_HTML}}, {{GOALS_HTML}}, etc.), generate valid Confluence storage-format HTML:
<p>text</p><ul><li><p>item</p></li></ul><ol start="1"><li><p>item</p></li></ol><h2>Subtitle</h2>, <h3>Sub-subtitle</h3><ac:structured-macro ac:name="code" ac:schema-version="1"><ac:parameter ac:name="language">rust</ac:parameter><ac:plain-text-body><![CDATA[code here]]></ac:plain-text-body></ac:structured-macro><strong>text</strong><em>text</em><a href="URL">text</a>Fetch the existing ADR:
bunx tsx scripts/confluence-get.ts <pageId>
Parse the HTML body and identify the section(s) to modify.
Apply changes to the HTML body. Preserve the card table structure exactly. Only modify the fields or sections that need updating.
Update the page:
bunx tsx scripts/confluence-update.ts <pageId> '{"body": "<UPDATED_HTML>"}'
If the status changed, update the page emoji:
bunx tsx scripts/confluence-properties.ts <pageId> set-emoji "<CODE_POINT>"
Accepted at date. Then sync the emoji.Generate a report of all ADRs and their current status.
# Markdown format (default)
bunx tsx scripts/adr-report.ts
# JSON format
bunx tsx scripts/adr-report.ts json
Run from: @path scripts/adr-report.ts (relative to this skill's directory)
The script:
Iterate through all ADRs and update their Confluence page emoji to match their status.
# Preview what would change
bunx tsx scripts/adr-sync-emojis.ts --dry-run
# Actually sync emojis
bunx tsx scripts/adr-sync-emojis.ts
Run from: @path scripts/adr-sync-emojis.ts (relative to this skill's directory)
The script:
emoji-title-published and emoji-title-draft page propertiesAlways run --dry-run first to verify the mapping looks correct.
Fetch an ADR and start a sub-agent review for architectural quality.
Fetch the ADR content:
bunx tsx scripts/confluence-get.ts <pageId>
Delegate to a review sub-agent using task() with the following prompt structure:
task(
category="ultrabrain",
load_skills=[],
description="Review ADR-NNN: <title>",
prompt="""
You are a senior principal architect conducting a formal review of an Architecture Decision Record (ADR).
## Your Role
You are an expert reviewer who must evaluate this ADR for technical soundness, completeness, clarity, and alignment with best practices. You have deep experience in distributed systems, security, and software architecture.
## ADR Content
<paste the full ADR body text here, converted from HTML to readable text>
## Review Criteria
Evaluate the ADR on each of these dimensions:
### 1. Problem Statement & Motivation
- Is the problem clearly defined?
- Is the motivation compelling and well-articulated?
- Are the goals and non-goals appropriate and complete?
### 2. Proposed Solution
- Is the proposal technically sound?
- Are there ambiguities or underspecified areas?
- Are edge cases addressed?
- Is the level of detail appropriate for an architecture decision?
### 3. Alternatives Analysis
- Were reasonable alternatives considered?
- Are pros/cons balanced and fair?
- Is the rationale for the chosen approach convincing?
### 4. Completeness
- Are all affected systems/teams identified?
- Are trade-offs explicitly acknowledged?
- Are there missing sections that should be included?
- Is the sign-off table appropriate for the scope of the decision?
### 5. Clarity & Communication
- Could a new team member understand this decision?
- Is RFC 2119 language (MUST, SHOULD, MAY) used correctly?
- Are terms defined or linked?
### 6. Risk Assessment
- Are there security implications not addressed?
- Are there scalability concerns?
- Are there operational/maintenance concerns?
- What could go wrong with this decision in 2-3 years?
## Output Format
Provide your review as:
1. **Overall Assessment**: One of: ✅ Approve, ⚠️ Approve with Comments, 🔄 Request Changes, ❌ Reject
2. **Summary**: 2-3 sentence overall impression
3. **Strengths**: What's done well (bullet points)
4. **Issues**: Problems found, categorized as:
- 🔴 **Critical**: Must be addressed before acceptance
- 🟡 **Important**: Should be addressed
- 🔵 **Minor**: Nice to have improvements
5. **Questions**: Open questions for the authors
6. **Suggestions**: Specific improvement recommendations
"""
)
development
Read channels, DMs, and threads; post and edit messages; search messages and users; add reactions; upload custom emojis — all via the Slack Web API.
tools
Create self-contained Python scripts that run with `uv run --script`. Covers PEP 723 inline metadata, ergonomic CLI design (argparse / Cyclopts), rich output formatting, progress bars (alive-progress), interactive prompts (questionary), and fuzzy selection (iterfzf). Use when asked to create a Python script, CLI tool, or automation script.
development
Search and read AI-generated documentation for any public GitHub repository. Use when asked about how an open-source library works, its architecture, API, or internals.
testing
Generate diagrams from declarative text using D2 - modern text-to-diagram language with automatic layouts, themes, and advanced styling. Use when creating architecture diagrams, flowcharts, decision trees, workflow diagrams, sequence flows, or ERDs from text definitions.