Conversation
…t items (#473) Closes #466. Closes #471. `prose_lint` carried a string past the end of a line for the C# verbatim form only, so a shell quote, a heredoc, a PowerShell here-string, and a YAML block scalar each left their markers readable and the comment rules reported on string content. Each syntax now declares what its strings do: which quotes delimit and where, which embed the delimiter by doubling it, how they escape, and which forms survive a newline. A YAML `run:` scalar is deliberately not opaque, since it holds a script whose `#` lines are the comments the rule governs. The seven source-side items from the Financial-Modeling router split: - The no-coordination-references rule justified itself with the template repo being private. It is public, so the reason is recast onto the grounds that hold. - `OPERATIONS.md` is recorded in the section model, with the topical docs named and the content each takes, and added to the inline-link exception list. - `GOVERNANCE.md` joins that list too, which is what its 51 inline links reflect, and the exception is stated as a closed list rather than a category. - The clause-splicing semicolons are swept out of the verbatim sections, and the governing rule is recorded: correct-as-you-next-edit has no downstream trigger for verbatim content, so the hub sweeps the class. - `spec/audit.py --branch` reads a ref other than the registry `groundTruthBranch`, so a convergence is verifiable before it is promoted. - The Financial-Modeling driftNotes are reconciled against a live audit. Both rules that repo offered are promoted into Verification Discipline, and the distinctive-phrase migration guidance is recorded in the section model. The Copilot loop ran eleven rounds and fixed eleven defects, only the first of which arrived as an inline thread. Round seven exposed the reason: the documented command for reading the suppressed-findings block keyed on a phrase the current review format does not use, so it matched none of the five rounds that carried one. That is fixed in the runbook. `scripts/test_pr_review.py` covers the one script that had no tests, `changed_lines` and the `sentence-split` rule get their first cases, and `spec/audit.py --selftest` runs in CI. Coverage over `scripts/` goes from 87% to 99%. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR promotes the previously-developed changeset into main, spanning the prose linting engine’s multi-line string handling, additional validation/self-test coverage, and several governance/spec updates tied to the router split and verification discipline.
Changes:
- Extend
scripts/prose_lint.pyto correctly mask comment markers inside multi-line string constructs across multiple syntaxes (shell, PowerShell, YAML, C#), with substantial new unit test coverage. - Add
spec/audit.py --branch REFsupport (viaargparse) to verify convergence against a non-registry ref, and run the audit engine self-test in CI. - Update governance/spec/docs to incorporate the router-split follow-ups (section model guidance, link-style exception list adjustments, promoted verification rules), plus accompanying registry drift note reconciliation.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| spec/section-model.md | Documents destinations for repo-specific extracted content (incl. OPERATIONS.md) and migration guidance. |
| spec/audit.py | Adds --branch override, switches to argparse, and expands self-test coverage. |
| scripts/test_repo_gate.py | Adds CLI-path and failure-mode tests for repo gate behavior. |
| scripts/test_prose_lint.py | Adds extensive tests for multi-line string carrying, syntax dispatch, diff scoping, and sentence-split behavior. |
| scripts/test_pr_review.py | New test module covering pr_review.py’s digest/wait logic and transport contract. |
| scripts/README.md | Updates script docs for new tests and revised prose-lint string-handling model. |
| scripts/prose_lint.py | Implements multi-line string carry model across syntaxes and refines string masking rules. |
| scripts/pr_review.py | Refactors CLI entry to accept argv for testability and adjusts comments. |
| registry/repos.json | Reconciles Financial-Modeling drift notes to reflect converged state. |
| README.md | Updates backlog item to track the next prose-class sweep target. |
| GOVERNANCE.md | Promotes verification discipline rules, updates link-style exception list, and applies prose sweeps/clarifications. |
| AUDIT.md | Documents spec/audit.py --branch usage for pre-promotion convergence verification. |
| .github/workflows/validate-task.yml | Runs new script tests and spec/audit.py --selftest in CI. |
| .github/copilot-instructions.md | Updates suppressed-findings detection guidance to match multiple heading phrasings. |
| .gitattributes | Pins LF for the newly added scripts/test_pr_review.py. |
Review loop closedRound 2 re-reviewed the head and returned no new comments. Round 1's single finding was declined with evidence on its thread:
Ready for the maintainer to merge. Two mechanics for whoever does it:
No release fires from this merge: the publisher is actor-gated and a human promotion to One item deliberately not in this promotion, recorded rather than dropped: leading |
The cspell gate reads README.md and HISTORY.md only, deliberately: gating every markdown file would mean endlessly padding cspell.json with technical terms. That left a British spelling anywhere else in the tree with nothing checking it, which is how `labelled`, `behaviour` and `judgement` reached main. The new `spelling` rule closes the gap and joins the blocking CI prose run, since all three are fixed here and the tree is clean. The banned words generate from stems rather than list one by one, since an inflected spelling is as wrong as its base and a hand-listed family drifts as soon as one form is added without the others. Two words are deliberately absent: `analyses` is the US plural of `analysis` as much as a British verb form, and `cancelled` is a GitHub Actions job status rather than prose. Outside markdown the rule reads the comments rather than the source lines, reusing the extraction comment-wrap already does. Judging a source line as prose had this script report its own table of banned words. Also leads YAML['quote_after'] with the dash. Membership is a set test, so the order carries no behavior, but ':-,' reads as a regex range and cost a review round on #474 when it was read as missing the dash. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Closes #466. Closes #471.
Promotes one squash commit,
f7c77d8(#473). Clean forward merge, no conflicts, nothing main-only in the content diff.What lands on
mainprose_lintcarries a multi-line string in every syntax that has one. It carried past the end of a line for the C# verbatim form only, so a shell quote, a heredoc, a PowerShell here-string, and a YAML block scalar each left their markers readable and the comment rules reported on string content. Each syntax now declares what its strings actually do: which quotes delimit and where, which embed the delimiter by doubling it, how they escape, and which forms survive a newline. A YAMLrun:scalar is deliberately not opaque, since it holds a script whose#lines are exactly the comments the rule governs.The seven source-side items from the Financial-Modeling router split, including the recast coordination-reference justification (the template repo is public, so the 404 reason was false),
OPERATIONS.mdin the section model and in the inline-link exception list,GOVERNANCE.mdadded to that list,spec/audit.py --branchfor verifying a convergence before promotion, and the reconciled Financial-Modeling driftNotes.Both rules that repo offered are promoted into Verification Discipline, and the distinctive-phrase migration guidance is recorded in the section model.
This is a fleet re-vendor
Twelve
GOVERNANCE.mdverbatim sections change, so every carried repo goes stale against the canonical on merge:That drift wave is the mechanism working, not a regression. The re-vendor is not tracked by an issue yet, and filing one is not authorized.
Verification
developCI is green onf7c77d8, and every gate passes locally on the merged state: 159 test cases overscripts/,spec/audit.py --selftest,spec/validate.py,scripts/repo_gate.py, the prose gate, markdownlint, cspell, actionlint, editorconfig-checker, and mypy.#473 took eleven Copilot rounds and fixed eleven defects, only the first of which arrived as an inline thread. Round seven exposed why: the runbook's documented command for reading the suppressed-findings block keyed on a phrase the current review format does not use, so it matched none of the five rounds that carried one. That fix is in this promotion.
No release fires from this merge: a human promotion to
mainskips the publisher's actor gate.🤖 Generated with Claude Code