Inlined into every dispatch, beats project docs, persona profile, tickets on
conflict. Tail's autonomy note outranks this file, profile, AGENTS.md on
asking, blocking, approval, forbidden commands. Worker dir:
<root>/worktrees/<worker>.
- Read
.dira/tickets/<hash>.wip.md.## Goal+## Done whenare the contract. - Before anything else, append
## 진행 계획: handoff-size steps, one checkbox per line -- [ ] step (<start> -> <end>), ISO 8601+offset likeassigned_at, stamped on start and check, read live, never pre-filled. Full rules:protocols/계획-규약.md. Push, retrospective,## 결과,.donerename aren't plan items. - Do the work. Nothing outside
## Done when. Flip each box- [ ]->- [x]the moment it is true - not batched at the end. - Append
## 결과- what changed, how verified (one-line summary, not full output), pushed commit hashes. - Confirm push succeeded and every
## Done whenbox is- [x]- one left- [ ]means the item isn't done or the flip was missed; settle it in## 결과first. Then rename to<hash>.done.md; skip it and the ticket stays incomplete. Onlymvallowed:.wip->.done.
Only-this-session lesson -> personas/<name>/memory/ (your persona); none ->
skip. Format: CORE-MEMORY.md.
work- instruction. Do it,.doneit.request- ask/question. Answer with a newkind: feedbackticket, never appended to the original;.doneit. A human demand splits into work tickets, each withreq: <original hash>(notdeps); once fully split,.donethe original. Can't split without guessing -> ask back and drop, not## 블록(CORE-TICKETS.md- Asking back).feedback- report/critique. Recipient opens follow-ups or.dones it.
Someone else's area -> new ticket, never edit theirs, noted in ## 결과
(-> <new hash> (persona) what). deps only if start needs it
(syntax: CORE-TICKETS.md).
No guessing forward. Append ## 블록 - one-line summary, then a question in
CORE-TICKETS.md §Question format (### <n>. + - (a)) - no format means a
four-choice fallback card. Exit leaving .wip, not .done. reap escalates
it (CORE-TICKETS.md - Asking back); re-dispatched -> read the awaiting
stem's .done.md, not the original.
Human calls: contradictory spec, read-only area, new external dep, push 3x
failed. Just a command to run, nothing to decide -> poll
(workers/<w>.sh poll), not a block. Waiting on a ticket -> deps: append +
unassign (CORE-TICKETS.md - Waiting on a ticket), not a block.
Human-read text (ticket bodies, ## 결과, ## 블록, commits, docs) uses ASCII
punctuation only - not code under apps/**. Allowed set:
` ~ ! @ # $ % ^ & * ( ) - _ = + [ ] { } \ | ; : ' " , . < > / ?
Outside it, never invent a substitute - decided list, exemptions:
CORE-TICKETS.md - Characters.
Name a ticket by its bare 8-char hash (547b7b98), never a path or filename -
the GUI renders a known hash as a linked ticket chip.
Never break these; convinced one must break -> ## 블록. State is the filename
(none / .wip / .done), never frontmatter. Claim is an atomic link, never
os.rename. Queue is flat, single-copy - no subdirectories under tickets/,
never in git.