원클릭으로
agile-plan
프로젝트 목표 + 설계 문서(objective.md)를 JTBD 기반 Q&A로 생성하고, 실행 전 검토 가능한 플래닝 세션을 초기화합니다.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
프로젝트 목표 + 설계 문서(objective.md)를 JTBD 기반 Q&A로 생성하고, 실행 전 검토 가능한 플래닝 세션을 초기화합니다.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | agile-plan |
| description | 프로젝트 목표 + 설계 문서(objective.md)를 JTBD 기반 Q&A로 생성하고, 실행 전 검토 가능한 플래닝 세션을 초기화합니다. |
| user-invocable | true |
| argument-hint | {프로젝트 목표 | --doc 파일경로 | --resume AGI-NNN} [--return-to parent/step] [-a|--auto] |
목적: $mst:agile-plan(Codex) 또는 /mst:agile-plan(Claude)으로 JTBD + 프로젝트 DoD 중심의 objective.md를 생성한다. 이 스킬은 플래닝 전용이며 Story 생성/실행은 담당하지 않는다.
In Codex, explicit $mst:agile-plan invocation is the command identity for this skill and is equivalent to the Claude-facing /mst:agile-plan command. Once $mst:agile-plan or /mst:agile-plan is present in the raw request, keep that identity fixed through Exit.
이 스킬 실행 중 Write/Edit 도구를 사용할 수 있는 경로는 아래만 해당합니다:
{PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/objective.md (신규 생성){PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/details/*.md (신규 생성){PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/draft/objective.md (staged draft){PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/draft/details/*.md (staged draft){PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/clarification-context.md{PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/clarification-questions.md{PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/round-history.md{PROJECT_ROOT}/.gran-maestro/agile/AGI-*/objective/adversarial-review-findings.md (review transcript only; canonical JSON sidecar는 managed command 사용){PROJECT_ROOT}/.gran-maestro/agile/AGI-*/quality-gate-log.md{PROJECT_ROOT}/.gran-maestro/agile/AGI-*/auto-decisions.md{PROJECT_ROOT}/.gran-maestro/state/{MST_SESSION_ID}/snapshot.json (agile init이 반환한 mst_session_id, 상속된 MST_SESSION_ID, 또는 동일한 structured context로 기록되는 상태 파일)그 외 모든 경로에 대한 Write/Edit 사용은 금지합니다.
mst.py 명령을 통해 수행한다.위 allowlist는 PM/에이전트의 직접 Write/Edit 도구 사용에만 적용한다. 아래 산출물은 직접 생성하지 말고 반드시 mst.py managed command를 통해 생성/갱신한다.
| 산출물 | 생성/갱신 경로 | 실패 시 처리 |
|---|---|---|
objective.ids.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} 또는 agile detail generate-anchors --details-dir ... | completion blocker |
handoff-manifest.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | missing_context / completion blocker |
adversarial-review-findings.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | completion blocker |
finding-trace.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | completion blocker |
section-review-inventory.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | completion blocker |
d3-findings.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | completion blocker |
reference-links.json | python3 {PLUGIN_ROOT}/scripts/mst.py agile sidecar-build {AGI_ID} | explicit skip reason 또는 fail_reference_handoff |
state/{MST_SESSION_ID}/snapshot.json | MST_SESSION_ID=... python3 {PLUGIN_ROOT}/scripts/mst.py state set ... | structured non-success |
.gran-maestro/references/REF-*/ | python3 {PLUGIN_ROOT}/scripts/mst.py reference add ... | NO_REFERENCE / missing_context |
| DoD status marker 및 changelog | python3 {PLUGIN_ROOT}/scripts/mst.py agile objective-transition ... | 전이 거부 |
managed command가 없거나 실패한 산출물을 직접 Write/Edit로 우회 생성하지 않는다. 실패는 해당 command 출력, sidecar schema validation, 또는 explicit skip reason으로 남긴다.
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/draft/ 아래 staged draft로 materialize한다.objective.md와 objective/details/*.md는 mandatory gate가 모두 통과한 뒤에만 promote한다.objective-snapshot, objective-transition, sidecar-build, objective-check 순서로 completion evidence를 재계산한다.mst.py agile init으로 AGI 세션을 생성한다.--doc 미지정 시 1A(Q&A 생성 모드), 지정 시 1B(문서 파싱 모드)로 분기한다.templates/objective.md 포맷으로 objective.md 저장 완료mst.py agile update {AGI_ID} --status active --objective-version 1 --json 완료MST_SESSION_ID={MST_SESSION_ID} python3 {PLUGIN_ROOT}/scripts/mst.py state set --skill agile-plan --step 3 --total 3 [--return-to ...] 기록 완료 (MST_SESSION_ID는 Step 0의 agile init 출력에서 확보하거나 현재 세션에서 상속됨)--return-to가 있으면 stop-hook continuation guard로 상위 스킬 복귀(re-feed), 없으면 독립 실행을 종료하고 --resume 안내다음 단계 실행 명령: 블록으로 끝난다.
--return-to 존재: 자동 복귀가 정상 경로임을 밝히고, 수동 fallback 명령으로 /mst:resume --wakeup-hint stop-recover를 마지막에 출력한다.--return-to 없음: /mst:agile --resume AGI-NNN을 마지막에 출력한다.경로 규칙 (MANDATORY): 이 스킬의 모든
.gran-maestro/경로는 절대경로로 사용합니다. 스킬 실행 시작 시PROJECT_ROOT를 취득하고, 이후 모든 경로에{PROJECT_ROOT}/접두사를 붙입니다.PROJECT_ROOT=$(pwd)
{PLUGIN_ROOT}는 이 스킬의 "Base directory"에서skills/{스킬명}/을 제거한 절대경로입니다. 상대경로(.claude/...)는 절대 사용하지 않습니다.
이 프로토콜은 이 스킬 아래의 모든 provider 실행 예시보다 우선한다. provider 작업을 시작하기 전에 parent host가 route와 lifecycle evidence를 소유하고, child는 실제 할당 작업만 수행한다.
python3 {PLUGIN_ROOT}/scripts/mst.py host context --json을 실행하고 JSON의 host를 읽는다. 이 호출 실패, 잘못된 JSON, 알 수 없는 host는 임의 추정하지 말고 blocked로 종료한다.
이어서 반드시 아래 중앙 planner를 호출한다. {scope}는 현재 작업의 실제 scope(implementation, review, exploration, ideation, discussion, debug, analysis)이고, {provider}는 선택된 codex | claude | agy다.
python3 {PLUGIN_ROOT}/scripts/mst.py delegation route \
--host "{host}" \
--provider "{provider}" \
--scope "{scope}" \
--capability-status "{available|unknown|unavailable}"
route 결과 외의 근거로 transport를 바꾸지 않는다.
route=native_candidate: 같은 host/provider의 native bridge만 사용한다. handshake_required=true이면 실제 host tool 가용성을 확인한 뒤 진행한다.route=external: 이 경우에만 아래에 남아 있는 managed wrapper, dispatch build, provider CLI adapter 예시를 사용할 수 있다.route=blocked, CLI non-zero, lifecycle 응답의 status=blocked, 또는 현재 attempt의 phase=reconciling: 즉시 fail closed 한다. 같은 task/worktree에 새 agent나 external process를 시작하지 않는다.native_candidate 실행과 evidenceNative spawn 전 parent가 delegation start를 호출하고 반환된 attempt_id를 이후 모든 CAS 호출에 사용한다. start는 lifecycle 준비만 하며, 신규 응답이나 exact replay 모두 그 자체로 spawn 권한을 주지 않는다(spawn_allowed=false).
python3 {PLUGIN_ROOT}/scripts/mst.py delegation start \
--task-id "{task_id}" \
--idempotency-key "{task_id}:start:{stable_key}" \
--host "{host}" \
--provider "{provider}" \
--capability-status available \
--route-reason "{route.reason_code}" \
--worktree-dir "{worktree_path}" \
--model "{model}" \
--scope "{scope}" \
--prompt-file "{prompt_file}" \
--output-path "{output_path}"
analysis|review|exploration|ideation|discussion|debug가 실제 read-only 작업이고 별도 linked worktree를 쓰지 않는 경우에만 --read-only를 추가한다. 구현·수정 작업에는 이 예외를 사용하지 않는다.
그 다음 parent invocation별 고유한 {claimant_id}로 single-use spawn claim을 요청한다. 오직 이 호출에서 spawn_allowed=true와 non-empty private claim_token_file을 함께 받은 단 한 caller만 native host tool을 한 번 호출할 수 있다. raw bearer token은 CLI JSON, argv, process listing, tool transcript, child prompt에 노출하지 않는다.
python3 {PLUGIN_ROOT}/scripts/mst.py delegation claim-spawn \
--task-id "{task_id}" \
--attempt-id "{attempt_id}" \
--claimant-id "{claimant_id}" \
--idempotency-key "{task_id}:claim:{claimant_id}"
spawn_allowed=false, claim_status=claim_replay|already_claimed|reconciling|provider_task_in_flight|terminal, 빈 claim_token_file, 또는 claim 응답 유실/불명확 상태에서는 host tool을 호출하지 않는다. claim_replay|already_claimed는 winner의 claim lease가 살아 있는 동안 wait만 하며 recover/cancel로 ownership을 빼앗지 않는다. lease 만료 뒤에만 delegation recover로 reconcile하고, 그 외에는 next_action에 따라 기존 provider task에 attach/wait한다. claim exact replay는 bearer token/파일을 다시 발급하지 않는다. 따라서 claim 결과를 잃은 caller도 외부 fallback이나 중복 native spawn을 시도하지 않는다.
host=codex, provider=codex: Codex collaboration native tools를 사용한다. collaboration.spawn_agent로 spawn하고, host가 제공하는 attach/follow-up 수단으로 같은 task에 연결하며, collaboration.wait_agent로 대기한 뒤 전달된 completion result를 수집한다. 병렬 fan-out은 독립 task마다 native agent를 하나씩 spawn한다.host=claude, provider=claude: Claude의 Task(...) 또는 Agent(...) native tool로 spawn한다. background task는 host의 TaskOutput/resume 결과로 대기·수집한다.codex exec, claude CLI, mst.py run --provider {same_provider}, 같은 provider의 managed wrapper, 또는 nested /mst:claude//mst:codex를 호출하지 않는다.Native tool 응답마다 claim winner parent가 다음 순서로 evidence를 기록한다. {claim_token_file}은 winner 응답의 mode 0400 private one-shot handle이며 acknowledge 성공 시 삭제된다. 내용을 읽거나 복사하거나 child/user/log에 전달하지 않는다. 각 명령의 JSON 응답에서 status/phase를 확인하고 blocked/reconciling이면 더 진행하지 않는다.
delegation acknowledge --task-id "{task_id}" --attempt-id "{attempt_id}" --claim-token-file "{claim_token_file}" --spawn-status created_with_task_id --provider-task-id "{provider_task_id}" --idempotency-key "{task_id}:ack:{stable_key}"delegation attach --task-id "{task_id}" --attempt-id "{attempt_id}" --attach-status attached --idempotency-key "{task_id}:attach:{stable_key}"delegation heartbeat --task-id "{task_id}" --attempt-id "{attempt_id}" --provider-state running --idempotency-key "{task_id}:heartbeat:{sequence}"{output_path}의 sibling temp file에 먼저 쓰고 atomic replace한 뒤, fresh hash/size를 확인한다. child에게 이 파일 쓰기를 맡기거나 기존 파일을 재사용하지 않는다.delegation complete --task-id "{task_id}" --attempt-id "{attempt_id}" --completion-signal "{succeeded|failed|timeout|unknown}" --output-path "{output_path}" --idempotency-key "{task_id}:complete:{stable_key}"Native spawn이 task 생성 전에 명확히 실패한 경우에만 claim winner가 같은 --claim-token-file "{claim_token_file}"로 spawn-status=definitive_not_created를 acknowledge한 뒤 delegation fallback --expected-attempt-id "{attempt_id}" ...를 요청할 수 있다. 그 후 capability를 unavailable로 route planner에 다시 전달해 route=external을 받은 경우에만 external lane을 실행한다. claim 결과 유실, accepted, task ID 발급, attach 실패/timeout, child 실패, unknown/indeterminate 결과 뒤에는 external fallback을 금지하고 reconcile 상태를 유지한다.
route=external 판정만으로 provider command를 직접 만들지 않는다. Fresh headless/cross-provider external lane은 command 생성 전에 중앙 planner 결과를 state에 고정한다.
python3 {PLUGIN_ROOT}/scripts/mst.py dispatch authorize-external \
--provider "{provider}" \
--task-id "{task_id}" \
--prompt-file "{prompt_file}" \
--worktree-dir "{worktree_path}" \
--running-log-path "{running_log}" \
--trace-path "{trace_path}" \
--output-path "{output_path}" \
--model "{model}" \
--scope "{scope}" \
--idempotency-key "{task_id}:external-authorize:{stable_key}" \
{read_only_flag}
이 명령은 실제 host를 다시 확인하고 중앙 route가 여전히 external일 때만 current external attempt와 model/running/trace/output binding을 저장한다. 구현·수정 lane은 registered linked worktree를 사용하고 {read_only_flag}를 비운다. 실제 read-only scope만 --read-only를 사용한다. 반환된 attempt_id와 동일한 artifact binding을 external wrapper에 전달한다.
python3 {PLUGIN_ROOT}/scripts/mst.py dispatch build \
--provider "{provider}" \
--task-id "{task_id}" \
--prompt-file "{prompt_file}" \
--worktree-dir "{worktree_path}" \
--log-file "{running_log}" \
--model "{model}" \
--expected-attempt-id "{external_attempt_id}"
Native definitive non-creation fallback이면 새 authorization을 만들지 않고 delegation fallback이 반환한 external attempt_id를 --expected-attempt-id로 사용한다. Builder는 current attempt의 task/provider/resolved worktree/prompt hash/route를 재검증하므로 native, reconciling, stale attempt, 또는 mismatch 상태에서는 command를 만들지 않는다. Codex/Claude 보호 wrapper는 provider command나 split claim/finalize shell을 포함하지 않고 dispatch run-external 단일 감독자만 호출한다. 감독자는 먼저 side effect가 없는 anonymous exec gate를 띄워 PID/PGID/start identity를 CAS로 attach하고, 같은 task lock 안에서 취소보다 먼저 exec 권한이 확정된 경우에만 실제 provider를 release한다. claim에서 캡처한 정확한 prompt bytes를 stdin으로 전달하고, provider process group을 회수한 뒤 fresh single-link inode로 claim해 계속 보유한 non-following output descriptor로 결과를 게시한다. prompt/snapshot/running/trace/output alias와 MST state·lock·history reserved path alias는 provider spawn 전에 차단한다. claim-external/heartbeat-external/finalize-external을 별도로 호출하거나 prompt snapshot/output pathname을 shell에서 다시 열지 않는다. Prompt 본문·snapshot path·claim secret·descriptor number는 argv/state/history에 확장하지 않는다.
모든 native child prompt에는 다음 제약을 그대로 포함한다.
DELEGATION BOUNDARY (MANDATORY)
- Complete the assigned task yourself; do not delegate or spawn another provider agent.
- Do not invoke codex/claude provider CLIs, /mst:codex, /mst:claude, or a same-provider managed wrapper.
- Do not call `mst.py delegation` lifecycle commands and do not edit `.gran-maestro/run`, session, or history state; the parent owns routing and evidence.
- Work only in the assigned worktree/scope and return the result/evidence to the parent.
아래 skill별 dispatch 예시는 이 protocol의 route로 gate한다. Provider CLI/managed wrapper 예시는 오직 route=external일 때만 사용한다. Task/Agent/Codex collaboration 예시는 host와 provider가 일치하는 route=native_candidate일 때만 사용하고 child boundary와 native lifecycle evidence를 함께 적용한다.
사용자 입력이 필요한 지점에서는 host별 질문 도구를 직접 판단하지 말고 question prepare를 먼저 호출한다. 이 규칙은 기존 AskUserQuestion 직접 호출 지시보다 우선한다.
templates/question-payload.schema.json을 따른다.python3 {PLUGIN_ROOT}/scripts/mst.py question prepare \
--skill {CURRENT_SKILL} \
--step "{CURRENT_STEP}" \
--resume-skill {CURRENT_SKILL} \
--resume-args "{RESUME_ARGS}" \
--payload-file {QUESTION_PAYLOAD_JSON} \
--json
mode=claude_tool: 반환된 payload로 AskUserQuestion을 호출한다.mode=pending_artifact: 반환된 user_message를 사용자에게 보여주고 종료한다. 이 상태는 정상적인 사용자 입력 대기이며 임의 중단이 아니다.mode=auto_decision: AUTO_MODE=true 경로로 질문 없이 계속하거나 blocker를 기록한다.AskUserQuestion을 직접 호출하지 않는다. pending question은 .gran-maestro/questions/Q-*.json에 저장되고 /mst:resume --answer Q-...로 재개한다.question prepare가 기록한 awaiting_user_input 상태와 payload hash가 일치할 때만 허용된다.[MST skill=agile-plan step=0/3 return_to={RETURN_TO_OR_NULL}]
| 플래그 | 설명 | 예시 |
|---|---|---|
--doc 파일경로 | 기존 문서 파싱 모드 | --doc docs/spec.md |
--resume AGI-NNN | 기존 AGI objective 재진입/recall patch 모드 | --resume AGI-029 |
--return-to parent/step | 서브스킬 복귀 지점 | --return-to agile/1 |
-a, --auto | parent agile 자율 모드 상속 | --auto |
--return-to 미지정 시 독립 실행으로 간주 (return_to=null)--auto가 있거나 parent workflow state의 auto=true이면 AUTO_MODE=true로 고정한다. 이 값은 Step 0부터 Exit까지 유지하며 사용자 대기 질문을 생성하지 않는다.Entry mode는 아래 순서로 deterministic하게 해석한다. 뒤 단계는 앞 단계 결정을 override하지 못한다.
--resume AGI-NNN: 기존 session/objective/history를 로드하며 agile init을 실행하지 않는다. recall patch manifest가 있으면 이 resume context 안에서만 Step 1P로 진입한다.--doc 파일경로: --resume이 없을 때만 문서 파싱 모드(1B)를 선택한다.--resume과 --doc이 모두 없을 때만 Step 1A를 선택한다.--return-to: entry mode를 바꾸지 않는 exit routing only 값이다.--auto 또는 parent workflow auto=true: entry mode를 바꾸지 않는 interaction policy 값이다.충돌 해소 우선순위는 CLI flags > inherited workflow state > config defaults > prompt summary diagnostic-only이다. source precedence는 validated history ledger, validated state snapshot, prompt summary diagnostic-only 순서로만 읽으며 prompt summary는 canonical state를 만들거나 복구하는 source가 아니다.
상태 mutation에는 canonical MST_SESSION_ID/mst_session_id가 반드시 필요하다. canonical identity가 없거나 검증 실패하면 AGI/session/history/snapshot을 silent pass로 갱신하지 않고 structured non-success로 종료한다. Legacy-only input(MST_STATE_PPID, owner_ppid, owner_session_id, owner_pid, hook session_id, transcript UUID, MST_SNAPSHOT_SESSION_ID, sessionId, session_id)은 diagnostic-only이며 canonical fallback이 아니다.
Regression fixture matrix는 최소한 아래 조합을 포함한다.
$mst:agile-plan --resume AGI-NNN --doc spec.md --return-to agile/1 --auto(Codex) / /mst:agile-plan --resume AGI-NNN --doc spec.md --return-to agile/1 --auto(Claude): resume wins, doc ignored for mode, return-to is exit routing, auto only changes interaction policy.$mst:agile-plan --doc spec.md(Codex) / /mst:agile-plan --doc spec.md(Claude) with no canonical identity mutation request: doc mode wins over Q&A.auto=true without CLI --auto: AUTO_MODE=true, no AskUserQuestion wait.MST_SESSION_ID on state write: structured non-success, no snapshot mutation.이 preflight는 mst.py agile init, 파일 생성, state 기록, 에이전트 위임보다 먼저 수행한다.
$mst:agile-plan(Codex) 또는 /mst:agile-plan(Claude)로 확정된 경우, 이 정체성을 Exit까지 고정한다.$mst:agile-plan//mst:agile-plan 입력 본문에 현재 구현을 변경, 수정, 구현 변경, 개선, 리팩터링, 계획, 구현, 방향 같은 구현 변경 또는 계획 수립 표현이 있어도 $mst:plan//mst:plan, $mst:request//mst:request, 내장 plan mode로 재분류하지 않는다.EnterPlanMode를 호출하지 않고, transcript/tool-call/captured output에 Entered plan mode를 출력하지 않는다.--resume AGI-NNN이 있으면 agile init을 실행하지 않는다.
python3 {PLUGIN_ROOT}/scripts/mst.py agile status AGI-NNN --json으로 기존 session을 로드한다.AGI_ID, mst_session_id, objective version/history를 그대로 사용한다. 새 AGI를 만들거나 objective를 새 파일로 복사하지 않는다.MST_SESSION_ID는 session의 canonical mst_session_id 또는 상속된 structured context 값만 사용한다.--resume이 없을 때만 python3 {PLUGIN_ROOT}/scripts/mst.py agile init --steering-every 3 --json 실행agi_id를 파싱해 AGI_ID에 저장하고, mst_session_id를 파싱해 MST_SESSION_ID에 저장한다.mst.py state ... 호출은 아래처럼 동일한 canonical identity를 명시해 실행한다.
MST_SESSION_ID="{MST_SESSION_ID}" \
MST_CONTEXT_JSON='{"schema_version":1,"mst_session_id":"{MST_SESSION_ID}","root_mst_id":"{AGI_ID}"}' \
python3 {PLUGIN_ROOT}/scripts/mst.py state ...
[신규 세션] AGI-{NNN} 생성됨 (MST_SESSION_ID={MST_SESSION_ID}, 스티어링 설정은 agile에서 확정) 출력Step 0.0에서 command identity/no-plan-mode preflight가 이미 완료됐는지 확인한다. 완료되지 않았으면 Step 0.0으로 돌아가며, AGI/session/state side effect를 만들지 않는다.
원시 입력의 command identity가 $mst:agile-plan(Codex) 또는 /mst:agile-plan(Claude)로 확정된 경우, 이 정체성을 Exit까지 유지한다.
이 guard는 $mst:agile-plan//mst:agile-plan command identity가 확정된 요청에만 적용한다. 일반 $mst:plan//mst:plan 및 $mst:request//mst:request 요청의 command identity, 사용자 대면 라우팅, 산출물 절차는 변경하지 않는다.
$mst:agile-plan//mst:agile-plan 입력 본문에 현재 구현을 변경, 수정, 구현 변경, 개선, 리팩터링, 계획, 구현, 방향 같은 구현 변경 또는 계획 수립 표현이 있어도 $mst:plan//mst:plan, $mst:request//mst:request, 내장 plan mode로 재분류하지 않는다.
Claude Code 내장 plan mode로 진입하지 않는다. 어떤 단계에서도 EnterPlanMode를 호출하지 않고, transcript/tool-call/captured output에 Entered plan mode를 출력하지 않는다.
재현 fixture $mst:agile-plan 그럼 현재 구현을 변경하는 방향으로 수정해줘(Codex) 또는 /mst:agile-plan 그럼 현재 구현을 변경하는 방향으로 수정해줘(Claude)는 agile-plan 절차의 objective/agile planning 입력으로 먼저 처리한다.
입력 형식이나 필수 정보 부족으로 objective/agile planning 입력으로 수용할 수 없으면, agile-plan 응답 또는 산출물 안에 수용 불가 사유를 남기고 Step 0.5.2 또는 Step 0.5.3의 확인/후보 제시 절차를 따른다. 이 경우에도 다른 명령이나 내장 plan mode로 전환하지 않는다.
PM은 요청 텍스트를 읽고 아래 질문을 내부 판단한다.
confidence(0.0~1.0)를 산정한다.
기본 경로는 objective 생성이다. confidence가 낮을 때만 확인 질문을 수행한다.
[의도 확인: objective 생성으로 진행] 한 줄 통지를 출력한다.질문/선택지 표기 규칙 (MANDATORY):
A, B, C, 1, 2, 3, A1, B2α, β, γ, i, ii, iii, I, II, III이 요청을 objective 생성으로 진행할까요?objective 생성으로 진행다른 의도 설명objective 생성으로 진행이면 Step 1A로 진행한다.다른 의도 설명이면 Step 0.5.3으로 진행한다.AUTO_MODE=true에서는 AskUserQuestion을 호출하지 않는다. confidence가 낮으면 auto-decisions.md와 clarification-questions.md에 blocker를 기록하고 structured non-success로 종료하거나, Step 0.5.3 후보 제시를 사용자 대기 없이 산출물로만 남긴다.목적:
$mst:agile-plan//mst:agile-plan호출 자체는 objective 정의 의도 신호이지만, args 본문이 메타/질문이거나 0.5.2에서 "다른 의도"로 응답한 경우, 요청 동작을 먼저 수행한 뒤 objective 후보를 선제시한다.
[objective 후보] A. {후보1} B. {후보2} C. {후보3} 또는 [objective 후보] 1. {후보1} 2. {후보2} 3. {후보3}A., B., C., 1., 2., 3.처럼 쉬운 prefix와 의미 요약을 함께 사용한다. 그리스 문자·로마 숫자·bare prefix는 금지한다.AUTO_MODE=false: AskUserQuestion으로 후보 중 선택받거나 UI 자동 Other로 직접 objective 입력받아 Step 1A로 진입한다. "D. 종료" 선택지를 포함한다.AUTO_MODE=true: AskUserQuestion을 호출하지 않는다. 후보가 1개이고 objective 입력으로 충분하면 PM이 그 후보를 선택하고 근거를 auto-decisions.md에 기록한다. 후보가 2개 이상이거나 사용자 의존성이 있으면 clarification-questions.md에 blocker를 기록하고 structured non-success로 종료한다.[MST skill=agile-plan step=1/3 return_to={RETURN_TO_OR_NULL}]
--doc가 있으면 1B, 없으면 1A를 수행한다.
mst.py agile recall이 patch manifest를 전달한 경우에는 아래 규칙을 우선 적용한다.
version을 1 증가시키고 last_event_id, semantic_hash를 갱신한다..gran-maestro/agile/{AGI_ID}/objective/history/에 append-only Level 3 변경 로그를 추가하고 기존 엔트리는 수정하지 않는다.목표: JTBD 5개 질문과 프로젝트 단위 DoD/설계/제약 정보를 수집해 objective.md를 생성한다.
⚠️ 상세 보존 원칙 (CRITICAL — 전 Step 공통): 사용자가 대화 중 이야기한 모든 설계 내용, 결정 근거, 합의 사항, 프로세스 설명, 기술 선택, 구조 명세는 objective 산출물(objective.md + details/*.md)에 구체화·문서화되어야 한다.
- 사용자가 설명한 원본 설계는 요약/축약하지 않고 원본 이상의 구체성으로 details/에 기록한다.
- plan 모드처럼 Q&A 정보까지 포함하여 더 구체화된 형태가 되어야 한다.
- objective.md + details/ 하위 문서만으로 충분히 개발할 수 있는 기반이 되어야 한다.
- 대화에서 논의되었으나 산출물 어디에도 기록되지 않은 내용이 있으면 저장 전 보완 필수.
JTBD 직후 아래 항목을 점검한다. WHO/WHAT/WHY는 JTBD에서 이미 수집되므로 여기서 재질문하지 않는다.
운영 규칙:
프로젝트 NFR, 설계 결정, 프로젝트 완료 기준 섹션에 반영한다.목적: JTBD/DoD 초기에 PM 자기과신으로 사용자 목적·범위·우선순위의 빈칸을 자동 보완하는 것을 막는다. 이 게이트는 D3의 후반 명료도 검증과 별개로, 사용자에게 물어야 할 질문을 찾는 전방 안전망이다.
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/clarification-context.md에 저장한다. 포함 항목은 JTBD 5문항 답변, DoD 후보, 현재 제약/MoSCoW/NFR/리스크의 알려진 값과 미확인 값이다.Task/Agent, external route만 managed provider entrypoint를 사용한다. Native child prompt에는 DELEGATION BOUNDARY를 포함하고 아래 형식을 따른다.
역할: objective clarification adversary.
Read로 clarification-context.md를 로드하고, 사용자에게 물어야 하는 critical/major 모호성만 JSON findings로 반환하시오.
각 finding에는 severity, requires_user_answer, question, recommended_answer, recommendation_rationale를 포함하시오.
severity=critical|major 또는 requires_user_answer=true 항목은 PM이 자동 보완하지 않는다. 반드시 아래 Critical/Major Clarification Batch Rule로 처리한다.minor 항목은 PM이 objective 초안의 참고 리스크로 반영할 수 있지만, 사용자 의도·범위·우선순위에 영향을 주면 major로 승격한다.적용 범위: Step 1A.2.5, Step 1A.9 Strategic Review, Step 1A.9.7 적대적 검토, Step 1A.10.5 D3에서 발견된 사용자 의존 모호성.
severity=critical|major이거나 finding의 requires_user_answer=true인 항목은 PM이 추론 또는 자동 보완으로 닫을 수 없다.질문, PM 추천 답변, 추천 근거, 틀렸을 때 영향을 작성하고 {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/clarification-questions.md에 append한다.| ID | 확인할 모호성 | PM 추천 답변 | 추천 근거 | 틀렸을 때 영향 |
|----|---------------|--------------|-----------|----------------|
| CQ-1 | ... | ... | ... | ... |
AUTO_MODE=false: 배치당 확인 질문 1회만 실행한다. AskUserQuestion을 사용할 수 있으면 선택지는 최대 4개로 고정한다.
A. 추천안 모두 수락: 표의 모든 PM 추천 답변을 사용자 승인 결정으로 반영B. 일부만 수정: 사용자가 CQ-1=...; CQ-3=...처럼 수정할 수 있게 안내하고, 수정된 항목만 재반영C. 더 검토: 현재 배치 전체를 mst:discussion 또는 mst:ideation으로 보강한 뒤 같은 배치를 재질문D. 범위 제외/보류: 해당 항목을 Won't/No-go Scope 또는 리스크 레지스터에 기록AUTO_MODE=true: critical/major 사용자 의존 모호성이 남아 있으면 자율로 진행하지 않는다. auto-decisions.md와 clarification-questions.md에 blocker를 기록하고 objective 확정을 중단한다.A. 추천안 모두 수락을 선택한 경우에도 기록에는 (PM 추천 — 사용자 일괄 승인)으로 남긴다. PM 단독 결정으로 기록하지 않는다.아래 4단계를 순서대로 수행하고, 각 결과를 objective.md에 즉시 반영한다.
제약사항 수집
## 제약사항 (Out-of-scope / 기술 / 비즈니스)MoSCoW 우선순위 수집
## 우선순위 (MoSCoW)priority 마커 값에 우선순위를 연결한다.리스크 식별 + 의존성 확인
## 리스크 레지스터, ## 설계 결정 (Architecture Decisions)Reference Lookup Protocol 실행
## 참조 레퍼런스외부 의존성(라이브러리/API/프레임워크/버전/프로토콜) 판단이 포함되면 아래를 적용한다.
자동 트리거 게이트
Bash(python3 {PLUGIN_ROOT}/scripts/mst.py config get reference.auto_search)로 reference.auto_search 확인cache_ttl_days=2cutoff_threshold_months=0.5max_searches_per_step=5llm_auto_trigger=trueauto_fact_check=true키워드 감지
library/framework/api/sdk/protocol/version/dependency 및 한국어 동의어 감지llm_auto_trigger == true면 키워드 매칭 외에도 최신성 리스크가 있으면 검색 가능3단계 신선도 체크
mst.py reference search --keyword "{keyword}" --jsoncache_ttl_days 기준 fresh/stalecutoff_threshold_months 초과 시 expired검색 실행
stale/expired만 검색auto_search == true일 때만 WebSearch 실행auto_fact_check == true면 핵심 claim 1회 교차 검증REF 저장 (MANDATORY — WebSearch 실행 시 Bash 호출 필수)
Bash로 mst.py reference add를 호출해야 한다.content.md는 raw 발췌(원문 근거) 중심으로 남긴다.mst.py reference add 최소 N회 호출 (1:1 대응 원칙).python3 {PLUGIN_ROOT}/scripts/mst.py reference add --topic "{topic}" --url "{url}" --summary "{summary}" --content "{raw 발췌 본문}"summary는 한 줄 인덱스 유지).skills/plan/SKILL.md의 Reference Lookup Protocol 4번 항목을 동일 기준으로 따른다.컨텍스트 주입 블록 생성
[REFERENCE_CONTEXT]
current_date: {YYYY-MM-DD}
model_cutoff: {cutoff_date_or_unknown}
references:
- REF-001 (fresh|stale|expired) {topic} | {url}
[/REFERENCE_CONTEXT]
references: none아래 루프를 수행한다.
WHILE (사용자 종료 선언 전):
round += 1
현재 상태 요약 -> PM 개선안 제시 -> 사용자 피드백 수집(자연어 대화) -> 반영 -> 수렴 체크
END WHILE
라운드 운영 규칙:
http://{host}:{port}/agile/{AGI_ID}/objective[대시보드 변경 감지] {N}건의 수정 / {M}건의 코멘트가 있었습니다{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/round-history.md에 라운드 요약을 append한다.detail_content_buffer(메모리)에 도메인별로 축적한다.
AUTO_MODE=true: 자연어 사용자 대기, AskUserQuestion, "종료하시겠습니까?"류 확인 질문을 생성하지 않는다.
agile.objective_refinement.max_auto_rounds(기본 2)까지만 PM 자율 정제를 수행한다.clarification-questions.md와 auto-decisions.md에 blocker를 기록하고 structured non-success로 종료한다.auto-decisions.md에 근거를 기록하고 진행한다.AUTO_MODE=false: 사용자 대화 루프는 soft limit과 수렴 체크포인트를 반드시 적용하며, soft limit 도달 시에도 질문은 1회만 수행한다.각 라운드 종료 시 직전 라운드 대비 delta를 측정한다.
N_t: DoD 추가·삭제 건수 정규화 값E_t: DoD 본문 수정 건수 정규화 값S_t: 구조 변경 이벤트(순서 재배치, split/merge, 의존성 변경) 정규화 값P_t: 상태 변경/미해결 코멘트 영향도 정규화 값D_t = (N_t + E_t + S_t + P_t) / 4EMA3_t = alpha * D_t + (1 - alpha) * EMA3_(t-1) (alpha=0.5, 초기값=D_1)D_t <= convergence_threshold_abs (기본 0.12)EMA3_t <= convergence_threshold_trend (기본 0.18)<= 1coverage_ratio >= config.agile.coverage_threshold (기본 0.85) — --doc 모드 1A.10 직전 details/*.md 집합에 대해 python3 {PLUGIN_ROOT}/scripts/mst.py agile coverage-check {원본문서경로} --details-dir {details_dir}를 실행해 coverage 값을 사용한다. 이 조건이 미충족이면 다른 3개 조건이 통과해도 수렴 종료를 권장하지 않는다.[수렴 감지] 변경량이 임계값 이하입니다. 현재 상태로 확정할까요?soft limit:
soft_limit_rounds=8 (설정값이 있으면 우선 적용)round == soft_limit_rounds에 도달하면 합의사항/미해결 쟁점을 요약하고 종료/연장 선택을 받는다.AUTO_MODE=true에서는 soft limit 질문을 하지 않는다. max_auto_rounds 도달 시 수렴/blocked/auto-decision 중 하나의 structured branch로만 종료한다.각 라운드 반영 직후(또는 최종 저장 직전) 9개 통합 품질 기준으로 DoD를 판정한다.
| # | 기준명 | 출처 | PM 판정 질문 |
|---|---|---|---|
| 1 | 정확성 (Correctness) | IEEE 830 | 이 DoD가 프로젝트 목표(JTBD)와 일치하는가? |
| 2 | 비모호성 (Unambiguity) | IEEE+IREB | 해석 분기 없이 단 하나의 의미만 가지는가? |
| 3 | 완전성 (Completeness) | IEEE+IREB | 정상/에러/경계 조건이 모두 정의되었는가? |
| 4 | 일관성 (Consistency) | IEEE 830 | 다른 DoD 항목과 모순되지 않는가? |
| 5 | 검증가능성 (Verifiability) | IEEE+IREB | 관찰/측정으로 완료 여부를 판정할 수 있는가? |
| 6 | 필요성 (Necessity) | IREB | 이 DoD 없이는 프로젝트 목표 달성이 불가능한가? |
| 7 | 이해가능성 (Understandability) | IREB | 비기술 이해관계자도 의미를 이해할 수 있는가? |
| 8 | 중요도 순위 (Ranked) | IEEE 830 | 우선순위가 부여되었는가? |
| 9 | ODI 구조 (Outcome Format) | ODI | 방향+측정+대상+맥락+목표값이 포함되었는가? |
운영 규칙:
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/quality-gate-log.md에 DoD별 1행 요약으로 기록한다.DoD ID, pass/total, 결과, 실패 기준 수, 타임스탬프결과=fail인 DoD만 <details>로 상세(기준명, 미충족 사유)를 추가한다.## 설계 결정 (Architecture Decisions) 및 objective/details/*.md에서는 기술 상세를 허용한다.dod_count_min/dod_count_max, 기본 5~15)를 안내하되 차단하지 않는다X 한다, so that 사용자는 Y 할 수 있다로 연결되는지 확인quality-gate-log.md에 observable_by_sprint: unclear 메타데이터 기록을 권장한다. 이 항목은 강제 게이트가 아닌 사고 보조 프롬프트다.최종 저장(1A.10) 전에 아래를 확인한다.
priority 마커 반영)detail_content_buffer에 축적된 내용과 대화 이력을 대조하여, 사용자가 논의 중 제시한 설계·결정·프로세스·구조 중 아직 details/ 소재에 반영되지 않은 항목이 없는지 확인한다. 누락 항목이 있으면 저장 전 보완한다.이 단계는 저장 전 품질 강화용 프로세스이며 objective.md에 섹션으로 남기지 않는다.
WebSearch로 최신 패턴/대안/함정 점검CRITICAL / MAJOR / MINOR / NO_ISSUESCRITICAL 또는 MAJOR 존재 시, 저장 전에 Critical/Major Clarification Batch Rule로 보완 질의 후 재검토Clarity, Feasibility, Risk Coverage, Evidence Freshness, TestabilityCRITICAL 해소 완료전략 검토를 통과한 뒤, objective 저장 전에 디자인 단계를 수행한다.
웹사이트, 앱, 화면, UI, 페이지, 대시보드, 컴포넌트, 레이아웃, 프론트엔드, 디자인, 목업, 시안, 랜딩, 포털[디자인 단계 skip] UI 프로젝트 미감지AUTO_MODE 분기:
AUTO_MODE=false: 감지 시 사용자에게 디자인 단계 진행 여부를 1회 확인한다.AUTO_MODE=true: 감지 시 사용자 확인 없이 자동 진입한다.확정된 DoD/설계 결정을 기준으로 아래 3종을 모두 포함한 와이어프레임을 작성한다.
화면명 + 1줄 설명→ 기반 흐름저장 경로:
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/details/design-wireframe.mdAUTO_MODE 분기:
AUTO_MODE=false: 생성한 와이어프레임을 제시하고 보완 피드백을 반영한다.AUTO_MODE=true: 와이어프레임을 자동 생성/저장하고 핵심 결정 근거를 auto-decisions.md에 기록한다.design-wireframe.md에 함께 저장한다.AUTO_MODE 분기:
AUTO_MODE=false: DoD/usecase 변경안을 사용자와 합의 후 반영한다.AUTO_MODE=true: PM이 자율 반영하고 변경 사유/근거를 auto-decisions.md에 기록한다.Skill(skill: "mst:stitch")mcp__stitch__* 도구 호출은 금지한다.throw / timeout / 빈 결과[Stitch 실패] {오류 요약} — 텍스트 와이어프레임으로 진행AUTO_MODE 분기:
AUTO_MODE=false: 생성된 시안을 사용자에게 제시하고 선택/피드백을 반영한다.AUTO_MODE=true: 생성된 시안을 PM이 자율 선택하고 근거를 auto-decisions.md에 기록한다.디자인 단계에서 기능 설계로 회귀하는 방향 전환 1건 = 1회AUTO_MODE 분기:
AUTO_MODE=false: 회귀 횟수 제한 없이 사용자 확정 시까지 반복 가능AUTO_MODE=true: agile.design_regression_max(기본 3) 상한을 적용한다.
auto-decisions.md에 기록한 뒤 Step 1A.9.5로 진행한다.objective 저장 전에 수집된 모든 상세 내용을 도메인 단위로 정리한다.
--doc 모드(1B): 원본 문서의 섹션별 내용 전체 + Q&A 보완 내용. 원본 문서의 H1/H2 구조를 클러스터링 참고 입력으로 우선 활용한다.details/{domain-slug}.md 파일명을 제안하고, 도메인명 + 1줄 요약을 작성한다.AUTO_MODE에서는 사용자 확인 대신 PM이 자율 확정하고 근거를 함께 기록한다.Step 1A.9.5의 도메인 클러스터링 결과와 누적 detail_content_buffer를 입력으로, Step 1A.9.7 적대적 검토 전에 사용자가 "완성된 모습"을 검증할 수 있도록 자연어 미리보기와 정제 라운드를 수행한다. PM이 미리보기가 불필요하거나 오히려 흐름을 방해한다고 판단하면 사용자 질문 없이 skip할 수 있다.
AskUserQuestion을 사용하지 않는다.[완성 모습 미리보기 skip] {사유}진행 시 아래 3종을 자연어로 제시한다. PM은 프로젝트 성격상 필요하다고 판단하면 추가 시각화나 표를 자유롭게 더할 수 있다.
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/round-history.md에 라운드 요약을 append한다.detail_content_buffer에 축적하고, Step 1A.10에서 details/*.md에 흡수한다.completion-preview.md 같은 별도 산출물 파일은 생성하지 않는다.AUTO_MODE 분기:
AUTO_MODE=false: 사용자 확정 시까지 라운드 횟수 제한 없이 반복 가능AUTO_MODE=true: 최대 2회 반복한다. 설정값 agile.completion_preview.max_rounds_auto가 있으면 해당 값을 상한으로 사용한다.
detail_content_buffer에 반영하고 Step 1A.9.7로 진행한다.완성된 모습 미리보기에서 DoD/JTBD/도메인 정제로 회귀하는 방향 전환 1건 = 1회AUTO_MODE=true에서는 agile.completion_preview.regression_max(기본 2) 상한을 적용한다.
auto-decisions.md에 기록한 뒤 Step 1A.9.7로 진행한다.AUTO_MODE=false에서는 사용자 확정 시까지 회귀 횟수 제한 없이 반복 가능하다.Step 1A.9.5 도메인 클러스터링 (및 Step 1A.9.6 완성된 모습 미리보기/정제 — 통과 또는 PM skip) 직후, objective 저장 직전에 완전성 보강 목적의 적대적 검토를 수행한다. 이 게이트는 D3의 명료도 검증이 아니라 엣지케이스, 누락 흐름, 통합 경계, persona/NFR gap을 찾아 Step 1A.4 재귀 정제 루프에 "적대적 검토 라운드" 1회로 주입하는 절차다.
Bash(python3 {PLUGIN_ROOT}/scripts/mst.py config get agile.adversarial_review)로 설정을 읽는다.
agile.adversarial_review.enabled != true이면 graceful skip 후 Step 1A.10으로 진행한다.edge, flow, integration이며 persona, nfr은 설정이 true인 경우에만 실행한다.max_rounds 기본값은 3, current_round 초기값은 1이다.{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/draft/에 materialize한다. 이 단계는 accepted objective promotion이 아니다.python3 {PLUGIN_ROOT}/scripts/mst.py agile review --agi {AGI_ID} --perspective {name} --draft-dir {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/draft --json
context_source가 draft인지 확인한다. accepted, placeholder, 빈 context, 또는 이전 objective 경로가 반환되면 review를 중단하고 draft materialization을 수정한다.context_files 경로와 output_schema 경로만 독립 에이전트에 전달한다. Perspective마다 shared route를 적용하고 native candidate는 host agent, external은 managed provider entrypoint를 사용하며 반드시 독립 컨텍스트로 실행한다. Native child에는 DELEGATION BOUNDARY를 포함하고 plan/objective 원문, detail 본문, DoD/JTBD 원문은 절대 포함하지 않는다.
역할: {perspective} 관점의 적대적 검토자.
Read로 context_files 경로를 로드하고 output_schema에 맞게 findings JSON을 반환하시오.
{PROJECT_ROOT}/.gran-maestro/agile/AGI-NNN/objective/adversarial-review-findings.md에 기록한다. 각 append 블록에는 round, perspective, severity, finding, suggested_dod, requires_user_answer, question, recommended_answer, 반영 여부를 포함한다.findings 배열이 비어있음 OR current_round >= max_rounds이다. 수렴 전에는 먼저 critical/major 사용자 의존 finding을 Critical/Major Clarification Batch Rule로 처리한다. 사용자 의존성이 없는 나머지 finding만 Step 1A.4 재귀 정제 루프의 추가 입력으로 반영하고 current_round += 1 후 재검토한다.AUTO_MODE=true:
parallel_in_auto_mode=true이면 enabled perspective를 병렬 실행하고, false이면 순차 실행한다.severity=critical|major 또는 requires_user_answer=true finding은 Critical/Major Clarification Batch Rule로 보낸다. PM이 자동 반영하지 않는다.{PROJECT_ROOT}/.gran-maestro/agile/AGI-NNN/auto-decisions.md에 근거와 반영 내용을 기록한다.AUTO_MODE=false:
edge + flow 2종을 순차 실행한다. 설정에서 다른 perspective가 enabled여도 PM이 필요하다고 판단한 경우에만 추가 실행한다.severity=critical|major 또는 requires_user_answer=true finding은 Critical/Major Clarification Batch Rule로 묶어 사용자 confirm 후 objective/detail 보강에 반영한다. minor는 요약만 제시하고 사용자가 반영을 선택한 경우에만 재정제한다.| 필드 | plan-time | sprint-runtime | sprint-end |
|---|---|---|---|
artifact_paths | 필수 (자동 채움) | - | 파일 실존 검증 |
entrypoint_path | 필수 (entrypoint: none + reason 예외 허용) | - | grep 실매칭 검증 |
integration_smoke_id | 예약 필수 (ID + user flow + 성공의도) | 선택 보강 | tests/ 실존 경로 강제 |
verify_cmd | 골격 필수 (비대화식 실행 정의) | 실제 명령 확정 | 실행 + 신호 매칭, true/exit 0/echo 단독 거부 |
expected_signal | TBD 허용 | TBD 해소 | 정규식/문자열 매칭 |
objective 저장 직후, downstream agile/request/approve handoff는 아래 path-first 계약을 기본으로 사용한다. objective anchor나 source plan이 없으면 조용히 생략하지 않고 명시적으로 보고한다.
[CONTEXT_FILES]
- objective: {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/objective.md
- objective_ids: {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/objective.ids.json or NO_OBJECTIVE_IDS
- objective_details: {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/details/{domain}.md or NO_OBJECTIVE_DETAILS
- plan: {PROJECT_ROOT}/.gran-maestro/plans/{PLAN_ID}/plan.md or NO_SOURCE_PLAN
- plan_json: {PROJECT_ROOT}/.gran-maestro/plans/{PLAN_ID}/plan.json or NO_PLAN_JSON
- plan_ids: {PROJECT_ROOT}/.gran-maestro/plans/{PLAN_ID}/plan.ids.json or NO_PLAN_IDS
- spec: {PROJECT_ROOT}/.gran-maestro/requests/{REQ_ID}/tasks/{TASK_ID}/spec.md or NO_ACTIVE_SPEC
- spec_context_manifest: {PROJECT_ROOT}/.gran-maestro/requests/{REQ_ID}/tasks/{TASK_ID}/spec.md#§0-Context-Manifest or NO_CONTEXT_MANIFEST
- previous_feedback: {PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/sprints/S{PREV_SPRINT}/retrospective.md or NO_PREVIOUS_FEEDBACK
[/CONTEXT_FILES]
[WORK_CONTRACT]
- read_requirements: 구현 전 위 context file과 spec §0 Context Manifest 파일을 직접 Read/inspection한다.
- output_contract: agile/agile-plan/prompt-template 변경 파일, dispatch result contract, completion report를 보고한다.
- verification_contract: verify_cmd, expected_signal, integration_smoke_id를 보고한다.
- failure_contract: timeout, empty result, blocked, missing_context 상태를 구조화해 남긴다.
[/WORK_CONTRACT]
추가 규칙:
objective.ids.json이 아직 생성되지 않았거나 읽기 실패면 NO_OBJECTIVE_IDS 또는 missing_context로 기록한다. objective anchor coverage evidence를 조용히 skip하지 않는다.NO_SOURCE_PLAN, NO_PLAN_JSON, NO_PLAN_IDS, NO_CONTEXT_MANIFEST 같은 explicit skip reason을 남긴다.Read/inspection evidence, changed files, simplifications made, remaining risks, verify_cmd, expected_signal, integration_smoke_id를 포함한다.templates/objective.md 포맷으로 아래 경로에 저장:
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/objective.md
{PROJECT_ROOT}/.gran-maestro/agile/{AGI_ID}/objective/details/{domain}.md
저장 규칙:
## 디자인 컨텍스트 섹션을 추가한다. 디자인 단계를 거치지 않은 경우(비-UI 프로젝트 포함) 해당 섹션은 생성하지 않고 skip한다.
## 상세 문서 (Details) 인덱스 이전## 디자인 컨텍스트
> 이 프로젝트의 디자인 baseline입니다. sprint 진행 중 수정될 수 있습니다.
- DES-ID: DES-NNN
- Stitch 프로젝트 URL: {URL}
- 생성일: {YYYY-MM-DD}
- 상태: baseline | updated
### 화면 목록
| 화면명 | Stitch URL | HTML 경로 | 설명 |
|--------|-----------|-----------|------|
| {화면명} | {url} | designs/DES-NNN/{screen-file}.html | {설명} |
### 화면 흐름
{텍스트 와이어프레임에서 정의된 화면 간 네비게이션 흐름}
### 텍스트 와이어프레임
{Step 1A.9.2.2에서 생성된 와이어프레임 원본 — 변경 추적용}
wireframe-only) 구조:## 디자인 컨텍스트
> 텍스트 와이어프레임만 생성됨 (Stitch 시안 미생성)
- DES-ID: 없음
- 상태: wireframe-only
### 텍스트 와이어프레임
{와이어프레임 원본}
## 상세 문서 (Details)에는 domain별 detail 파일 링크 + 도메인명 + 1줄 요약을 기록한다.objective/details/*.md)에는 해당 도메인의 모든 상세 내용을 원본 수준으로 보존한다(요약/축약 금지).
## 상세 명세 하위에 1:1 보존한다 — 설계 결정과 그 근거, 기술 선택과 비교 대안, 디렉토리 구조, 프로세스 흐름, Gate/체크리스트, 스키마/템플릿, 예시, 합의 사항 등. PM은 사용자 발화를 누락 없이 기록하며, 대화에서 논의되었으나 details/에 없는 내용이 있으면 안 된다.--doc 모드(1B): 원본 문서의 해당 도메인 내용 전체 + Q&A로 추가 보완된 내용. 원본 문서에 기술된 내용이 details/에서 누락되어서는 안 된다.details/{domain}.md 파일의 첫 줄에는 반드시 source mapping 메타데이터를 작성한다.
--doc 모드 또는 원본문서가 있는 경우: <!-- source-mapping: original=<원본경로> sections=[<H1/H2 헤더 목록>] --><!-- source-mapping: source=conversation evidence=clarification-context.md sections=[<JTBD/결정/질문 묶음>] --><!-- source-mapping: source=conversation skip_reason=<명시적 사유> sections=[<근거 묶음>] -->original=objective.md, original=SKILL.md 같은 가짜 원본문서 경로로 대체하지 않는다..gran-maestro/agile/{AGI_ID}/objective/objective.ids.json anchor manifest를 생성/갱신한다. 각 objective anchor는 id, source_file, text, kind, grade, domain_slug, dod_refs를 포함해야 하며, AD/설계 결정/DoD/NFR/리스크/체크리스트 성격의 MUST/SHOULD 요구를 deterministic하게 추적 가능해야 한다.python3 {PLUGIN_ROOT}/scripts/mst.py agile detail validate-mapping {details_file_path} 명령으로 source-mapping 메타데이터를 검증한다.python3 {PLUGIN_ROOT}/scripts/mst.py agile coverage-check {원본문서경로} --details-dir {details_dir} 명령으로 원본 ↔ details 집합 매칭률과 objective anchor coverage evidence를 검증한다. 매칭률이 임계 미만이면 저장을 실패로 처리하고, 누락된 원본 슬러그 목록을 사용자에게 보고한 뒤 details 보강 후 재실행한다. objective.ids.json이 존재하면 출력의 anchor_total, anchor_mapped, anchor_missing_ids도 확인하고 downstream trace 누락을 다음 agile/plan 단계의 known evidence로 보존한다.details/{domain}.md 파일은 아래 구조를 따른다.
# {도메인명}
> 이 문서는 objective.md의 상세 참조 문서입니다.
> 관련 DoD: DOD-NNN, DOD-MMM
## 개요
{이 도메인이 다루는 영역의 1~2문장 요약}
## 설계 결정
### AD-NNN: {결정 제목}
- **결정**: {무엇을 결정했는가}
- **근거**: {왜 이렇게 결정했는가 — Q&A에서 논의된 이유}
- **대안 검토**: {비교한 대안과 기각 사유}
- **영향 범위**: {이 결정이 영향을 주는 영역}
## 상세 명세
{대화에서 정제된 구체적 설계 내용 — tree 구조로 항목별 정리}
{프로세스 흐름, Gate 체크리스트, 스키마, 템플릿, 디렉토리 구조, 예시 등}
{원본 제시 내용 + Q&A를 통해 구체화/보강된 내용 모두 포함}
## Q&A 보강 사항
{대화 중 추가로 결정/보완된 항목들 — 결정 내용 + 근거}
## 상세 명세 섹션이 핵심이다. 여기에 대화를 통해 정제된 설계 원본이 tree 구조(제목/소제목/불릿)로 항목별 정리되어야 한다.Direction/Measure/Object/Context/Target)를 사용한다.<!-- dod:DOD-NNN status:todo priority:must domain:{slug} -->{slug}는 해당 DoD가 속한 도메인의 상세 문서 파일명 (예: details/intent-context-propagation.md → domain:intent-context-propagation)priority 값은 MoSCoW 결과를 반영해 must|should|could|wont 중 하나를 사용한다.Step 1A.10 저장 직후, 각 detail 파일에 대해 독립적으로 D3 검증을 수행한다.
Bash(python3 {PLUGIN_ROOT}/scripts/mst.py config get d3.objective_detail_threshold)에서 d3.objective_detail_threshold를 조회한다.0.1을 사용한다.objective/details/*.md 각 파일마다 독립 에이전트로 D3 역방향 시뮬레이션을 실행한다.mst:plan Step 3.9) 패턴을 따르되, 임계치는 objective_detail_threshold를 사용한다.severity, requires_user_answer, question, recommended_answer, recommendation_rationale를 포함한다.severity=critical|major 또는 requires_user_answer=true인 사용자 의존 모호성은 Critical/Major Clarification Batch Rule로 처리한다. PM이 자동 보완하지 않는다.저장 후:
python3 {PLUGIN_ROOT}/scripts/mst.py agile update {AGI_ID} --status active --objective-version 1 --json 실행목표: 기존 문서의 내용 전체를 프로젝트 DoD 중심 구조로 정규화하고, 원본 문서의 상세 내용을 details/에 도메인별로 전량 보존하며, 누락 항목을 Q&A로 보완한다.
Read({PROJECT_ROOT}/{--doc 경로}) 실행 (절대경로 변환)PARSED_CONTEXT에 저장
PARSED_CONTEXT 기반으로 JTBD/DoD/설계/제약 초안을 생성한다.--doc 모드도 아래 단계를 동일 적용한다.
python3 {PLUGIN_ROOT}/scripts/mst.py agile update {AGI_ID} --status active --objective-version 1 --json 실행[MST skill=agile-plan step=2/3 return_to={RETURN_TO_OR_NULL}]
objective 저장 후 반드시 상태 스냅샷을 기록한다. State execution contract: state write commands inherit MST_SESSION_ID from the current session or receive equivalent structured context; do not inject process-scoped identity into canonical writes.
MST_SESSION_ID="{MST_SESSION_ID}" \
MST_CONTEXT_JSON='{"schema_version":1,"mst_session_id":"{MST_SESSION_ID}","root_mst_id":"{AGI_ID}"}' \
python3 {PLUGIN_ROOT}/scripts/mst.py state set \
--skill agile-plan \
--step 3 \
--total 3 \
[--return-to {RETURN_TO}]
--return-to가 있으면 아래 종료 마커와 다음 단계 실행 명령을 출력 후 즉시 종료:
[MST skill=agile-plan step=returned return_to={RETURN_TO}]다음 단계 실행 명령:
/mst:resume --wakeup-hint stop-recover
return_to를 감지하여 상위 스킬 re-feed를 강제한다.다음 단계 실행 명령:
/mst:agile --resume {AGI_ID}
evidence_ref를 반드시 포함한다.프로젝트 목표를 제공하면 JTBD+프로젝트 DoD 기반 자율 실행을 수행합니다. Step 1은 agile-plan 서브스킬로 objective.md를 준비하고 Sprint 0 → Sprint N(프로젝트 건강 우선) 루프 → 스티어링 체크포인트를 반복합니다.
스펙을 승인하고 실행을 시작합니다. 사용자가 '승인', '진행해', 'OK 진행'을 말하거나 /mst:approve를 호출할 때 사용. Gran Maestro 워크플로우 내에서만 의미 있으며, 일반적인 확인 응답에는 사용하지 않음.
Claude provider 전용 native-first delegation entrypoint. 사용자가 '클로드로 실행', '클로드 서브에이전트'를 말하거나 /mst:claude를 호출할 때 사용한다. 같은 Claude host에서는 Task/Agent를 우선하고 route=external일 때만 managed wrapper를 사용한다.
Codex provider 작업을 native-first로 위임합니다. 사용자가 '코덱스 실행', '코덱스로', '코드 작업'을 말하거나 /mst:codex를 호출할 때 사용. 같은 Codex host에서는 collaboration agent를 우선하고, 중앙 route가 external일 때만 Codex CLI adapter를 사용합니다.
설정된 AI 에이전트들이 병렬로 버그를 조사하고 종합 리포트를 생성합니다. 사용자가 '디버그', '버그 찾아줘', '문제 분석'을 말하거나 /mst:debug를 호출할 때 사용. 1회성 의견 수집은 /mst:ideation을, 합의 토론은 /mst:discussion을 사용.
설정된 AI 팀원들이 합의에 도달할 때까지 반복 토론합니다. 사용자가 '토론', '합의', '디스커션'을 말하거나 /mst:discussion를 호출할 때 사용. 1회성 의견 수집은 /mst:ideation 사용.