---
title: openplanr 2.2639.5
description: Published 2026-09-28. Creating an artifact (openplanr backlog add, openplanr epic create and the other create commands) no longer reissues the id of a removed…
url: https://openplanr.dev/docs/changelog/2.2639.5
updated: 2026-09-28
related:
  - https://openplanr.dev/docs/changelog/2.2640.1.md
  - https://openplanr.dev/docs/changelog/2.2640.0.md
  - https://openplanr.dev/docs/changelog/2.2639.4.md
---

# openplanr 2.2639.5

Published 2026-09-28.

[Release on GitHub](https://github.com/openplanr/OpenPlanr/releases/tag/openplanr%402.2639.5)

## Patch Changes

Creating an artifact (`openplanr backlog add`, `openplanr epic create` and the other create commands) no longer reissues the id of a removed item, continues past 999 (`FEAT-1000`), gives concurrent runs different ids, and ignores `SPRINT-NNN/` notes folders; issued ids are recorded as empty files in each artifact folder's `.issued-ids/`, which belongs in version control with the rest of `.planr/`. `planr <type> list` now shows ids past 999, in numeric order.

`openplanr github sync` now reads the upper-case issue states `gh` reports, so pull no longer resets artifacts linked to closed issues to `pending`, push closes or reopens only the issues whose state differs, and the default direction reports a conflict only where the two sides disagree. An issue number that names a merged pull request counts as closed, and `openplanr github status` marks an issue it could not fetch as out of sync.

Landing custody now clears a stored `recovery_required` receipt when the rollback or compensate intent is committed, so a landing host built on it can dispatch the recovery instead of failing with `LANDING_BINDING_MISMATCH`.

A `reportLinter.vaguePhrases[].pattern` in `.planr/config.json` that is not a valid regular expression, or that can match empty text such as `(soon)?`, now fails config loading with `E_CONFIG_INVALID` naming the field and the pattern. Before, `openplanr report`, `openplanr report-linter` and `openplanr voice` failed with a raw `SyntaxError` or looped until the process ran out of memory.
