# Semi-structured software spec

> 상태없는 AI-인간 인터랙션을 구현하기 위한 프로세스이자 도구이자 명세서 형식. 에이전트 기반 코딩 실험 3의 결과물.

[상태없는 AI-인간 인터랙션](https://wiki.g15e.com/pages/Stateless%20AI-Human%20Interaction.txt)을 구현하기 위한 프로세스이자 도구이자 명세서 형식. [에이전트 기반 코딩 실험 3](https://wiki.g15e.com/pages/Agentic%20coding%20experiment%203.txt)의 결과물.

https://github.com/akngs/s4

## 설명

`s4`는 특정 형식을 따르는 yaml 명세서(`s4.yaml`)와 소스 코드를 정적 분석하여 다음에 해야 할 일이 무엇인지를 출력하는 전통적인 CLI 프로그램이다.

`s4 status`를 실행하면

1. 명세서에 내적 일관성이 있는지(모든 비즈니스 목표에 한 개 이상의 구체적 기능이 존재하는지, 기능 사이의 의존 관계에 순환이 없는지, 모든 기능에 한 개 이상의 인수 기준이 존재하는지 등)
2. 명세서와 코드 사이가 일치하는지(명세서 상 인수 기준에 대응되는 인수 테스트가 코드에 존재하는지)
3. 명세서에 등록된 모든 검사(인수 테스트, 단위 테스트, 커버리지, 타입 검사 등)를 통과하는지를

검사한 후 문제가 발견되면 가장 먼저 해결해야 할 문제가 무엇인지, 해당 문제를 해결하기 위해 필요한 뭘 하면 되는지 등을 알려준다. `s4`의 출력은 문제 해결에 필요한 맥락을 충분히 담고 있어서 [상태없는 AI-인간 인터랙션](https://wiki.g15e.com/pages/Stateless%20AI-Human%20Interaction.txt)을 가능하게 해준다.

## 부연

이 방식은 AI 에이전트가 도구의 호출 여부를 제어하고, 호출된 도구는 AI 에이전트가 잘 하지 못하는 종류의 작업을 수행한 뒤에 도구가 잘 하지 못하는 종류의 작업을 다시 AI 에이전트에게 구체적으로 지시하여 에이전트의 작업을 촉발한다는 점에서 [재귀적 신경기호 제어 역전](https://wiki.g15e.com/pages/Recursive%20Neuro-Symbolic%20Inversion%20of%20Control.txt) 패턴의 일종이라고 볼 수 있다.

## 개선점

[Alloy](https://wiki.g15e.com/pages/Alloy%20Analyzer.txt) 등을 이용한 형식화

- 어쩌면 반자동으로? 예: 명세를 자연어로 적으면 AI가 Alloy 모델을 만들어준다. 모호성이 있는 부분에 대해 예시를 여러 개 보여주며 어떤 게 의도에 부합하는지 사용자에게 물어보고 이를 통해 스펙을 정교하게 다듬기
- [자연어로 작성된 명세서](https://wiki.g15e.com/pages/Specification%20written%20in%20natural%20language.txt)
- [Model-driven testing](https://wiki.g15e.com/pages/Model-driven%20testing.txt)

[MCP](https://wiki.g15e.com/pages/Model%20context%20protocol.txt)와 유사한 프롬프트 템플릿. 예:

- 명세서의 AT와 코드로 구현된 AT가 의미적으로 일치하는지 검사
- 명세서의 서로 다른 두 기능이 의미적으로 동일한지 검사
- 명세서의 서로 다른 두 인수 테스트가 의미적으로 동일한지 검사

Forward engineering vs. reverse engineering

- 레거시 프로젝트에 이 방법론을 적용하려면 reverse 모드로. 새로 시작하는 프로젝트에서는 forward 모드로.
- Forward 모드에서는 명세서가 <Single source of truth>라면 reverse 모드에서는 코드가 SSoT인 상태에서 점진적으로 권위(?)를 명세서로 옮겨오는 방식.

<깃>과 연결하기

- 비싼(시간이 오래 걸리거나 토큰을 많이 쓰거나 등) 작업은 바뀐 코드에 대해서만 적용

의존성 그래프

- 특정 기능을 선택하면 해당 기능이 의존하는 다른 기능, 해당 기능에 의존하는 다른 기능, 해당 기능과 연결된 인수 테스트 등을 LLM이 읽기 쉽도록 보여주기
- 허용하지 않을 의존 관계를 명시할 수 있게 하기

스펙 리팩토링을 도와줄 무언가. 리팩토링이란?

- 하나의 FEAT을 둘로 나누기
- 두 개의 FEAT을 하나로 합치기
- …