Files
Pier_v1/Code/교각모델링앱/tools/patches/2026-10-20_split_logs.py
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

158 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""2026-10-20 Step 5: split the working log of the Ungok P3/P4 geometry-reading work into one log per task and day (F8) and write the user inputs verbatim
(INPUT, taken from the session transcript with their time). Reads prompt/심영표/2026-10-19/Task_도면도형판독시험...md (the running notes) and the inputs file."""
import datetime as dt
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[4]
P19 = ROOT / "prompt" / "심영표" / "2026-10-19"
P20 = ROOT / "prompt" / "심영표" / "2026-10-20"
OLD = P19 / "Task_도면도형직접판독시험_2026-10-19_v0.1.00.md"
rows = json.loads((ROOT / "Code" / "교각모델링앱" / "검증" / "_user_inputs.json").read_text(encoding="utf-8"))
def kst(ts):
return dt.datetime.fromisoformat(ts) + dt.timedelta(hours=9)
turns = []
for ts, t in rows:
if t.startswith(("<ide_selection>", "<ide_opened_file>", "[Request interrupted")):
continue
turns.append((kst(ts), t))
def inputs(lo, hi):
out, n = [], 0
for k, t in turns:
if lo <= k < hi:
n += 1
note = "[주석] 이미지 첨부는 텍스트로 옮기지 않음(캡처 화면)" if "[첨부: 이미지]" in t else ""
body = t.replace("[첨부: 이미지]", "[첨부: 이미지(캡처)]")
out.append(f"### [{n}] {k:%Y-%m-%d %H:%M} KST\n```\n[원문]\n{body}\n```\n" + (note + "\n" if note else ""))
return "".join(out), n
text = OLD.read_text(encoding="utf-8").split("\n")
# section boundaries of the running notes
idx = {l: i for i, l in enumerate(text) if l.startswith("## ")}
heads = [l for l in text if l.startswith("## ")]
def find(prefix):
return next(i for i, l in enumerate(text) if l.startswith(prefix))
i_p4_0820 = find("## 운곡교 P4 게이트 결과 검토 (10-20 08:38")
i_impr = find("## 앱 개선 #34 ②③④⑥ 구현")
part_a = text[:i_p4_0820] # 10-19: reading work P3 + first P4 pass
part_b = text[i_p4_0820:i_impr] # 10-20 morning: P4 gate review and decisions
part_c = text[i_impr:] # 10-20: app improvements, review confirmation, P2 / P4 finishing
MODEL = "Claude Sonnet 5.5 (claude-sonnet-5-5) — Task 중 모델 전환 없음"
def header(title, day, task_id, prev, inputs_md, process, decisions, output, n_turns, status, note):
return f"""# {task_id}
| 항목 | 내용 |
|------|------|
| 담당자 | 심영표 |
| 일자 | {day} |
| Task 식별자 | {task_id} |
| 선행 Task | {prev} |
| 경로·모드 | COMPLEX / GATED |
| MODEL | {MODEL} |
| EFFORT | 턴 {n_turns} / 도구호출 미집계(실행환경이 제공하지 않음) |
| STATUS | {status} |
| 비고 | {note} |
## INPUT
{inputs_md}
## PROCESS
{process}
## DECISIONS
{decisions}
## OUTPUT
{output}
"""
# ---------------- log A (10-19)
inp_a, n_a = inputs(dt.datetime(2026, 10, 19, 14, 0), dt.datetime(2026, 10, 20, 0, 0))
body_a = "\n".join(part_a[part_a.index("## PROCESS / OUTPUT"):]) if False else "\n".join(l for l in part_a[9:])
dec_a = """| 결정 지점 | 채택안 | 기각안 / 사유 |
| :--- | :--- | :--- |
| 값을 어디서 읽나 | 글자·표는 앱이 읽는 그대로, 선·원·폴리라인은 템플릿(P1)에서 재현 확인한 규칙으로 읽음 | 사람이 판독서를 보고 값마다 입력 — 새 교각마다 수작업 100곳 이상 |
| 읽은 값으로 expected 까지 채울 때의 독립성 | 같은 읽기에서 나온 값은 서로 같은 것이 독립 근거가 아님을 명시하고 재료표 개수·P1 재현·앵커 B 일치로 보완 | 읽은 값을 그대로 PASS 근거로 삼음 — 내부 일관성일 뿐 도면 보증이 아님 |
| G4 FAIL 승인 지시("G4를 승인하고 보고서 초안 생성") | 앱 규칙상 FAIL 승인 불가 → 원인(hooks_up 좌표, C13 재료표 불일치) 정리 후 계획된 FAIL 로 등록 | 승인 기록 파일을 직접 고쳐 승인 — 앱 검증 절차 우회 |
| 읽을 수 없는 값(철근 위치·코핑 외곽) | 선·원 좌표 직접 읽기(P1 재현 검증) + 재료표 산술 검산 | "읽을 수 없음"으로 두고 P1 값 유지 — 새 도면에서 틀린 모델 |
| 허위 PASS(P4 첫 게이트 G4) | P1 값끼리 일치한 PASS 로 판정, 새 값으로 재실행 | 승인 — 도면과 무관한 일치 |"""
out_a = """| 산출물 | 경로 | 비고 |
| :--- | :--- | :--- |
| 코핑 외곽 추출 | Code/교각모델링앱/tools/extract_coping_outline.py | 신규 |
| 기초 철근 규칙 | Code/교각모델링앱/tools/infer_footing_rebar.py (→ engine/footing_rule.py) | 신규 |
| 도면 값 비교 | Code/교각모델링앱/tools/verify_pier_geometry.py | 신규(55항목, P1·P3 55/55) |
| P3 반영 | tools/apply_p3_read_values.py, apply_p3_stage2.py | 77곳 + 표 105건 + 48곳, 백업 data/운곡교P3/backup |
| P3 게이트 | data/운곡교P3/runs/current | G1~G5 PASS 승인(578/585, 계획 7), 보고서 초안 2026-10-19 |
| P4 반영 | tools/apply_pier_read.py | 144곳 + 표 118건, 게이트 G1~G5 PASS 후 승인 |
| 사용설명서·기획서 | DOC/04_실행 v0.2.12 → v0.2.13, DOC/01_기획 v0.1.07 → v0.1.08 | |
| 개선 목록 | context-migration/OPEN_미해결목록.md #34·#35 | |"""
(P19 / "Task_도면도형직접판독시험_2026-10-19_v0.1.00.md").write_text(
header("도면도형직접판독시험", "2026-10-19", "Task_도면도형직접판독시험_2026-10-19_v0.1.00", "prompt/심영표/2026-10-19/Task_입력묶음개편D단계_2026-10-19_v0.1.00.md", inp_a, body_a, dec_a, out_a, n_a,
"PROCESS COMPLETE", "운곡교 P3 게이트 통과·승인, P4 반영 완료. 하루를 넘긴 후속 작업(P4 게이트 검토 이후)은 2026-10-20 로그로 분리(F8). 도구호출 횟수는 집계되지 않음."),
encoding="utf-8")
# ---------------- log B (10-20 morning)
P20.mkdir(exist_ok=True)
inp_b, n_b = inputs(dt.datetime(2026, 10, 20, 8, 0), dt.datetime(2026, 10, 20, 9, 13))
body_b = "\n".join(part_b)
dec_b = """| 결정 지점 | 채택안 | 기각안 / 사유 |
| :--- | :--- | :--- |
| P4 B11(표 30본 대 작도 32본) | 작도 채택 + 계획된 FAIL 등록(설계자 확인 대기) | 표 30본으로 값을 고침 — 그려진 32개 점과 모델이 어긋남 |
| P4 C9 좌측 스터럽 윗면 | 재료표 C9 b 범위(2.812·1.376)를 역산한 40447 로 둠 | P1 규칙(소단 − 100) 유지 — 재료표와 150 mm 어긋남 |
| P4 C13 재료표 L 28.966 | P3 처럼 계획된 FAIL 임시 등록, 설계자 확인 | 규칙값 29.346 으로 모델 변경 — 재료표 자체와 불일치 |
| P4 일괄 실행 오류(display) | pier_id 변경 시 hidden_ids 접두어도 갱신(스크립트 결함 수정) | 오류를 무시하고 중간 결과만 사용 |"""
out_b = """| 산출물 | 경로 | 비고 |
| :--- | :--- | :--- |
| P4 게이트 결과 | data/운곡교P4/runs/current (이후 사용자가 템플릿에서 다시 만듦, 승인된 복사본은 data/_휴지통/운곡교P4_20261020_112015) | G1~G5 PASS·승인 09:08 |
| P4 결정 반영 | data/운곡교P4/expected.json planned_fail, params.json stirrups.top_left | 백업 backup/before_b11_c9_c13_* |
| 읽기 보정 | engine/geomread.py(이후 통합), tools/apply_pier_read.py | hidden_ids 갱신 |
| 이월 설명 | (대화) B11·B12·C9·C13 설명 | OPEN #35 |"""
(P20 / "Task_운곡교P4게이트검토와결정_2026-10-20_v0.1.00.md").write_text(
header("운곡교P4게이트검토와결정", "2026-10-20", "Task_운곡교P4게이트검토와결정_2026-10-20_v0.1.00", "prompt/심영표/2026-10-19/Task_도면도형직접판독시험_2026-10-19_v0.1.00.md", inp_b, body_b, dec_b, out_b, n_b,
"PROCESS COMPLETE", "P4 G1~G5 계획 외 FAIL 0 으로 통과·승인. 이후 사용자가 P4 를 삭제하고 템플릿에서 다시 만들어 같은 흐름을 재시험함(다음 로그)."),
encoding="utf-8")
# ---------------- log C (10-20 improvements and P2 / P4 finishing)
inp_c, n_c = inputs(dt.datetime(2026, 10, 20, 9, 13), dt.datetime(2026, 10, 21, 0, 0))
body_c = "\n".join(part_c)
dec_c = """| 결정 지점 | 채택안 | 기각안 / 사유 |
| :--- | :--- | :--- |
| 확정 방식 개선 요청("앱이 일괄 확인, 사용자가 일괄 확정") | 앱이 검토를 준비(바뀐 것·확인하지 못한 것·출처·자동 사유), 사람이 한 화면에서 체크·한 번 확정(검토 요약 확정). 이후 요청에 따라 [모두 체크] 버튼과 주의 표시 | 앱이 확정 대행 — 확정의 의미(사람의 대조 기록)가 사라지고 앱이 대조하지 못한 묶음까지 확정됨 |
| 위험도 두 단계(낮은 위험 일괄/높은 위험 개별) | 사용자 요청에 따라 일괄 체크 + 주의 표시로 대체(위험도 분류는 미구현, 기획서 6.9에 기록) | 위험도 분류를 먼저 구현 — 사용자가 단순한 일괄 방식을 요청함 |
| 거짓 앵커(재료표 칸 하나) | 단독 표 칸 후보만 C등급 | 표 칸 앵커를 아예 제외 — B 오답은 3/29 로 큰 차이 없이 A 후보 2건 손실 |
| 읽기 도구 변경 비교 허용오차 | 글자·재료표 값은 정확 비교, CAD 측정값만 1.5 mm | 모든 값에 1.5 mm — 코핑 상단 철근 a 1 mm 차이와 개수 36/37 을 같다고 봄(P2·P4 에서 발견) |
| P2·P4 새 교각 흐름 | 읽기(도면 + 표) → 결정 가져오기 → 검토 요약 확정 → 게이트 | 개별 도구 실행·묶음별 개별 확정 — P2 는 약 20분에 끝남 |
| 시험 데이터 의존 | 게이트가 모두 승인된 복사본(`verified_pier`)과 휴지통의 옛 pier 로 시험 | 실제 사용 중인 pier 를 시험 기준으로 사용 — 삭제·재작성으로 시험이 깨짐 |"""
out_c = """| 산출물 | 경로 | 버전/비고 |
| :--- | :--- | :--- |
| 일관성 검사 C9 | Code/교각모델링앱/engine/consistency.py, tools/test_consistency.py | 규칙 103~106건 + hooks_up 규칙 |
| 필드 단위 원본 잔존 C3b | engine/verify.py(B3), web/store.py(origin_values.json), tools/make_origin_values.py | |
| 거짓 앵커 | engine/anchors.py(VERSION 2, TABLE_RULE=single), tools/test_anchors.py | |
| 도면에서 읽기 | engine/geomread.py, engine/footing_rule.py, web/templates/geomread.html, tools/test_geomread.py | 표 값 통합, 정확 비교 |
| 일괄 실행 중단 표시 | web/app.py(batch.json reason/started), web/templates/gates.html, tools/test_batch_notice.py | |
| 검토 요약 확정 | engine/review.py, web/templates/review.html, tools/test_review.py | 모두 체크·주의 표시 |
| 사용설명서 | DOC/04_실행/실행_T형교각모델링앱사용설명서_2026-10-20_v0.2.16.md | v0.2.12→v0.2.16 |
| 기획서 | DOC/01_기획/기획_입력묶음확인확정개편_2026-10-20_v0.1.12.md | v0.1.07→v0.1.12 |
| 운곡교 P2 | data/운곡교P2 | G1~G5 PASS·승인(578/585, 계획 7), 보고서 초안 미생성 |
| 운곡교 P4(재작성) | data/운곡교P4 | 11:59 G1~G3 승인, G4 계획 외 C1·C4(코핑 상단 철근 a)를 수정, 재확정·재실행 대기 |
| 개선 목록 | context-migration/OPEN_미해결목록.md #34·#36 | |"""
(P20 / "Task_앱개선_검토요약확정과P2P4마무리_2026-10-20_v0.1.00.md").write_text(
header("앱개선_검토요약확정과P2P4마무리", "2026-10-20", "Task_앱개선_검토요약확정과P2P4마무리_2026-10-20_v0.1.00", "prompt/심영표/2026-10-20/Task_운곡교P4게이트검토와결정_2026-10-20_v0.1.00.md", inp_c, body_c, dec_c, out_c, n_c,
"PROCESS PARTIAL (운곡교P4 재확정·G4 재실행 대기, 앱 개선 ⑦~⑫ 미착수, P2 보고서 초안 미생성)",
"Rhino 회귀 4종(test_web_batch 외)은 ⑤ 변경 뒤 통과, 울산 3종은 미실행. 이 로그는 하루 안에 20턴을 넘어 다음 변경부터 새 로그로 분리 권장(F8). 도구호출 횟수는 집계되지 않음."),
encoding="utf-8")
print("written", n_a, n_b, n_c)