tmt-pm · git:20261005.d37c5e1 · 2026-10-05 · sha256 1c3424b5f57abf36
tmt-pm git:20261005.d37c5e1A
Immutable. This exact content never changes and is served at /api/v1/blob/1c3424b5f57abf36.
---
name: tmt-pm
description: Run the project-management pass and the leaders sync for this repository. Find blocked, stale, unstaffed, oversized and waiting-on-maintainer work, move it with the owning lead, and keep status flowing to the PM instead of the core lead.
---
# TMT project management
Use this skill when you act as the project manager (`tmt-core-pm`) or audit
delivery flow. [Project tracking](../../../DEVELOPMENT.md#project-tracking)
owns the Project fields, Status meanings and the tracker rules. This skill
owns the procedure only.
## Ticket levels
- **Tracker (`Epic: <name>`)**: a product item the maintainer set. A squad
lead may propose a new tracker to tmt-lead, but it is opened only after the
maintainer approves it. The PM never creates a tracker.
- **Child issue**: one outcome with acceptance criteria and normally one
reviewable PR (about 1,500 changed lines or fewer). Leads and the PM may
open children as direct native sub-issues of an existing tracker.
- **Split** a child when its progress is invisible: several PRs, several
squads, or a long open period without movement. Propose each split to the
owning lead first; open the children after the lead agrees.
## Pass and leaders sync
1. **Read state in one batch.** Make one GraphQL query for Project items
(Status, Squad, Owner, Agents, native parent, updatedAt) and one for open PRs
(head, checks, mergeable, updatedAt) and the merge queue. Read `tmt ls`
for active members. Do not query items one by one.
2. **Detect.**
- _Blocked without an owner_: the work waits on something that has no
issue, no owner, or no recent movement.
- _Stale_: In Progress or blocked for more than 6 hours with no PR
activity or comment. A PR with a pinned head that waits on CI or the
merge queue, or one held for a named dependency that is moving, is not
stale.
- _Unstaffed_: a squad with In Progress or blocked work and no active
member.
- _Board drift_: a squad's `tmt sq ls --squad <name>` members differ
from the active members working for that squad.
- _Waiting on the maintainer_: a decision marked pending in an issue or
PR comment.
- _Oversized_: a tracker or child whose progress the board cannot show.
3. **Act through the owning lead.** Name the item, what is missing, and the
next action you propose: assign the blocker an owner, file the missing
child, rebase, split, or request staff. Follow up on the next pass. Leads
staff their own squads within the recorded limits and ask the maintainer
above them; "no expansion without the maintainer's approval" never means
staying silent.
4. **Run the leaders sync** on the cadence recorded in the team issue (#606).
Leads send their status (done, next, blockers or cross-squad needs) to the
PM, not to tmt-lead. Post one combined digest to all leads, at most 12
lines under these headings: Blocked (item, blocker, owner, age, action),
Stale, Unstaffed, Waiting on Ben (item, one-line question, age), Splits.
Send tmt-lead only items that need its decision (core paths, core
contracts, seams between squads), and broadcast team-wide alerts (API
budget, disk, CI) to the leads yourself.
5. **Keep the pinned "Pending owner decisions" issue current.** It holds one
checklist line per open decision, with its link and the date it was
asked. Remove the line when the answer is recorded.
## Limits
- **Code and merging:** the PM never merges, enqueues, pins, approves PRs or
pushes code.
- **Members and settings:** the PM never starts or retires members and never
changes provider or TMT settings.
- **Project fields:** when editing a single-select field, pass existing option
IDs, and never redefine a field's options.
- **Replies:** only a received reply block carries a receipt. For a "reply
from" notice, read it with `tmt result` and answer with `tmt talk`.