Playbook: Issue Deferral — Future Milestone
What this covers
Deferring a GitHub issue until a specific future date using the defer-until: body line,
and understanding how the Future milestone pipeline works end-to-end.
How to defer an issue
Edit the issue body and add this line anywhere:
defer-until: YYYY-MM-DD
Example: to defer issue #999 until 1 July 2026:
- Open
https://github.com/radieu/p24-infra/issues/999 - Click Edit on the issue body
- Add a line:
defer-until: 2026-07-01 - Save
Or via CLI (append to existing body — replace <current body> with the full existing text):
$body = gh issue view 999 --repo radieu/p24-infra --json body --jq '.body'
$body += "`n`ndefer-until: 2026-07-01"
gh issue edit 999 --body $body --repo radieu/p24-infraThe hourly triage will detect this within the hour and move the issue to Future milestone.
No labels or milestone changes needed from you.
Automated timeline
| Time | Event |
|---|---|
| T+0 | You add defer-until: YYYY-MM-DD to the issue body |
| T+0 to T+1h | Hourly triage Phase 0 runs, detects the line, sets Future milestone |
| 00:30 UTC on target date | Nightly check Phase 0 promotes: sets Triage milestone, posts a comment |
| T+0 to T+1h after 00:30 UTC | Hourly triage Phase 3 spawns a worker; implementation begins |
Cancelling a deferral
Remove the defer-until: line from the body (or replace the date with a past date).
On the next hourly run, if the issue has no other milestone it will be assigned Triage.
If the issue is already in Future milestone and you remove the line, change the milestone
manually to Triage as well — the hourly triage only promotes Future→Triage via the
defer-until: line at 00:30 UTC; it will not promote manually-milestoned Future issues.
gh issue edit 999 --milestone "Triage" --repo radieu/p24-infraIssues in Future without a defer-until: line
Issues #18, #23, #37 and similar are in Future milestone with no defer-until: date.
These are permanently deferred items that need manual human action before they can proceed
(purchasing WAHA Plus, provisioning a new server, etc.). Both agents ignore them.
To reactivate one: add a defer-until: line with today’s date, or move the milestone manually.
Edge cases
| Scenario | Outcome |
|---|---|
defer-until: date is today | Next nightly check (00:30 UTC) promotes immediately |
defer-until: date is in the past when added | Next nightly check promotes; hourly triage will not |
Malformed date (defer-until: soon) | Logged as warning, treated as absent, normal Triage assigned |
Two defer-until: lines in the body | First match wins (regex Select-Object -First 1) |
defer-until: on an In Progress issue | Hourly triage skips issues that already have a milestone — only affects issues without a milestone |
Troubleshooting
Issue stuck in Future after the target date
- Confirm the nightly check ran: check
dev_r_scheduled_runsin Supabase for a row withjob_name='nightly-infra-check'andstatus='success'on the expected date. - Confirm the
defer-until:line is correctly formatted (ISO date, no typos). - Promote manually if needed:
gh issue edit 999 --milestone "Triage" --repo radieu/p24-infra
Issue not moving to Future after adding defer-until:
- Wait for the next hourly triage (runs at top of every hour on bms-4).
- Check the triage log:
ssh ubuntu@54.36.123.110 "tail -50 /var/log/hourly-devops-triage.log" - Confirm the issue body contains exactly
defer-until: YYYY-MM-DDon its own line (not inside a code block or indented more than expected by the regex).
Regex pattern reference
Both agents use: (?m)^\s*defer-until:\s*(\d{4}-\d{2}-\d{2})\s*$
- Leading/trailing whitespace on the line is allowed
- The line must not be inside a fenced code block (the regex has no code-block awareness)
- The date must be exactly
YYYY-MM-DD— no slashes, no words
Prevention / best practice
- Use
defer-until:for issues that are genuinely waiting on a fixed calendar date (scheduled maintenance window, contract start date, dependency release date). - Use
Futuremilestone manually (withoutdefer-until:) for items that are indefinitely deferred — WAHA Plus upgrade, new VPS provision, etc. - Do not add
defer-until:to issues inIn ProgressorReview— those milestones are respected by both agents; the line will have no effect.