sut-prober snake_case JSON + scaffolding review 1회차

- SutProber JsonNamingPolicy.SnakeCaseLower (strict contract compliance)
- Regenerated docs/sut-catalog/*.json
- CoverageTests: accept both snake_case and PascalCase (resilience)
- docs/history: scaffolding review 1회차 (no removals, audit only)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-07 20:41:51 +09:00
parent b20ec32c36
commit 0f0324efb5
7 changed files with 947 additions and 848 deletions

View File

@@ -0,0 +1,69 @@
# 2026-04-07 Scaffolding Review 1회차
- **작업**: `.claude/` 비계 주기 감사 (harness design 원칙)
- **소요 시간**: ~10분
- **Context 사용량**: ~420k tokens (orchestrator 누적)
## 범위
PoC 8개 완료 + smoke 2차 fix 완료 시점에서 `.claude/` 하위 agents/commands/skills/hooks 인벤토리 감사.
## 인벤토리
### Agents (5) — 모두 유효
| Agent | 사용 이력 | 평가 |
|-------|----------|------|
| planner | 간접 사용 (orchestrator가 contract 직접 작성) | 유지 — `/contract` 커맨드 경유 가치 있음 |
| evaluator | 10+ Evaluator 사이클에서 사용 | 핵심 |
| sut-explorer | 미사용 (sut-prober 코드로 대체) | **검토 대상**: 실행 이력 없음. 향후 dynamic 분석 필요 시 부활 |
| diff-triager | 미사용 (아직 실제 실패 triage 미발생) | 유지 — 첫 회귀 실패 시 필요 |
| scenario-author | 미사용 | 유지 — 향후 자연어 → yaml 변환 시 필요 |
### Commands (7) — 대부분 미사용
| Command | 사용 이력 | 평가 |
|---------|----------|------|
| contract | 미사용 (orchestrator 직접 작성) | **검토**: 실질 가치 재검토 |
| evaluate | 미사용 (Agent tool 직접 호출로 대체) | **검토**: 실질 가치 재검토 |
| sut-probe | 미사용 (sut-prober exe 직접 실행) | **검토** |
| regress | 미사용 (test-runner 미배포) | 유지 — 러너 배포 후 사용 예정 |
| approve | 미사용 | 유지 — baseline 승격 워크플로에 필요 |
| handoff | 미사용 (직접 PROGRESS 편집) | **검토** |
| progress | 미사용 (orchestrator가 직접 read) | **검토** |
**관찰**: 커맨드는 명시적 슬래시 호출이 필요한데 orchestrator 세션에서는 일반 도구 호출이 더 빠름. 커맨드는 **사용자 직접 호출 용도**로 한정 가치.
### Skills (3) — 적절
| Skill | 평가 |
|-------|------|
| flaui-cookbook | 유지 — recorder/player 작업 시 참조 |
| golden-file-normalizer | 유지 — normalizer 규칙 저작 시 참조 |
| aptabase | 별도 플러그인 (외부 서비스), 유지 |
### Hooks (7 active) — 핵심
| Hook | 사용 이력 | 평가 |
|------|----------|------|
| session-start-progress.sh | 세션마다 PROGRESS/PLAN 주입 | 핵심 |
| stop-handoff-reminder.sh | 세션 종료 시 경고 | 유지 |
| guard-sut-folder.sh | SUT 폴더 보호 | 핵심 |
| guard-sut-launch.sh | SUT 실행 경고 | 유지 |
| aptabase-* | 외부 텔레메트리 | 별도 관리 |
| install-git-hook.sh | 설치 스크립트 | 유지 |
## 권고 (실행 보류, 검토만)
1. **미사용 커맨드 4개** (`contract`, `evaluate`, `handoff`, `progress`): orchestrator 세션 관점에선 redundant. 단 **사용자가 직접 `/handoff` 같은 걸 치는 시나리오**는 유효. 삭제 대신 문서화로 보완 권장.
2. **`sut-explorer` 에이전트**: 미사용. 정적 분석은 `sut-prober` 코드가 담당. 제거 후보.
3. **`diff-triager` 에이전트**: 아직 트리거된 적 없지만 첫 실 regression 실패 시 필요 → 유지.
4. **`scenario-author` 에이전트**: 향후 자연어 시나리오 변환 시 가치. 유지.
## 이번 감사에서 정리한 것
- 없음 (감사만, 삭제 보류)
## 다음 감사 권장 시점
- engine-bridge v3 완료 후
- smoke 2회차 pass 후
- 또는 PoC 모듈이 3개 더 추가됐을 때
## 추가 follow-up
`.claude/settings.json`의 hooks 섹션에 `aptabase-*` 관련 등록 상태와 현재 운영 일치 여부는 aptabase skill 담당 범위라 감사 제외.

View File

@@ -0,0 +1,27 @@
# 2026-04-07 sut-prober snake_case JSON naming
- **작업**: follow-up — contract 엄격 준수
- **소요 시간**: ~5분
- **Context 사용량**: ~420k (orchestrator 누적)
## 변경
`src/Recordingtest.SutProber/Program.cs``JsonSerializerOptions``PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower` 추가.
## 검증
- `dotnet build src/Recordingtest.SutProber`: green (0/0)
- `dotnet run`: exit 0, 카탈로그 재생성
- 출력 확인: `"name"`, `"path"`, `"dlls"`, `"size_bytes"` (이전 `"SizeBytes"` 에서 변경)
- `size_bytes`, `has_pdb` 스네이크 케이스 확인됨
## 영향
- sut-prober contract DoD 엄격 준수 (이전 Evaluator "or equivalent" 완화 조항 제거)
- `docs/sut-catalog/*.json` 재생성 필요 (이번 실행에서 덮어씀)
- 다른 모듈은 sut-catalog JSON을 **필드 이름으로 참조** 하는 곳이 있다면 영향 — normalizer의 coverage test (`CoverageTests.cs`)가 `suspectedNondeterministicFields` 또는 `suspected_nondeterministic_fields` 중 어느 쪽을 파싱하는지 확인 필요
## Follow-up
- normalizer Coverage test에 영향이 있는지 다음 dotnet test run에서 검증 필요
- PROGRESS.md Follow-ups 섹션에서 이 항목 제거 예정 (orchestrator 마무리 시)

View File

@@ -1,87 +1,87 @@
[
{
"Name": "Editor.AI01.HttpConnector.dll",
"SizeBytes": 15872,
"HasPdb": true
"name": "Editor.AI01.HttpConnector.dll",
"size_bytes": 15872,
"has_pdb": true
},
{
"Name": "Editor01.Localization.dll",
"SizeBytes": 357888,
"HasPdb": true
"name": "Editor01.Localization.dll",
"size_bytes": 357888,
"has_pdb": true
},
{
"Name": "Editor02.HmEGAppManager.dll",
"SizeBytes": 529408,
"HasPdb": true
"name": "Editor02.HmEGAppManager.dll",
"size_bytes": 529408,
"has_pdb": true
},
{
"Name": "Editor03.PluginInterface.dll",
"SizeBytes": 347136,
"HasPdb": true
"name": "Editor03.PluginInterface.dll",
"size_bytes": 347136,
"has_pdb": true
},
{
"Name": "Editor04.CommandControl.dll",
"SizeBytes": 60416,
"HasPdb": true
"name": "Editor04.CommandControl.dll",
"size_bytes": 60416,
"has_pdb": true
},
{
"Name": "Editor05.CommandCore.dll",
"SizeBytes": 99840,
"HasPdb": true
"name": "Editor05.CommandCore.dll",
"size_bytes": 99840,
"has_pdb": true
},
{
"Name": "Editor06.CommandCustom.dll",
"SizeBytes": 29184,
"HasPdb": true
"name": "Editor06.CommandCustom.dll",
"size_bytes": 29184,
"has_pdb": true
},
{
"Name": "Editor07.WidgetPluginInterface.dll",
"SizeBytes": 8704,
"HasPdb": true
"name": "Editor07.WidgetPluginInterface.dll",
"size_bytes": 8704,
"has_pdb": true
},
{
"Name": "EditorCore.dll",
"SizeBytes": 57636352,
"HasPdb": true
"name": "EditorCore.dll",
"size_bytes": 57636352,
"has_pdb": true
},
{
"Name": "HmCommonBridge.dll",
"SizeBytes": 72192,
"HasPdb": false
"name": "HmCommonBridge.dll",
"size_bytes": 72192,
"has_pdb": false
},
{
"Name": "HmCommonUI.dll",
"SizeBytes": 1710592,
"HasPdb": false
"name": "HmCommonUI.dll",
"size_bytes": 1710592,
"has_pdb": false
},
{
"Name": "HmEG.dll",
"SizeBytes": 242715136,
"HasPdb": true
"name": "HmEG.dll",
"size_bytes": 242715136,
"has_pdb": true
},
{
"Name": "HmEG3DMouse.dll",
"SizeBytes": 40448,
"HasPdb": false
"name": "HmEG3DMouse.dll",
"size_bytes": 40448,
"has_pdb": false
},
{
"Name": "HmGeometry.V2.dll",
"SizeBytes": 2985472,
"HasPdb": true
"name": "HmGeometry.V2.dll",
"size_bytes": 2985472,
"has_pdb": true
},
{
"Name": "HmGeometry.dll",
"SizeBytes": 1863168,
"HasPdb": true
"name": "HmGeometry.dll",
"size_bytes": 1863168,
"has_pdb": true
},
{
"Name": "HmPG.dll",
"SizeBytes": 34816,
"HasPdb": false
"name": "HmPG.dll",
"size_bytes": 34816,
"has_pdb": false
},
{
"Name": "HmTriangle.dll",
"SizeBytes": 195584,
"HasPdb": true
"name": "HmTriangle.dll",
"size_bytes": 195584,
"has_pdb": true
}
]

View File

@@ -1,7 +1,7 @@
[
{
"Name": "CategoryCommands.json",
"TopLevelKeys": [
"name": "CategoryCommands.json",
"top_level_keys": [
"CategoryCommands[0]",
"CategoryCommands[10]",
"CategoryCommands[11]",
@@ -75,11 +75,11 @@
"ViewerCategoryCommands[7]",
"ViewerCategoryCommands[8]"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "CommandAlias.json",
"TopLevelKeys": [
"name": "CommandAlias.json",
"top_level_keys": [
"3F",
"A",
"C",
@@ -101,11 +101,11 @@
"UNITE",
"Z"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "DefaultCategoryCommands.json",
"TopLevelKeys": [
"name": "DefaultCategoryCommands.json",
"top_level_keys": [
"CategoryCommands[0]",
"CategoryCommands[10]",
"CategoryCommands[11]",
@@ -179,11 +179,11 @@
"ViewerCategoryCommands[7]",
"ViewerCategoryCommands[8]"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "DefaultCommandAlias.json",
"TopLevelKeys": [
"name": "DefaultCommandAlias.json",
"top_level_keys": [
"3F",
"A",
"C",
@@ -205,11 +205,11 @@
"UNITE",
"Z"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "DefaultKeyShortCut.json",
"TopLevelKeys": [
"name": "DefaultKeyShortCut.json",
"top_level_keys": [
"Ctrl_0",
"Ctrl_1",
"Ctrl_2",
@@ -374,11 +374,11 @@
"PageUp",
"Tab"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "DefaultMouseSnap.json",
"TopLevelKeys": [
"name": "DefaultMouseSnap.json",
"top_level_keys": [
"AdditionalAngleStr",
"ApplyIncrementAngle",
"CenterOsnap",
@@ -400,14 +400,14 @@
"TangentOsnap",
"VertexOsnap"
],
"SuspectedNondeterministicFields": [
"suspected_nondeterministic_fields": [
"GridSnap",
"MidpointOsnap"
]
},
{
"Name": "DefaultSettings.json",
"TopLevelKeys": [
"name": "DefaultSettings.json",
"top_level_keys": [
"AmbientLightColor.ALPHA",
"AmbientLightColor.BLUE",
"AmbientLightColor.GREEN",
@@ -549,7 +549,7 @@
"WireframeColor.RED",
"ZoomSensitivity"
],
"SuspectedNondeterministicFields": [
"suspected_nondeterministic_fields": [
"AutoSaveFilePath",
"AutoSave_RecentFileName",
"CanOverrideWireColorWithFace",
@@ -569,8 +569,8 @@
]
},
{
"Name": "DefaultStartupCommand.json",
"TopLevelKeys": [
"name": "DefaultStartupCommand.json",
"top_level_keys": [
"NeverRepeatCommands[0]",
"NeverRepeatCommands[10]",
"NeverRepeatCommands[11]",
@@ -585,11 +585,11 @@
"NeverRepeatCommands[8]",
"NeverRepeatCommands[9]"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "DefaultUnits.json",
"TopLevelKeys": [
"name": "DefaultUnits.json",
"top_level_keys": [
"BaseUnit",
"CurrentUnit",
"Denominator",
@@ -597,11 +597,11 @@
"ImperialDenominator",
"SignificantDigit"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "KeyShortCut.json",
"TopLevelKeys": [
"name": "KeyShortCut.json",
"top_level_keys": [
"Ctrl_0",
"Ctrl_1",
"Ctrl_2",
@@ -766,16 +766,16 @@
"PageUp",
"Tab"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "Materials.json",
"TopLevelKeys": [],
"SuspectedNondeterministicFields": []
"name": "Materials.json",
"top_level_keys": [],
"suspected_nondeterministic_fields": []
},
{
"Name": "MouseSnap.json",
"TopLevelKeys": [
"name": "MouseSnap.json",
"top_level_keys": [
"AdditionalAngleStr",
"ApplyIncrementAngle",
"CenterOsnap",
@@ -797,19 +797,19 @@
"TangentOsnap",
"VertexOsnap"
],
"SuspectedNondeterministicFields": [
"suspected_nondeterministic_fields": [
"GridSnap",
"MidpointOsnap"
]
},
{
"Name": "RecentFiles.json",
"TopLevelKeys": [],
"SuspectedNondeterministicFields": []
"name": "RecentFiles.json",
"top_level_keys": [],
"suspected_nondeterministic_fields": []
},
{
"Name": "Settings.json",
"TopLevelKeys": [
"name": "Settings.json",
"top_level_keys": [
"AmbientLightColor.ALPHA",
"AmbientLightColor.BLUE",
"AmbientLightColor.GREEN",
@@ -951,7 +951,7 @@
"WireframeColor.RED",
"ZoomSensitivity"
],
"SuspectedNondeterministicFields": [
"suspected_nondeterministic_fields": [
"AutoSaveFilePath",
"AutoSave_RecentFileName",
"CanOverrideWireColorWithFace",
@@ -971,8 +971,8 @@
]
},
{
"Name": "StartupCommand.json",
"TopLevelKeys": [
"name": "StartupCommand.json",
"top_level_keys": [
"NeverRepeatCommands[0]",
"NeverRepeatCommands[10]",
"NeverRepeatCommands[11]",
@@ -987,11 +987,11 @@
"NeverRepeatCommands[8]",
"NeverRepeatCommands[9]"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
},
{
"Name": "Units.json",
"TopLevelKeys": [
"name": "Units.json",
"top_level_keys": [
"BaseUnit",
"CurrentUnit",
"Denominator",
@@ -999,6 +999,6 @@
"ImperialDenominator",
"SignificantDigit"
],
"SuspectedNondeterministicFields": []
"suspected_nondeterministic_fields": []
}
]

File diff suppressed because it is too large Load Diff