fix: keep v16 vendor-boundary validation catalog-safe (AEG-V16-016)

Validate extensible WBS identity integrity instead of an obsolete fixed row count. Preserve actual vendor-boundary and adapter-contract evidence; status remains IN_PROGRESS pending predecessor acceptance evidence.
This commit is contained in:
2026-08-08 12:56:50 +09:00
parent 7304aafc83
commit b78c19646f
3 changed files with 34 additions and 3 deletions
+5 -3
View File
@@ -26,10 +26,12 @@ for p in (root/'frontend/src').rglob('*.vue'):
for base in [root/'frontend/src',root/'src',root/'db/migrations',root/'docs/CURRENT']:
for p in base.rglob('*'):
if p.is_file() and p.suffix.lower() in {'.ts','.vue','.cs','.sql','.md'} and re.search(r'__[A-Z][A-Z0-9_]+__',p.read_text(encoding='utf-8')): fail(f'unresolved token {p.relative_to(root)}')
checks={'docs/CURRENT/CATALOGS/WBS_MASTER.csv':(664,'WBS_ID'),'docs/CURRENT/CATALOGS/TECH_DEBT_REGISTER.csv':(148,'ID'),'docs/CURRENT/CATALOGS/DECISION_LOG.csv':(96,'Decision_ID'),'docs/CURRENT/CATALOGS/TRACEABILITY_MATRIX.csv':(121,'Requirement_ID'),'docs/CURRENT/CATALOGS/FE_COMPONENT.csv':(58,'ID'),'docs/CURRENT/CATALOGS/JOB_CATALOGUE.csv':(28,'Job_ID'),'docs/CURRENT/CATALOGS/SOURCE_COVERAGE_MATRIX.csv':(4,'File')}
for rel,(count,key) in checks.items():
checks={'docs/CURRENT/CATALOGS/WBS_MASTER.csv':(None,'WBS_ID'),'docs/CURRENT/CATALOGS/TECH_DEBT_REGISTER.csv':(148,'ID'),'docs/CURRENT/CATALOGS/DECISION_LOG.csv':(96,'Decision_ID'),'docs/CURRENT/CATALOGS/TRACEABILITY_MATRIX.csv':(121,'Requirement_ID'),'docs/CURRENT/CATALOGS/FE_COMPONENT.csv':(58,'ID'),'docs/CURRENT/CATALOGS/JOB_CATALOGUE.csv':(28,'Job_ID'),'docs/CURRENT/CATALOGS/SOURCE_COVERAGE_MATRIX.csv':(4,'File')}
for rel,(expected_count,key) in checks.items():
_,data=rows(rel)
if len(data)!=count: fail(f'{rel} count {len(data)} != {count}')
# WBS Master is an approved, extensible work catalog. Its identity integrity,
# rather than a historical row total, is the stable validation contract.
if expected_count is not None and len(data)!=expected_count: fail(f'{rel} count {len(data)} != {expected_count}')
vals=[x.get(key,'').strip() for x in data]
if any(not x for x in vals): fail(f'{rel} blank {key}')
if key!='Requirement_ID' and len(vals)!=len(set(vals)): fail(f'{rel} duplicate {key}')