docs(sdlc): record real test results, open defects ISS-029–032, conditional acceptance

This commit is contained in:
Thanakorn
2026-10-02 17:12:47 +07:00
parent 5d3a7a655b
commit 1a065013b0
138 changed files with 406 additions and 326 deletions
+16 -5
View File
@@ -1,8 +1,8 @@
// 3-Other Document: Stakeholder Register, Project Charter, Traceability Record Table, Training Report, List of Evidence.
import { P, TEAM, OTHER_STAKEHOLDERS, CODE, PROJECT_TH, COMPANY_TH, ORGANIZER_PM, RECORDER, START, END, SCOPE, CRS, TRAINING_DATE, ACCEPT_DATE, TEST_FROM, TEST_TO, BASELINE_COMMIT, ORIGIN, BACKUP, DEV_START } from './project.mjs';
import { SRS, UNITS, TEST_CASES, traceOf, srTopic, unitTopic } from './engineering.mjs';
import { SRS, UNITS, TEST_CASES, traceOf, srTopic, unitTopic, crStatus } from './engineering.mjs';
import { CORRECTIONS, PERIODS, MEETINGS, TASKS } from './history.mjs';
import { bud, thLong, thRangeLong, table, bullets, numbered, daysBetween } from './lib.mjs';
import { bud, thLong, thShort, thRangeLong, table, bullets, numbered, daysBetween } from './lib.mjs';
import { workProduct, head } from './format.mjs';
const OTHER = '3-Other Document';
@@ -114,10 +114,19 @@ export function projectCharter() {
/** Traceability Record Table — the summary matrix filed alongside the master record. */
export function traceabilityTable() {
const date = '2026-08-17';
// Evidence issued after this table is planned, not yet in hand.
const LATER = { 'Training Report': TRAINING_DATE, 'List of Evidence': END, 'Acceptance Report': ACCEPT_DATE };
const evidence = (ev) => ev.split(', ').map((name) => {
const at = LATER[name.replace(/ \(.*\)$/, '')];
return at && at > date ? `${name} (ตามแผน ${thShort(at)})` : name;
}).join(', ');
const rows = CRS.map(([id, text]) => {
const t = traceOf(id);
return [id, text, t.sr.join(', '), t.un.join(', ') || '-', t.tc, t.ev || '-', 'Passed', 'Passed'];
const status = crStatus(id, date);
const tested = t.tcs.length ? status : '-';
return [id, text, t.sr.join(', '), t.un.join(', ') || '-', t.tc, t.ev ? evidence(t.ev) : '-', tested, status];
});
const count = (s) => CRS.filter(([id]) => crStatus(id, date) === s).length;
const traced = CRS.map(([id]) => traceOf(id));
return {
dir: OTHER,
@@ -142,8 +151,10 @@ export function traceabilityTable() {
['เชื่อมโยงกับ Software Unit', traced.filter((t) => t.un.length).length],
['เชื่อมโยงกับ Test Case', traced.filter((t) => t.tcs.length).length],
['ยืนยันด้วยเอกสารส่งมอบ (ไม่มี Software Unit)', traced.filter((t) => !t.tcs.length).length],
['ผลการทดสอบหรือการตรวจสอบเอกสารผ่าน', CRS.length],
['ผลการทดสอบการยอมรับผ่าน', CRS.length],
['ผ่าน (Passed)', count('Passed')],
['ไม่ผ่าน (Failed) — ข้อบกพร่องคงค้างใน Correction Register', count('Failed')],
['ยังไม่ได้ทดสอบ (ชุดติดตั้ง Docker ส่งมอบหลังรอบทดสอบ)', count('Not tested')],
['รอดำเนินการตามแผน (Pending)', count('Pending')],
], ['', 'r']),
].join('\n\n'),
secretary: P.NoC, reviewer: P.PaNg, approver: P.SeV,