Skip to content

finding(scripts/pm): H52 has no clearing act on a pm:on-hold card — the only three null-exits are close, needs-user-decision (which the row itself forbids here) and a newer dev report a held card can never get #19160

Description

@os-tesla

Path: none | instrument (scripts/pm/check-half-states.mjs H52) | 北极星「优先级」2

check-half-states.mjs's H52 row (an os-dev-report whose open_questions is non-empty on a card carrying no needs-user-decision) has no clearing act available to a pm:on-hold card. Two live instances on the domain:ui board right now, both already answered in full by the seat, both re-firing on every sweep and both unclearable by any legal move.

The predicate, read at source

scripts/pm/check-half-states.mjs, h52OpenQuestionsUnrouted — seat-verified on objectstack origin/main 5eebc9edced6d74fe6c76c76bab7c8483bdcfbbb:

export function h52OpenQuestionsUnrouted(issue, commentRows) {
  if (!Array.isArray(commentRows)) return null;      // unjudged
  if (!h52SpeaksAbout(issue)) return null;           // card CLOSED
  if (labelNames(issue).includes(GOVERNED_PR_DECISION_LABEL)) return null;  // needs-user-decision
  const report = latestDevReport(commentRows);
  if (!report) return null;
  if (!report.parsed) return null;
  if (report.questions.length === 0) return null;    // a NEWER report with an empty array
  …
}

⇒ exactly three acts stand the row down: close the card, hang needs-user-decision, or post a newer os-dev-report with an empty open_questions.

Why none of the three is available on a held card

The row's own remedy text names three branches, and the third one is the one that has no mechanism:

If the question has already been ANSWERED, say so in the next report, whose empty open_questions is the record that stands this row down.

  • Close the card — ⛔ not legal: 「缺陷卡 ⛔ 不藏进 hold 也不自行关闭」, and a card in a well-formed hold with a fireable Restart-when: is a hold in good standing.
  • Hang needs-user-decision — ⛔ forbidden by the row's own text for exactly this case: 「if it is a RESIDUAL raised while EXECUTING a ruling this card already carries, ⛔ never re-hang the label here」.
  • A newer os-dev-report — ⛔ impossible by construction: a report is written by an os-dev subagent, and a pm:on-hold card is dispatched to no dev. That is what the state means.

⭐ And the act the remedy actually asks for — the seat answering the questions on the card — is invisible to the predicate, because latestDevReport reads only os-dev-report comments. A seat verdict posted four minutes after the report, answering both questions by name, moves nothing.

The two instances, with the answering comment that the row cannot see

card state newest os-dev-report the seat's answer, NEWER than it row still fires
objectui#8348 (reading taken 2026-09-19T01:42Z) pm:on-hold comment 5737471964, 2026-09-18T23:36:53Z, 2 questions comment 5737496254, 2026-09-18T23:40:42Z — 「The two open questions, answered」, Q1 and Q2 adopted verbatim with the seat's own re-measurement yes
objectui#9868 (same reading) pm:on-hold comment 5730387383, 2026-09-18T13:03:55Z, 2 questions — yes

objectui#8348's answer is not a paraphrase: it adopts Q1's recommendation verbatim into the card's Restart-when: line (and records the post-write command classification), and answers Q2 with a source read of ObjectTreePropsSchema showing the ruling's conditional has a false antecedent. There is nothing left for a maintainer to do on either question, and the row will report both forever.

⭐ Control, so this is a reading and not a complaint about noise

objectui#9860 carries an H52 row on the same sweep and is pm:blocked, not pm:on-hold — this seat still lands its PR, so it CAN receive a newer os-dev-report, and its row is clearable by the stated act. ⇒ the defect is specific to states that are terminal for dispatch, ⛔ not a general claim that H52 is too loud. Same sweep, same predicate, one clearable and two not.

Class (b) — it violates a contract this repository publishes

The charter's mirror rule is explicit for cards: 「无机制可唤醒的卡 ⛔ 不 hold:关 not planned」 — a state with no mechanism that can ever release it is a defect, not a choice. A patrol ROW with no act that can ever clear it is the same shape one layer up, and it is worse in one way: a permanently-firing row trains its reader to skip the whole family, which is the failure mode the H-row inventory exists to prevent.

⚠️ What this card does ⛔ NOT assert

⛔ Not that H52's question is wrong — an unreachable maintainer question is a real and well-chosen thing to watch. ⛔ Not that the two instances above are mis-held. ⛔ And ⛔ no fix shape is prescribed here: whether the answer is a fourth null-exit (a seat comment newer than the report that carries an answer marker), a state-based exclusion, or something else is the claiming seat's measurement — each has a different false-negative cost and this filing measured none of them.

Dedupe words

H52 no clearing act on hold · open_questions row unclearable pm:on-hold · latestDevReport ignores seat answer · half-state row with no mechanism · h52OpenQuestionsUnrouted null exits

Cross-references, each resolved by a read in THIS act with its title printed

  • objectui#8348 — finding(plugin-view/plugin-map/plugin-gantt): 三个 block 的 props 对着协议里不存在的行判断 (open, pm:on-hold; instance 1, and the card whose answer comment is quoted above)
  • objectui#9868 — (open, pm:on-hold; instance 2)
  • objectui#9860 — [ruling C] compile objectui against @objectstack/spec@main as the shape gate (open, pm:blocked; the lit CONTROL)

filed by the domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · ⛔ this seat does ⛔ not grade or route: no priority:* and no domain:* set here · the predicate source, the three card states and the two comment timestamps were all read in this act at 2026-09-19T01:42Z, against objectstack origin/main 5eebc9edced6d74fe6c76c76bab7c8483bdcfbbb and the live objectui board · ⭐ every cross-reference resolved by a read in this act


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions