You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Read a Tool Row Without a Trailing or Leading Pipe, and Report the License Column (#636)
The 3rd Party Tools check required both outer pipes on every table row, which GitHub's Markdown makes optional, so a row written without either was skipped outright and its link, description and ordering all went unread. A table written that way scored clean rather than unread.
spec/project-types.json asserted "The section carries no license column" at verdict letter, and nothing read it. The table header is now read for that column, once per table rather than once per row, and it is the only extra column named, since spec/readme-structure.md forbids that one and no other.
table_cells requires a separating pipe rather than a leading one, which is what keeps a thematic break out: `---` alone carries no pipe, where treating it as a one-cell delimiter row would have read the paragraph above it as a table header.
Measured against all 22 cataloged READMEs, in both directions: 56 findings become 57, the addition being Blog's License column, no verdict is lost, and the leading-pipe widening moves nothing. Neither outer-pipe form appears in the fleet today, so both fixes close a silent blind spot rather than a live miss.
Raised by Copilot on promotion pull request #635.
Copy file name to clipboardExpand all lines: TODO.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -134,13 +134,13 @@ The spec rework and its audit check shipped. What remains is the per-repo confor
134
134
-**Settled** - Three order findings are genuine and each is one move: LanguageTags places Installation after Usage, aiopurpleair places Getting Started after Installation, and PlexCleaner places Questions or Issues immediately after the Table of Contents where the order now puts it ninth.
135
135
-**Settled** - Two placement findings are genuine: KiCadLibrary carries a `## TODO` after `## License`, which the "TODO.md" rule already forbids, and HomeAutomation-Config renders the license shield twice, once outside the License section.
136
136
-**Settled** - MediaTools carries a `NuGet Pre-Release` shield that renders the same version as its `NuGet Release` shield, and it is dropped on that repo's next visit. The check does not report it, because a shield class is a floor and an extra shield is never a finding.
137
-
-**Settled** - Blog is the only repo carrying a `3rd Party Tools` table today, and it needs both fixes the rule now states: drop the License column, and rewrite two of its three roles, since "theme, vendored under `themes/`" and "web server, serving the built site and the redirects" describe this repo's wiring where "static site generator" correctly describes the tool.
137
+
-**Settled** - Blog is the only repo carrying a `3rd Party Tools` table today, and it needs both fixes the rule now states: drop the License column, which the audit reports since 2026-08-09, and rewrite all three roles, since "theme, vendored under `themes/`" and "web server, serving the built site and the redirects" describe this repo's wiring where "static site generator" describes the tool correctly and differs only by its opening capital and its full stop.
138
138
139
-
-**Bring each repo's `3rd Party Tools` entries onto the shared catalog.** Measured on 2026-08-08: 56 findings across four repos, every one of them a link, a description, or an ordering that disagrees with [`spec/third-party-tools.json`][third-party-tools].
139
+
-**Bring each repo's `3rd Party Tools` entries onto the shared catalog.** Measured on 2026-08-09: 57 findings across four repos, a link, a description, or an ordering that disagrees with [`spec/third-party-tools.json`][third-party-tools], plus the one License column [`spec/readme-structure.md`][readme-structure] forbids.
140
140
-**Blocked by** - Nothing.
141
141
-**Issue** - None filed.
142
-
-**Checked** - Every repo's default branch on 2026-08-08, with the hub read at its own `develop`, which now conforms.
143
-
-**Settled** - The bulk is absent descriptions rather than wrong ones: 48 of the 56 are a tool listed with no description at all, across LanguageTags, MediaTools and PlexCleaner, and PlexCleaner alone accounts for 27. Of the remaining eight, three describe a tool differently from the catalog, four link it differently, and one is Blog listing Hugo, PaperMod, Caddy out of alphabetical order.
142
+
-**Checked** - Every repo's default branch on 2026-08-09, with the hub read at its own `develop`, which now conforms.
143
+
-**Settled** - The bulk is absent descriptions rather than wrong ones: 48 of the 57 are a tool listed with no description at all, across LanguageTags, MediaTools and PlexCleaner, and PlexCleaner alone accounts for 25 of those and 27 findings overall. Of the remaining nine, three describe a tool differently from the catalog, four link it differently, one is Blog listing Hugo, PaperMod, Caddy out of alphabetical order, and one is Blog's License column.
144
144
-**Settled** - Twelve tools already appear in more than one repo, which is what makes the catalog worth having before the 17 repos owing the section write their own wording for each.
145
145
-**Settled** - Four tools are already linked by two different URLs across the fleet, and the catalog picks one each: GitHub Actions takes `github.com/actions`, Dependabot takes `github.com/dependabot`, Nerdbank.GitVersioning takes the project repo rather than its marketplace action, and uv takes `docs.astral.sh/uv/` to match ruff. The hub was the outlier on the first two and is fixed.
146
146
-**Settled** - PlexCleaner lists Bring Your Own Badge as a tool, so the retired badge service has a fourth touchpoint beyond the three rendering it, and that entry goes with the same deletion.
# Both outer pipes are optional because GitHub's Markdown makes them optional, so a row written without either is still a row this section is graded on.
694
+
# Requiring them skipped such a row outright, so its link, its description and its place in the ordering all went unread and the repo scored clean on a table nothing had read.
695
+
# The separating pipe is what makes a row a row, and it is the one this keeps demanding, since a line carrying none of them is prose.
findings.append(("LETTER", "readme: 3rd Party Tools carries a License column - a license belongs to the dependency and is authoritative at its source, so restating it adds a maintenance obligation and no information (spec/readme-structure.md)"))
# The list is alphabetized, which spec/readme-structure.md states and nothing checked until now.
1805
1841
("an unsorted tool list is reported", tools_head+"| Tool | Role |\n| --- | --- |\n| [markdownlint-cli2][md-link] | Markdown linter. |\n| [cspell][cspell-link] | Spell checker. |\n"+tools_defs+"[md-link]: https://github.com/DavidAnson/markdownlint-cli2\n", 1),
1806
1842
("a sorted tool list is not", tools_head+"| Tool | Role |\n| --- | --- |\n| [cspell][cspell-link] | Spell checker. |\n| [markdownlint-cli2][md-link] | Markdown linter. |\n"+tools_defs+"[md-link]: https://github.com/DavidAnson/markdownlint-cli2\n", 0),
1843
+
# GitHub's Markdown makes both outer pipes optional, so a row written without either is an entry rather than a non-row.
1844
+
# Requiring them read such a table as empty, which scores as clean rather than as unread.
1845
+
("a row with no trailing pipe is read", tools_head+"| Tool | Role |\n| --- | --- |\n| [cspell][cspell-link] | Spell checker.\n"+tools_defs, 0),
1846
+
("a row with no trailing pipe is judged like any other", tools_head+"| Tool | Role |\n| --- | --- |\n| [cspell][cspell-link] | Spell-checks the README in CI.\n"+tools_defs, 1),
1847
+
("a whole table with no trailing pipes is ordered", tools_head+"| Tool | Role\n| --- | ---\n| [markdownlint-cli2][md-link] | Markdown linter.\n| [cspell][cspell-link] | Spell checker.\n"+tools_defs+"[md-link]: https://github.com/DavidAnson/markdownlint-cli2\n", 1),
1848
+
("a row with no leading pipe is read", tools_head+"Tool | Role |\n--- | --- |\n[cspell][cspell-link] | Spell checker. |\n"+tools_defs, 0),
1849
+
("a table with neither outer pipe is judged", tools_head+"Tool | Role\n--- | ---\n[cspell][cspell-link] | Spell-checks the README in CI.\n"+tools_defs, 1),
1850
+
# The License column is forbidden by spec/readme-structure.md, and project-types.json asserted that as `letter` before anything read it.
1851
+
# One finding is raised for the table, read off its header, rather than one per row.
1852
+
("a License column is reported once", tools_head+"| Tool | Role | License |\n| --- | --- | --- |\n| [cspell][cspell-link] | Spell checker. | MIT |\n| [markdownlint-cli2][md-link] | Markdown linter. | MIT |\n"+tools_defs+"[md-link]: https://github.com/DavidAnson/markdownlint-cli2\n", 1),
1853
+
("a License column does not stop the rows being read", tools_head+"| Tool | Role | License |\n| --- | --- | --- |\n| [cspell][cspell-link] | Spell-checks the README in CI. | MIT |\n"+tools_defs, 2),
1854
+
("a table with no License column is not reported", tools_head+"| Tool | Role |\n| --- | --- |\n| [cspell][cspell-link] | Spell checker. |\n"+tools_defs, 0),
1855
+
# A tool whose own role is the word license must not read as the column, since the header is a header.
1856
+
("a row cell reading License is not the column", tools_head+"| Tool | Role |\n| --- | --- |\n| [Widget][widget-link] | License |\n"+tools_defs, 0),
1857
+
("a License column with no outer pipes is reported", tools_head+"Tool | Role | License\n--- | --- | ---\n[cspell][cspell-link] | Spell checker. | MIT\n"+tools_defs, 1),
1858
+
# A thematic break carries no pipe, so it is not a one-cell delimiter row and the paragraph above it is not a header.
1859
+
("a thematic break is not a delimiter row", tools_head+"Licensing notes follow.\n\n---\n\n| Tool | Role |\n| --- | --- |\n| [cspell][cspell-link] | Spell checker. |\n"+tools_defs, 0),
1860
+
# Prose mentioning a tool is not a row, since a link alone does not make one.
1861
+
("prose naming a cataloged tool is not a row", tools_head+"We run [cspell][cspell-link] in CI.\n"+tools_defs, 0),
0 commit comments