Third malformed row in .agents/issue-index.md in one day, same class each time, none of them caught by a gate.
Found on origin/main at b493f4981 while merging main into #991. Row for #1003 (ORACLE-LLAMACPP-REPIN-STOCK, arrived with #1051) splits into 10 parts where a well-formed 4-column row splits into 6 — four unescaped | characters inside the Title cell. It renders as a 9-cell row.
The class
A well-formed row | a | b | c | d | splits into exactly 6 parts on unescaped pipes. Today's three defects:
| Row |
Parts |
Defect |
Caught by |
#995 (dup 1) |
7 |
unescaped | in a code span |
nothing |
#995 (dup 2) |
5 |
missing trailing | |
nothing |
#1003 |
10 |
four unescaped | |
nothing |
The first two were repaired in #1025 / #1022, and were only found because check-agent-record.py happened to red on a duplicate key and I ran a histogram while investigating. Nothing in the gate set measures cell count, so a malformed row is invisible until a human looks.
An unescaped | inside a code span is the natural way to write a shell pipeline in a Title cell — git diff ... | grep ... — so this will keep recurring. It is not carelessness; it is the obvious way to write the thing.
Proposed fix
Add a cell-count assertion to check-agent-record.py:
bad = [(n, len(re.split(r"(?<!\\)\|", l)))
for n, l in enumerate(rows, 1)
if len(re.split(r"(?<!\\)\|", l)) != 6]
Cheap, exact, and it catches all three of today's shapes. Needs a red-before test per AGENTS.md "Changing the rules or a checker" — the three rows above are ready-made fixtures.
Note check-agent-record.py exits on the first error, which is how defects 2 and 3 stayed hidden behind defect 1. Worth having it report all findings rather than the first.
Not fixed in flow
Deliberately: this is a checker-semantics change and wants its own spec, red-before test and fresh review — the in-flow rule explicitly excludes changes that alter checker semantics. The one-line row repair could ride along, but repairing the row without the gate just resets the clock until the next shell pipeline gets written into a Title cell.
Third malformed row in
.agents/issue-index.mdin one day, same class each time, none of them caught by a gate.Found on
origin/mainatb493f4981while merging main into #991. Row for #1003 (ORACLE-LLAMACPP-REPIN-STOCK, arrived with #1051) splits into 10 parts where a well-formed 4-column row splits into 6 — four unescaped|characters inside the Title cell. It renders as a 9-cell row.The class
A well-formed row
| a | b | c | d |splits into exactly 6 parts on unescaped pipes. Today's three defects:#995(dup 1)|in a code span#995(dup 2)|#1003|The first two were repaired in #1025 / #1022, and were only found because
check-agent-record.pyhappened to red on a duplicate key and I ran a histogram while investigating. Nothing in the gate set measures cell count, so a malformed row is invisible until a human looks.An unescaped
|inside a code span is the natural way to write a shell pipeline in a Title cell —git diff ... | grep ...— so this will keep recurring. It is not carelessness; it is the obvious way to write the thing.Proposed fix
Add a cell-count assertion to
check-agent-record.py:Cheap, exact, and it catches all three of today's shapes. Needs a red-before test per AGENTS.md "Changing the rules or a checker" — the three rows above are ready-made fixtures.
Note
check-agent-record.pyexits on the first error, which is how defects 2 and 3 stayed hidden behind defect 1. Worth having it report all findings rather than the first.Not fixed in flow
Deliberately: this is a checker-semantics change and wants its own spec, red-before test and fresh review — the in-flow rule explicitly excludes changes that alter checker semantics. The one-line row repair could ride along, but repairing the row without the gate just resets the clock until the next shell pipeline gets written into a Title cell.