<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lynkk</title>
    <description>The latest articles on DEV Community by Lynkk (@lynkk).</description>
    <link>https://dev.to/lynkk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4176792%2Fa93daafc-3643-48cf-bf29-4fcec33dd0a6.png</url>
      <title>DEV Community: Lynkk</title>
      <link>https://dev.to/lynkk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lynkk"/>
    <language>en</language>
    <item>
      <title>Meeting Notes Templates for Dev Teams: Standup, Retro, ADR</title>
      <dc:creator>Lynkk</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:55:48 +0000</pubDate>
      <link>https://dev.to/lynkk/meeting-notes-templates-for-dev-teams-standup-retro-adr-3gcl</link>
      <guid>https://dev.to/lynkk/meeting-notes-templates-for-dev-teams-standup-retro-adr-3gcl</guid>
      <description>&lt;p&gt;Every engineering team has the same problem. A decision gets made in a meeting ("we'll drop SSO from v1", "Postgres, not DynamoDB"), and three weeks later nobody can find where it was written down, or whether it was written down at all.&lt;/p&gt;

&lt;p&gt;The fix isn't a fancier tool. It's treating meeting notes like code: &lt;strong&gt;plain Markdown, in the repo, with a consistent template.&lt;/strong&gt; Notes in the repo are diffable, greppable, linkable from PRs and issues, and they live as long as the codebase does.&lt;/p&gt;

&lt;p&gt;Below are four templates I'd hand to any dev team: daily standup, sprint planning, sprint retrospective, and the Architecture Decision Record (ADR) for design reviews. At the end there's a 30-line Python script that lists every open action item across all your notes, grouped by owner.&lt;/p&gt;

&lt;p&gt;![How meeting notes flow into the repo: standup, planning and retro notes in docs/meetings, design decisions in docs/adr]&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the notes live
&lt;/h2&gt;

&lt;p&gt;Keep it boring and predictable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
  meetings/
    2026-10-14-standup.md
    2026-10-13-sprint-42-planning.md
    2026-10-24-sprint-42-retro.md
  adr/
    0001-use-postgres-for-event-store.md
    0002-drop-sso-from-v1.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two conventions make everything else work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File names start with the date&lt;/strong&gt; (&lt;code&gt;YYYY-MM-DD&lt;/code&gt;), so &lt;code&gt;ls&lt;/code&gt; sorts them chronologically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action items use one format everywhere:&lt;/strong&gt; &lt;code&gt;- [ ] @owner Task #issue (due YYYY-MM-DD)&lt;/code&gt;. GitHub and GitLab render &lt;code&gt;- [ ]&lt;/code&gt; as a checkbox, and the script at the end parses it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Daily standup meeting notes template
&lt;/h2&gt;

&lt;p&gt;Most standup notes fail because they log status ("worked on the API"). Status belongs in the issue tracker. Standup notes should capture only the two things that change what the team does today: &lt;strong&gt;blockers&lt;/strong&gt; and &lt;strong&gt;decisions&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Standup, 2026-10-14&lt;/span&gt;

&lt;span class="gu"&gt;## Blockers&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; @marco Staging DB is out of disk, reindex job can't run. Needs @ops.

&lt;span class="gu"&gt;## Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Billing rounding fix ships as a hotfix before the sprint starts.

&lt;span class="gu"&gt;## Action items&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @ops Expand staging DB volume #491 (due 2026-10-14)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @priya Add regression test for the rounding bug #482 (due 2026-10-16)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a standup produced no blockers and no decisions, the notes can be one line: "No blockers, no decisions." That's a feature, not a failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Sprint planning meeting notes template
&lt;/h2&gt;

&lt;p&gt;Sprint planning creates commitments, and commitments are exactly what gets forgotten. The most useful section here is &lt;strong&gt;out of scope&lt;/strong&gt;: writing down what you explicitly decided &lt;em&gt;not&lt;/em&gt; to do stops it from sneaking back in mid-sprint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Sprint 42 planning, 2026-10-13&lt;/span&gt;

&lt;span class="gu"&gt;## Sprint goal&lt;/span&gt;
Ship export v2 to all customers behind a feature flag.

&lt;span class="gu"&gt;## Committed&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; #470 Export v2 backend
&lt;span class="p"&gt;-&lt;/span&gt; #471 Export v2 UI
&lt;span class="p"&gt;-&lt;/span&gt; #482 Billing rounding hotfix

&lt;span class="gu"&gt;## Out of scope (decided)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Search reindex moves to sprint 43.
&lt;span class="p"&gt;-&lt;/span&gt; No SSO work this sprint.

&lt;span class="gu"&gt;## Risks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Export v2 depends on the storage migration finishing (#455).

&lt;span class="gu"&gt;## Action items&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @lena Confirm storage migration ETA with infra #455 (due 2026-10-15)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @sam Size the search reindex for sprint 43 #476
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Sprint retrospective template
&lt;/h2&gt;

&lt;p&gt;The classic retro failure: the team agrees on improvements, and nobody checks them at the next retro. So this sprint retrospective template &lt;strong&gt;starts with last retro's action items&lt;/strong&gt;, before anything else.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Sprint 42 retro, 2026-10-24&lt;/span&gt;

&lt;span class="gu"&gt;## Last retro's action items&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] @sam Add a PR template with a testing checklist #460
&lt;span class="p"&gt;-&lt;/span&gt; [x] @lena Cap WIP at 3 tickets per person: not done, carried over below

&lt;span class="gu"&gt;## What went well&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Export v2 shipped on day 8 of 10.
&lt;span class="p"&gt;-&lt;/span&gt; Hotfix process worked: rounding fix live in under 2 hours.

&lt;span class="gu"&gt;## What didn't&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Staging was down for a full day (disk full, again).
&lt;span class="p"&gt;-&lt;/span&gt; Three PRs waited more than 2 days for review.

&lt;span class="gu"&gt;## What we'll try next sprint&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Review rotation: one dev on "PR duty" per day.

&lt;span class="gu"&gt;## Action items&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @ops Add disk usage alert on staging DB #493 (due 2026-10-28)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @marco Set up the PR duty rotation in the team calendar (due 2026-10-27)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @lena Cap WIP at 3 tickets per person, carried over (due 2026-10-28)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep "what we'll try" to one or two things. A retro that produces eight improvements produces zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Design reviews: write an Architecture Decision Record
&lt;/h2&gt;

&lt;p&gt;Design review meetings make the decisions that are most expensive to forget, and meeting notes are the wrong format for them. A decision like "use Postgres for the event store" needs to be findable in two years by someone who wasn't in the room.&lt;/p&gt;

&lt;p&gt;That's what an &lt;strong&gt;Architecture Decision Record (ADR)&lt;/strong&gt; is for. The format most teams use comes from Michael Nygard's 2011 post &lt;em&gt;Documenting Architecture Decisions&lt;/em&gt;: one short Markdown file per decision, numbered, never deleted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# 0001. Use Postgres for the event store&lt;/span&gt;

&lt;span class="gu"&gt;## Status&lt;/span&gt;
Accepted (2026-10-09). Supersedes nothing.

&lt;span class="gu"&gt;## Context&lt;/span&gt;
We need durable storage for ~5M events/day with replay by tenant.
Options reviewed in the 2026-10-09 design review: Postgres, DynamoDB, Kafka with compaction.

&lt;span class="gu"&gt;## Decision&lt;/span&gt;
Postgres with a partitioned &lt;span class="sb"&gt;`events`&lt;/span&gt; table (monthly partitions, tenant_id in the key).

&lt;span class="gu"&gt;## Consequences&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Good: the team already runs Postgres; replay is a plain SQL query.
&lt;span class="p"&gt;-&lt;/span&gt; Bad: we own partition maintenance; revisit above ~50M events/day.

&lt;span class="gu"&gt;## Follow-ups&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] @lena Write the partition rotation job #488 (due 2026-10-20)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules that keep ADRs useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One decision per file&lt;/strong&gt;, numbered in order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never edit an accepted decision.&lt;/strong&gt; If it changes, write a new ADR and mark the old one "Superseded by 0007".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link the ADR from the PR&lt;/strong&gt; that implements it, so &lt;code&gt;git blame&lt;/code&gt; leads back to the reasoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want tooling, &lt;code&gt;adr-tools&lt;/code&gt; (npryce/adr-tools on GitHub) creates and links ADR files from the command line, but a template file and a naming convention are enough to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: list every open action item with 30 lines of Python
&lt;/h2&gt;

&lt;p&gt;Because every template uses the same action item format, one script can find all open items across all your notes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;List open action items in Markdown meeting notes, grouped by owner.

Format: - [ ] @owner Task #issue (due YYYY-MM-DD)
Usage:  python open_actions.py [docs]
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;ITEM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- \[ \] @(?P&amp;lt;owner&amp;gt;[\w-]+) (?P&amp;lt;task&amp;gt;.+?)(?: \(due (?P&amp;lt;due&amp;gt;\d{4}-\d{2}-\d{2})\))?\s*$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;by_owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rglob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ITEM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;by_owner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;due&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;by_owner&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;by_owner&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it against the four example files above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python open_actions.py docs
@lena
  2026-10-15  Confirm storage migration ETA with infra #455  (2026-10-13-sprint-42-planning.md)
  2026-10-20  Write the partition rotation job #488  (0001-use-postgres-for-event-store.md)
  2026-10-28  Cap WIP at 3 tickets per person, carried over  (2026-10-24-sprint-42-retro.md)
@marco
  2026-10-27  Set up the PR duty rotation in the team calendar  (2026-10-24-sprint-42-retro.md)
@ops
  2026-10-14  Expand staging DB volume #491  (2026-10-14-standup.md)
  2026-10-28  Add disk usage alert on staging DB #493  (2026-10-24-sprint-42-retro.md)
@priya
  2026-10-16  Add regression test for the rounding bug #482  (2026-10-14-standup.md)
@sam
  no date  Size the search reindex for sprint 43 #476  (2026-10-13-sprint-42-planning.md)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice Sam's item: &lt;strong&gt;no date&lt;/strong&gt;. Look back at the sprint planning template and you'll see it was written without a &lt;code&gt;(due ...)&lt;/code&gt;. The script just caught a broken rule from the planning meeting, and items without a date sort to the bottom of each person's list, so they're easy to spot. Small conventions, checked by a small script, are what keep notes from rotting.&lt;/p&gt;

&lt;p&gt;Drop it in CI as a weekly job that posts to your team channel, and nobody has to chase action items by hand again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules that make any template work
&lt;/h2&gt;

&lt;p&gt;Whatever template you use, these four rules matter more than the format:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every action item has one owner and one date.&lt;/strong&gt; "&lt;a class="mentioned-user" href="https://dev.to/team"&gt;@team&lt;/a&gt;" is not an owner. "Soon" is not a date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decisions are written as decisions.&lt;/strong&gt; "We discussed caching" is not a decision. "Cache tenant config for 60s" is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes are committed the same day.&lt;/strong&gt; A PR with yesterday's retro notes is fine. A PR with last month's is fiction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectural decisions become ADRs.&lt;/strong&gt; If someone will ask "why did we do it this way?" in a year, it needs its own file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;If your team records calls, you can generate a first draft of these notes from the transcript instead of typing them live. I wrote up &lt;a href="https://dev.toHASHNODE_POST_URL"&gt;the prompt and a Python script that turns a meeting transcript into notes and Jira tickets&lt;/a&gt;, and the same JSON output maps straight onto the action item format above.&lt;/p&gt;

&lt;p&gt;What does your team use for meeting notes? Wiki, repo, or nothing at all? I'm curious what's actually working for people in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was written with AI assistance and reviewed, tested and edited by the author. The script was run against the example files shown.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
