Repository navigation
Find Table Cell Boundaries Before Blanking Code Spans and Quotations - #3660
Conversation
The semicolon rule split a table row into cells only after its code spans and quotations were blanked, so a cell boundary inside either one was lost. A pipe inside a code span, which markdown-it-py reads as a cell boundary, let a comma in one cell excuse a semicolon list in the next. An unpaired quote paired with one in a later cell and hid every cell between. The row is now split first, and each cell's code spans and quotations are blanked on their own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dash, dupword, spelling, and dead-path rules blanked code spans and quotations across a whole table row too, so the same lost cell boundary hid a later cell from each of them. One helper now blanks a row a cell at a time, and every rule reading Markdown text goes through it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dead-path rule still read code-span tokens over the whole row, so a lone backtick in one cell paired with a later cell's span and hid it. The semicolon rule also kept its own row check beside the blanking one. A single helper now names a row's cells for both, and the docs say the rule applies to a row opening with a pipe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
|
A recorded local strict-review pass covers head |
The semicolon rule split a row itself beside row_cells, so two places defined a cell. It now reads the cells row_cells returns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
A moderate active finding remains because the semicolon parsing path duplicates shared cell-boundary logic and handles edge pipes inconsistently instead of reusing row_cells.
1 open issue
What changed in this PR
This pull request fixes Markdown table-cell boundary handling in the prose gate by splitting rows before blanking code spans and quotations. The correction is applied across related prose and dead-path rules, with regression tests and documentation updates.
Changes:
- Adds shared
row_cellsandby_cellhelpers for cell-aware processing. - Updates semicolon, dash, duplicate-word, spelling, and dead-path checks.
- Adds regression coverage for table boundaries, quotations, code spans, and deleted paths.
- Documents cell-by-cell blanking behavior.
| File | Summary |
|---|---|
tests/test_prose_lint.py |
Adds regression coverage for affected table-cell, quotation, code-span, and dead-path cases. |
scripts/README.md |
Documents cell-aware processing for pipe-opening Markdown table rows. |
.github/actions/prose-gate/prose_lint.py |
Adds shared table-cell processing and applies it across affected rules. Open findings: reuse row_cells in rule_semicolon (P2, 4 votes) and clarify the row_cells docstring (P3, 1 vote). |
This pull request requires changes.
Review effort: Lite
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3660 +/- ##
===========================================
+ Coverage 81.60% 81.70% +0.09%
===========================================
Files 26 26
Lines 9070 9119 +49
===========================================
+ Hits 7402 7451 +49
Misses 1668 1668
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
A recorded local strict-review pass covers head |
…Session Prompt Rules (#3667) Promotes the changes merged into `develop` since promotion #3636 to `main`. - [#3640](#3640) Pins the validator's `uvx ruff` to a Dependabot-managed manifest. - [#3642](#3642) Counts Copilot findings under the unresolved bullet and the file table. - [#3644](#3644) Aligns the split comment copies and drops the stale counts. - [#3646](#3646) Sends a command meant for the session's input line in a plain message, never in a blocking prompt. - [#3648](#3648) Opens the attended session by cloning a hub checkout of the session's own. - [#3650](#3650) Reads a held package as installed in both Linux host scripts. - [#3652](#3652) States the PowerShell `-Help` and `-h` form in the command-line argument rules. - [#3654](#3654) Counts sentences in Markdown table cells for the sentence-length check. - [#3658](#3658) Splits a table row only at an unescaped pipe in the semicolon rule. - [#3660](#3660) Finds table cell boundaries before blanking code spans and quotations. - [#3662](#3662) Names a stale job record on a completed run in `pr_review.py`. - [#3665](#3665) Keeps a line holding code after a block comment's closer out of `comment-added`. Its squash commit on `develop` carries the pull request's original title, which names a heredoc reading. That reading was withdrawn before the merge on decision #3666, so a workflow `run:` heredoc body still reads as code. - [#3669](#3669) Counts each `[Pn]` marker in a Copilot Findings cell, so a second finding in one cell is no longer dropped from triage. It answers one of the two findings Copilot raised on this promotion. The other is declined with a parser probe in its thread. Closes #3616 Closes #3610 Closes #3622 Closes #3638 Closes #3604 Closes #3511 Closes #3602 Closes #3456 Closes #3655 Closes #3657 Closes #3362 Closes #1664 🤖 Generated with [Claude Code](https://claude.com/claude-code)

Summary
The prose gate's Markdown rules blanked code spans and quotations across a whole table row before any cell split. So a cell boundary inside either one was lost.
"in one cell, such as an inch mark, paired with a quote in a later cell. Every cell between them was blanked, so no rule read them.The semicolon rule is the one the issue names. A local review pass found the same defect class in the
dash,dupword,spelling, anddead-pathrules, all in the same file, so every site moves onto one helper here.Changes
.github/actions/prose-gate/prose_lint.py:TABLE_ROWandrow_cellssplit a row opening with a pipe, blockquoted or not, at each pipe no backslash escapes.by_cellapplies a blanker one cell at a time and rejoins the cells, so every pipe that ends a cell stays where it was.prose_lines,unit_texts, and thedead-pathcode-span and link scans each go through it.rule_semicolonreads the blanked row fromprose_linesas before.tests/test_prose_lint.py: both of the issue's cases for the semicolon rule, a quotation inside one cell still blanked, the unpaired-quote case fordash,dupword, andspelling, a code span across cells fordash, and twodead-pathcases.scripts/README.md: states that a row opening with a pipe is blanked a cell at a time, and why.Verification
semicolonviolations, two on each body row, and reported none before. The issue says five. Counting the cells it names gives four:e; f; gholds two semicolons anda; b; cholds two.rule_semicolonand blanking code.Local Review
Three recorded
local-strict-reviewpasses.rule_semicolon, a code-span token scan indead-pathstill reading the whole row, and docs wider than the code for rows with no leading pipe. All three were fixed.rule_semicolonstill split a row itself besiderow_cells. That push's edit budget was spent, so it went out listed as open and was fixed on the next push, which now callsrow_cells.Closes on promotion: #3657
🤖 Generated with Claude Code