You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(process): a closing keyword in a merged PR body does not close the card in this repo — 29 of 29 measured closes were performed by hand, 0 by a commit, and the same is true of the bare #N form #9476
Filed by the domain:spec @ objectui execution seat, 2026-09-14T08:48Z, from the post-merge bookkeeping of PR objectui#9470. ⛔ Bare finding — no domain:*, no priority, no type, no assignee.
The claim
A closing keyword in a merged PR body does not close the referenced card in this repository. Every card close in the measured sample was performed by hand, minutes after the merge, by a person or a bot.
Measured
Population: 300 closed pull requests fetched over 3 pages of /pulls?state=closed&sort=updated, of which the merged ones were scanned for (?:Fixes|Closes|Resolves|Fixed|Closed|Resolved)\s+<ref>. Reading taken 2026-09-14T08:46–08:48Z.
The instrument is the issue timeline's closed event, not the issue's state. ⭐ That distinction is the whole measurement: a close performed by a landing commit records a commit_id on that event; a close performed by a person or a bot records an actor and leaves commit_id null. state: closed alone cannot tell the two apart, which is why counting closed cards proves nothing here.
spelling
pairs measured
closed BY COMMIT
closed BY ACTOR
Fixes objectui#N
3 (all of them)
0
3
Fixes #N (bare)
25 (sampled from 300)
0
25
Fixes objectstack-ai/objectui#N
1 (all of them)
0
1
29 of 29 closed by an actor. Zero by a commit. The closers are spread across five accounts — os-tesla, baozhoutao, os-zhuang, os-warren, claude[bot] — so this is not one seat's habit; it is the repository's actual behaviour, already being absorbed by everyone who lands work here.
The specific case that started this, with its timings:
PR #9470 merged 2026-09-14T08:43:33Z, body carries "Fixes objectui#8653."
issue #8653 closed 2026-09-14T08:45:25Z by claude[bot] commit_id=None <- by hand, ~2 min later
PR #9009 merged 2026-09-10T18:52:15Z -> #8623 closed 18:54:52Z by actor, commit_id=None
PR #9007 merged 2026-09-10T18:51:55Z -> #8554 closed 18:55:41Z by actor, commit_id=None
⭐ Why this costs more than one manual close
It explains a recurring residue rather than being a new one. This seat had recorded, six times over, that pm:dispatched is "never auto-stripped by a merged Fixes". The label survives because nothing closed the card — the close and the pm:* strip are the same missing step, not two.
⇒ operationally, for every seat: a merged closing keyword is not bookkeeping. The close, the state_reason: completed, and the pm:* strip are all owed by hand, and a seat that trusts the keyword leaves a closed-in-fact card sitting open + pm:dispatched on the board, where the next round reads it as live work.
⚠️ A hypothesis this card had and DISCARDED — recorded so the next reader does not re-run it
The first reading was n=1: Fixes objectui#8653 did not close #8653, and objectui#N is not one of the two reference forms GitHub documents (#N and owner/repo#N). The hypothesis wrote itself — this repo's full-name PM convention silently disables closing keywords.
⛔ It is false, and two separate errors produced it:
state was the wrong instrument. Only the timeline's commit_id separates an auto-close from a manual one. Switching instruments turned "all three closed, hypothesis refuted" into "all three closed by hand, and so is every control" — a different and much larger finding.
⭐ The control is what settled it: the bare #N form, which GitHub certainly does resolve, behaves identically — 25 of 25 by actor. So the reference spelling is not the variable, and a card filed on the first hypothesis would have sent someone to rewrite every PR template for nothing.
⚠️ NOT measured
The cause. No repository setting, workflow, or merge-queue behaviour was inspected. The merge commit for fix(plugin-list): retire the legacy title alias and pin the rowActionDefs exemption #9470 demonstrably does carry Fixes objectui#8653. in its body on main, so the keyword reaches the default branch and the close still does not happen. Why is unmeasured, and ⛔ this card asserts no cause.
Whether a non-queue merge in this repo behaves differently — the sample may contain no such merge, and none was isolated.
25 of 300 bare-form pairs were sampled, not all 300; the other two spellings were measured exhaustively (3 and 1).
An earlier pass reported 16 bare-form pairs as state: None. Those are unreadable API responses, ⛔ not counter-examples, and they are excluded rather than counted either way.
Whether the sibling repositories behave the same. This reading is objectui-only.
Dedup
Two phrasings of this subject returned 0. ⚠️ The control is same-repo and same-instrument but not same-subject: queries about other CI/tooling subjects in this repo return results (a coverage-gate query returned 12 including objectui#9271; a renderer-cast query returned 4), so the instrument is answering in this repo. On that basis the zero is treated as a reading, ⛔ with the weaker control stated rather than implied.
Filed by the
domain:spec@ objectui execution seat, 2026-09-14T08:48Z, from the post-merge bookkeeping of PR objectui#9470. ⛔ Barefinding— nodomain:*, no priority, no type, no assignee.The claim
A closing keyword in a merged PR body does not close the referenced card in this repository. Every card close in the measured sample was performed by hand, minutes after the merge, by a person or a bot.
Measured
Population: 300 closed pull requests fetched over 3 pages of
/pulls?state=closed&sort=updated, of which the merged ones were scanned for(?:Fixes|Closes|Resolves|Fixed|Closed|Resolved)\s+<ref>. Reading taken 2026-09-14T08:46–08:48Z.The instrument is the issue timeline's
closedevent, not the issue'sstate. ⭐ That distinction is the whole measurement: a close performed by a landing commit records acommit_idon that event; a close performed by a person or a bot records anactorand leavescommit_idnull.state: closedalone cannot tell the two apart, which is why counting closed cards proves nothing here.Fixes objectui#NFixes #N(bare)Fixes objectstack-ai/objectui#N29 of 29 closed by an actor. Zero by a commit. The closers are spread across five accounts —
os-tesla,baozhoutao,os-zhuang,os-warren,claude[bot]— so this is not one seat's habit; it is the repository's actual behaviour, already being absorbed by everyone who lands work here.The specific case that started this, with its timings:
⭐ Why this costs more than one manual close
It explains a recurring residue rather than being a new one. This seat had recorded, six times over, that
pm:dispatchedis "never auto-stripped by a mergedFixes". The label survives because nothing closed the card — the close and thepm:*strip are the same missing step, not two.⇒ operationally, for every seat: a merged closing keyword is not bookkeeping. The close, the
state_reason: completed, and thepm:*strip are all owed by hand, and a seat that trusts the keyword leaves a closed-in-fact card sittingopen+pm:dispatchedon the board, where the next round reads it as live work.The first reading was n=1:
Fixes objectui#8653did not close #8653, andobjectui#Nis not one of the two reference forms GitHub documents (#Nandowner/repo#N). The hypothesis wrote itself — this repo's full-name PM convention silently disables closing keywords.⛔ It is false, and two separate errors produced it:
objectui#Npairs, allstate: closed— which looked like a refutation, except that one of the three was decision(plugin-list):titleis read undeclared offListViewSchema— androwActionDefsis read at a site with NO docblock and NO pin, unlike the grid's ruled twin (6 of 7, objectui#8327) #8653, which this seat had hand-closed two minutes earlier. A census that includes the measurer's own intervention cannot distinguish the mechanism from the measurer.statewas the wrong instrument. Only the timeline'scommit_idseparates an auto-close from a manual one. Switching instruments turned "all three closed, hypothesis refuted" into "all three closed by hand, and so is every control" — a different and much larger finding.⭐ The control is what settled it: the bare
#Nform, which GitHub certainly does resolve, behaves identically — 25 of 25 by actor. So the reference spelling is not the variable, and a card filed on the first hypothesis would have sent someone to rewrite every PR template for nothing.titlealias and pin therowActionDefsexemption #9470 demonstrably does carryFixes objectui#8653.in its body onmain, so the keyword reaches the default branch and the close still does not happen. Why is unmeasured, and ⛔ this card asserts no cause.state: None. Those are unreadable API responses, ⛔ not counter-examples, and they are excluded rather than counted either way.Dedup
Two phrasings of this subject returned 0.⚠️ The control is same-repo and same-instrument but not same-subject: queries about other CI/tooling subjects in this repo return results (a coverage-gate query returned 12 including objectui#9271; a renderer-cast query returned 4), so the instrument is answering in this repo. On that basis the zero is treated as a reading, ⛔ with the weaker control stated rather than implied.
Generated by Claude Code