Check whether this card's code meets the acceptance criteria
日本語の概要は準備中です。原文の説明を表示しています。
Draft public Tamanu release notes for a given version. Use when the user wants release notes for a Tamanu release (e.g. "draft release notes for v2.45"). Pulls work from the specs and code that landed in that version's release/X.Y branch, plus the matching issues in the trackers (Linear's Tamanu team and Workhorse's Tamanu workspace), reconciles them, and writes docs/release-notes/vX-YY.md in the canonical v2.44 format for project managers and system administrators, plus a styled HTML rendering at .workhorse/design/designs/vX-YY-release-notes.html. Not for developer changelogs or QA test scoping (use scope-tamanu-release-tests for the latter).
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Produce public release notes for one Tamanu version, as two files kept in step: the markdown at docs/release-notes/vX-YY.md, and a styled HTML rendering at .workhorse/design/designs/vX-YY-release-notes.html.
The audience is project managers and system administrators, not developers. They read these notes to understand what new capabilities their teams gain, what workflows change, what configuration is required, and what to prepare and test before upgrading. Write to that audience throughout: user-facing capabilities and benefits, not implementation detail.
The canonical format is the published v2.44 notes, kept alongside this skill at example-v2-44.md. Read it first — it is the reference for section order, headings, emoji markers, voice, and how much detail each section carries.
If docs/release-notes/vX-YY.md already exists, that version has been written up — deliver the existing notes rather than redrafting them, unless the user asks for a rewrite. Where the markdown exists but the styled version does not, produce the styled version from it.
The user specifies the version (e.g. v2.45, or 2.45). Normalise it to:
release/2.45docs/release-notes/v2-45.md and .workhorse/design/designs/v2-45-release-notes.html — both filenames hyphenate the version, so the only dot in each is the extension'sv2.45.0); confirm the exact label against the Tamanu team's labels rather than assuming. Version labels also drift, so ground the notes in what code shipped rather than assuming Linear is correct.Ask for the release date if the user hasn't given it. Format it DD-MM-YYYY in the header. If it's genuinely not known yet, leave Released [RELEASE_DATE_PLACEHOLDER].
Work included in a version comes from both of these. The repo is the primary source for what shipped and how it behaves; the trackers supply the human framing. Gather from each, then reconcile.
Cards live in both trackers — Linear for older work, Workhorse for recent cycles — so check both. A single version often draws on each.
In Linear, pull issues on the Tamanu team labelled with the version (e.g. v2.45.0). Filter issues directly by the label string; the label-search tool is unreliable for version labels, so read the labels on a returned issue to confirm the exact spelling rather than trusting a label lookup. Filtering to the Tamanu team already excludes DataTrak, Tupaia, and other non-Tamanu product work — they live on separate teams.
In Workhorse, cards carry no version label, so version membership comes from the release branch instead: collect the card codes from the branch's commit history (commit subjects carry them, e.g. feat(web): F3: …) and read each card. Listing cards in a shipped status — Merged to Main, Release: Regression Ready, Complete: Docs Required, Complete — gives a second list to cross-check that against, catching anything whose commits you missed.
Then, in either tracker:
Start with the specs that landed in this release: they describe the behaviour as the product intends it, which is how release notes should read. Then follow the same process across the rest of the repo to ground each claim and fill in missing detail, keeping the specs as the primary framing.
Find the spec delta for the version with git:
git fetch origin release/2.45
git fetch origin release/2.44
git diff --name-status origin/release/2.44...origin/release/2.45 -- specs/
Diff from the merge base (three dots), not between the tips. Tamanu keeps servicing older release branches after a newer one is cut, so a two-dot diff reads the previous version's hotfixes as this version's work.
Read each added or modified spec to understand the behaviour, and use git log on a spec path to recover the card and PR that introduced it.
Notes on refs:
Derive the previous release line from the branch list, don't assume it's X.(YY-1). List what actually exists and take the highest release branch below the target, so a skipped or unshipped minor can't send you to a branch that was never released:
git branch -r --list 'origin/release/2.*' --sort=version:refname
Confirm the line shipped by checking it has tags (git tag --list 'v2.44.*'). Compare against that branch so the delta is exactly this version's work, not an accumulation. State which refs you used.
If release/2.45 hasn't been cut yet, the work is still on main — use origin/release/2.44...origin/main instead, and say so. This is an upper-bound-free view: main may already carry work destined for a later version, so check each spec's introducing commit and drop anything that isn't part of the version being written up.
The same piece of work often appears in both places — a spec-driven card usually originates from an issue in a tracker. Match them on the card id carried in the spec's introducing commits.
git log --oneline origin/release/2.45 --grep TAM-6786. If the work isn't in the branch, leave it out — a label alone is not evidence it shipped.Classify every included item into one of the six sections. Judge by significance and breadth, exactly as the v2.44 example does.
Let the release set the length. Most releases are quiet, and a quiet release gets a short document. The v2.44 example is a big release and is long because it had that much in it; it sets the shape, not a target size. Never promote smaller work to fill a section, pad an overview to match the example's density, or give an item more space than its significance earns. A release whose largest item is one administrative change should say so plainly in the header and run a few hundred words.
Released DD-MM-YYYY, then one short paragraph naming the release's marquee items.## headings, using only the surfaces that have content: Tamanu Desktop, Tamanu Mobile, Patient Portal, System Administration. Each feature is an ### _Italic title_ with an overview paragraph, a Key features bullet list, and a Supporting documentation list. Add Security considerations or a Keen to implement …? call-to-action block only where the feature warrants it (as the example does for the Patient Portal and integrations).## Desktop, ## Mobile), with a ## System group for backend, sync, and infrastructure fixes that aren't tied to one client. Within a group, one bullet per area (**Bold label** - what improved), rolling that area's fixes into a themed sentence or two. Do not enumerate individual fixes: a reader wants to know which areas got attention, not to read the commit log. Name a specific fix only where a PM would otherwise be surprised by the change.Give Required and Optional the same heading level as each other in both sections — ### Required and ### Optional. The v2.44 example sets Optional in bold rather than as a heading, which renders it inside the Required section; don't carry that across.
Two more things the example does that a new draft should not. It names settings keys and reference-data values literally (appointments.bookingSlots.startTime, isBookable), which no longer belongs in release notes at all — see the plain-language rule under Voice and conventions. It also opens by calling itself "one of our biggest recent releases", which suited that release and suits few others. Take section order, headings, emoji markers and density from the example; take neither of these.
Separate major sections with --- as the example does. Keep the emoji markers (🌟 🔧 🐛 ⚠️) — they are load-bearing.
You cannot generate real Slab URLs. Wherever the format expects a Supporting documentation link, leave a labelled placeholder for a human to fill:
**Supporting documentation**
- Feature overview - [SLAB_LINK_PLACEHOLDER]
- Configuration guide - [SLAB_LINK_PLACEHOLDER]
- User manual - [SLAB_LINK_PLACEHOLDER]
Keep the descriptive label before each placeholder so the person filling them in knows which document goes where.
Include only the documents that version's feature actually has. Three placeholders is the shape of the example, not a quota — a feature with only a configuration guide gets one line.
Every version carries a styled HTML rendering at .workhorse/design/designs/vX-YY-release-notes.html, alongside the markdown. It is what gets shared with a customer, pasted into a published page, or read by someone who is not looking at the repo.
.workhorse/design/designs/v*-release-notes.html, replace its content, and leave its CSS alone. This keeps every release looking like the last one and keeps the styling evolving in a single lineage rather than being reinvented per version.designs/, never in a card's mockups/ folder. Release notes are read well outside the card that drafted them, and mockups/{card-id}/ is card scratch that gets stripped on merge..workhorse/design/ — and if that library is absent, the house palette: stone-grey page with white surfaces, burnt orange accent, Inter, 4px spacing grid.PM/admin audience. Explain what a feature does, why it's useful, and how it fits a workflow. Leave out API specifics, database schemas, and internal architecture.
No coded language, anywhere in the document. No settings keys, reference-data codes, permission identifiers, environment variables, column names, or file paths. Name the thing in plain words instead: "the modification reason list", not the reference-data type's literal name; "permission to dispense medications", not the permission identifier; "invoicing is off by default", not the setting that turns it on. A reader who needs the exact key follows the configuration guide, which is where keys belong.
Inverted commas around every feature and interface name, spelled and capitalised as it appears on screen: the 'Send to pharmacy' column, the 'Dispense medication' modal, the 'Emergency patients' board, 'Details' and 'Ordered by', 'Discharge qty' becoming 'Dispensing qty'. The test is whether the reader has to find that exact wording on screen to act on the sentence. Buttons, fields, columns being renamed or made required, tabs, modals, views, menu options and note types all pass it.
Three things stay as ordinary nouns. Product surfaces: Tamanu Desktop, Tamanu Mobile, the admin panel, Patient Portal. Clinical artefacts: an encounter, a prescription, the medication administration record, a price list. Self-evident values and simple labels, where the words explain themselves and quoting them only adds clutter: last 7 days, the clinician column, the sex column, triage category, the Urgent and Deceased categories. When a simple label sits mid-sentence and reads fine unquoted, leave it unquoted.
Benefits over mechanics. "The system automatically removes conflicting location assignments" — not how it's implemented.
Australian/NZ English — finalise, colour, organise, centralise, authorised.
Concise. Match the example's density: a tight overview paragraph, then scannable bullets. No filler.
example-v2-44.md for the target shape.specs/ to get the landed specs; read them; ground and deepen using the code changes as required; recover their cards/PRs from git log.[SLAB_LINK_PLACEHOLDER] for every supporting-documentation link.docs/release-notes/vX-YY.md (create docs/release-notes/ on the first version)..workhorse/design/designs/vX-YY-release-notes.html, copying the most recent existing one and replacing its content.Later turns that revise the notes revise both files, and say so.
The committed specs and the Tamanu commit history are authoritative for what shipped; the trackers supply framing. This skill encodes the method, not a fixed answer — the surfaces, sections, and format can evolve. If the repo or a newer published release disagrees with this skill, the repo wins; update the skill and refresh the canonical example.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Check whether this card's code meets the acceptance criteria
日本語の概要は準備中です。原文の説明を表示しています。
Summarise the unit and e2e tests a branch/PR adds, run only those, and produce a paste-ready report (e.g. for a Linear card). Use when asked to 'summarise added tests', 'run the new tests', 'what tests did this PR add', or to prove a card's test coverage.
日本語の概要は準備中です。原文の説明を表示しています。
Run a quick UX/UI workshop using ASCII-art sketches
日本語の概要は準備中です。原文の説明を表示しています。
Write automated tests for unticked scenarios in this card's test cases
日本語の概要は準備中です。原文の説明を表示しています。
Review code changes on this card for likely bugs, regressions, and missed edges
日本語の概要は準備中です。原文の説明を表示しています。
Maintain a support docs pack — dedup, length budgets, and no splintering — and land changes as a reviewed pull request. Use when a support thread, or a hand-off from Support assist, surfaces a new resolution, a correction to an existing one, or a deployment quirk worth recording. Not for ordinary code changes.
日本語の概要は準備中です。原文の説明を表示しています。