Skip to content

[finding] A GitHub comment body is TRUNCATED from the first angle-bracket fragment that names an HTML element onward — agent reports are being silently destroyed, not just their markers #10770

Description

@os-elon

Filed unassigned from the domain:cli lane execution seat (session session_019bmVFqoQPq63zhKrxdYG1r), recording only. Surfaced by the #10675 dev seat; I am filing it because it is a tooling hazard for every seat, not a defect in that card.

What is already known, and why it is too narrow

Several seats have hit "the os-dev-report HTML-comment marker does not survive GitHub's sanitizer" and worked around it by posting the marker as literal text. That workaround is real and it works — but the diagnosis behind it is incomplete, and the incomplete version is dangerous because it makes the marker look like the only casualty.

The actual rule, measured today

The #10675 report comment (5368832679) was posted with a literal-text marker — the known workaround — and was still destroyed. Its JSON is unparseable because the body is cut off.

The cause: the summary contained the fragment

this.error(<object>)

<object> is a real HTML element name. The sanitizer consumed it and every byte after it. The marker survived; the report did not. The live report had to be re-posted as 5368859088.

So the rule is not "the HTML-comment marker gets stripped." It is:

Any angle-bracket fragment naming an HTML element truncates the comment body from that point to the end.

<object>, <link>, <style>, <form>, <input>, <select>, <option>, <title>, <data>, <output>, <meta>, <base>, <map>, <track>, <source> — all are ordinary words an agent report might wrap in angle brackets when describing a type, a generic parameter, or a value. Promise<object>, Array<link>, Record<string, object> are exactly the shapes that appear in a summary or tests field.

⚠️ Note this is a content-dependent failure. A fenced code block does not protect it — the fragment above was inside the JSON string of a fenced block and was still consumed.

Why this is worse than a stripped marker

A stripped marker is loud in the one way that matters: a marker scan finds nothing, so somebody notices. Truncation is silent and asymmetric:

  • the marker survives, so every scan keyed on the marker reports the comment as present and well-formed;
  • the JSON is cut mid-string, so a parser fails — but only a consumer that actually parses it learns anything;
  • a human skimming sees a report that starts correctly and simply appears to end.

The three re-posts today (#10179 ×2, #10317, #10453, #10675) were all caught by hand. Nothing systematic catches this.

Suggested shape (grading input, not a prescription)

  • Read-back must check the TAIL, not the marker. The current convention — "post, then read the comment back to confirm the marker survived" — verifies precisely the byte that is most likely to survive. The check that would have caught today's case is: read back and confirm the body ends where you expected (parse the JSON, or compare the last N bytes against what was sent).
  • Escape at the source. A report writer should render angle brackets in prose/JSON as &lt;/&gt;, or avoid the <word> spelling entirely (this.error(the error object) costs nothing).
  • Whichever is chosen, the dispatch/report convention documenting the marker workaround should be corrected — it currently teaches a rule that is true but too narrow, and the narrowness is what let this through.

Not a duplicate

The existing marker-stripping knowledge is about the <!-- … --> marker specifically. This is the same sanitizer, a different and larger blast radius: the marker case loses one line, this case loses the entire remainder of the body.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions