docs(sdlc): content-sized columns in Word, trace record with test cases, PSRs presented at minuted meetings

This commit is contained in:
Thanakorn
2026-10-02 16:35:31 +07:00
parent 64b1be55d8
commit 203b541c59
139 changed files with 322 additions and 170 deletions
+18 -5
View File
@@ -90,7 +90,9 @@ export function hindsightErrors(docs, root) {
const where = `Minutes Of Meeting ${m.date}`;
const latest = lagged(m.date);
if (weekend(m.date)) errors.push(`${where}: held on a weekend`);
if (m.next && !(m.next.date > m.date && !weekend(m.next.date))) errors.push(`${where}: next meeting ${m.next.date} is not a later working day`);
// The next meeting named in minutes is the next meeting that has minutes.
const following = MEETINGS.find((x) => x.date > m.date)?.date ?? null;
if ((m.next?.date ?? null) !== following) errors.push(`${where}: next meeting ${m.next?.date ?? 'none'} should be ${following ?? 'none'}`);
const text = JSON.stringify(m);
const hashes = new Set([...text.matchAll(/(?<![\w/.-])([0-9a-f]{7,40})(?![\w/.-])/g)].map((x) => x[1]));
const range = taskById(m.taskId)[9].match(/\bGit (\w+)(?:–(\w+))?/);
@@ -103,9 +105,20 @@ export function hindsightErrors(docs, root) {
if (corrected.get(id) > latest) errors.push(`${where}: confirms ${id} corrected ${corrected.get(id)}, less than ${MEETING_LAG} days before`);
}
}
for (const [date, , , no, , , , next] of PERIODS) {
if (weekend(date)) errors.push(`Progress Status Record ${no} (${date}): dated on a weekend`);
if (next && !(next.date > date && !weekend(next.date))) errors.push(`Progress Status Record ${no} (${date}): next meeting ${next.date} is not a later working day`);
}
// Every Progress Status Record is presented at a meeting that has minutes: the one
// its "Next Meeting" names, held MEETING_LAG days or more after the period's last commit.
// Only the closing record has no next meeting; the closing meeting presents it.
const meetingDates = new Set(MEETINGS.map((m) => m.date));
PERIODS.forEach(([date, from, to, no, , , , next], i) => {
const where = `Progress Status Record ${no} (${date})`;
if (weekend(date)) errors.push(`${where}: dated on a weekend`);
if (!next) {
if (i !== PERIODS.length - 1) errors.push(`${where}: names no next meeting`);
return;
}
if (!(next.date > date && meetingDates.has(next.date))) errors.push(`${where}: next meeting ${next.date} has no minutes`);
const last = hasGit ? git(root, ['log', 'main', '-1', '--format=%ad', '--date=short', `--since=${from} 00:00`, `--until=${to} 23:59:59`]) : null;
if (last && last > lagged(next.date)) errors.push(`${where}: next meeting ${next.date} is less than ${MEETING_LAG} days after commit on ${last}`);
});
return [...new Set(errors)];
}