chore: 이전 세션이 남긴 변경을 커밋한다
이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다. 사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다. 대부분은 clean-architecture-backend-template 의 그림 정본 재배치다 — final/assets/diagrams/<이름>/ 에 있던 것이 CLAUDE.md 가 적은 배치인 final/assets/<이름>/ 로 옮겨졌고 .techviz/<이름>/ 이 함께 들어왔다. 삽입 줄의 대부분(3.15M)이 그 .techviz context.json 이다. 그 밖에 ca-tmpl·document-haness 의 정리, .claude/agents/ 열한 개, writing-practitioner-guides 스킬, .playwright-mcp 세션 산출물, scripts/check-ssot-facts.py 와 그 시험이 들어 있다. 이 커밋의 내용은 내가 만든 것이 아니라 이전 세션이 남긴 것이고 검증하지 않았다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2109f726fe
commit
ab59130196
@@ -757,6 +757,43 @@ class HarnessTestPlanTest(unittest.TestCase):
|
||||
for gone in ("basis", "decision", "impact"):
|
||||
self.assertNotIn(gone, doc)
|
||||
|
||||
def test_every_kind_in_the_contract_has_a_field_map_shape_and_delete_path(self):
|
||||
"""**세 표가 같은 여섯 종류를 말해야 한다.**
|
||||
|
||||
빠뜨렸을 때 나는 일이 표마다 다르다 — `FIELD_MAP` 이면 「모르는 kind」로 거절되고,
|
||||
`SHAPES` 면 `KeyError` 로 죽고, `DELETE_PATHS` 면 **지울 수 없는 초안이 운영에 남는다.**
|
||||
`_kinds_line_up()` 이 import 할 때 보지만, 그 관문이 지워지면 여기서 걸린다.
|
||||
"""
|
||||
six = {"CASE", "CONCEPT", "REFERENCE", "QUESTION", "PROJECT_DECISION", "SETUP"}
|
||||
self.assertEqual(six, set(ss.FIELD_MAP))
|
||||
self.assertEqual(six, set(ss.SHAPES))
|
||||
self.assertEqual(six, set(ss.DELETE_PATHS))
|
||||
|
||||
def test_setup_takes_its_pinned_versions_from_the_frontmatter(self):
|
||||
"""`pinnedVersions` 는 절이 아니라 frontmatter 에 있다. 절만 보면 빠지고,
|
||||
`SetupInput.required` 에 있어 빠지면 422 다 — Concept 의 `basisVersion` 과 같은 자리다."""
|
||||
self.assertEqual({"본문": "bodyMarkdown"}, ss.FIELD_MAP["SETUP"])
|
||||
doc = ss._setup_shape(
|
||||
{"slug": "s"},
|
||||
{"pinnedVersions": "- name: Keycloak\n version: 26.7.0"})
|
||||
self.assertEqual([{"name": "Keycloak", "version": "26.7.0"}], doc["pinnedVersions"])
|
||||
# 이 종류에는 검증일 칸이 없다. 다른 종류를 보고 넣지 않는다 —
|
||||
# `unevaluatedProperties: false` 라 보내면 거절된다
|
||||
for gone in ("lastVerifiedOn", "verifiedOn", "basisVersion"):
|
||||
self.assertNotIn(gone, doc)
|
||||
|
||||
def test_an_empty_pinned_version_list_is_not_the_same_as_an_unreadable_one(self):
|
||||
"""「비우면 화면에 표를 그리지 않습니다」 — 비운 것은 정상이다.
|
||||
글이 있는데 못 읽은 것은 거절한다. 빈 칸으로 보내지 않는다."""
|
||||
self.assertEqual([], ss._pinned_versions(""))
|
||||
self.assertEqual([], ss._pinned_versions(None))
|
||||
with self.assertRaises(ss.Refused):
|
||||
ss._pinned_versions("- Keycloak / 26.7.0") # 모양이 다르다
|
||||
with self.assertRaises(ss.Refused):
|
||||
ss._pinned_versions("- name: Keycloak") # 버전이 없다
|
||||
with self.assertRaises(ss.Refused):
|
||||
ss._pinned_versions("- name: K\n version: " + "9" * 41) # 상한 40자
|
||||
|
||||
def test_decision_status_outside_the_enum_is_refused(self):
|
||||
"""enum 이 셋뿐이다. 지어내지 않고 여기서 막는다 —
|
||||
운영에 초안을 만들어 놓고 422 를 받는 것보다 낫다."""
|
||||
@@ -968,6 +1005,17 @@ class HarnessTestPlanTest(unittest.TestCase):
|
||||
# 묶음은 worktree 밖에 있다. 없으면 **안 돌았다고 적고 넘어간다** —
|
||||
# 조용히 통과시키면 이 회귀가 초록인 채로 아무것도 안 재게 된다
|
||||
self.skipTest(f"묶음이 없어 계획을 못 낸다: {PACKAGE}")
|
||||
# 이 시험이 재는 것은 **런 식별자를 계획이 적는가** 이고, 고정 해시는 그저 입력이다.
|
||||
# 작업 트리에서 이 기록을 고치면 어댑터가 (맞게) 거절해서 계획 자체가 안 나온다.
|
||||
# 그때 **고치는 것은 기록도 묶음도 아니다** — 재지 못했다고 적고 넘어간다.
|
||||
# 고정값이 이 파일의 과거 판일 때만 그렇다. 남의 묶음이면 그건 진짜 결함이라 실패한다
|
||||
want = (json.load(open(PACKAGE, encoding="utf-8")).get("target") or {}).get("sha256")
|
||||
record = os.path.join(ROOT, DECISION_RECORD)
|
||||
if want and want != ss._sha256_file(record):
|
||||
kind, detail = ss._pin_verdict(record, want)
|
||||
if kind != ss.PIN_ALIEN:
|
||||
self.skipTest(
|
||||
f"검토가 본 판과 작업 트리가 다르다 — 계획을 못 낸다 ({kind} · {detail})")
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
out = os.path.join(d, "plan.json")
|
||||
r = subprocess.run(
|
||||
|
||||
Reference in New Issue
Block a user