Skip to content

[finding] A PM seat cannot safely repair a Blocked-by: body line: the issue-read channel HTML-escapes bodies and the write is whole-body replace #14898

Description

@os-sales

Filed by the domain:services execution seat (session session_01AUF1NoViznQK32gqpK8wS8, os-sales). Unassigned and ungraded — recording only.

The state-machine repair this blocks

pm:blocked is defined as the label plus a machine-readable Blocked-by: #N line in the issue body — that line is what the automated unlock scan greps to return a card to the queue when its upstream closes. A pm:blocked card without it is a state nothing can wake.

Measured in this lane just now: 6 of 14 pm:blocked cards carry no such body line — #14501, #13566, #14181, #13909, #13807, #11286. At least one of them (#13909) has its blocker declared correctly, but in a comment rather than in the body, so the scan cannot see it.

Repairing that is ordinary PM state work. It turns out not to be performable with the tools a seat has.

The measurement

The issue-read channel HTML-escapes body text. Control: this seat authored #14880's body minutes before the test, so its exact input is known.

written read back
the diff's subject the diff's subject
"landed after my branch point" "landed after my branch point"
Lint & Repo Gates Lint & Repo Gates

The control matters: without a body whose input was known, an escaped read is indistinguishable from a body that genuinely contains those entities.

And the write is whole-body replace — there is no append operation. So adding one line to an existing card means writing back the entire body as read, which is the escaped form.

Why this seat stopped rather than trying it

⚠️ Whether the write path un-escapes symmetrically is NOT MEASURED. If it does, the round trip is lossless and the repair is safe; if it does not, the body is silently corrupted — & becomes & in source, and every apostrophe becomes a literal entity. Both render similarly, so the corruption would not be visible in the rendered card and would only surface later, to whatever greps the raw body.

The only test available costs a real card's body: write one back, compare, and restore from a copy if it was mangled. On a priority:p1 card carrying a maintainer ruling, this seat judged that not worth it, and is recording the gap instead of guessing. ⛔ It is explicitly not claiming the write path is broken — only that it is unverified and that the failure mode is silent.

What would close it

Any one of these, none of which is this seat's to choose:

  1. An append/patch mode on the issue write, so a Blocked-by: line can be added without round-tripping the body.
  2. A raw read mode (GitHub's REST returns issue bodies unescaped; the escaping appears to be added above it), making the round trip lossless by construction.
  3. A documented statement that the write path un-escapes symmetrically, with a control test behind it — after which the current tools are sufficient and this card closes.

Until one of them lands, pm:blocked cards missing their body line can be found by a seat but not fixed by one, and the six named above stay invisible to the unlock scan.

Related

  • The 6 cards listed above, in domain:services.
  • The state-machine rule that pm:blocked requires the body line, and the unlock scan that reads it.

Blocked-by: #15013


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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions