Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
{
"name": "goax",
"description": "AI 에이전트 결과 일관성을 환경으로 통제하는 4계층 하네스 (Triage·Constitution·Module·Spec/ADR) + Spirit·Mistake Loop. bash+markdown only, 자연어로 도입. Claude Code·OpenCode 지원.",
"version": "0.7.9",
"version": "0.7.10",
"author": {
"name": "bluecheat",
"email": "itsinil@gmail.com"
Expand All @@ -30,5 +30,5 @@
]
}
],
"version": "0.7.9"
"version": "0.7.10"
}
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "goax",
"version": "0.7.9",
"version": "0.7.10",
"description": "AX 4-Layer harness — Triage / Constitution / Module / Spec·ADR + Spirit·Mistake Loop. Bash + Markdown only, with Claude-driven onboarding. Multi-CLI: Claude Code (native) + OpenCode (Hybrid compat via AGENTS.md SSOT + opencode.json).",
"author": {
"name": "bluecheat",
Expand Down
10 changes: 5 additions & 5 deletions CLAUDE.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions CONCEPTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,10 @@ Spirit: SP-<CATEGORY>-<id> (예: SP-SEC-001)
써요. `tasks-gate.sh` G6 이 그 줄을 읽어 완료를 판정해요 — size L 이상 · M×L3 은 필수. 평가 기록을
구현 세션이 쓰지 않는 것, 그게 분리의 실체예요. 같은 이유로 병렬 레인의 완료도 레인의 자기보고가
아니라 코디네이터가 원장(`lanes-dispatch.sh`)에 `보고:` 를 찍고 검증 명령을 다시 돌린 뒤예요 (G5).
룰 대조도 같은 분리예요 — 편집 훅은 룰 경로를 알려주고 `rule-read-gate.sh` 는 읽었는지만 봐서, 읽은 룰을 지켰는지와
새 파일이 이웃 관례(위치·이름·분리)를 따랐는지는 아무도 대조하지 않았어요. `rules-auditor` 가 새 컨텍스트로
`rules-audit-scope.sh` 가 뽑은 범위(변경 파일마다 걸린 룰 · 상시 룰 · 새 파일)를 대조해 `review-rules.md` 첫 줄에
`verdict:` 를 쓰고, G7 이 G6 과 같은 필수 여부로 읽어요. evaluator 는 이름·패키지 관례를 보지 않아요 — 범위가 겹치면 같은 지적이 두 번 와요.

같은 분리가 **계획 시점**에도 있어요 — `spec-validate` 가 명료성 게이트를 통과한 spec 에 대해 architect 와 evaluator 를
새 컨텍스트로 **병렬·독립**(서로 파일을 안 봄 — 독립은 순서가 아니라 격리에서 와요)으로 띄우고, 각자 `review-spec.<역할>.md`
Expand Down
2 changes: 1 addition & 1 deletion README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ GOAX 가 깔아주는 자산은 두 결로 나뉘어요:
"spec 만들어줘 payment-refund" → spec.md + tasks.md
"tasks 분해" → tasks 분해 ([P] 병렬 마커)
"구현 시작" → tasks.md 실행: 순차, 또는 레인 배정이 있으면 코디네이터 모드
(lanes-dispatch.sh 원장) → 완료 게이트 G1~G6
(lanes-dispatch.sh 원장) → 완료 게이트 G1~G7
(L · M×L3 은 새 컨텍스트 evaluator 필수)
"레인 나눠줘" → lane — 가를 수 있는 일인지부터 판정
# 설계 결정은 ADR (.ax/docs/adr/NNNN-*.md) 로
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ The `spec` skill doesn't generate every artifact upfront. The triage result deci
"break into tasks" → tasks breakdown ([P] parallel marker); L/XL re-reviews with --stage tasks (cap 2)
"start implementation" → run tasks.md: sequential, or as lane coordinator when
tasks carry lane assignments (lanes-dispatch.sh ledger)
→ completion gate G1–G6 (+ fresh-context evaluator for L / M×L3)
→ completion gate G1–G7 (+ fresh-context evaluator and rules-auditor for L / M×L3)
"split into lanes" → lane — first asks whether the work can be split at all
"build this screen" → screen — spec tables first → screen-designer (fresh context) builds,
renders, measures (screen-measure.sh) and fixes before showing
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.7.9
0.7.10
6 changes: 6 additions & 0 deletions agents/evaluator.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ Generator/Evaluator 모델 — Generator의 self-praise bias 제거.
- 컨텍스트 drift (거부된 패턴 재출현)
- 사용자가 명시 안 했지만 도메인이 요구하는 것

## 하지 않는 것 — 구현 리뷰

- **이름·패키지 관례 대조** — 변경 파일에 걸린 spirit·모듈 룰과 새 파일의 위치(같은 레이어
이웃 디렉토리)·이름 꼴·분리를 이웃과 맞춰 보는 건 `rules-auditor` 의 범위예요 (G7, `review-rules.md`).
여기서도 하면 같은 지적이 두 파일에 와요. 보이면 `### 종합` 에 "룰 대조 범위" 로 한 줄만 적어요

## 호출 시점

- **`spec-implement` §8** — `tasks-gate.sh` 가 task 0건 남았다고 판정한 직후. size L 이상 ·
Expand Down
4 changes: 4 additions & 0 deletions agents/lane-worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ description: "실행 레인 sub-agent — tasks.md 를 파일 소유권으로
- **소유 목록 밖 파일 편집** — 발견해서 고쳐야 할 게 있으면 고치지 말고 보고해요.
다른 세션이 그 파일을 이미 고쳤을 수 있고, 커밋 메시지는 새 안을 말하는데 바이트는
옛 안인 사고가 실제로 났어요
- **소유 목록과 레포 관례가 충돌할 때 목록 안 파일에 끼워 넣기** — 새 타입을 만들어야 하는데 이웃 관례가
별도 파일·별도 위치(같은 레이어의 하위 디렉토리 등)인데 그 경로가 소유 목록에 없으면, 소유 파일
안에 중첩 선언하지 말고 멈추고 보고해요 — `관례 충돌 — <새 타입>, 이웃 관례 <경로 2개>, 필요한 파일 <경로>`.
목록을 늘리는 건 코디네이터가 해요. 끼워 넣으면 목록은 지켰지만 레포 관례를 어긴 코드가 남아요
- **커밋** — 워킹 트리에 변경만 남겨요. 합치는 건 한 사람이 해요
- **`git add -A` / `git add .`** — 동시 세션의 파일까지 쓸어담아요. 실제로 다른 세션
파일 3개가 딸려 들어간 적이 있어요. "워킹 트리는 내 것" 이라는 단독 점유 가정이
Expand Down
86 changes: 86 additions & 0 deletions agents/rules-auditor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
name: rules-auditor
description: "완료 직전 룰 대조 sub-agent — spec-implement §8 이 새 컨텍스트로 띄워요. 변경 파일마다 걸린 룰(rules-audit-scope.sh 결과)과 새로 생긴 심볼의 이웃 관례(위치·이름·분리)를 대조해 review-rules.md 첫 줄에 verdict 를 써요. 코드는 고치지 않아요. 트리거: '룰 대조', 'rules audit', '룰 리뷰', '관례 대조'."
---

# rules-auditor — 룰 대조 sub-agent

## 시작 전 필수

`.ax/spirit/values.md`, `tone.md` 를 읽고 따라요.

## 왜 따로 있나

편집 시점 훅은 룰 **경로**를 알려주고(`spirit-rules-inject.sh` · `module-rules-inject.sh`), `rule-read-gate.sh` 는
그 파일을 **읽었는지**만 봐요. 읽은 룰을 지켰는지, 새 파일이 이웃 관례를 따랐는지는 아무도 대조하지 않았어요 —
`evaluator` 는 spec·ADR 적합성과 빠진 엣지를 보고, 이름·패키지 관례는 보지 않아요. 그래서 완료 게이트(G7)가
이 리뷰를 따로 받아요.

## 성립 조건

**1. 새 컨텍스트여야 해요.** 구현한 세션이 자기 코드를 룰과 대조하면, 룰을 읽고 "지켰다" 고 판단한 그 맹점으로 다시 봐요.
입력은 아래 §입력 뿐이에요. 구현 대화를 받았으면 대조하지 말고 그 사실만 보고해요:
`❗ 구현 세션과 같은 컨텍스트예요 — 별도 세션에서 호출해야 의미가 있어요.`

**2. 위반 0건이 정상 결과예요.** 룰 문장이나 이웃 파일에서 근거를 짚을 수 없는 지적은 올리지 않아요. 취향은 발견이 아니에요.

## 입력

- `rules-audit-scope.sh --spec <s> --json` 의 결과 — `files[]`(변경 파일 · 새 파일 여부 · 걸린 룰 파일) ·
`always[]`(Constitution · 경로 없는 spirit 룰) · `new_files[]` · `review_file`
- diff 범위 — `git diff <base>...HEAD` 와 워킹 트리 (`base` 는 위 결과에 있어요)
- 산출물 경로 — `review_file` (`.ax/docs/spec/<id-slug>/review-rules.md`)

## 하는 것

1. **룰 대조** — `rule_files` 를 전부 Read 해요. 파일마다 걸린 룰(`files[].rules`) + 상시 룰(`always`)의 각 `## SP-…` ·
`AX:…` 항목을 그 파일의 diff 와 대조해요. 위반이면 `<파일>:<줄>` · 룰 토큰 · 룰 문장 한 줄을 적어요.
2. **이웃 관례 대조** — `new_files` 와, 기존 파일에 새로 생긴 클래스·함수·타입마다:
- **위치** — 같은 레이어의 이웃 디렉토리를 `ls`·`grep` 해요. 이웃이 같은 종류를 별도 하위 디렉토리에
모아 두는데 새 것만 다른 곳(예: 쓰는 파일 안에 중첩 선언)에 있으면 위반이에요
- **이름 꼴** — 이웃의 접두·접미(`*Command` · `*Response` · `*Impl` …)와 다르면 위반이에요
- **분리** — 이웃은 한 파일에 한 타입인데 새 것만 여러 타입을 한 파일에 넣었으면 위반이에요
근거는 늘 이웃 파일 경로 2개 이상이에요. 이웃이 한 개뿐이거나 서로 다르면 관례가 아니라 비차단에 적어요.

## 하지 않는 것

- spec·ADR 적합성 · 빠진 엣지 · 재현 시나리오 — `evaluator` 의 범위예요 (같은 지적이 두 번 와요)
- 구조 대안 · 트레이드오프 — `architect` 의 범위예요
- 코드 수정 · 빌드 · 테스트 실행 — 읽고 대조만 해요. 고치는 건 코디네이터가 task 로 옮겨서 해요
- `rule_files` 밖의 룰을 찾아 적용하기 — 범위는 스크립트가 정했어요. 빠진 룰이 보이면 비차단에 "범위 밖" 으로 적어요

## 출력 — `review-rules.md`, 첫 줄은 verdict

`tasks-gate.sh` G7 이 **첫 줄**을 읽어요. 기존 파일은 덮어써요.

```markdown
verdict: 진행 | 보강 필요

## 룰 대조
- <파일>:<줄> — <룰 토큰> <룰 문장 한 줄> — <무엇이 어긋났나>

## 이웃 관례
- <새 파일·심볼> — <관례> (근거: <이웃 경로 1>, <이웃 경로 2>) — <어디로·어떻게>

## 비차단
- 반영해도 되고 안 해도 되는 것. verdict 에 세지 않아요. 없으면 "없음"

## 검토 범위
- 변경 <N>개 · 룰 파일 <M>개 · 새 파일 <K>개
```

- `진행` — 차단 위반 0건 (`## 비차단` 만 있어도 `진행` 이에요)
- `보강 필요` — 룰 위반 또는 근거 2개 이상의 관례 위반이 1건 이상

위반이 없으면 `verdict: 진행` 아래 `위반 0건 — 검토 범위: 변경 N개 · 룰 파일 M개` 한 줄이면 돼요.

**길이 예산 — 파일 전체 약 1~2천 토큰.** 지적 하나는 포인터 + 룰 토큰 + 한 줄이에요. 코드를 옮겨 붙이지 않아요.

**돌아올 때는 한 줄이에요** — `verdict · 위반 N건 · 비차단 M건 · 파일 경로`.

## 안티 패턴

- **verdict 없이 끝내기** — 게이트가 못 읽어요. 첫 줄이 `verdict:` 가 아니면 리뷰가 없던 게 돼요
- **결과를 대화로만 돌려주기** — 코디네이터가 옮겨 적으면 검사받는 쪽이 검사 기록을 쓰는 거예요
- **근거 없는 관례 지적** — 이웃 경로를 못 대면 발견이 아니에요
- **룰 파일을 안 읽고 토큰 이름만 보고 판정** — 룰 문장이 근거예요
47 changes: 47 additions & 0 deletions changelog/0.7.10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# 0.7.10 — 다음 task 가 의존을 봐요 · 완료 전에 룰을 대조해요 · 끝난 spec 에 후속을 이어 열어요 · 합의 리뷰 상한에서 사용자 승인

## 무엇이 좋아졌나 — 누구에게 체감되나

> spec 을 tasks 로 나눠 구현하는 사람에게 체감돼요. 다섯 가지 모두 실사용 프로젝트에서 실제로 겪은 마찰이에요.

- **다음 task 가 의존을 지켜요.** `mark-task.sh --next` 가 `의존:` 을 무시하고 펜스 밖 첫 미완료 task 를 골라,
아직 안 끝난 task 에 기대는 일을 먼저 시작했어요. 이제 의존이 전부 `[x]`·`[~]` 인 첫 task 를 골라요
(`tasks-plan.sh` 와 같은 파서). 미완료가 전부 막혀 있으면 "끝났다" 가 아니라 `warning` 과 막힌 task ·
풀리지 않은 의존(없는 ID 는 따로)을 돌려줘요 — 완료 게이트로 잘못 넘어가지 않아요.
- **새 파일이 관례 위치로 가요.** `files:` 목록이 관례 위치(같은 레이어의 별도 하위 디렉토리)를 빠뜨리면,
구현자가 목록을 지키려고 새 타입을 목록 안 파일에 끼워 넣었어요. spec-tasks 는 새 파일 경로를 적기 전에 이웃을
grep 하고, 레인·위임 브리프는 "목록과 관례가 충돌하면 멈추고 보고" 를 실어요.
- **완료 전에 룰을 대조해요 (G7).** 위반된 룰(이름 룰, 레이어 룰)은 편집 때 훅이 실제로
매칭해서 안내했어요. 그런데 안내 훅은 룰 **경로**만 주고, `rule-read-gate.sh` 는 그 파일을 **읽었는지**만 봐요 —
읽은 룰을 지켰는지, 새 파일이 이웃 관례를 따랐는지는 아무도 대조하지 않았어요. 이제 새 컨텍스트의
`rules-auditor` 가 변경 파일마다 걸린 룰과 새 심볼의 이웃 관례를 대조해 `review-rules.md` 첫 줄에 verdict 를 쓰고,
완료 게이트가 G6 과 같은 필수 여부(size L 이상 · M×L3)로 읽어요.
- 편집 훅도 조금 더 줘요 — 세션에서 처음 매칭될 때 룰 파일 경로와 함께 룰 제목(`SP-…: …`)을 붙여요.
- **끝난 spec 에 후속 작업을 이어 열어요.** `reset-task.sh` 로 닫은 작업은 `--activate` 가 "작업이 없어요" 로 실패해
새로 열면 spec 연결이 끊겼어요. `update-task.sh --start --follow-up <spec>` 가 spec_id · spec_dir · spec_tier 를
이어받고 `follow_up_of` 를 남겨요.
- **합의 리뷰 상한에서 사용자가 승인할 수 있어요.** 상한에 닿은 뒤 남은 차단이 기계적 수정뿐이어도 진행하려면
intent_notes 에 손으로 적어야 했고, `--status` 는 그걸 몰라 pass 가 안 됐어요. `spec-review.sh --override --reason`
이 지금 sha 에 누가 · 언제 · 왜 를 `review-override.md` 로 남기고 `--status` 가 그걸 인정해요. 본문을 또 고치면 풀려요.

## 바뀐 것

- `common.sh` `goax_tasks_parse` — tasks.md 실행 그래프 파서 하나 (`tasks-plan.sh` · `mark-task.sh --next` 공용).
`의존:` 줄은 T-ID 만 읽고, T-ID 가 없는 다른 표기는 풀리지 않는 의존으로 남겨요 (오타가 "의존 없음" 으로 통과하지 않게). `없음 (첫 task)` 처럼 없음·none·- 뒤에 설명을 붙인 건 의존 없음이에요
- `tasks-plan.sh` — 의존이 `[~]` 보류여도 풀린 걸로 봐요 (`--next`·G1 과 같은 기준)
- `mark-task.sh --next` — 의존 판정 · 전부 막힘이면 `status: warning` · `result.blocked` · `blocked_tasks[]`
- `rules-audit-scope.sh` (신규) — 변경 파일마다 걸린 spirit·모듈 룰(편집 훅과 같은 매칭 함수) · 상시 룰 · 새 파일
- `agents/rules-auditor.md` (신규) · `tasks-gate.sh` G7 (`rules_review_required` · `rules_review_verdict`)
- `agents/evaluator.md` — 구현 리뷰의 "하지 않는 것": 이름·패키지 관례 대조는 rules-auditor 범위
- `spec-implement` — §1 막힘 처리 · §3.3 위임 브리프 · §8.1.5 룰 대조 · 절대 금지 2줄
- `spec-tasks` · `lane` §10 브리프 · `agents/lane-worker.md` — 관례 위치 / 충돌 시 멈추고 보고
- `update-task.sh --follow-up` · `triage` 사용법 한 줄 · 없는 작업 에러가 `--follow-up` 을 알려줘요
- `spec-review.sh --override --reason` (상한 도달 전·사유 없음은 거부, `--dry-run` 무기록) · `spec-validate` 상한 절
- `pre-edit/spirit-rules-inject.sh` — 경로와 함께 룰 제목 (파일당 15줄, 세션당 처음만)
- `subagent-start/harness-pointer.sh` — rules-auditor 는 자기 에이전트로 제외

## 검증

- smoke §65 — `--next` 의존·막힘·T-ID 없는 의존 · 관례 위치 문구 4곳 · rules-audit-scope 범위 · G7 없음/보강/진행 ·
rules-auditor 배선 · 훅의 룰 제목 · `--follow-up` 상속·거부 · `--override` 상한 전/사유 없음/dry-run/sha 고정
- smoke §29(G6) fixture 는 G7 진행 파일을 같이 둬요
1 change: 1 addition & 0 deletions changelog/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

## 버전

- [0.7.10](0.7.10.md) — `--next` 가 `의존:` 을 봐요 · 완료 전 룰 대조(G7 · `rules-auditor`) · 관례 위치 · 끝난 spec 후속 작업(`--follow-up`) · 합의 리뷰 상한의 사용자 승인(`--override`)
- [0.7.9](0.7.9.md) — 레인이 보고·검증 뒤 스스로 정리돼요 (`TaskStop` · `ListAgents` 대조) · 레인은 브리프가 허락한 외부 쓰기만 · 종료 응답은 객체로
- [0.7.8](0.7.8.md) — 화면을 만들고 재고 고친 뒤에만 보여주는 `screen` skill · `screen-designer` (외부 도구 없이도, 게이트 20개를 숫자로)
- [0.7.7](0.7.7.md) — 병렬 작업이 서로 상태를 덮지 않아요 (`.ax/tasks/`) · 스킬 description 을 발동 조건만으로 · 훅 출력 10,000자 상한 · 에러가 다음 할 일을 알려줘요
Expand Down
3 changes: 2 additions & 1 deletion evals/doctor-i6/scaffold.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ python3 - <<'PY'
import re
p='AGENTS.md'; s=open(p).read()
start=s.index('🔴 **`AX:CRITICAL:001`**')
end=s.index('> ⚠ hook 파일을 아직 못 만들었으면')
# 안내 줄의 이모지는 바뀌어요(⚠ → ❗) — 문구로 찾고 그 줄 처음부터 잘라요
end=s.rindex('\n', 0, s.index('hook 파일을 아직 못 만들었으면')) + 1
rule=('🔴 **`EVL:CRITICAL:001`** 사용자 노출 카피 안전선을 어기지 않는다\n'
'- enforced_by: external:vitest\n'
'- enforced_kind: test\n\n')
Expand Down
8 changes: 6 additions & 2 deletions skills/lane/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,10 @@ bash .ax/scripts/bash/tasks-plan.sh --spec "$SPEC" --json
`grep` 하고 결과를 보고에 포함하세요.
- **공유 이름을 바꾸면 즉시 보고하세요.** props 이름·타입 축·토큰 이름을 바꾸는 건
파일 안의 일이 아니라 레인 밖의 일이에요.
- **소유 목록과 레포 관례가 충돌하면 멈추고 보고하세요.** 새 타입의 이웃 관례가 별도 파일·별도
위치(같은 레이어의 하위 디렉토리 등)인데 그 경로가 목록에 없으면, 목록 안 파일에
끼워 넣지 말고 `관례 충돌 — <새 타입>, 이웃 관례 <경로 2개>, 필요한 파일 <경로>` 로 보고해요.
목록은 코디네이터가 늘려요.
- **보고는 한 번, 한 경로로.** 도구 목록에 `SendMessage` 가 있는지로 경로가 정해져요.
- 없으면(서브에이전트): **결과를 최종 메시지에 전부 담으세요.** 최종 응답이 유일한 산출물
경로예요. 파일을 다 만들고 idle 이 되는 건 완료가 아니에요.
Expand Down Expand Up @@ -336,7 +340,7 @@ bash .ax/scripts/bash/tasks-gate.sh --spec "$SPEC" --json
레인 모드에선 원장도 봐요 — `dispatched_unreported`(보고 안 받은 디스패치)와
`done_without_report`(보고 없이 켜진 체크박스)가 비어야 해요. 레인이 자기 체크박스를 켜면
여기서 잡혀요. 그리고 size L 이상 · M×L3 이면 새 컨텍스트 evaluator 의 `review.md`
첫 줄이 `verdict: 진행` 이어야 `complete` 예요 (G6). 체크박스를 채운 세션이 검사까지
첫 줄이 `verdict: 진행` 이어야 `complete` 예요 (G6). 룰 대조 `review-rules.md`(rules-auditor)도 같아요 (G7). 체크박스를 채운 세션이 검사까지
하면 게이트가 아니라 자기보고라서요.

### 12.2 통합 검증 — 파일이 안 겹쳤다고 합쳐서 도는 건 아니에요
Expand All @@ -358,7 +362,7 @@ bash .ax/scripts/bash/status-note.sh --show --json | jq -r '.result.sections.ren

## 13. 알려진 제약 — 이걸 모르면 게이트가 조용히 헛돌아요

- **`tasks-plan.sh` 는 의존 키워드를 한글 `의존:` 로 하드코딩해요** (`tasks-plan.sh:83`).
- **`tasks-plan.sh` 는 의존 키워드를 한글 `의존:` 로 하드코딩해요** (`common.sh` 의 `goax_tasks_parse`).
`deps:`·`depends:` 는 안 읽혀요. "의존 없음"으로 인정되는 값은 `없음`·`none`·`-`
뿐이에요. 다른 표기는 그 이름의 task 에 의존하는 걸로 읽혀서 영원히 blocked 가 돼요.
- **파일 겹침 검출은 task 줄에 파일 경로가 실제로 적혀 있어야 성립해요.** `files:` 가
Expand Down
Loading
Loading