Timeboxed meeting agenda from AI that fits a 60-minute slot
Get a 60-minute agenda where every outcome is a decision and low-priority items move out, then check minutes and times with a script.
Seven items, one 60-minute slot, and the agenda has to go out the day before. Ask an AI for it and the minutes usually add up. The problems are elsewhere.
The short prompt
Here is part of the answer to "Make an agenda for it with these items" followed by the seven item names.
| Time | Min | Item | Goal ||---|---|---|---|| 2:00-2:10 | 10 | Q3 results review | Inform || 2:10-2:20 | 10 | Customer churn response plan | Decide on owners and actions |…| 2:40-2:48 | 8 | Approve two new hires | Decide || 2:48-2:55 | 7 | Evaluate replacing the team chat tool | Decide whether to pursue, and next steps || 2:55-2:58 | 3 | Year-end party date | Pick a date || 2:58-3:00 | 2 | Recap of decisions and action items | Confirm owners and deadlines |Both runs added up to 60 and both squeezed in all seven items. The first row's goal is only "Inform" in one run and "Shared understanding of performance vs. plan" in the other, and the wrap-up got 2 minutes in one run and nothing in the other. The hiring decision got 8 minutes in both; the chat tool, a Low item, got 8 minutes in one run and 7 in the other.
The fixed prompt
What the model lacked: priorities, a fixed wrap-up, and what an "outcome" sentence should look like. Google's prompting strategies guide says to state constraints on the response and the format you want. Rules 1-6 are those constraints. Rule 4 gives the model permission to drop items; without it, as above, it slices the hour thinner.
Build the agenda for the meeting below. It goes out to attendees the day before. From the table alone, each attendee should know what has to be decided under each item, so they can come prepared. <meeting>Meeting: {meeting name}Time: {14:00}-{15:00} ({60} minutes)The last {5} minutes ({14:55}-{15:00}) are fixed for "Confirm decisions and owners"</meeting> <agenda>| Item | Priority | Note ||---|---|---|{item | High/Medium/Low | pre-read, deadline}</agenda> Rules:1. Use exactly these columns: No | Start | End | Min | Item | Expected outcome2. Start and End are HH:MM. The first item starts at {14:00}, and each item starts when the previous one ends. The last row is the {14:55}-{15:00} wrap-up.3. The Min column must add up to exactly {60}. Give time to High items first.4. If everything cannot fit in {60} minutes, drop the lowest-priority items from the table and list them on one line under the table, starting with "Moved to next meeting:".5. Expected outcome is one sentence saying what must be settled when the meeting ends, starting with a decision verb such as "Decide", "Approve", "Choose" or "Assign". Do not use "Discuss", "Share" or "Review" as the outcome. Phrase it so the result left behind is a number, a name, or a yes/no.6. Output only the table and the "Moved to next meeting:" line.The same seven items (3 High, 2 Medium, 2 Low) gave this:
| No | Start | End | Min | Item | Expected outcome ||---|---|---|---|---|---|| 1 | 14:00 | 14:05 | 5 | Q3 results review | Decide yes/no whether the Q3 figures (slides sent in advance) are accepted as the baseline for the Q4 target. || 2 | 14:05 | 14:20 | 15 | Lock the Q4 revenue target | Choose one of the three team proposals and fix the Q4 revenue target as a single number. || 3 | 14:20 | 14:30 | 10 | Approve two new hires | Approve or reject each of the two hires (yes/no per role) and name the hiring owner for each. || 4 | 14:30 | 14:45 | 15 | Reallocate the marketing budget | Decide the new budget amount for each marketing line, with the total as a single number. || 5 | 14:45 | 14:55 | 10 | Customer churn response plan | Approve one churn response plan (yes/no) and name its owner. || 6 | 14:55 | 15:00 | 5 | Confirm decisions and owners | Assign a named owner and due date to every decision made in items 1-5. | Moved to next meeting: Evaluate replacing the team chat tool; Year-end party dateBoth Low items are out, in both runs. Without the last sentence of rule 5, the Q3 row read "Decide which Q3 results from the pre-sent slides must change the Q4 plan.": a decision verb with no finish line. With it, the row became a yes/no ("Decide yes/no whether the Q3 figures … are accepted as the baseline"). That is the opposite risk: a yes/no on "accept Q3 as the baseline" is a vote nobody needed. Rewrite rows like that by hand before sending.
Rule 4 was in the prompt either way, yet one of the two runs without the last sentence still fitted all seven items in (the chat tool got 4 minutes, the party date 2) and wrote "Moved to next meeting: None". The runs with it dropped both Low items every time, but four runs cannot tell you the sentence is the reason.
Check the table
Paste it into a spreadsheet and =SUM(D2:D7) the Min column, or save the answer as out.txt and run the script below. It sums the minutes, checks that each item starts where the last one ended, compares each start-end span to its Min cell, and flags outcomes that start with Discuss, Review or Share.
#!/usr/bin/env python3# usage: check_agenda.py out.txt START ENDimport re, sysfrom datetime import datetime as dtout, start, end = sys.argv[1:4]mins = lambda a, b: int((dt.strptime(b, "%H:%M") - dt.strptime(a, "%H:%M")).seconds // 60)rows = [[c.strip() for c in l.strip().strip("|").split("|")] for l in open(out, encoding="utf-8") if l.startswith("|")][2:]bad, total, prev = 0, 0, startfor no, s, e, m, item, outcome in rows: total += int(m); errs = [] if s != prev: errs.append(f"starts {s}, previous ended {prev}") if mins(s, e) != int(m): errs.append(f"{s}-{e} is {mins(s, e)} min, column says {m}") if re.search(r"(논의|공유|검토)\w*\.?$|^(discuss|review|share)\b", outcome, re.I): errs.append("outcome is not a decision") print(("NG " if errs else "OK ") + f"{no} {item} " + "; ".join(errs)) bad += bool(errs); prev = eif prev != end: print(f"NG last row ends {prev}"); bad += 1print(f"total {total} min, {bad} problem(s)")sys.exit(1 if bad else 0)$ python3 -I check_agenda.py out.txt 14:00 15:00 | tail -1; echo "exit ${PIPESTATUS[0]}"total 60 min, 0 problem(s)exit 0Both results passed. A copy with row 1 edited by hand to "7 min · Review the Q3 numbers together." prints NG 1 … is 5 min, column says 7; outcome is not a decision and total 62 min, and exits 1.
What the script cannot judge
Whether a dropped item can really wait. "Year-end party date" is Low, but if the venue deadline is this week it stays in. Put deadlines in the Note column so the model can see them. In one English run (the version without the last sentence of rule 5) the model also appended a note to the Item cell, "Q3 results review (slides sent in advance)"; if the table is going into another document, add "Copy item names exactly as given" to rule 1.
To pull decisions and action items out of the minutes afterwards, see meeting notes action items.