docs: 계약 없이 남아 있던 두 프로젝트에 주제를 갈라 계약을 세운다
keycloak-session-store 와 TechLog 는 SSOT 만 있고 분해 계약이 없었다. 두 프로젝트 모두 후보를 처분과 함께 남기고 PROMOTE 만 주제로 올린다. keycloak-session-store 주제 6 · 글감 33 · 후보 42 (제외 9) TechLog 주제 13 · 글감 56 · 후보 91 (제외 35) TechLog 는 저장소가 셋이라 sourceRepository 를 목록으로 적는다. 설계 패키지는 이 기계에 체크아웃이 없고 반입한 쪽의 MANIFEST.sha256 이 세 계약의 원본 리비전을 고정하므로 그것을 리비전으로 적었다. 검사기 둘이 그 모양을 읽게 고친다 — verify-tech-log-tree.py 는 목록의 항목마다 path·revision·verified 를 보고, check_evidence.mjs 는 체크아웃이면 git 으로, 매니페스트면 그 파일이 리비전을 적고 있는지로 대조한다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
4d50bb939a
commit
a0ca2bb72a
@@ -107,17 +107,28 @@ for (const topicDir of readdirSync(studio)) {
|
||||
|
||||
// 4. (--repo) 저장소가 실재하고 리비전이 맞는가
|
||||
if (withRepo) {
|
||||
const repo = tree.sourceRepository || {};
|
||||
if (!repo.path) findings.push(["tech-log-tree.json", "sourceRepository.path 가 없다", ""]);
|
||||
else if (!existsSync(repo.path)) findings.push(["tech-log-tree.json", "저장소 경로가 없다", repo.path]);
|
||||
else {
|
||||
// 저장소가 여럿인 프로젝트는 목록으로 적는다
|
||||
const declared = tree.sourceRepository || {};
|
||||
const repos = Array.isArray(declared) ? declared : [declared];
|
||||
for (const repo of repos) {
|
||||
const name = repo.name || project;
|
||||
if (!repo.path) { findings.push(["tech-log-tree.json", "sourceRepository.path 가 없다", name]); continue; }
|
||||
if (!existsSync(repo.path)) { findings.push(["tech-log-tree.json", "저장소 경로가 없다", `${name} — ${repo.path}`]); continue; }
|
||||
// 갈래가 여럿이면 revisions 로 적는다. 둘 다 없으면 verify-tech-log-tree.py 가 warn 을 낸다
|
||||
const revs = repo.revision ? { revision: repo.revision } : (repo.revisions || {});
|
||||
// 체크아웃이 없는 저장소는 반입한 쪽의 매니페스트가 리비전을 고정한다. 그럴 때는
|
||||
// path 가 그 파일이고, git 대신 그 파일이 리비전을 적고 있는지 본다
|
||||
const isCheckout = statSync(repo.path).isDirectory();
|
||||
const manifest = isCheckout ? "" : readFileSync(repo.path, "utf8");
|
||||
for (const [label, rev] of Object.entries(revs)) {
|
||||
try {
|
||||
execSync(`git -C ${JSON.stringify(repo.path)} cat-file -e ${rev}^{commit}`, { stdio: "ignore" });
|
||||
} catch {
|
||||
findings.push(["tech-log-tree.json", "그 리비전이 저장소에 없다", `${label} = ${rev}`]);
|
||||
if (isCheckout) {
|
||||
try {
|
||||
execSync(`git -C ${JSON.stringify(repo.path)} cat-file -e ${rev}^{commit}`, { stdio: "ignore" });
|
||||
} catch {
|
||||
findings.push(["tech-log-tree.json", "그 리비전이 저장소에 없다", `${name} · ${label} = ${rev}`]);
|
||||
}
|
||||
} else if (!manifest.includes(rev)) {
|
||||
findings.push(["tech-log-tree.json", "매니페스트가 그 리비전을 적고 있지 않다", `${name} · ${label} = ${rev}`]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user