Professional English for Developers Module 3 – Grammar that changes meaning at work
Tenses at work: updates, changelogs and stories
Choose the present perfect or the past simple for finished work, the right forms for plans, and one pattern each for changelogs, timelines and stories.
What you will learn
- Choose the present perfect or the past simple when you report finished work
- Describe work in progress, plans and schedules with the right present and future forms
- Avoid continuous forms with state verbs, as in "I am knowing the cause"
- Write changelogs, incident timelines and stories about past projects with consistent tenses
Before you start
What you’ll learn · Before you start
What you will learn
- Choose the present perfect or the past simple when you report finished work
- Describe work in progress, plans and schedules with the right present and future forms
- Avoid continuous forms with state verbs, as in "I am knowing the cause"
- Write changelogs, incident timelines and stories about past projects with consistent tenses
Before you start
On this page
“I have fixed the login bug yesterday” asks the listener to hear two things that English keeps apart: have fixed says that the result matters now, and yesterday says when it happened. In one week of 15 stand-up lines, checked below, five lines had a tense slip, and three of them were this one.
This lesson shows which tense each kind of work report takes. Finished work takes the present perfect: The verb form have or has with a past participle, as in "I've fixed the bug": a finished action whose result matters now, with no finished time named. or the past simple: The verb form for an action finished at a time in the past, as in "I fixed the bug yesterday". Regular verbs add -ed., work in progress the -ing form, and what comes next going to or will. Commit subjects take the imperative: The form of a verb that gives an instruction or an order, as in "Fix the crash" or "Open the app". Commit subjects and how-to steps use it., and changelog entries keep one form. Incident timelines and stories take the past simple, with the past continuous for background and the past perfect for what happened earlier.
Finished work: the present perfect, unless you say when
Compare three lines from a Monday stand-up:
- “I’ve fixed the login bug.” The present perfect: the fix is done, and its result, a working login, matters now.
- “I fixed the login bug yesterday.” The past simple: the line says when.
- “I have fixed the login bug yesterday.” A slip: the two forms pull in different directions.
The British Council’s grammar pages draw the line at time: once you say when something happened, or treat that period of your life as finished, use the past simple. The present perfect is for a past action with a result now, and for a period that is not over yet, such as today or this sprint. How long is a third case: with since and for, an activity that goes on takes the present perfect continuous, “I’ve been working on the refund API since Monday”, and a count of results the simple form, “I’ve closed four tickets since Monday”.
Step through the questions that choose the verb form of one line:
The drawing shows the whole scene; its 7 steps are listed below.
Every step as text
- Finished, with a time. The first line, "I have fixed the login bug yesterday", reports finished work, and it says when: yesterday. A finished time takes the past simple.
- Finished, no time. Without the time, "I have fixed the login bug" is right: the present perfect reports a past action whose result, a working login, matters now.
- In progress now. "Today I work on the refund API" describes work going on now. Work in progress takes be and the -ing form: "Today I'm working on the refund API."
- In progress, how long. "I am working on it since Monday" says how long. How long, with since or for, takes the present perfect continuous: "I've been working on it since Monday."
- An arrangement. "We are releasing it on Friday" is agreed with other people, with a known day. An arrangement takes be and the -ing form, so the line is already right.
- A plan made earlier. "I'm going to look at the flaky test next" is an intention you formed before the stand-up, so it takes going to.
- Decided as you speak. Asked who can pair on the migration, you answer "I'll pair with Ravi after lunch": a decision made at the moment of speaking takes will.
The program checks one week of stand-up lines for these slips and for one more, the present simple for work in
progress. Press Edit and add a line of your own to WEEK:
// A week of stand-up lines checked for three tense slips this lesson names: the present perfect next to a finished
// time ("I have fixed it yesterday"), the present simple for work in progress ("Today I work on ..."), and a present
// form with since or for ("I am working on it since Monday").
const PERFECT = /\b(?:have|has|'ve|'s)\s+(?:\w+ly\s+)?(?:\w+ed|written|done|seen|made|sent|built|run|found|given|taken|gone|begun|broken)\b/i;
const FINISHED_TIME = /\b(?:yesterday|last (?:night|week|month|sprint|Monday|Tuesday|Wednesday|Thursday|Friday)|\w+ ago|at \d{1,2}:\d{2}|on (?:Monday|Tuesday|Wednesday|Thursday|Friday))\b/i;
const NOW_SIMPLE = /\b(?:today|now|currently|this week),?\s+(?:I|we)\s+(?:work|fix|write|test|build|review|migrate)\b/i;
const HOW_LONG = /\b(?:am|is|are|'m|'re)\s+\w+ing\b[^.]*\b(?:since|for (?:\d+|a few|two|three) \w+)\b/i;
function slips(line) {
const out = [];
if (PERFECT.test(line) && FINISHED_TIME.test(line)) out.push(`says when (${line.match(FINISHED_TIME)[0]}): past simple`);
if (NOW_SIMPLE.test(line)) out.push('work in progress: be + -ing');
if (HOW_LONG.test(line)) out.push('says how long: have been + -ing');
return out;
}
const WEEK = [
['Monday', [
['I have fixed the login bug yesterday.', 'I fixed the login bug yesterday.'],
['Today I work on the refund API.', "Today I'm working on the refund API."],
['No blockers.'],
]],
['Tuesday', [
['I am working on the refund API since Monday.', "I've been working on the refund API since Monday."],
['I have reviewed two pull requests.'],
["The staging database is down, so I'm writing unit tests instead."],
]],
['Wednesday', [
['I finished the refund API yesterday evening.'],
['We are releasing it on Friday.'],
["I'm going to look at the flaky checkout test next."],
]],
['Thursday', [
['I have deployed the fix to staging at 11:00.', 'I deployed the fix to staging at 11:00.'],
['QA is testing it now.'],
["I'll pair with Ravi on the migration after lunch."],
]],
['Friday', [
['The release went out at 16:00 IST.'],
['I have written the release notes last night.', 'I wrote the release notes last night.'],
["Next week I'm starting the billing work with Meera."],
]],
];
let lines = 0;
let before = 0;
let after = 0;
for (const [day, items] of WEEK) {
console.log(day);
for (const [line, fixed] of items) {
lines++;
const found = slips(line);
before += found.length ? 1 : 0;
after += slips(fixed ?? line).length ? 1 : 0;
console.log(` ${line}`);
for (const f of found) console.log(` ${f}`);
if (fixed) console.log(` -> ${fixed}`);
}
}
console.log(`\n${lines} lines: ${before} to fix before, ${after} after`); Output
Monday
I have fixed the login bug yesterday.
says when (yesterday): past simple
-> I fixed the login bug yesterday.
Today I work on the refund API.
work in progress: be + -ing
-> Today I'm working on the refund API.
No blockers.
Tuesday
I am working on the refund API since Monday.
says how long: have been + -ing
-> I've been working on the refund API since Monday.
I have reviewed two pull requests.
The staging database is down, so I'm writing unit tests instead.
Wednesday
I finished the refund API yesterday evening.
We are releasing it on Friday.
I'm going to look at the flaky checkout test next.
Thursday
I have deployed the fix to staging at 11:00.
says when (at 11:00): past simple
-> I deployed the fix to staging at 11:00.
QA is testing it now.
I'll pair with Ravi on the migration after lunch.
Friday
The release went out at 16:00 IST.
I have written the release notes last night.
says when (last night): past simple
-> I wrote the release notes last night.
Next week I'm starting the billing work with Meera.
15 lines: 5 to fix before, 0 after
Recorded with Node.js 24.21.0 on macOS 26 arm64. To run it yourself: mise exec node@24.21.0 -- node standup_week.mjs
Runs on this device, in your browser. The first run downloads JavaScript (about 0.6 MB), which is kept for the next runs.
Your run, in this browser
Five of the 15 lines needed a fix, and three of the five were the same slip: a present perfect next to yesterday, at 11:00 or last night. The other ten were right as written, including “I have reviewed two pull requests”, which names no time.
Key idea
Use the present perfect for finished work whose result matters now, and switch to the past simple the moment you say when it happened.
Checkpoint
Check: Present perfect or past simple for finished work
Work in progress and plans: continuous, going to or will
For work going on now, English uses the present continuous, be and the -ing form: “I’m migrating the tests”, “QA is testing the fix”. “Today I work on the refund API” sounds like a habit, not today’s task. For what comes next, the British Council’s page on future forms separates three cases, and a stand-up uses all three:
| Line | Form | It fits |
|---|---|---|
| We’re releasing the fix on Friday. | be + -ing | an arrangement agreed with others, with a known time |
| I’m going to look at the flaky test next. | going to | a plan you made before you spoke |
| I’ll pair with Ravi after lunch. | will | a decision you make as you speak |
Documentation follows its own rule. Google’s style guide asks for the present tense for general behaviour, as in “The server sends an acknowledgment”, and keeps will for something that happens later.
Three more patterns have parts of their own below. state verb: A verb that describes a state rather than an action, such as know, belong or prefer. It is not usually used in the -ing form: "I know", not "I am knowing". such as know and belong keep the simple form: “I know the cause”, not “I am knowing”. Commit subjects take the imperative, and changelog entries keep one form under headings such as Added and Fixed. Timelines and stories of past work take the past simple, with the past continuous for background and the past perfect for earlier events.
Checkpoint
Check: Work in progress and plans
State verbs: I know, not I am knowing, with a checker Pro: opens with a Pro, Premium or Ultimate pass
Some verbs describe a state rather than an action, and English rarely puts them in the -ing form. This part lists the state verbs you will use at work, shows the verbs that are states in one meaning and actions in another, and checks ten sentences with a program.
In this part:
- State verbs at work, from know to belong
- Verbs that are states in one meaning and actions in another
1 runnable example (JavaScript) · about 3 minutes
Opening this part with your pass…
This part opens with any MySmartCoPilot pass.
- Pro pass · 1 week₹79$2.99
- 30 days₹179$5.99
- 1 year₹1,699$45
One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.
Passes can’t be bought right now, so this part can’t be opened at the moment. The free part above stands on its own. If you have a pass, enter your licence key.
It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).
Commit subjects, changelogs and release notes in one pattern Pro: opens with a Pro, Premium or Ultimate pass
Commit subjects, changelog entries and reference docs each follow their own convention, and most messy histories come from mixing them. This part gives each one its form, from Git’s guidance and Keep a Changelog, and regroups a mixed changelog with a program that counts its forms.
In this part:
- Commit subjects in the imperative, as if you give the code an order
- Changelog entries grouped under one set of headings
1 runnable example (JavaScript) · about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Incident timelines and project stories, in the past Pro: opens with a Pro, Premium or Ultimate pass
Notes written during an incident are in the present, and the timeline and the story you tell later are in the past. This part turns live notes into a timeline with times in two zones, and builds a project story with the past simple, the past continuous and the past perfect.
In this part:
- Incident timelines: past simple, a time and its zone
- Project stories: past simple, past continuous and past perfect
- Three rules to keep from the parts on state verbs, changelogs and stories
1 diagram · 1 runnable example (JavaScript) · about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Practise: fix the tenses of a status update
The exercise holds eight lines of a status update with the slips of the first two sections. Fix them until the sample tests pass:
Exercise · Easy · JavaScript
Fix the tenses of an eight-line status update
update.mjs holds a status update of eight lines. Six of them have a tense slip from this lesson; two are right and must stay as they are. Fix the six by editing the text inside the quotes:
- a line that says when something finished (last week, at 09:30, two days ago) takes the past simple;
- work going on now takes be + -ing: QA is testing it now;
- how long, with since or for, takes the present perfect continuous: I've been waiting since Tuesday;
- keep each line's verb and change only its form;
- every fact stays: the names, the version, the times and the days.
Run the sample tests after each line. When they pass, read the update aloud once, as you would in a stand-up.
Starter code · update.mjs
// Fix the tenses of this status update: edit the words inside the quotes, keep every fact, and leave the two lines
// that are already right as they are.
export const lines = [
'I have finished the search API last week.',
'Today I review the payment PRs.',
'I am waiting for the database team since Tuesday.',
'We have released 3.9 to staging at 09:30.',
'QA tests it now.',
'I have written the migration guide two days ago.',
'We are releasing to production on Thursday.',
"I've closed six tickets this week.",
]; The sample tests · update.test.mjs
import { test, assert } from 'mysmartcopilot:test';
import { lines } from './update.mjs';
// The lesson's checks, as its stand-up checker applies them.
const PERFECT = /\b(?:have|has|'ve|'s)\s+(?:\w+ly\s+)?(?:\w+ed|written|done|seen|made|sent|built|run|found|given|taken|gone)\b/i;
const FINISHED_TIME = /\b(?:yesterday|last (?:night|week|month|sprint)|\w+ ago|at \d{1,2}:\d{2}|on (?:Monday|Tuesday|Wednesday|Thursday|Friday))\b/i;
const NOW_SIMPLE = /\b(?:today|now|currently|this week),?\s+(?:I|we)\s+(?:work|fix|write|test|build|review|migrate)\b/i;
const NOW_SIMPLE_THIRD = /\b(?:tests|reviews|works|checks|fixes|builds)\b[^.]*\bnow\b/i;
const HOW_LONG = /\b(?:am|is|are|'m|'re)\s+\w+ing\b[^.]*\b(?:since|for)\b/i;
test('the update still has eight lines', () => {
assert.equal(lines.length, 8, 'keep eight lines');
});
test('a line that says when takes the past simple', () => {
for (const line of lines) assert.ok(!(PERFECT.test(line) && FINISHED_TIME.test(line)), `says when, so past simple: "${line}"`);
});
test('work going on now takes be + -ing', () => {
for (const line of lines) assert.ok(!NOW_SIMPLE.test(line) && !NOW_SIMPLE_THIRD.test(line), `work in progress: "${line}"`);
});
test('how long takes the present perfect continuous', () => {
for (const line of lines) assert.ok(!HOW_LONG.test(line), `since or for with a present form: "${line}"`);
assert.ok(/\b(?:have|'ve|has)\s+been\s+waiting\b/.test(lines[2]), 'line 3: have been waiting since Tuesday');
});
test('each fixed line has the form its rule asks for, with the same verb', () => {
// The past simple has no helper verb in front of it: "I finished", not "I have finished" or "I had finished".
const pastSimple = (line, verb) => new RegExp(`\\b${verb}\\b`).test(line) && !/\b(?:have|has|had|'ve|'d)\b/i.test(line);
assert.ok(pastSimple(lines[0], 'finished'), 'line 1: the past simple, finished');
assert.ok(/\b(?:I'm|I am)\s+reviewing\b/.test(lines[1]), "line 2: be + -ing, I'm reviewing");
assert.ok(pastSimple(lines[3], 'released'), 'line 4: the past simple, released');
assert.ok(/\bis\s+testing\b/.test(lines[4]), 'line 5: be + -ing, QA is testing');
assert.ok(pastSimple(lines[5], 'wrote'), 'line 6: the past simple, wrote');
});
test('the two lines that were right stay as they are', () => {
assert.equal(lines[6], 'We are releasing to production on Thursday.');
assert.equal(lines[7], "I've closed six tickets this week.");
});
test('every fact stays', () => {
const facts = ['search API', 'last week', 'payment PRs', 'database team', 'since Tuesday', '3.9', '09:30', 'QA', 'migration guide', 'two days ago'];
const all = lines.join(' ');
for (const fact of facts) assert.ok(all.includes(fact), `the update no longer says "${fact}"`);
}); A hint
Find the time words first. Lines with last week, at 09:30 and two days ago say when, so their present perfect (have finished, have released, have written) becomes the past simple: finished, released, wrote.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
The sample tests run on this device, in your browser (QuickJS): nothing is sent to mysmartcopilot.com. The first run downloads JavaScript (about 0.6 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.
Then check yourself on finished work and on plans. Miss a question, and the next one on the same idea is a step simpler:
Practice that adapts to you
Practise this lesson
6 questions about 5 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Warm-up (fresher to mid-level): When do you use the present perfect instead of the past simple in a status update?
Use the present perfect for finished work whose result matters now, when you do not say when it happened: “I’ve fixed the login bug”, “I’ve reviewed two pull requests today”. Use the past simple as soon as you name a finished time, such as yesterday, last week or 11:00: “I fixed it yesterday”. Combining the two, “I have fixed it yesterday”, is a common slip. For how long something has been going on, use the present perfect continuous: “I’ve been working on it since Monday”.
Three longer questions on tenses at work wait in this module’s bank:
-
Mid to senior
During an incident you wrote notes such as "10:42 deploy failing", "checking logs" and "rolling back". The team now needs the timeline for the postmortem, read in India, Germany and the US. How do you turn your notes into it?
-
Mid to senior
Your project's commits and changelog mix "Fixed", "Fixes", "Fixing" and "Fix". You are asked to propose one convention for commit subjects, changelog entries and release notes. What do you propose, and how do you defend it?
-
Fresher to senior
In an interview you tell the story of a migration you worked on. Afterwards the interviewer says it was hard to follow what had already happened and what was still going on. How would you tell it again?
Key takeaways
- Report finished work with the present perfect when its result matters now, and with the past simple as soon as you say when it happened.
- Say how long with since or for and the present perfect continuous: “I’ve been working on it since Monday.”
- Use be + -ing for work in progress and for arrangements, going to for plans you made earlier, and will for decisions you make as you speak.
Terms in this lesson
- imperative
- The form of a verb that gives an instruction or an order, as in "Fix the crash" or "Open the app". Commit subjects and how-to steps use it.
- past simple
- The verb form for an action finished at a time in the past, as in "I fixed the bug yesterday". Regular verbs add -ed.
- present perfect
- The verb form have or has with a past participle, as in "I've fixed the bug": a finished action whose result matters now, with no finished time named.
- state verb
- A verb that describes a state rather than an action, such as know, belong or prefer. It is not usually used in the -ing form: "I know", not "I am knowing".
References
- Present perfect (LearnEnglish, B1-B2 grammar) (British Council)
- Present perfect simple and continuous (LearnEnglish, B1-B2 grammar) (British Council)
- Future forms: 'will', 'be going to' and present continuous (LearnEnglish, B1-B2 grammar) (British Council)
- Stative verbs (LearnEnglish, B1-B2 grammar) (British Council)
- Past perfect (LearnEnglish, B1-B2 grammar) (British Council)
- Tense (Google developer documentation style guide) (Google for Developers)
- API reference code comments (Google developer documentation style guide) (Google for Developers)
- Submitting patches: describe your changes well (Git documentation) (Git project)
- Writing good CL descriptions (Google engineering practices) (Google)
- Keep a Changelog 1.1.0 (Keep a Changelog)
- Configuring commit squashing for pull requests (GitHub Docs) (GitHub)
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress