fix: round 4 of the release review of 6.3.0
Round 4 (v6.2.0..41ea8fc, WARN: 9 MAJOR, 3 MINOR); the nine MAJOR fixed, each behind a test that failed first (operator 2026-10-10). Three were regressions from round 3's shared Files: reader. - fieldPaths keeps a backticked path with punctuation after it and one inside a note, a directory (docs/) and a glob (src/*.mjs) in plain text, and app/(auth)/x.ts whole; a bare word counts only alone and capitalised (Makefile), so "format" or "v6.3.0" in a description is no path. The K6 sweep plans what v6.2.0 planned for `a.mjs`: and `b.mjs`. - skill frontmatter: a quoted value may carry a YAML comment after it. - criteria runner: no word with a leading ~ (sh expands it), and nothing after `make test` (another target would run). - release-check: scope_sha_end must be a commit sha (a ref name passed coverage whatever was reviewed), and README lines changed after the review may differ only in the badge's version. The round-3 leading-zero example is 7 characters now, the shortest sha accepted. The three MINOR (one word screen for git, the exec copy in regression-check, a shared isMain helper) are not in this round. Suite 2175 (2173/0/2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
41ea8fc317
commit
ab6dcd838e
6 changed files with 137 additions and 33 deletions
|
|
@ -134,6 +134,18 @@ export function changedLines(diff) {
|
|||
return out;
|
||||
}
|
||||
|
||||
// The README lines changed after the review differ only in the badge's
|
||||
// version: every line holds the badge, and with the version taken out the
|
||||
// removed lines and the added lines are the same (round 4: other text on the
|
||||
// badge line got through).
|
||||
export function onlyBadgeVersion(lines) {
|
||||
if (!lines.every((l) => BADGE_RE.test(l))) return false;
|
||||
const norm = (l) => l.slice(1).replace(/badge\/version-[^\s)]+-(?=[^-\s)]+\))/g, 'badge/version-V-');
|
||||
const removed = lines.filter((l) => l.startsWith('-')).map(norm).sort();
|
||||
const added = lines.filter((l) => l.startsWith('+')).map(norm).sort();
|
||||
return removed.length === added.length && removed.every((l, i) => l === added[i]);
|
||||
}
|
||||
|
||||
function checkTree(repo) {
|
||||
const r = git(repo, ['status', '--porcelain', '--', '.']);
|
||||
if (r.status !== 0) return { id: 'tree', status: 'error', detail: `git status failed: ${r.stderr.trim()}` };
|
||||
|
|
@ -177,13 +189,15 @@ function checkReview(reviewPath) {
|
|||
export function reviewedSha(reviewText) {
|
||||
const fm = /^---\r?\n([\s\S]*?)\r?\n---\r?\n/.exec(String(reviewText ?? ''));
|
||||
const m = fm && /^scope_sha_end:[ \t]*(["']?)([^"'\s#]*)\1[ \t]*(?:#.*)?$/m.exec(fm[1]);
|
||||
return m ? m[2] : '';
|
||||
// A commit sha only: a ref name (HEAD, main, a tag) resolves to whatever it
|
||||
// points at now, and coverage would pass whatever was reviewed (round 4).
|
||||
return m && /^[0-9a-f]{7,40}$/i.test(m[2]) ? m[2] : '';
|
||||
}
|
||||
|
||||
function checkCoverage(repo, reviewText) {
|
||||
if (reviewText === null) return { id: 'coverage', status: 'skip', detail: 'not checked: no readable review' };
|
||||
const sha = reviewedSha(reviewText);
|
||||
if (!sha) return { id: 'coverage', status: 'fail', detail: 'review.md has no scope_sha_end — cannot tell what it reviewed' };
|
||||
if (!sha) return { id: 'coverage', status: 'fail', detail: 'review.md has no scope_sha_end that is a commit sha (7-40 hex characters) — cannot tell what it reviewed' };
|
||||
const resolved = git(repo, ['rev-parse', '--verify', '--quiet', `${sha}^{commit}`]);
|
||||
if (resolved.status !== 0) return { id: 'coverage', status: 'fail', detail: `the reviewed commit ${sha} is not in the history of HEAD (unknown commit)` };
|
||||
const full = resolved.stdout.trim();
|
||||
|
|
@ -209,7 +223,7 @@ function checkCoverage(repo, reviewText) {
|
|||
if (changed.includes('README.md')) {
|
||||
const d = git(repo, ['diff', '--relative', '-U0', full, 'HEAD', '--', 'README.md']);
|
||||
if (d.status !== 0) return { id: 'coverage', status: 'error', detail: `git diff of README.md failed: ${d.stderr.trim()} — not measured` };
|
||||
if (changedLines(d.stdout).some((l) => !BADGE_RE.test(l))) outside.push('README.md (lines other than the version badge)');
|
||||
if (!onlyBadgeVersion(changedLines(d.stdout))) outside.push('README.md (lines other than the version badge)');
|
||||
}
|
||||
if (outside.length > 0) {
|
||||
return { id: 'coverage', status: 'fail', detail: `changed after the reviewed commit ${full.slice(0, 12)} and not covered by the review: ${outside.join(', ')}`, items: outside };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue