161 lines
9.1 KiB
Markdown
161 lines
9.1 KiB
Markdown
---
|
|
name: running-tech-log-pipeline
|
|
description: Use when a codebase must go all the way to a saved Tech Log Studio draft — running the seven stages (SSOT, tree, record, diagram, prose, voice, Studio save) as separate subagents, one skill per stage, with a run ledger that records which skill each stage actually used and which gate it passed.
|
|
---
|
|
|
|
# Tech Log 파이프라인 실행
|
|
|
|
## 이 스킬이 하는 일
|
|
|
|
스킬 일곱 개를 **한 줄기로 잇는다.** 각 스킬은 자기 단계만 알고 앞뒤를 모른다. 이 스킬이
|
|
단계 사이의 인계물과 순서와 관문을 정하고, 단계마다 **서브에이전트를 하나씩 띄운다.**
|
|
|
|
한 실행이 남기는 것은 산출물과 **런 원장**(`runs/<프로젝트>/<runId>/run.json`) 둘이다.
|
|
원장은 단계마다 어떤 스킬을 실제로 읽었고 어떤 관문을 어떤 종료 코드로 지났는지를 적는다.
|
|
`python3 scripts/verify-pipeline-run.py <원장>` 이 그 원장을 검사한다.
|
|
|
|
**원장이 이 스킬의 존재 이유다.** 스킬을 안 읽고 쓴 글과 읽고 쓴 글은 결과물만 봐서는
|
|
구분되지 않는다. 원장은 그것을 기계가 구분할 수 있게 만든다.
|
|
|
|
## 왜 단계마다 서브에이전트인가
|
|
|
|
한 세션이 일곱 단계를 이어서 하면 앞 단계의 문맥이 뒤 단계로 새어 든다. 그러면 세 가지가
|
|
망가진다.
|
|
|
|
- **스킬을 안 읽고도 그럴듯하게 쓴다.** 3단계에서 본문 규칙을 읽었으니 5단계에서
|
|
`rewriting-technical-prose-naturally` 를 열지 않아도 문장이 나온다. 스킬이 적용됐는지
|
|
확인할 방법이 사라진다.
|
|
- **관문이 형식이 된다.** 자기가 쓴 글을 자기가 검사하면 실패를 「이건 예외」로 넘긴다.
|
|
- **어디서 어긋났는지 못 찾는다.** 결과가 이상할 때 일곱 단계 중 어디가 원인인지 가릴 수 없다.
|
|
|
|
서브에이전트는 **자기 단계의 입력 파일과 자기 스킬만** 받는다. 다른 단계가 무엇을 했는지
|
|
모른다. 그래서 스킬을 안 읽으면 못 쓰고, 못 쓰면 원장에 남는다.
|
|
|
|
## 일곱 단계
|
|
|
|
| # | 단계 | 스킬 | 산출물 |
|
|
|---|---|---|---|
|
|
| S1 | 코드베이스 → SSOT | `analyzing-codebase-for-tech-log` | `docs/<프로젝트>/final/document.md` |
|
|
| S2 | SSOT → 분해 계약 | `deriving-tech-log-root-tree` | `docs/<프로젝트>/tech-log-studio/tech-log-tree.json` |
|
|
| S3 | 글감 → 기록 | `writing-tech-log-records` | `.../<주제>/<종류>/<기록>.md` |
|
|
| S4 | 기록 → 그림 | `technical-visualizer` | `final/assets/<이름>/` · `final/.techviz/<이름>/` |
|
|
| S5 | AI 티 제거 | `rewriting-technical-prose-naturally` | 같은 기록 파일 (제자리 수정) |
|
|
| S6 | 일한 사람의 목소리 | `writing-as-the-person-who-did-it` | 같은 기록 파일 (제자리 수정) |
|
|
| S7 | Studio 저장 | `publishing-tech-log-to-studio` | Studio 작업본 + `studio:` URL. **게시하지 않는다** |
|
|
|
|
단계마다의 입력·관문·원장 칸은 [references/stage-contracts.md](references/stage-contracts.md).
|
|
서브에이전트에 그대로 넣는 프롬프트는 [references/subagent-prompts.md](references/subagent-prompts.md).
|
|
|
|
## 순서가 고정된 곳
|
|
|
|
세 자리는 바꾸면 결과가 틀어진다.
|
|
|
|
**S3 → S4.** 그림은 기록을 쓴 다음에 만든다. 무엇을 그릴지는 기록 본문이 정하고
|
|
(`writing-tech-log-records/references/choosing-a-diagram.md` 의 세 관문), 그림의 근거는 그
|
|
기록의 `source` 앵커가 가리키는 SSOT 절이다. **기록 본문이 그림의 소재를 고르고, SSOT 절이
|
|
그림의 사실을 댄다.** 기록 `.md` 를 `techviz prepare` 에 넣지 않는다 — 기록은 SSOT 의 인용이라
|
|
줄 번호가 근거가 되지 못한다.
|
|
|
|
**S4 → S5 → S6.** 문장 손질은 본문이 다 찬 뒤에 한다. 그림을 붙이면 본문에 그림을 읽는 문단이
|
|
한둘 늘고, 그 문단도 같은 손질을 받아야 한다. S5 가 먼저다 — 번역투와 반복 문형을 걷어낸 뒤라야
|
|
S6 이 채울 자리(선택·비교·어긋남)가 보인다. 순서를 뒤집으면 S5 가 S6 이 넣은 목소리를
|
|
「과한 대구」로 다시 깎는다.
|
|
|
|
**S6 → S7.** Studio 에는 문장 손질이 끝난 것만 넣는다. 저장한 뒤에 고치면 Studio 쪽 `version`
|
|
이 올라가고 검증 산출물이 무효가 된다.
|
|
|
|
## S5·S6 뒤에는 S3 관문을 다시 돌린다
|
|
|
|
문장을 고치면 본문 문법과 인용이 함께 움직인다. `check_prose` 가 error 0 이어도 `check_body`
|
|
가 깨지거나, 고쳐 쓴 코드블록 한 줄이 SSOT 와 달라져 `check_evidence` 가 걸린다.
|
|
|
|
```bash
|
|
python3 scripts/studio-body.py <기록.md> -o /tmp/studio-body.md
|
|
node --experimental-transform-types \
|
|
.agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/studio-body.md
|
|
node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs <프로젝트> --repo
|
|
```
|
|
|
|
원장에서는 이것이 S5·S6 의 관문이지 S3 의 재실행이 아니다.
|
|
|
|
## 건너뛰어도 되는 단계
|
|
|
|
이미 있는 것을 다시 만들지 않는다. 건너뛴 단계도 **원장에 `SKIPPED` 와 사유를 적는다.**
|
|
적지 않고 빠뜨린 것과 판단해서 건너뛴 것을 구분해야 한다.
|
|
|
|
| 단계 | 건너뛰는 조건 |
|
|
|---|---|
|
|
| S1 | `final/document.md` 가 있고 그 안에서 이 글감의 근거를 찾을 수 있다 |
|
|
| S2 | `tech-log-tree.json` 에 이 글감이 `PROMOTE` · `CONFIRMED` 로 이미 있다 |
|
|
| S4 | 그림이 필요 없다(세 관문에 걸린다) 또는 `ssot-assets` 가 배정한 그림이 이미 있다 |
|
|
| S7 | 사용자가 Studio 반입을 요청하지 않았다 |
|
|
|
|
**S3·S5·S6 은 건너뛰지 않는다.** 기록을 쓰는 단계와 문장을 고치는 두 단계는 이 파이프라인의
|
|
산출물 자체다.
|
|
|
|
## 실행 절차
|
|
|
|
### 0. 런을 연다
|
|
|
|
```bash
|
|
python3 scripts/verify-pipeline-run.py --init runs/<프로젝트>/<runId>/run.json \
|
|
--project <프로젝트> --record <기록 경로>
|
|
```
|
|
|
|
`runId` 는 `YYYY-MM-DD-HHMM` 이다. 원장의 틀은
|
|
[templates/run.json](templates/run.json) 이고, `--init` 이 그 틀을 채워 놓는다.
|
|
|
|
### 1. 단계마다 서브에이전트를 띄운다
|
|
|
|
프롬프트는 [references/subagent-prompts.md](references/subagent-prompts.md) 의 것을 쓴다.
|
|
프롬프트에 **반드시** 들어가야 하는 넷이 있다.
|
|
|
|
1. **스킬 이름과 「먼저 그 SKILL.md 를 끝까지 읽어라」** — 요약을 주지 않는다. 요약을 주면
|
|
에이전트가 스킬을 안 연다.
|
|
2. **자기 단계의 입력 파일 경로만.** 앞 단계가 무엇을 했는지 설명하지 않는다.
|
|
3. **관문 명령 원문과 「error 0 까지 고쳐라」.**
|
|
4. **스킬 영수증** — 그 SKILL.md 에서 자기 단계에 해당하는 규칙 한 줄을 **원문 그대로**
|
|
인용해 돌려보내게 한다. 이것이 스킬을 열었다는 기계 검증 가능한 증거다
|
|
(`verify-pipeline-run.py` 가 그 문자열이 실제 SKILL.md 안에 있는지 대조한다).
|
|
|
|
한 단계가 끝나면 그 결과를 원장에 적고 다음 단계를 띄운다. **단계를 병렬로 띄우지 않는다** —
|
|
S1~S7 은 앞 단계의 산출물이 뒤 단계의 입력이다. 병렬이 되는 것은 같은 단계 안에서
|
|
**서로 다른 기록 여러 건**을 처리할 때뿐이다.
|
|
|
|
### 2. 원장을 검사한다
|
|
|
|
```bash
|
|
python3 scripts/verify-pipeline-run.py runs/<프로젝트>/<runId>/run.json
|
|
```
|
|
|
|
error 0 이어야 런이 끝난 것이다. 이 검사기가 보는 것은 결과물의 품질이 아니라 **절차의
|
|
준수**다 — 단계가 빠졌는지, 스킬 영수증이 그 스킬의 실제 문장인지, 관문이 돌았고 종료 코드가
|
|
0 이었는지, 적어 낸 산출물이 디스크에 있는지.
|
|
|
|
### 3. 프로젝트 검사기를 돌린다
|
|
|
|
```bash
|
|
python3 scripts/verify-tech-log-tree.py <프로젝트>
|
|
python3 scripts/verify-project-layout.py <프로젝트>
|
|
python3 scripts/audit-records.py <프로젝트>
|
|
python3 scripts/check-figure-text.py <프로젝트>
|
|
```
|
|
|
|
## 이 스킬이 하지 않는 것
|
|
|
|
- **판단을 대신하지 않는다.** 어떤 후보를 `PROMOTE` 할지, 그림이 필요한지, 어떤 종류인지는
|
|
각 단계의 스킬이 정한다. 이 스킬은 그 스킬이 실제로 불렸는지만 본다.
|
|
- **관문을 완화하지 않는다.** 관문이 error 를 내면 그 단계는 끝나지 않은 것이다. 원장에
|
|
`FAILED` 로 적고 멈춘다. 다음 단계로 넘기지 않는다.
|
|
- **게시하지 않는다.** S7 은 저장까지다. 게시는 사람이 공개 화면을 보고 판단한다.
|
|
|
|
## 자주 어긋나는 자리
|
|
|
|
| 증상 | 원인 | 원장에 남는 모습 |
|
|
|---|---|---|
|
|
| 문장이 여전히 AI 같다 | S5 를 같은 세션이 겸했다 | `skillEcho` 가 비었거나 SKILL.md 에 없는 문장 |
|
|
| 그림 안에 문장이 있다 | S4 가 `check-figure-text.py` 를 안 돌렸다 | 관문 목록에 그 명령이 없다 |
|
|
| SSOT 에 없는 인용이 있다 | S3 이 앞 기록에서 코드를 옮겨 적었다 | `check_evidence` 종료 코드 ≠ 0 |
|
|
| 기록이 색인에 없다 | S2 를 건너뛰고 S3 을 했다 | S2 가 `SKIPPED` 인데 사유가 없다 |
|
|
| Studio 에서 그림이 안 보인다 | S7 이 Asset 을 올리기 전에 본문을 넣었다 | S7 관문에 미리보기 확인이 없다 |
|