Repository navigation
Count Sentences in Markdown Table Cells for the Sentence-Length Check - #3654
Conversation
The prose gate's sentence-length rule read only paragraph inline units, so a sentence in a Markdown table cell was never counted. Each header and body cell is now its own sentence block, held to the same cap as a paragraph, and two short cells on one row never join. Rewords the table cells in hub-authored content that the stricter check reports, regenerating the skill distributions from their sources. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restores the conditional scope of the S14 scenario, the arrow mapping in S7, the reason the ledger passes precede the commit, and the restrictive reading of the uv row, and drops a stated count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3654 +/- ##
===========================================
+ 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:
|
There was a problem hiding this comment.
🟡 Changes recommended
Three active P2 documentation issues remain: the Unit contract omits some paragraph sources, and S1/S7 do not unambiguously state their run-wide artifact guarantees.
3 open issues
What changed in this PR
This pull request extends the prose gate’s sentence-length check to Markdown table header and body cells while preserving the blockquote exclusion. It adds regression coverage, rewords affected documentation, and regenerates distributed skill content and source digests.
Changes:
- Treats each Markdown table cell as an independent sentence block.
- Adds coverage for body cells, header cells, separate cells, and preserved blockquote behavior.
- Updates documentation affected by the stricter check.
- Regenerates distributed skills and their source digests.
| File | Description |
|---|---|
WORKFLOW.md |
Updates workflow test-scenario prose. |
tests/test_prose_lint.py |
Adds table-cell sentence-length tests and updates structure coverage. |
scripts/README.md |
Rewords review-loop exit-code descriptions. |
host-setup/windows/README.md |
Rewords the Windows tooling comparison. |
docs/host-setup.md |
Rewords the uv tool requirements. |
catalog/snippets/workflows/README.md |
Rewords workflow snippet descriptions. |
AGENTS.md |
Rewords routed-skill descriptions. |
.github/skills/workflow-ci-contract/references/test-methodology.md |
Updates generated workflow methodology content. |
.github/skills/local-strict-review/SKILL.md |
Updates generated local-review skill content. |
.github/actions/prose-gate/prose_lint.py |
Adds table-cell extraction to sentence-length units and updates the Unit documentation. |
.claude-plugin/fleet-skills/skills/workflow-ci-contract/references/test-methodology.md |
Updates distributed Claude workflow methodology content. |
.claude-plugin/fleet-skills/skills/local-strict-review/SKILL.md |
Updates distributed Claude local-review content. |
.claude-plugin/fleet-skills/.source-digests/workflow-ci-contract |
Refreshes the workflow skill source digest. |
.claude-plugin/fleet-skills/.source-digests/local-strict-review |
Refreshes the local-review skill source digest. |
.agents/skills/workflow-ci-contract/references/test-methodology.md |
Updates the canonical workflow methodology source. |
.agents/skills/local-strict-review/SKILL.md |
Updates the canonical local-review skill source. |
Review effort: Lite
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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
sentence-lengthrule read only paragraph inline units. So a sentence in a Markdown table cell was never counted. A table cell holds prose as a paragraph does. So each header and body cell is now its own sentence block, held to the same cap. Two short cells on one row never join into one sentence. A blockquoted table stays unread, as a blockquoted paragraph already is..github/actions/prose-gate/prose_lint.py:extract_markdownbuilds aparagraphunit for each inline token underth_openortd_open, as it already did underparagraph_open.sentence-lengthis the only rule readingparagraphunits, so no other rule starts reading cells.tests/test_prose_lint.py: new cases cover a body cell, a header cell, and two cells on one row judged apart. The structure test drops its table-row case, the exemption this issue ends.AGENTS.md,WORKFLOW.mdsection 5, thelocal-strict-reviewskill,catalog/snippets/workflows/README.md,docs/host-setup.md,host-setup/windows/README.md, andscripts/README.md. The skill distributions are regenerated withscripts/build_dist.py.Downstream effect. Carriers fetch the prose gate from the hub's
main. Once this is promoted, a change touching a table row whose cell holds an over-cap sentence fails the gate there. The composite action runs diff-scoped, so only touched rows are read. That is the intended effect of the fix.Closes on promotion: #3456
Verification
probe.md:5(the cell) andprobe.md:7(the paragraph).python3 scripts/prose_lint.py .over the whole tree reports no violations.python -m unittest discover -s testspasses on the final head. Its one failure on the first commit was the old table-row exemption this change ends.scripts/build_dist.py --checkreports the generated distributions current. Docker markdownlint, cspell, and editorconfig-checker pass, and so do ruff check and ruff format.local-strict-reviewpasses ran over the whole diff. Each of the first five found meaning drift or an ambiguous pronoun in a reworded cell, fixed in the commit after it. The sixth found no defect in this change.Pre-existing findings, filed
.github/actions/prose-gate/prose_lint.py:1103,pre-existing:rule_semicolonsplits a table row on raw|, so an escaped\|splits a cell and raises a false semicolon finding. Filed as Read Table Cells From the Parser in the Semicolon Rule #3655.🤖 Generated with Claude Code