Gantt Guild

The same request, rewritten: the writing that actually moves projects

In a distributed team, writing is where the work happens. Before-and-after examples of the five things a project manager writes every day: requests, issue descriptions, decisions, status updates and escalations.

A person learning on a laptop at home

Most project managers never get taught to write. They get taught templates. But in a remote or hybrid company, requests, decisions, plans, status and escalations all travel as text, and a PM who writes clearly saves dozens of hours a week across the team. One who writes vaguely creates meetings, rework and mistrust.

Here are the five forms that matter most, each with a real before-and-after from the four projects in Projects, For Real.

The one test

GitLab's TeamOps guidance names the core skill: low-context communication. Assume the reader knows nothing about the topic. Give them the background, the specific request, links to the source of truth, definitions of unusual terms, the deadline and the reason. Before you send anything, ask: could a capable colleague who joined the company yesterday act on this without asking a question? If not, add what they'd need. In an async team, every follow-up question can cost a day.

1. The request

Every request needs five things: who (an @-mention, not a CC), what (the action, in one sentence), why (so they can prioritize or find a better way), by when (a date, and what happens if it's missed) and where (a link to the issue, document or line in question).

Before · Slack DM
#direct message
PR
Priya Raman16:02
hey chen can you check the workday thing when you get a chance? thx
After · comment on issue #1166, linked in #proj-ledger
Workday → Spendwise employee sync: field mapping
#1166 · ledger · comment by Priya Raman

@chen.wu, could you confirm the cost-center field mapping in the table under Mapping v2 in this issue's description? Specifically: Workday Cost_Center_Reference_ID → Spendwise department_code.

Why: Apex starts configuring approval routing on Mon 19 Jul, and routing keys off department code. If the mapping is wrong we'll rebuild routing (~3 days).

By: end of Fri 16 Jul. If you can't get to it, tell me by Wed and I'll ask Ravi to check against a Workday report instead.

The rewrite is longer. It costs Chen thirty seconds to understand and costs the project zero follow-up messages. And because it lives on the issue, anyone checking the mapping later sees the question and the answer.

Answering is the other half. “Will do” doesn't tell the requester whether to wait or find another route. Reply with a date or “done”: “I can do this Thursday. If that's too late, Ravi has the same report access.”

2. The issue description

An issue is the unit of work, and its description is that work's single source of truth. The structure is deliberately boring: problem, proposal, out of scope, acceptance criteria, links.

Backfill 12 weeks of throughput history for existing milestones
#44121 · gitlab-org/gitlab · opened by Alex Kovalenko · Milestone 20.2 · Weight 5 · Epic &9102
groupproject managementtypefeatureworkflowin devDeliverable

Problem. Forecasts need at least 8 weeks of throughput history to be meaningful. Milestones that existed before the feature flag was enabled have no history, so on launch every existing team would see “Not enough data” for two months.

Proposal. A background migration that computes weekly closed-issue counts per milestone and per epic for the trailing 12 weeks, from existing closed_at timestamps. Batched, throttled per the database guidelines.

Out of scope. Weight-based history (follow-up #44140). Iteration cadences (deferred).

Acceptance criteria. For a milestone created ≥ 12 weeks ago, the history table has 12 weekly rows. Runs on GitLab.com in < 6 h with no severity 3+ alerts. Re-running is idempotent.

Rollback. Disable via flag; rows are inert without the main flag.

“Out of scope” heads off scope creep during review. Acceptance criteria define done. Links tie the work to the decision that justified it.

3. The decision

When a decision needs input or buy-in, write it up. GitLab's SPADE structure works at any size: Setting, People, Alternatives, Decision, Explain.

Closed
Decision: Ledger go-live date
#1201 · ledger · opened by Priya Raman 2027-06-21 · closed 2027-06-30 · DRI: Daniel Okafor
ledgerdecision

Setting. We need a go-live date to baseline the schedule. Constraints: (1) Finance blackout covers the last 3 and first 8 business days of each quarter (Q3 FY28 closes 31 Oct); (2) the legacy tool's support ends 31 Dec; (3) employees submit most expenses in the first week of the month; (4) a two-week UAT is needed after SIT. Earliest realistic date: late September. Reversible until we announce the date to employees on 2 Aug.

People. DRI: Daniel Okafor (Sponsor). Consulted: the Controller, AP, Field Ops, Payroll, integrations, the vendor and the implementation partner.

Alternatives. A. Mon 27 Sep: earliest, most benefit, but collides with September's month-end AP close and submission peak. B. Mon 4 Oct: after month-end, ~13 business days before the Q3 blackout, hypercare finishes before Q4 close; two days less float. C. Mon 8 Nov: most float, but inside Q4's blackout; next window late November near holidays; ~$45k of benefit lost per month of delay.

Decision. Option B: go-live Monday 4 October 2027. Fallback: 18 October, decided at go/no-go on 29 Sep.

Explain. B is the only option that avoids both month-end AP close and the quarter-close blackout while leaving a fallback inside the same window. A's one-week benefit gain doesn't justify the close risk.

The part people skip is the part that matters most later: the options that lost, and why. Six months on, when someone asks “why didn't we go live in September?”, the answer takes thirty seconds to find.

4. The status update

A good status answers four questions in this order: what's the overall state, in one line, with a reason; what changed; what's next; and what do you need from the reader. Most executives read the first two lines. Make them carry the message.

Before
Good progress this sprint. Team migrated a bunch of repos and worked on CI templates. Some issues with the bank's firewall but working through it. Next sprint we'll continue with the pilot. Let me know if questions!
After · Harbor status epic, 6 Sep

Status: Needs attention. Pilot wave (M2) is on plan for 14 Sep acceptance, but firewall approvals for the runner network are 6 days late and now on the critical path.

Done (iteration 3): 312 of 500 pilot repositories migrated with full history (62%). 9 of the top-40 CI templates built and passing. Pilot team A onboarded (41 developers).

Changed: New risk R-09: firewall change pending in Meridian's change board since 31 Aug. If not approved at the 7 Sep CAB, pilot acceptance moves to 21 Sep (no cost impact).

Next: remaining 188 pilot repos; 6 more templates; pilot team B.

Needs: @thomas.whitfield, could you ask Martin Cole to put the runner firewall change first on Tuesday's CAB agenda? Details: RAID item #87.

Hours: 642 of 1,980 used (32%) against 40% of schedule elapsed.

5. The escalation

An escalation is a request for help from someone with more authority when you're blocked and have done what you can. Good ones are short, factual and offer options:

Escalation: Spendwise SSO/SCIM connector, needs your help by Friday

@daniel.okafor: the vendor's Okta connector has failed our SSO tests for 9 business days (issue I-04). Their PM has twice moved the fix date without a root cause. If it isn't fixed by 31 Aug, SIT slips ≥ 1 week and the 4 Oct go-live is at risk.

What I've done: daily follow-up with their PM; cited the SLA (§7.2); tested a workaround (local accounts for non-SSO tests).

Ask: an exec-to-exec call with Spendwise's VP of Customer Success this week to get a committed date and a named engineer. Talking points are drafted in I-04.

Options if no fix by 31 Aug: (a) go live with SAML-only SSO and manual provisioning for 4 weeks (+0.5 FTE in IT Ops); (b) move go-live to the 18 Oct fallback.

Executives welcome escalations like this. The facts are in place, the work done so far is visible, and the decision is framed.

Chat coordinates; documents record

Use public channels, not DMs, so others learn from the answer. Use threads. Link to the source of truth instead of pasting content that will go stale. And move decisions out of chat: if a decision happens in Slack, write it into the issue and link back.

#proj-ledger
PR
Priya Raman09:14
▸ Decision from today's core-team sync, recorded in #1312: SIT starts Mon 30 Aug as planned, with non-SSO scenarios using local test accounts. SSO scenarios move to a dedicated SIT block once the vendor fix lands (target 31 Aug). Owners and dates are in the issue. Questions in thread »
CW
Chen Wu09:20
I'll create the 25 local test accounts today and note them in #1312 so we remember to delete them before go-live.
RM
Ravi Menon09:31
Updated the SIT schedule tab; 38 of 380 cases are SSO-dependent and moved to block 2.
✓ 3   👀 2

One last rule from GitLab's guidance on generated text: if you use AI to help write, you own every word. Read it, verify the facts and numbers, and don't hide behind a disclaimer.

How students practice this

Week 2 is entirely about the workbench and these five forms. After that, every weekly deliverable includes at least one request, one status and one decision written to this standard, and every Friday review starts with someone's writing on the screen.

Adapted from Projects, For Real, chapter 8. The projects, people, vendors and numbers are the book's fictional case studies, set against GitLab's publicly documented practices. Gantt Guild is not affiliated with GitLab Inc.

Operator Program · Cohort 1

Do this for free, for real

Every article here is a week of the Operator Program in miniature. In the program you write the documents yourself, in real tools, and get reviewed live.

The whole program is free. No tuition, no deposit, no income-share agreement, nothing owed if you leave.

Apply, it's free