Skip to content

feat(tasks): 병렬 작업이 서로 상태를 덮지 않아요 · 스킬 description 정비 · 훅 출력 상한 (v0.7.7) - #39

Merged
bluecheat merged 11 commits into
mainfrom
feat/tasks-per-task-state
Oct 3, 2026
Merged

bluecheat merged 11 commits into
mainfrom
feat/tasks-per-task-state

Conversation

@bluecheat

Copy link
Copy Markdown
Owner

릴리즈 노트: changelog/0.7.7.md

묶은 것

  • .ax/current-task.json 이 작업 하나만 담아요 — 병렬 작업이면 서로 덮을까 봐 갱신을 포기해요 #34 작업별 상태 — .ax/tasks/<task_id>.json + current-task.json 은 지금 작업 사본·handoff. update-task.sh --task/--activate, reset-task.sh --task, 완료 게이트·G6·session-brief 가 병렬 작업을 봐요. 독립 리뷰(HIGH 2 · MEDIUM 2 · LOW 5) 전부 반영
  • 스킬 트리거 튜닝 — 15개 description 을 발동 조건 + 형제 스킬 안내로만, vendor 는 disable-model-invocation, evals/trigger/ 16케이스 (1회 실행 16/16)
  • 훅 출력 예산 — goax_cap_context (8,000바이트, UTF-8 경계), asyncRewake 는 검토 후 보류
  • 컨텍스트 엔지니어링 — 서브에이전트 보고 길이 예산, 스크립트 에러 메시지 12곳에 다음 행동

검증

  • smoke 803 통과 (macOS bash 3.2)
  • §61 작업별 상태 16건 · §62 훅 출력 예산

Closes #34

🤖 Generated with Claude Code

https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt

bluecheat and others added 11 commits October 3, 2026 23:50
Claude Code 는 훅의 additionalContext·stdout 이 10,000자를 넘으면 파일로 빼고 앞 2,000자만
보여 주고, 그 파일을 읽으라고 하지 않아요. 주입 훅이 먼저 줄이게 공용 함수 하나를 둬요.

- common.sh goax_cap_context [max] [where] — 바이트 예산(기본 GOAX_CONTEXT_MAX=8000),
  UTF-8 글자 중간에서 안 끊고, 가까운 줄바꿈에서 끊고, "… N바이트·M줄 생략 — <볼 곳>" 꼬리
- lint-changed: cut -c/head -c(한글을 반으로 자르던 것) → goax_cap_context 3000 + 전체 상한
- module-rules-inject · spirit-rules-inject · harness-pointer · session-start 브리핑 중계: 전체 상한
- block-destructive · block-hook-bypass · destructive-facts: 막을 때 되돌려 주는 명령 원문은 앞 600바이트만
- smoke §61: 50KB lint 출력 · 모듈/룰 300개 · 50KB 브리핑 · heredoc 50KB 명령으로 상한·유효 JSON·
  깨진 글자 없음 확인, additionalContext 를 내는 훅이 헬퍼를 안 거치면 실패
- async/asyncRewake 는 쓰지 않아요 (CLAUDE.md 에 이유)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
lane-scout · lane-worker · evaluator · architect 가 돌려주는 보고(또는 리뷰 파일)에 길이 예산을 둬요.
탐색에 수만 토큰을 써도 코디네이터 컨텍스트에 남는 건 보고뿐이고, 레인 여럿의 보고가 한곳에 쌓여요.
코드·diff·로그 본문은 붙이지 않고 <파일>:<줄> 포인터로, 출력은 주장을 받치는 마지막 몇 줄만.
팀원 SendMessage 규약(한 메시지 ≤ 약 3,000자, 최종 응답 한 줄)과 리뷰어의 한 줄 반환은 그대로예요.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
… 덮지 않아요

current-task.json 이 작업 하나만 담아서, 병렬로 작업 둘이 돌면 한쪽의 update-task 가 다른 쪽 상태를 덮었고
에이전트는 그게 두려워 갱신을 포기했어요 — HUD 와 완료 게이트가 실제 진행과 어긋났어요 (#34).

- 작업별 원본 `.ax/tasks/<task_id>.json`. current-task.json 은 지금 작업의 사본 + handoff 라 읽는 쪽은 그대로예요
- update-task.sh `--task <id>`: 그 작업 파일만 갱신하고, 지금 작업이 아니면 current-task.json 은 손대지 않아요.
  `--start` 로 새 작업을 열어도 앞 작업은 자기 파일에 남고, `--task <id> --activate` 로 돌아가요.
  옛 형식(작업 파일 없음)은 첫 갱신에 옮겨요. 락 순서는 current-task.json → 작업 파일로 고정
- reset-task.sh `--task <id>`: 그 작업 파일을 지우고, 지금 작업일 때만 current-task.json 을 idle 로
- spec-completion-gate: 진행 중 작업 전부의 spec 을 봐요 (스테이지 파일과 무관한 spec 은 한 줄)
- session-brief: 다른 진행 중 작업과 돌아가는 명령을 알려요 (other_tasks)
- spec-implement 는 진입 때 잡은 작업 id 를 --task 로 넘겨요 · triage 에 병렬 작업 안내
- .gitignore 템플릿 · doctor-scan 기대 목록에 .ax/tasks/ · 문서 (scripts/hooks README · state-ownership · CLAUDE.md)
- smoke §61 10건

Closes #34

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
…ndor 로만

- 15개 skill description 에서 절차 요약(스크립트 이름·단계·G1~G6·id 형식)을 빼고
  "언제 쓰나 + 트리거 + 안 쓰는 경우(형제 skill)" 만 남겨요. 요약이 있으면 모델이
  본문 대신 description 만 따라가요
- 겹치는 이웃(triage·spec·spec-tasks·spec-implement·spec-validate·lane·audit·mistake·
  doctor·up·onboarding·zero)마다 근접 표현을 어느 skill 이 받는지 적었어요
- vendor 에 disable-model-invocation: true — 저장소에 파일을 한꺼번에 쓰는 일이라
  '/vendor' 직접 입력으로만 돌고 skill 목록에서 빠져요. /goax 인덱스·README 도 맞췄어요
- description 합계 4,687자 → 4,010자 (목록에 실리는 양 3,819자)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
- evals/trigger/<case>/case.yaml 한 파일에 프롬프트·grader. fires-<skill>(min 1) 과
  not-<이웃>(min 0 · max 0 · arm both) 으로 근접 표현을 가려요
- scaffold·hook shim 없이 allowed_tools [Skill] 만 — hook 이 아니라 description 을 재요
- 첫 실행(--runs 1 · --ablation none): 16/16 통과, $2.57, 67초
- evals/README 의 기본 실행은 --tag hooks 로 행동 케이스만 고르게 바꿨어요

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
"spec not found" · "file not found" · "jq 미설치" 처럼 무엇이 틀렸는지만 말하던 에러 12곳이
다음에 돌릴 명령이나 볼 파일을 같이 말해요. 모델이 에러를 받고 추측 대신 바로 다음 행동을 해요.

- add-spec-files · check-spec-clarity: 없는 spec/파일 → ls .ax/docs/spec/ · spec skill · --spec <id>
- tasks-plan · lanes-hotfiles: tasks.md 없음 → spec-tasks 또는 add-spec-files.sh --add tasks (텍스트 경로도 한글로 통일)
- init-spec-dir: 템플릿 없음 → /up · 이미 있음 → next-spec-num.sh --reserve · 필수 템플릿 누락 → /up · check-templates-drift.sh
- init-mistake-file: 템플릿 없음 → /up
- install-git-hooks: git 저장소 아님 → git init
- triage-search: 빈 키워드 → --keywords 예시
- check-rule-enforcement · check-sensor-liveness · register-spirit-hook: jq 설치 명령
- ade-settings: 병합 실패 → --check --json · next-spec-num: 텍스트 경로도 ls -ld 안내

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
…재시작 · 오래 멈춘 작업

- update-task: 진행 중 작업이 여럿인데 --task 가 없으면 덮지 않고 되물어요 · 같은 id 로 --start 거부 ·
  작업 id 형식 검증(파일 이름이 돼요) · --dry-run 도 대상 작업을 확인
- spec · spec-tasks · spec-validate · triage(friction·plan_doc·intent) 가 --task 를 넘겨요. triage 작업 id 는 4hex
- tasks-gate G6: spec 을 맡은 작업(.ax/tasks/*.json 포함)의 size×risk 로 evaluator 필수 판정 — 지금 작업이 바뀌어도 안 빠져요
- GOAX_TASK_TTL_DAYS(기본 7일) 넘게 멈춘 병렬 작업은 완료 게이트에서 빼고 session-brief 가 정리를 권해요
- reset-task --task 가 다음 옵션을 삼키지 않고, 작업 파일 락 실패는 오류로
- hooks README: Stop 게이트가 지금 작업만 보는 이유 · smoke §61 6건 추가

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
… 파이프 없이 바이트 단위로 잘라요

`printf | head -c` 는 head 가 먼저 끝나면 printf 가 SIGPIPE 를 받아 stderr 에 write error 를 남겨요.
로컬(macOS)에선 타이밍상 드물게, CI(macOS·ubuntu)에선 매번 smoke §62 를 깨뜨렸어요.
C 로케일 서브셸의 `${s:0:k}` 로 잘라 파이프를 없앴어요.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MW9uw5kSzPQhuMePpnsJYt
@bluecheat
bluecheat merged commit 824e090 into main Oct 3, 2026
2 checks passed
@bluecheat
bluecheat deleted the feat/tasks-per-task-state branch October 3, 2026 15:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.ax/current-task.json 이 작업 하나만 담아요 — 병렬 작업이면 서로 덮을까 봐 갱신을 포기해요

1 participant