Question
•
안녕하십니까, 양 박사님. 지난 매트랩 교육의 과제를 이제야 제출합니다. 대학원생의 넉넉지 않은 주머니 사정으로 인한 Late Submission을 너그러운 마음으로 이해해 주시기 바랍니다. 캄사합니다.
•
다만 한 가지 문제가 있습니다. 저는 결과가 저장될 때, 이미 Result_01이 존재한다면 새 결과는 Result_02, 그 다음은 Result_03과 같이 저장되기를 바랍니다. 하지만 CodingStyle_Core를 수정해봐도 여전히 새로운 결과가 기존의 Result_01에 덮어쓰기 형식으로 저장 됩니다. 이 문제를 어떻게 해결하면 좋을지 여쭤봅니다.
Answer
원하는 로직이 잘 구현 되지 않았던 이유
질문이 "스킬에 규칙을 적었는데 왜 Claude가 그걸 무시한 코드를 만들었느냐" 인거 같은데,
Claude가 규칙을 무시한 게 아니라, 그 규칙을 코드로 옮길 만한 구체적 패턴이 스킬 안에 없었기 때문.
자연어 규칙 vs 구체적 코드 템플릿
CodingStyle_Core.md §4에 적은 내용을 다시 보면 이런 식의 산문 설명임:
When creating an output, check the '[3] Output/' folder and see the latest result. If there are no results created yet, generate the result name 'Results_01/'. If there is a result that is already created, generate the new result after the already existing result.
이건 사람이 읽으면 "폴더 스캔해서 max+1 해야겠구나"라고 추론이 되지만, Claude 입장에서는 이 규칙을 MATLAB 코드로 어떻게 옮길지에 대한 구체적 예시가 없음.
스킬의 references/ 폴더를 보면:
•
Ex_MainStructure.m → main 스크립트 골격은 있지만 simName = 'Results_01' 하드코딩
•
Ex_OutputManagement.m → SaveResults 패턴은 있지만 outDir 자동 증가 로직 없음
•
나머지 reference 파일 → 자동 증가와 무관
즉, "규칙은 .md에 있지만, 그 규칙을 구현한 .m 템플릿이 없는" 상태였음.
Claude는 이런 상황에서 reference 파일의 패턴을 그대로 따르기 때문에, 자연스럽게 simName = 'Results_01' 고정 패턴이 생성됨.
본인 코드에서 무슨 일이 일어났는가
main_doublePendulumCart.m 13–16줄을 보면:
**simName** = 'Results_01';
**outDir** = fullfile('[2] Output', **simName**);
if ~exist(**outDir**, 'dir'); mkdir(**outDir**); end
MATLAB
복사
•
simName이 문자열 리터럴로 고정 → 매 실행마다 같은 값
•
if ~exist 문은 "폴더가 없을 때만 mkdir"이므로 이미 폴더가 있으면 그냥 통과
•
결과적으로 출력은 항상 같은 폴더에 덮어쓰기됨
이 패턴은 정확히 Ex_MainStructure.m을 따른 결과이며, 템플릿에 자동 증가 구현이 빠져 있었던 것뿐임.
해결법: 스킬에 구현 예시(.m) 추가
규칙을 산문으로만 두지 말고, 같은 규칙을 코드로 보여주는 reference .m 파일을 추가해야 함.
그러면 다음에 Claude가 main 스크립트를 만들 때 자동으로 이 패턴을 따라감.
Step 1: references/에 Ex_AutoIncrementOutput.m 추가
%% Auto-Increment Output Directory Pattern
% Scan output root, find latest Results_NN, create next index.
% UPDATED: 2026-04-13
**outRoot** = '[2] Output';
if ~exist(**outRoot**, 'dir'); mkdir(**outRoot**); end
**existing** = dir(fullfile(**outRoot**, 'Results_*'));
**nums** = [];
for k = 1:length(**existing**)
if **existing**(k).isdir
**tok** = regexp(**existing**(k).name, '^Results_(\d+)$', 'tokens', 'once');
if ~isempty(**tok**); **nums**(end+1) = str2double(**tok**{1}); end
end
end
**nextIdx** = max([0, **nums**]) + 1;
**simName** = sprintf('Results_%02d', **nextIdx**);
**outDir** = fullfile(**outRoot**, **simName**);
mkdir(**outDir**);
MATLAB
복사
Step 2: SKILL.md Quick Reference Map에 한 줄 추가
| Set up auto-incremented output folder | `references/Ex_AutoIncrementOutput.m` |
Markdown
복사
Step 3: Ex_MainStructure.m의 Simulation Identity 블록도 위 패턴으로 교체
•
references/Ex_MainStructure.m은 Claude가 main 스크립트를 만들 때 가장 먼저 참고하는 템플릿 파일임.
이 파일 자체가 하드코딩 패턴을 보여주고 있는 한, Step 1에서 별도 참조 파일을 추가해도 Claude는 여전히 Ex_MainStructure의 패턴을 따라갈 가능성이 높음
•
따라서 이 파일 안의 Simulation Identity 블록도 함께 고쳐 놓아야 충돌 없이 일관된 코드가 생성됨
Skill Design Principle
스킬에서 자연어 규칙과 구현 예시(.m) 는 서로 다른 채널임:
•
.md 규칙만 있을 때 → Claude가 추론으로 코드를 만들 수 있지만, reference .m 파일이 다른 패턴을 보이면 reference를 우선함
•
.m 예시만 있을 때 → 패턴은 따르지만 적용 조건/이유를 놓칠 수 있음
•
둘 다 있을 때 → 가장 안정적으로 의도대로 작동함
이번 사례는 .md에만 규칙을 적고 .m에는 구현이 없어서, Claude가 reference 파일의 하드코딩 패턴을 따른 케이스임.
P.S. 2026 MATLAB 교육자료의 내용 및 소스 코드는 비공개라 올려둔 첨부파일은 삭제해뒀음.