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:
69
docs/history/2026-04-07_scaffolding-review-1회차.md
Normal file
69
docs/history/2026-04-07_scaffolding-review-1회차.md
Normal 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 담당 범위라 감사 제외.
|
||||
27
docs/history/2026-04-07_sut-prober-snake-case.md
Normal file
27
docs/history/2026-04-07_sut-prober-snake-case.md
Normal 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 마무리 시)
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
@@ -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
Reference in New Issue
Block a user