pm-github 2026.10.24 → 2026.10.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.10.25 - 2026-10-25
4
+
5
+ ### Fixed
6
+
7
+ - Hold ambiguous merged-PR delivery until attribution is verified ([pm-github-closeout-attribution](https://github.com/unbraind/pm-github/blob/main/.agents/pm/issues/pm-github-closeout-attribution.toon))
8
+
3
9
  ## 2026.10.24 - 2026-10-24
4
10
 
5
11
  ### Fixed
package/README.md CHANGED
@@ -48,17 +48,41 @@ PR body, including links in follow-up lists (`PM:`), can produce `not_delivery`
48
48
  rows for otherwise eligible items with the reason "Mentioned, not delivered".
49
49
  Tracker PR URL metadata with no body reference or declaration produces no row.
50
50
 
51
- When several merged PRs declare delivery, closeout selects the latest merge with
52
- complete merge facts and passing head checks. Equal merge times use the higher
53
- PR number. Other qualifying claims receive `duplicate_selection`; mention-only
54
- PRs retain `not_delivery`. All completion fields and the appended close event use
55
- the selected PR's merge time, merge SHA, head SHA and check evidence.
51
+ A merged PR is a delivery candidate only when it claims the item through an explicit
52
+ `delivery-pr:` tag, a closing declaration, or a commit claim naming the item.
53
+ A fully inspected mention-only or link-only PR is context: it remains listed as
54
+ `skip` / `not_delivery`, never enters the candidate set, and its merge/check gaps
55
+ cannot hold another delivery. Unreadable PR or commit evidence remains unresolved
56
+ because it may hide a claim; a known candidate's incomplete evidence still holds.
57
+
58
+ Closeout never breaks a delivery tie by PR number or merge order. Prefer one explicit
59
+ item tag linking the delivery PR, for example:
60
+
61
+ ```sh
62
+ pm update pm-x --add-tags delivery-pr:https://github.com/example/project/pull/19
63
+ ```
64
+
65
+ The tagged PR must be in the selected PR set and pass the merge and head-check gates.
66
+ Ordinary `pr_url` metadata remains contextual. Without an explicit tag, exactly one
67
+ linked merged PR must declare the item in its description or commit messages and
68
+ merge strictly after the last acceptance-criteria edit in the item's SDK history.
69
+ Creation is the cutoff when no later criteria edit exists; comments and unrelated
70
+ updates do not move it. Missing or unverifiable history cannot establish chronology.
71
+ Unreadable commits on an otherwise qualifying mention also hold selection: they may hide another claim. A failed check on the unique PR never permits fallback to an earlier delivery.
72
+
73
+ Unresolved attribution produces `needs_review` rows listing every linked candidate
74
+ PR number, leaving the item and its history unchanged. Multiple or unmatched explicit
75
+ tags also require review. The reusable workflow includes these rows and candidates
76
+ in the closeout PR body. An all-held run proposes only the privacy-gated
77
+ `closeout-review.json` report in the tracker, so it can still open a review PR.
78
+ All completion fields and the appended close event use the selected PR's merge
79
+ time, merge SHA, head SHA and check evidence.
56
80
 
57
81
  **A mention is not delivery.** PR bodies routinely link follow-ups, epics and
58
82
  related work for context, so a link alone never closes an item. An item is
59
83
  closed only when:
60
84
 
61
- - its delivery is explicitly declared; a canonical link may be preceded on the same
85
+ - its delivery is selected by an explicit item tag or a unique claim after the last criteria edit; a canonical link may be preceded on the same
62
86
  line by a GitHub-style closing keyword: `Closes`, `Fixes`, `Resolves` or
63
87
  `Delivers` (and their tense forms), for example `- Closes [pm-x](…/pm-x.toon)`;
64
88
  - it is not an `Epic`; epics close when their children are done;
@@ -163,10 +187,96 @@ for missed deliveries or unavailable webhooks. Back up the ignored durable
163
187
  [CLI and typed SDK example](docs/webhook-inbox.md) for deployment, crash recovery,
164
188
  retention and supported-event details.
165
189
 
190
+ ## Issue-form completion contracts
191
+
192
+ `pm github form` reads one explicitly selected repository issue form through the
193
+ GitHub Contents API. It compiles requirements before export; it never writes to
194
+ GitHub or changes an item. Select a revision explicitly (prefer a commit SHA for
195
+ reproducibility). Requirements follow [GitHub's form schema](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema).
196
+
197
+ ```sh
198
+ pm github form --repo unbraind/pm-cli \
199
+ --form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
200
+ --form-bindings docs/issue-form-bindings.json --compile --json
201
+
202
+ pm github form --repo unbraind/pm-cli \
203
+ --form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
204
+ --item pm-123 --form-bindings docs/issue-form-bindings.json \
205
+ --form-answers docs/issue-form-answers.json --json
206
+
207
+ pm github export --repo unbraind/pm-cli --ids pm-123 \
208
+ --form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
209
+ --form-bindings docs/issue-form-bindings.json \
210
+ --form-answers docs/issue-form-answers.json --dry-run --json
211
+ ```
212
+
213
+ The [bindings example](docs/issue-form-bindings.json) maps form IDs to current
214
+ native item fields; the [answers example](docs/issue-form-answers.json) supplies
215
+ the dropdown selection. Explicit answers override bindings. Native text fields
216
+ (including custom fields) and string arrays are read through the SDK, without
217
+ coercion. Numbers, objects and nested arrays refuse as answers. Status bindings
218
+ are literal text; this feature does not infer lifecycle meaning. Required text
219
+ must contain non-whitespace content. Text supports `required` and `min_length`
220
+ (Unicode code points, after CRLF/CR normalization); dropdowns support `required`,
221
+ exact option membership, uniqueness and single/multiple selection. Defaults and
222
+ placeholders do not count as confirmed answers. Markdown elements are display
223
+ context and are omitted from the issue body. Fields without IDs use `field-N`,
224
+ where N is their one-based position in the form body.
225
+
226
+ IDs accept Unicode letters/numbers, `_` and `-` (1..100 characters). Names such as
227
+ `toString`, `constructor`, `__proto__`, `hasOwnProperty` and `valueOf` are ordinary
228
+ IDs, choices and binding names. Answer and binding maps preserve every own key;
229
+ inherited properties never supply answers or defaults. Invalid answer objects
230
+ refuse by value shape, without rejecting these names or changing prototypes.
231
+
232
+ Unknown keys, validators or element types refuse explicitly as `unsupported_form`.
233
+ This includes checkboxes, uploads, rendered/code textareas, dropdown defaults,
234
+ assignees, project routing and issue types. Duplicate IDs, labels or options
235
+ also refuse. The supported top-level keys are `name`, `description`, `title`,
236
+ `labels`, and `body`; `title` is a UI preset and the native pm title remains the
237
+ exported title. Form labels augment exported labels. Missing/invalid answers
238
+ produce `incomplete_answers`, exit 2, and **one** checklist of at most 20 repairs
239
+ plus an omitted count. A batch validates all selected items before any POST or
240
+ PATCH, so one incomplete item yields zero remote writes. Pass the same form
241
+ flags to `export --apply` only after reviewing the preview. Without `--form`,
242
+ export retains its existing behavior. This does not repair export identity,
243
+ retry or idempotency defects, and a form check is not an approval for later use.
244
+
245
+ Normal form output is compact host-rendered TOON (`--json` selects JSON): contract,
246
+ binding names, counts and repair evidence, without item contents or answer values.
247
+ `--compile` returns the contract even before answers are supplied. Limits are
248
+ 128 KiB YAML/JSON files; 100 elements, map entries or choices; 200 characters per
249
+ label/choice; 32,768 characters per answer; `min_length` 0..32,768; 64 KiB UTF-8
250
+ rendered issue body. Arrays must be dense and numeric validators finite integers.
251
+ Input and output size refusals use `invalid_form_input`; inaccessible forms and
252
+ items use `form_unavailable` and `item_unavailable`. Remedies use the host SDK's
253
+ structured error context (`nextSteps` and `why`).
254
+
255
+ The typed SDK exports `IssueFormInput`, `IssueFormContract`, `IssueFormReport`,
256
+ `IssueFormRefusalCode`, `compileIssueForm(input)`,
257
+ `completeIssueForm(pmRoot, input)` and `readRepositoryIssueForm(selection, reader, apiBase)`:
258
+
259
+ ```ts
260
+ import { completeIssueForm, type IssueFormInput } from "pm-github";
261
+
262
+ const input: IssueFormInput = {
263
+ repo: "owner/repo", ref: "commit-sha", path: ".github/ISSUE_TEMPLATE/bug.yml",
264
+ yaml: selectedRepositoryFormYaml,
265
+ item: "pm-123", bindings: { problem: "description" },
266
+ answers: { version: "stable" },
267
+ };
268
+ const { report, body } = await completeIssueForm(pmRoot, input);
269
+ // report.ok is completion evidence for this read; body is the validated export text.
270
+ ```
271
+
272
+ There are no saved plans, leases, idempotency keys, or retries in the completion
273
+ adapter. Every call re-reads native state, and the semantic form digest is only
274
+ a source identifier. Imports and sync do not use this opt-in export adapter.
275
+
166
276
  ## Without git
167
277
 
168
278
  With an explicit repository, GitHub import, export, refresh, sync, project commands,
169
- blocker checks, closeout and webhook receive/reconcile work in a plain pm tracker
279
+ blocker checks, issue-form compilation/completion, closeout and webhook receive/reconcile work in a plain pm tracker
170
280
  without a git executable.
171
281
  `pm github identity` also works there, entirely offline and without credentials.
172
282
  The provider commands still require their normal GitHub access and credentials. Privacy scanning
@@ -176,6 +286,14 @@ Gated imports (`github import --gate`, including the scheduled sync workflow)
176
286
  also require a git repository so the proposed publication can be checked. They
177
287
  refuse before writing when the tracker is outside one; plain imports still work.
178
288
 
289
+ Import lifecycle finalization uses the pm SDK's item mutation boundary, retaining
290
+ GitHub source dates and both import write hooks. Tracker ownership, workflow,
291
+ history-stream and transactional extension guards now apply to these writes too;
292
+ a refusal leaves the item and history unchanged. The SDK supplies missing-item
293
+ diagnostics (not-found exit code 3), maintains its derived index, and uses its
294
+ native TOON storage format when updating legacy documents.
295
+ See [SDK adoption evidence](docs/sdk-adoption-1025.md).
296
+
179
297
  ## Revalidate GitHub blockers
180
298
 
181
299
  **Compatibility:** pm-github now requires PM CLI 2026.10.5 or newer for complete
@@ -11,12 +11,18 @@ export interface CloseoutApi {
11
11
  export interface CloseoutRow {
12
12
  item: string;
13
13
  pr: number;
14
- action: "close" | "skip";
14
+ action: "close" | "skip" | "needs_review";
15
+ candidates?: number[];
16
+ missing_evidence?: {
17
+ pr: number;
18
+ code: CloseoutCode;
19
+ reason: string;
20
+ }[];
15
21
  reason: string;
16
22
  code: CloseoutCode;
17
23
  }
18
24
  /** Stable decisions used by automation and compact skip counts. */
19
- export type CloseoutCode = "already_terminal" | "other_repository" | "duplicate_selection" | "explicit_skip" | "unknown_item" | "epic" | "active_children" | "not_delivery" | "close_failed" | "head_checks_passed" | "head_checks_failed" | "head_evidence_unavailable" | "required_checks_unverified" | "incomplete_merge";
25
+ export type CloseoutCode = "already_terminal" | "other_repository" | "duplicate_selection" | "explicit_skip" | "needs_review" | "unknown_item" | "epic" | "active_children" | "not_delivery" | "close_failed" | "head_checks_passed" | "head_checks_failed" | "head_evidence_unavailable" | "required_checks_unverified" | "not_merged" | "incomplete_merge";
20
26
  /** Which head-check policy was evaluated for one selected pull request. */
21
27
  interface CheckGate {
22
28
  pr: number;
@@ -30,9 +36,10 @@ interface CheckGate {
30
36
  interface PullRequest {
31
37
  number: number;
32
38
  body: string | null;
33
- merged: boolean;
39
+ merged: boolean | null;
34
40
  merged_at: string | null;
35
41
  merge_commit_sha: string | null;
42
+ commits?: number | null;
36
43
  html_url: string;
37
44
  head: {
38
45
  sha: string;
@@ -76,8 +83,10 @@ export declare class CloseoutUsageError extends Error {
76
83
  * may pass on neutral or skipped runs alone, so it states that policy and lists successful checks only when any exist.
77
84
  */
78
85
  export declare function checkEvidence(gate: CheckGate): string;
79
- /** Plan all selected PRs before closing eligible items through the real SDK. */
80
- export declare function runCloseout(pmRoot: string, repo: string | undefined, options: Record<string, unknown>, api: CloseoutApi): Promise<{
86
+ /** Deterministic scheduling observer; it never replaces SDK reads or writes. */
87
+ export type CloseoutObserver = (boundary: "listed" | "snapshot" | "history" | "selection" | "before_close" | "locked") => Promise<void>;
88
+ /** Plan selected PRs and apply only decisions whose exact item snapshot still matches. */
89
+ export declare function runCloseout(pmRoot: string, repo: string | undefined, options: Record<string, unknown>, api: CloseoutApi, observer?: CloseoutObserver): Promise<{
81
90
  command: string;
82
91
  repo: string;
83
92
  dry_run: boolean;
@@ -96,6 +105,12 @@ export declare function compactCloseoutReport(report: Awaited<ReturnType<typeof
96
105
  plan: {
97
106
  item: string;
98
107
  pr: number;
108
+ candidates?: number[];
109
+ missing_evidence?: {
110
+ pr: number;
111
+ code: CloseoutCode;
112
+ reason: string;
113
+ }[];
99
114
  reason: string;
100
115
  code: CloseoutCode;
101
116
  action: string;
@@ -1 +1 @@
1
- {"version":3,"file":"closeout.d.ts","sourceRoot":"","sources":["../closeout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"closeout.d.ts","sourceRoot":"","sources":["../closeout.ts"],"names":[],"mappings":"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"}