@sjawhar/pi-envoy 10.14.0 → 10.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/skills/dispatch/SKILL.md +107 -409
- package/dist/skills/dispatch/references/api.md +16 -48
- package/dist/skills/dispatch/references/asks.md +19 -78
- package/dist/skills/dispatch/references/document-edits.md +38 -187
- package/dist/skills/dispatch/references/documents.md +32 -224
- package/dist/skills/dispatch/references/examples.md +10 -27
- package/dist/skills/dispatch/references/issues.md +34 -196
- package/dist/skills/dispatch/references/messages.md +13 -58
- package/dist/skills/dispatch/references/reading.md +10 -45
- package/dist/skills/dispatch-brainstorming/SKILL.md +34 -99
- package/dist/skills/dispatch-first/SKILL.md +16 -34
- package/package.json +1 -1
|
@@ -1,471 +1,181 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dispatch
|
|
3
|
-
description: "Use
|
|
3
|
+
description: "Use when posting to Dispatch: a message, status update, comment, artifact, spec or document edit, claim or status change. Use when asking a human a question, also one that cites another message, artifact or eval. Use when brainstorming or asking about a design change, or when running any dispatch command."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Dispatch
|
|
7
7
|
|
|
8
|
-
Dispatch
|
|
9
|
-
decide, never a log of your work. The transcript is your scratch pad; progress and status stay there. Anything meant for a human
|
|
10
|
-
goes through the `dispatch` command, which runs in your shell: `dispatch --help` lists the commands, and `dispatch <command> --help`
|
|
11
|
-
each one's flags and an example. A field is a flag (`--issue LEGION-3`); long text goes on stdin with `--<field>-file -` and a
|
|
12
|
-
quoted here-document (`<<'EOF'` … `EOF`), and an object or list field takes JSON (`--ops-json`). What it prints is the result; it
|
|
13
|
-
exits 0 when it wrote or read, 1 when Dispatch refused, and 2 on a usage error.
|
|
8
|
+
Dispatch holds an issue's or project document's spec, asks, comments and artifacts. It is a high-signal record for the humans who decide, never a log of your work. Narrate progress in your transcript, not here.
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
- Write to Dispatch only with the `dispatch` command in your shell. `dispatch --help` lists the commands. `dispatch <command> --help` gives the flags, the limits and an example.
|
|
11
|
+
- Put long text on stdin: `--<field>-file -` with a quoted here-document (`<<'EOF'` … `EOF`). Give object and list fields as JSON (`--ops-json`).
|
|
12
|
+
- Exit code 0 means it wrote or read, 1 means Dispatch refused, 2 means a usage error.
|
|
13
|
+
- Dispatch refuses over-limit input with the number to trim. It never truncates. It lists every problem of a call in one refusal, so fix them all and call once again.
|
|
19
14
|
|
|
20
15
|
## Where the detail lives
|
|
21
16
|
|
|
22
|
-
|
|
23
|
-
that step, not before. On a host with no `skill://` scheme (Claude Code, OpenCode), a link's path
|
|
24
|
-
after `skill://dispatch/` is relative to this skill's base directory.
|
|
17
|
+
Open a reference when you reach its step, not before. On a host with no `skill://` scheme (Claude Code, OpenCode), the path after `skill://dispatch/` is relative to this skill's directory.
|
|
25
18
|
|
|
26
|
-
|
|
|
19
|
+
| Before you | Read |
|
|
27
20
|
| --- | --- |
|
|
28
|
-
| run `dispatch doc-edit
|
|
29
|
-
| write a typed block
|
|
30
|
-
| choose
|
|
31
|
-
|
|
|
21
|
+
| run `dispatch doc-edit` | [Editing a document](skill://dispatch/references/document-edits.md) |
|
|
22
|
+
| write a typed block, comment, suggest, upload an artifact, request approval, or retry `DOC_SERVICE_UNAVAILABLE` | [Documents](skill://dispatch/references/documents.md) |
|
|
23
|
+
| choose, claim or move an issue, set priority, reorder a board, or audit a backlog | [Working an issue](skill://dispatch/references/issues.md) |
|
|
24
|
+
| route, edit, retract, resolve or reply to an open ask, or follow its thread | [Asks after they open](skill://dispatch/references/asks.md) |
|
|
32
25
|
| catch up after a restart, trace what cites a node, or write a `dispatch://` reference | [Reading back](skill://dispatch/references/reading.md) |
|
|
33
|
-
| answer a BTW, Aside or Steer frame, or
|
|
34
|
-
|
|
|
35
|
-
| set up a token, or call a route
|
|
26
|
+
| answer a BTW, Aside or Steer frame, or an Agents-page message | [Targeted and direct messages](skill://dispatch/references/messages.md) |
|
|
27
|
+
| want a worked example | [Before and after](skill://dispatch/references/examples.md) |
|
|
28
|
+
| set up a token, or call a route no command covers | [Authentication and the HTTP API](skill://dispatch/references/api.md) |
|
|
36
29
|
|
|
37
30
|
## Design changes are brainstormed here
|
|
38
31
|
|
|
39
|
-
|
|
40
|
-
issue's spec, not chat or a repository design document, and its plan is the issue's `plan.md`
|
|
41
|
-
document. `skill://dispatch-brainstorming` holds the process: read it before a spec's first
|
|
42
|
-
version, before each next turn, and before you write a plan.
|
|
32
|
+
A design change that needs the human's choices is brainstormed in its issue's spec, not in chat or a repository design document. Its plan is the issue's `plan.md` document. Read `skill://dispatch-brainstorming` before a spec's first version, before each next turn, and before you write a plan.
|
|
43
33
|
|
|
44
34
|
## Writing for the human
|
|
45
35
|
|
|
46
|
-
Every spec, ask, comment, message
|
|
47
|
-
not share this session's vocabulary, and is often on a phone. Write for that person.
|
|
48
|
-
|
|
49
|
-
- Plain English, full sentences, one idea per sentence. Never repo shorthand or nouns you coined:
|
|
50
|
-
not "fix 8c", "READY-target", "PR B", "spec@v3", "the pair", "the packet" — say what the thing is.
|
|
51
|
-
- A real name is not a coined noun: name a product, a tool and its operation
|
|
52
|
-
(`dispatch request-approval`), an event type (`artifact.approved`), a route, a setting or a
|
|
53
|
-
status exactly, and say how it works in a clause ("the daemon opens the gate when Dispatch emits
|
|
54
|
-
`artifact.approved` for that document at that version"), never with a vague verb such as
|
|
55
|
-
"notice", "accept", "tell" or "pick up" ([before and after](skill://dispatch/references/examples.md#naming-the-mechanism)).
|
|
56
|
-
- Expand every identifier the first time it appears: an issue key gets its title, a PR number its
|
|
57
|
-
title, a file what it is for, a session id who it is. Link a URL rather than pasting a bare id.
|
|
58
|
-
- A question lives in the spec or discussion it came from, placed as
|
|
59
|
-
[Decision blocks](#decision-blocks) says, never as a compressed standalone ask. The question
|
|
60
|
-
carries the problem the reader recognises and why it matters now, what constrains the answer, and
|
|
61
|
-
the recommendation with its reason. It asks how to solve the problem or which outcome is wanted;
|
|
62
|
-
never enumerate choices in the question. The options carry the genuinely different approaches.
|
|
63
|
-
Each option has a label, and its description says what that approach costs.
|
|
64
|
-
- Describe a change first by what its reader stands to lose — who can do what today, what they
|
|
65
|
-
will not be able to do after it, what still works, and what you cannot tell — then by what the
|
|
66
|
-
system does, each mechanism named exactly. The reader's sentence is a different sentence, not a
|
|
67
|
-
shorter engineering one: shortening keeps the system as its subject. Test that the first sentence
|
|
68
|
-
has a human subject, even on a sentence you already simplified; a lead naming what a change does
|
|
69
|
-
inside a system leaves the reader nothing to act on. Where the judgment rule below applies, the
|
|
70
|
-
judgment leads and this rule shapes the sentence under it.
|
|
71
|
-
- Before posting, test it: could the human, reading only this text on their phone, know what they are being
|
|
72
|
-
told or asked? If not, rewrite it. Length is not the problem; density is.
|
|
73
|
-
- When an ask or message communicates a judgment, lead with that judgment in one sentence and put the mechanism underneath it. Do not make the reader ask a second time whether the result is a win. This shapes communication only when a judgment exists; it does not pre-decide an open question or remove its genuine options.
|
|
74
|
-
- When an ask, comment or message states a root cause or a blocker, include the command, error output or record that shows it, with its time, in that same text. Without it, label the diagnosis a hypothesis; a diagnosis still in progress may say so plainly. This boundary applies to causal claims, not to reporting that an investigation has started.
|
|
36
|
+
Every spec, ask, comment, message and PR body goes to a person who has not read the code. They do not share your vocabulary, and often read on a phone.
|
|
75
37
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
a
|
|
82
|
-
|
|
83
|
-
- **Each open question is a decision block**, shaped and placed as [Decision blocks](#decision-blocks)
|
|
84
|
-
says. Because it is an ask, it reaches the human's Inbox, and the answer lands next to its context.
|
|
85
|
-
- **An answered decision block is itself the record of the decision.** It already renders the
|
|
86
|
-
person's chosen option and their own words, with who answered it and when; never add text
|
|
87
|
-
restating it. A point you inferred says so, with the reasoning — a security concern, a
|
|
88
|
-
restriction, or a cost nobody measured is exactly this, not a settled constraint; during a live
|
|
89
|
-
brainstorming conversation, `skill://dispatch-brainstorming` is stricter and keeps an inference
|
|
90
|
-
out of the spec until the human has agreed to it. One carried in from another document keeps its
|
|
91
|
-
provenance: an agent's inference there is marked one here, or stays out until the human raises
|
|
92
|
-
it.
|
|
93
|
-
- **A decision that arrives another way carries no rendered record.** A comment that answers a
|
|
94
|
-
question, a conversation, or a waiver is written into the text in the person's own words and the
|
|
95
|
-
date, quoted, naming them from `dispatch whoami` or the conversation, or "the person" when the
|
|
96
|
-
token names no owner — never a name you were not given.
|
|
97
|
-
- **Sections follow the topic.** No heading is required and none has a fixed place; name each
|
|
98
|
-
section for what it discusses.
|
|
99
|
-
- **A changed point is rewritten, not appended to.** When an answer or a new fact changes design
|
|
100
|
-
text outside its decision block, rewrite that text; the block stays where it is as the record of
|
|
101
|
-
the answer. The document's versions keep the history.
|
|
102
|
-
- **No placeholders.** No TBD, TODO, or hedging ("might", "could consider"): an open item is a
|
|
103
|
-
decision block, a technical decision your lane makes where the work happens, outside the spec,
|
|
104
|
-
or, for a contract between two lanes, a question you settle with the other lane over Envoy (see
|
|
105
|
-
[Before you ask](#before-you-ask) under Asking).
|
|
106
|
-
- **No progress.** The spec records the design and its decisions, never status, timestamps, an
|
|
107
|
-
"Update HH:MMZ" section, a pull-request list, or handoff notes. Progress is not a Dispatch
|
|
108
|
-
object at all; it lives in your transcript and your pull request (see [Messages](#messages)).
|
|
109
|
-
- **No commentary.** The spec talks about the design, never about the spec or the conversation: no
|
|
110
|
-
sentence calls it a draft, a conversation, a version or a turn; says what a later version will
|
|
111
|
-
add; describes an earlier version or correction; or narrates the exchange that produced it.
|
|
112
|
-
|
|
113
|
-
Before a new version goes out, read it as the human will: no two passages conflict, each point has
|
|
114
|
-
one reading, and every decision block passes the phone test above. A worked example is
|
|
115
|
-
`dispatch://LEGION-386/artifact/spec@v5`: the problem and its counts, what the human settled in his
|
|
116
|
-
own words, a section for each part of the design, and its one open question as a decision block
|
|
117
|
-
after the section on models.
|
|
38
|
+
- Write plain English in full sentences, one idea each. Never use repo shorthand or nouns you coined ("fix 8c", "PR B", "spec@v3", "the pair"). Say what the thing is.
|
|
39
|
+
- Name a real product, tool operation (`dispatch request-approval`), event (`artifact.approved`), route, setting or status exactly. Say in a clause how it works. Never use a vague verb such as "notice", "accept", "tell" or "pick up" ([example](skill://dispatch/references/examples.md#naming-the-mechanism)).
|
|
40
|
+
- Expand each identifier on first use. Give an issue key or PR number its title, a file its purpose, a session id who it is. Link a URL, not a bare id.
|
|
41
|
+
- Describe a change first by what its reader stands to lose. Say who can do what today, what they cannot do after it, what still works, and what you cannot tell. Then name each mechanism. Write that first sentence with a human subject. A shorter engineering sentence is not a reader's sentence.
|
|
42
|
+
- When the text carries a judgment, lead with it in one sentence and put the mechanism under it. Then the judgment comes first, and the rule above shapes the sentence under it. This never pre-decides an open question or drops its real options.
|
|
43
|
+
- When you state a root cause or a blocker, include the command, error output or record that shows it, with its time. Without it, call the diagnosis a hypothesis. A diagnosis in progress can say so.
|
|
44
|
+
- Phone test before you post: can the human, reading only this text on a phone, know what they are told or asked? If not, rewrite. Density is the problem, not length.
|
|
118
45
|
|
|
119
|
-
|
|
46
|
+
A question lives in the spec or discussion it came from, as [Decision blocks](#decision-blocks) says, never as a compressed standalone ask. It carries the problem the reader recognises, why it matters now, what constrains the answer, and your recommendation with its reason. It asks how to solve the problem or which outcome is wanted. It never lists the choices: the options carry the different approaches, each a label and a description of what it costs.
|
|
120
47
|
|
|
121
|
-
|
|
122
|
-
shaped as [Writing for the human](#writing-for-the-human) says for a question, with what
|
|
123
|
-
constrains the answer split into measured, known and unknown. It asks how to solve the problem,
|
|
124
|
-
never whether to apply a change already chosen. Never gather decisions into a list, at the top,
|
|
125
|
-
at the bottom or in an "open questions" section, and never ask one as a standalone `dispatch ask`
|
|
126
|
-
that points at the spec.
|
|
48
|
+
## Writing a spec
|
|
127
49
|
|
|
128
|
-
|
|
129
|
-
nobody. A spec with no ask blocks is fine only when the issue genuinely needs no human decision.
|
|
130
|
-
What `dispatch issue` and `dispatch artifact` answer about a spec's blocks, and how to check an edit
|
|
131
|
-
wrote one, is in [Typed blocks](skill://dispatch/references/documents.md#typed-blocks).
|
|
50
|
+
A spec is the design conversation with the human, written down. It starts as the problem and its evidence: what goes wrong, for whom, and the counts or cases that show it. It grows in place. It is the issue's one primary document: extend it with a new version that keeps the human's text, never a second "spec" artifact.
|
|
132
51
|
|
|
133
|
-
|
|
134
|
-
**
|
|
135
|
-
|
|
52
|
+
- **Each open question is a decision block** ([Decision blocks](#decision-blocks)).
|
|
53
|
+
- **An answered decision block is the record.** It shows the chosen option, the person's words, who and when. Never restate it.
|
|
54
|
+
- **Mark an inference as one**, with its reasoning. A security concern, a restriction or a cost nobody measured is an inference, not a settled constraint. A point carried from another document keeps its provenance. `skill://dispatch-brainstorming` keeps an inference out of a live brainstorm's spec until the human agrees to it.
|
|
55
|
+
- **A decision from a comment, conversation or waiver has no rendered record.** Write it into the text in the person's words, quoted and dated. Name them from `dispatch whoami` or the conversation. If neither names them, write "the person". Never use a name you were not given.
|
|
56
|
+
- **Sections follow the topic.** No heading is required or fixed.
|
|
57
|
+
- **Rewrite a changed point. Do not append.** The decision block stays as the record. Versions keep the history.
|
|
58
|
+
- **No placeholders**: no TBD, TODO or hedging. An open item is a decision block or a two-lane contract you settle over Envoy. Or it is a technical decision your lane makes where the work happens, outside the spec.
|
|
59
|
+
- **No progress**: no status, timestamps, "Update HH:MMZ" sections, PR lists or handoff notes.
|
|
60
|
+
- **No commentary**: never call it a draft, version or turn, preview a later version, describe a correction, or narrate the exchange.
|
|
136
61
|
|
|
137
|
-
|
|
138
|
-
`--ops-json '[{"op":"move","block":"<block-uuid>","after":"<the last sentence of the section that discusses it>"}]'` relocates
|
|
139
|
-
the block and keeps its ask, its answer and its followers; the context paragraphs that were lifted
|
|
140
|
-
out of Design move the same way, and the emptied section is deleted. An ask block has two ids that
|
|
141
|
-
differ; [Editing a document](skill://dispatch/references/document-edits.md) says which.
|
|
62
|
+
Before a version goes out, read it as the human will. No two passages conflict, each point has one reading, and each decision block passes the phone test.
|
|
142
63
|
|
|
143
|
-
|
|
144
|
-
[Asking](#asking) to decide whether the question is a real decision at all.
|
|
64
|
+
## Decision blocks
|
|
145
65
|
|
|
146
|
-
|
|
66
|
+
A decision a human must make is an `:::ask{#slug}` block at the end of the section that discusses it. Shape it as [Writing for the human](#writing-for-the-human) says. Split what constrains it into measured, known and unknown. Give 2–4 options and a recommendation, with the trade-off in the prose around it. It asks how to solve the problem, never whether to apply a change already chosen.
|
|
147
67
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
[
|
|
152
|
-
that GitHub issue or pull request. Only `dispatch issue` with `--external` creates a native issue; if no issue is linked, run
|
|
153
|
-
`dispatch issue --external owner/repo#n --project <project> --title '<title>'` before addressing it.
|
|
68
|
+
- Never gather decisions in a list, at the top, at the bottom, or in an "open questions" section. Never ask one as a standalone `dispatch ask` that points at the spec.
|
|
69
|
+
- Prose questions reach nobody. Only the block reaches the Inbox. A spec with no blocks is right only when no human decision is needed.
|
|
70
|
+
- Fix a pile with `move`, not a rewrite. `dispatch doc-edit --ops-json '[{"op":"move","block":"<block-uuid>","after":"<last sentence of its section>"}]'` keeps the ask, its answer and its followers. Move the lifted context the same way and delete the empty section. An ask block has two different ids ([Editing a document](skill://dispatch/references/document-edits.md)).
|
|
71
|
+
- Syntax and checks: [Typed blocks](skill://dispatch/references/documents.md#typed-blocks). Whether to ask at all: [Before you ask](#before-you-ask).
|
|
154
72
|
|
|
155
|
-
|
|
156
|
-
Labels are optional: Dispatch trims them, preserves their case, and removes case-insensitive duplicates. `--priority` is yours on creation too — see [Priority is yours to set](skill://dispatch/references/issues.md). Set `--assignee` (the email of a person who has signed in to Dispatch) only when the human said who owns the work; otherwise the default above applies, so a child inherits its parent's assignee. Set `--repo <owner/name>` when the issue targets a repository other than the one it would inherit: its parent's, else the project's default; the repository must be mapped to the project in Settings, and `dispatch read` shows the one the issue resolves to on its `Repository:` line. It prints
|
|
157
|
-
the new key; creating an issue does not subscribe you to it (see [Following](#following)). Use `dispatch issue` only to create an issue; never use it to park a question. When you pass a spec,
|
|
158
|
-
follow [Writing a spec](#writing-a-spec).
|
|
73
|
+
## Your owner
|
|
159
74
|
|
|
160
|
-
|
|
75
|
+
- Every owner-scoped command takes exactly one owner. That is `--issue` (a key such as `LEGION-3`, `owner/repo#n`, or a bare number for the cwd repository), or `--project` with `--artifact`. Legion pre-fills `--issue` from `LEGION_ISSUE`.
|
|
76
|
+
- An external reference addresses the Dispatch issue linked to it. If none is linked, create one: `dispatch issue --external owner/repo#n --project <project> --title '<title>'`.
|
|
77
|
+
- Create an issue for new work with `dispatch issue --project <KEY> --title '<title>'`. Set `--priority` ([issues.md](skill://dispatch/references/issues.md#priority-is-yours-to-set)). Set `--assignee` only when the human said who owns it. Set `--repo` only when it differs from what the issue inherits. Creating an issue does not subscribe you. Never create an issue to park a question.
|
|
78
|
+
- File work in a project that exists (`dispatch projects`). Work across projects goes in the one that owns most of it. Create a project only when the human asks. You cannot rename or delete a project.
|
|
161
79
|
|
|
162
80
|
## Search first
|
|
163
81
|
|
|
164
|
-
`skill://dispatch-first
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
Websearch syntax applies: `"merge queue"`, `-daemon`, `OR`. Issues, documents, asks, comments, and messages rank separately; the
|
|
168
|
-
merged page orders each kind's best in turn — issue, document, ask, comment, message — and a bare issue key ranks first. Each
|
|
169
|
-
kind's list also merges a query embedding's meaning match with keyword hits (LEGION-549): a paraphrase with no shared word can
|
|
170
|
-
still match; without an embedder, it says so and ranks by keyword alone. A page holds `--limit` hits (20 default, 50 max); the first
|
|
171
|
-
line gives the total (`showing 1-20 of 312`); see [Search paging](skill://dispatch/references/issues.md#search-paging) for more.
|
|
172
|
-
Queries over 1,000 characters are refused: use the few words `skill://dispatch-first` names, never a pasted passage. Issue hits
|
|
173
|
-
start with the issue key; document hits start with `dispatch://PROJECT/artifact/<slug>`, then the link. Cite the hit (`dispatch://KEY` or the doc ref) or say "no prior issue".
|
|
174
|
-
|
|
175
|
-
`dispatch issue` refuses a title that near-duplicates an issue in the same project and prints the candidates (`POSSIBLE_DUPLICATE`). Read them; reference the existing issue, or run it again with `--force` when it is genuinely new work.
|
|
176
|
-
The check compares title words only (shared stemmed terms), never meaning: "four tests that fail a
|
|
177
|
-
merge" pairs with "four CI gates that cannot fail a merge". So when you force past a candidate, give
|
|
178
|
-
the new issue a title that names what differs where you can, and open its spec with the
|
|
179
|
-
distinction from the named issue, citing it (`dispatch://KEY`), for whoever reads the next pairing.
|
|
180
|
-
|
|
181
|
-
### Symptom versus cause
|
|
182
|
-
|
|
183
|
-
When a symptom and its cause sit on different issues, the work accrues to the cause's issue, and
|
|
184
|
-
the symptom's issue carries a pointer to it. Before posting a measurement or finding, search
|
|
185
|
-
Dispatch for the failing identity's or component's name, and post on the issue whose title names
|
|
186
|
-
the fix, not the one naming the symptom. A symptom issue gathering messages with no human response
|
|
187
|
-
is the tell.
|
|
82
|
+
- Search as `skill://dispatch-first` says before you plan, file, ask, post, start a design document or start work. `dispatch search --help` has the syntax and paging. A paraphrase can match by meaning. Without an embedder, search says so and ranks by keyword. Never paste a passage: a query over 1,000 characters is refused. Cite the hit (`dispatch://KEY`) or say "no prior issue".
|
|
83
|
+
- `POSSIBLE_DUPLICATE` compares title words only. Read the candidates. Reference the existing issue, or use `--force` for new work. Then give the new title the difference, and open its spec with the distinction, citing the named issue.
|
|
84
|
+
- **Symptom versus cause.** Work goes on the issue whose title names the fix. The symptom's issue gets a pointer. Before you post a finding, search for the failing component's name. A symptom issue that gathers messages with no human reply is the sign.
|
|
188
85
|
|
|
189
86
|
## Claim the issue before you work it
|
|
190
87
|
|
|
191
|
-
Before you
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
dispatch claim --issue LEGION-234 # I am implementing this
|
|
195
|
-
dispatch claim --issue LEGION-234 --release # I have stopped; it is free
|
|
196
|
-
```
|
|
197
|
-
A claim is intent to implement: reading, commenting, asking, or gating a pull request claims
|
|
198
|
-
nothing. `409 ISSUE_CLAIMED` means someone else holds the issue; never work it in parallel. What
|
|
199
|
-
each refusal means, and when a claim is yours to take, is in
|
|
200
|
-
[Working an issue](skill://dispatch/references/issues.md).
|
|
88
|
+
- Before you implement, `dispatch claim --issue <KEY>` and `dispatch issue-update --issue <KEY> --status in_progress`. Release with `--release` when you finish, hand over or switch. Closing releases it.
|
|
89
|
+
- Reading, commenting, asking or gating a PR claims nothing.
|
|
90
|
+
- `409 ISSUE_CLAIMED`: someone else holds it. Never work it in parallel. Refusals and takeovers: [issues.md](skill://dispatch/references/issues.md).
|
|
201
91
|
|
|
202
92
|
## Issue status is yours to move
|
|
203
93
|
|
|
204
|
-
|
|
205
|
-
`dispatch claim --issue <KEY>` and `dispatch issue-update --issue <KEY> --status in_progress`. Outside
|
|
206
|
-
Legion the session doing the work moves its issue and the children it owns: `in_progress` when
|
|
207
|
-
implementation starts, `testing` while the change is proven on a production-like surface,
|
|
208
|
-
`needs_review` when its pull request waits on the merge queue, and `done`, with a `--reason`, once
|
|
209
|
-
the change has been driven in production. Never write the status of an issue that carries the
|
|
210
|
-
`legion` label, or of any issue under one: the Legion daemon writes those. Closing, clearing a
|
|
211
|
-
field, and choosing your next issue are in [Working an issue](skill://dispatch/references/issues.md).
|
|
94
|
+
Outside Legion, the session doing the work moves its issue and the children it owns. Use `in_progress` at implementation and `testing` while proven on a production-like surface. Use `needs_review` while its PR waits on the merge queue, and `done` with `--reason` once driven in production. Never write the status of an issue with the `legion` label or under one. The daemon writes those.
|
|
212
95
|
|
|
213
96
|
## Asking
|
|
214
97
|
|
|
215
|
-
|
|
216
|
-
block in that document ([Decision blocks](#decision-blocks)), at every phase, approved or not: a
|
|
217
|
-
block in an approved document leaves the approval stale until the answer, which carries it
|
|
218
|
-
forward when it is the whole change (below). A Legion phase worker sends it to its architect,
|
|
219
|
-
which writes the block (`skill://legion-worker`). A to-do or permission only a human can give, or
|
|
220
|
-
a decision with no document to live in, is a `dispatch ask`. The gates below apply to both.
|
|
98
|
+
A design decision a document records is a decision block in it, at every phase, approved or not. A block in an approved document makes the approval stale until its answer. A Legion phase worker sends the decision to its architect (`skill://legion-worker`). A to-do or permission only a human can give, or a decision with no document, is a `dispatch ask`. The gates apply to both.
|
|
221
99
|
|
|
222
100
|
### Before you ask
|
|
223
101
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
for it. A halt condition (a change to IAM, deletion or exposure of production data, anything
|
|
232
|
-
that reaches a customer) passes this gate: it is your own `dispatch ask` to the human on your own
|
|
233
|
-
issue.
|
|
234
|
-
2. **Is there genuine uncertainty, and have you measured what you can?** If there is none, it is
|
|
235
|
-
a plan you execute. The one legitimate ask without uncertainty is permission for an action
|
|
236
|
-
only a human can authorise — a production write, an external send, a console action. Start it
|
|
237
|
-
with the problem and why the action is needed, then state what the action changes and risks;
|
|
238
|
-
its options name the outcomes.
|
|
239
|
-
Measure before you write: how many are affected, whether anything reaches the path, what the
|
|
240
|
-
current state already is. The measurement decides whether a human is needed at all, and when
|
|
241
|
-
one is, it turns a research request he cannot answer into a decision he can. Put the
|
|
242
|
-
measurement and the size of the affected population in the ask. When the measurement shows one
|
|
243
|
-
fix cannot repair most of that population and another fix can, drop the first, rather than
|
|
244
|
-
offering it cut down to the part it reaches. An option not to act, such as a permission ask's
|
|
245
|
-
Hold, is not a fix, and it stays.
|
|
246
|
-
Report what the measurement could **not** establish, with its own control: "I found no
|
|
247
|
-
evidence" and "there is no evidence to find" read alike and mean opposite things, and a
|
|
248
|
-
control that shares the query's blind spot proves neither. Before you say you are waiting on
|
|
249
|
-
him, run `dispatch open-asks` (below) — and the test for a new ask is not whether you asked on
|
|
250
|
-
this issue before, but whether it asks him to re-report something he has already answered.
|
|
251
|
-
3. **Can someone who has not read the code answer it on a phone?** Write it as
|
|
252
|
-
[Writing for the human](#writing-for-the-human) says — who can do what today and what changes
|
|
253
|
-
for them, then two options with what each costs and your recommendation — with no slice or
|
|
254
|
-
decision numbers, no coined nouns, and each real tool, event, route or setting named exactly with
|
|
255
|
-
what it does. If you cannot write it that way, you do not understand it well enough to ask.
|
|
256
|
-
4. **Is it outside what he has already told you he wants?** If not, that want is settled, and so
|
|
257
|
-
is every choice inside it his words do not make: build it and ask nothing about it or beside it
|
|
258
|
-
until it is delivered, whatever the ask says about the build. Afterwards, ask only about a choice his own
|
|
259
|
-
message raises and leaves open, quoting his words and naming what you delivered. A cause you
|
|
260
|
-
diagnosed, or a behaviour next to the one he named, is not in his message: neither ask about
|
|
261
|
-
it nor build it — fixing the cause of the thing he named is delivering what he asked for, and
|
|
262
|
-
is not what this forbids; changing something else is. An ask that turns his complaint about
|
|
263
|
-
one control into a choice about another does not address what he asked, and changing that
|
|
264
|
-
other control is a change he never asked for. What is still an ask the moment you know it,
|
|
265
|
-
even before delivery, is anything "Anything you are blocked on a human for is visible in
|
|
266
|
-
Dispatch" (further down) lists that the delivery waits on — including a conflict between what
|
|
267
|
-
he asked for and another of his rules, which this gate would otherwise bury as settled.
|
|
268
|
-
|
|
269
|
-
Nobody audits or retracts another session's asks: passing every gate, and carrying the content
|
|
270
|
-
instead of pointing at another message in prose (below), is the asking session's own check.
|
|
271
|
-
|
|
272
|
-
Open a standalone ask with `dispatch ask` (`dispatch ask --help` lists its flags), one `--option` per choice:
|
|
102
|
+
1. **Does it need the human's authority, taste or risk appetite?** Your lane decides schema shapes, field names and migration internals. Decide them in the plan or code, not in the spec. Settle a two-lane contract over Envoy, with no ask. A halt condition passes the gate. That is an IAM change, deleting or exposing production data, or anything that reaches a customer. Ask on your own issue.
|
|
103
|
+
2. **Is there real uncertainty, and did you measure what you can?** With none, execute. The one ask without uncertainty is permission only a human can give: a production write, an external send, a console action. Start it with the problem and why, then what it changes and risks. Options name outcomes. Measure first: how many are affected, what reaches the path, the current state. Put the measurement and the population size in the ask. One fix cannot fix most of that population and another can? Drop the first. Never offer it cut down. An option not to act (Hold) stays. Report what the measurement could not establish, with its own control. "I found no evidence" and "there is none to find" differ. A control with the query's blind spot proves neither. The test for a new ask is not whether you asked on this issue before. It is whether it makes the human report again an answer they already gave.
|
|
104
|
+
3. **Can someone who has not read the code answer it on a phone?** Say who can do what today and what changes. Give two options with costs, and your recommendation. No slice or decision numbers, no coined nouns. If you cannot write it so, you do not understand it yet.
|
|
105
|
+
4. **Is it outside what the human already said they want?** If not, it is settled, with every choice inside it their words leave open. Build it and ask nothing about it or beside it until delivered, whatever the ask says about the build. After that, ask only about a choice their message raised and left open, quoting it and naming what you delivered. A cause you diagnosed or a neighbouring behaviour is not in their message: do not ask about it or build it. Fixing the cause of the thing they named is delivery. Do not turn a complaint about one control into a choice about another. Still ask at once about any blocker in [When you need a human](#when-you-need-a-human), including a conflict between their request and another of their rules.
|
|
106
|
+
|
|
107
|
+
Nobody else audits or retracts your asks. Passing the gates is your own check.
|
|
108
|
+
|
|
273
109
|
```bash
|
|
274
110
|
dispatch ask --issue <KEY> --question-file - --option 'Label: what it costs' --option 'Other: what it costs' <<'EOF'
|
|
275
|
-
<the problem, what constrains the answer (each answer of
|
|
111
|
+
<the problem, what constrains the answer (each answer of theirs you rely on, linked), your recommendation and why>
|
|
276
112
|
EOF
|
|
277
113
|
```
|
|
278
|
-
It prints the ask's id; you follow the ask you opened (see [Following](#following)).
|
|
279
|
-
|
|
280
|
-
References belong in the question text; `--ref` is sugar that appends its `dispatch://` value to the question as a rendered link.
|
|
281
|
-
|
|
282
|
-
An ask is read on a phone by someone who has not read the code. Write its question and options as
|
|
283
|
-
[Writing for the human](#writing-for-the-human) says, and apply its phone test before posting.
|
|
284
|
-
Never lead a question with a file path, line number, sequence number, document version or role token: its own text explains the problem.
|
|
285
|
-
Evidence below it may cite one where the reader checks it, or anchor the ask to the passage with `--anchor-json '{"artifact":"spec","quote":"…"}'`; an optional `occurrence` is zero-based and selects a repeated quote.
|
|
286
|
-
A quote anchor is pinned to its lowest complete
|
|
287
|
-
containing block while retaining its quote as display text, so rewording the passage keeps it
|
|
288
|
-
attached; a quote spanning top-level blocks, and existing anchors without a block, stay readable
|
|
289
|
-
against their original document version if their quote disappears.
|
|
290
|
-
|
|
291
|
-
An ask must be answerable from its own text and its anchor alone. Anchor a to-do about a document
|
|
292
|
-
passage with `--anchor-json`. Follow up on an ask or comment with `dispatch comment`; cite anything else
|
|
293
|
-
with a `dispatch://` reference (see [References](#references)). Never write "see above", "the
|
|
294
|
-
message above", or "as attached".
|
|
295
|
-
|
|
296
|
-
**Pointing at another message is a defect, not a shortcut:** the ask view does not show the
|
|
297
|
-
issue's comments. The rules:
|
|
298
|
-
|
|
299
|
-
- An ask that names another message in prose — "my comment above", "the procedure I posted",
|
|
300
|
-
"see the earlier message" — fails the gates. Put the content IN the ask. If it does not fit the
|
|
301
|
-
800-character budget, the step is too big: split the step, never point elsewhere. The only
|
|
302
|
-
pointers an ask may carry are a `dispatch://` reference or a document `anchor`, and they cite —
|
|
303
|
-
the ask still says in one line what the reader will find there and can be answered without
|
|
304
|
-
following them.
|
|
305
|
-
- A runbook the human must execute is one ask per step, each self-contained: what to do, where,
|
|
306
|
-
what result proves it, and options that name the step's outcomes. Each later step opens only
|
|
307
|
-
after the previous is answered and states that step's verified result in one line ("Step 1
|
|
308
|
-
done: the licence shows Cloud Identity Free on the admin console.") — never a pointer to the
|
|
309
|
-
earlier ask.
|
|
310
|
-
|
|
311
|
-
**A decision about an uploaded artifact links it.** If the human must read an artifact to answer,
|
|
312
|
-
the question carries `dispatch://KEY/artifact/<slug>` (or `ref`), never just its filename. Text
|
|
313
|
-
they must read to decide belongs in the spec in the first place — see [Artifacts](#artifacts).
|
|
314
114
|
|
|
315
|
-
|
|
115
|
+
- You follow the ask you open. `--ref` appends a `dispatch://` link to the question.
|
|
116
|
+
- Never lead with a file path, line number, sequence number, version or role token. Evidence under it can cite one. Anchor it to a passage with `--anchor-json '{"artifact":"spec","quote":"…"}'` (optional zero-based `occurrence`).
|
|
117
|
+
- The ask must be answerable from its own text and anchor. The ask view does not show the issue's comments. Never write "see above", "my comment above" or "as attached". Put the content in the ask. If it does not fit in 800 characters, split the step. A `dispatch://` reference or an anchor may cite, with one line on what it holds.
|
|
118
|
+
- A runbook for the human is one self-contained ask per step: what, where, what result proves it, and outcome options. Open each step after the previous is answered, with its verified result in one line.
|
|
119
|
+
- If the human must read an artifact to decide, link `dispatch://KEY/artifact/<slug>`, never a filename. Text needed to decide belongs in the spec ([Artifacts](#artifacts)).
|
|
316
120
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
**Unsettled product shape needs a decision before implementation.** When a page, navigation entry, table key, customer-scoping rule, or persisted sidecar would set product shape that the human has not already settled, write a decision block in the document that records the work before the first implementation commit; in a Legion tree the architect writes it, and a phase worker sends the decision to its architect. A lane's schema decision or a contract two lanes agree does not settle product shape. This does not turn a user-specified decision or routine implementation into an approval request. A control or behaviour the human asked for in words is settled by those words, together with every choice inside it that his words do not make (where it sits, its defaults, …
|
|
320
|
-
|
|
321
|
-
**Anything you are blocked on a human for is visible in Dispatch.** An agent waits on a human only
|
|
322
|
-
through an open ask. A to-do, permission, credential or grant renewal, setting only they can
|
|
323
|
-
change, review click, or conflict between two of their own rules is a `dispatch ask` the moment you
|
|
324
|
-
know. Start with the problem and why it matters, then the constraints, options and their costs, and
|
|
325
|
-
your recommendation. For an action only the human can perform, state what it changes and risks;
|
|
326
|
-
never make the action itself the question (a design decision is a decision block, as above). Never
|
|
327
|
-
write a human to-do only into a spec, a comment reply, a message, or a pull-request body: nothing
|
|
328
|
-
in those paths reaches the human's Inbox, and a human who is not reading the document does not
|
|
329
|
-
know they are the blocker. Before asking, try to remove the step: a value already on the machine, a
|
|
330
|
-
permission you already hold, an API that replaces the click. One ask per item, `--urgency high`
|
|
331
|
-
when work is stopped on it; while it is open, keep working on everything that is not.
|
|
121
|
+
### When you need a human
|
|
332
122
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
123
|
+
- Before you say you wait on a human, run `dispatch open-asks`. Add `--project <KEY>` to see every open ask in a project.
|
|
124
|
+
- **Unsettled product shape needs a decision before implementation.** Product shape can come from a page, navigation entry, table key, customer-scoping rule or persisted sidecar. If the human has not settled it, write a decision block in the work's document before the first implementation commit. In a Legion tree the architect writes it. A lane's schema choice or a two-lane contract does not settle product shape. A behaviour the human asked for in words is settled, with each choice inside it. Routine work needs no approval.
|
|
125
|
+
- **Anything you are blocked on a human for is visible in Dispatch.** An agent waits on a human only through an open ask. Make each blocker a `dispatch ask` the moment you know. Blockers are a to-do, a permission, a credential or grant renewal, a human-only setting, a review click, or a conflict between two of their rules. Start with the problem and why, then constraints, options with costs, and your recommendation. For a human-only action, state what it changes and risks. Never make the action the question. A to-do only in a spec, comment, message or PR body reaches no Inbox.
|
|
126
|
+
- First try to make the step unnecessary: a value on the machine, a permission you hold, an API that replaces the click.
|
|
127
|
+
- One ask per item, `--urgency high` when work halts on it. Keep working on everything else.
|
|
128
|
+
- **Ask once.** Do not raise an open ask again in each message. The open ask is the request.
|
|
129
|
+
- After it opens: [Asks after they open](skill://dispatch/references/asks.md).
|
|
336
130
|
|
|
337
131
|
## Architecture components
|
|
338
132
|
|
|
339
|
-
Attach every architectural issue to the components it changes. Attach the root before
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
dispatch
|
|
343
|
-
dispatch issue-update --issue CORE-12 --components-json '{"mode":"explicit","ids":["web"]}' # its own set, replacing what it inherited
|
|
344
|
-
dispatch issue-update --issue CORE-13 --components-json '{"mode":"none","reason":"hiring, not code"}'
|
|
345
|
-
dispatch issue-update --issue CORE-14 --components-json '{"mode":"inherit"}' # back to the parent chain's attachment
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
No `dispatch` command lists component ids. Read the configured model with `GET /api/v1/projects/{key}/architecture` and use each non-external `components[].id`; when its source repository is your checkout, those ids are the file names under `.dispatch/architecture/` (`web.md` → `web`). An id absent from the model, or an `external` component, is refused with `COMPONENTS_INPUT`.
|
|
349
|
-
|
|
350
|
-
Use `"mode":"none"` with a concrete reason only when the work is genuinely non-architectural (for example hiring, process, or operations work). A closed issue can be classified without reopening. Change code and its architecture description (`.dispatch/architecture/<id>.md`) in the same review. When the model you read is behind your checkout, `dispatch architecture-sync` imports it now ([Syncing a project's architecture model](skill://dispatch/references/issues.md)).
|
|
133
|
+
- Attach every architectural issue to the components it changes. Attach the root before you decompose it: children inherit.
|
|
134
|
+
- `--components-json '{"mode":"explicit","ids":["web"]}'`, `'{"mode":"none","reason":"hiring, not code"}'` (only for non-architectural work, with a concrete reason), or `'{"mode":"inherit"}'`.
|
|
135
|
+
- Component ids: each non-external `components[].id` from `GET /api/v1/projects/{key}/architecture`, or the file names under `.dispatch/architecture/` in its source repository. Others are refused `COMPONENTS_INPUT`. A closed issue can be classified without reopening.
|
|
136
|
+
- Change code and `.dispatch/architecture/<id>.md` in the same review. A stale model: `dispatch architecture-sync` ([issues.md](skill://dispatch/references/issues.md#syncing-a-projects-architecture-model)).
|
|
351
137
|
|
|
352
138
|
## Close what you opened
|
|
353
139
|
|
|
354
|
-
An ask you opened is yours until
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
Never leave it for the human to clear.
|
|
358
|
-
|
|
359
|
-
Every later write on the issue answers `You still have an open ask on …` and names it. Treat that
|
|
360
|
-
as the checklist: if it is still needed, leave it; if it was answered elsewhere, resolve it with
|
|
361
|
-
the resolving fact as the reason. Before posting a new ask, inspect your open ones. If the new ask
|
|
362
|
-
supersedes one, retract the old one with `dispatch resolve-ask --kind retracted` in the same
|
|
363
|
-
turn.
|
|
364
|
-
|
|
365
|
-
See [Following](#following) for why you receive what happens to asks you open and
|
|
366
|
-
[What comes back](skill://dispatch/references/reading.md) for finding them again with `dispatch open-asks`.
|
|
140
|
+
- An ask you opened is yours until answered or resolved. When the answer arrives another way, or the design made it moot, `dispatch resolve-ask` in the same turn. Never leave it for the human.
|
|
141
|
+
- Each later write names your open asks (`You still have an open ask on …`). Keep the ones still needed. Resolve the rest with the resolving fact as the reason.
|
|
142
|
+
- Before a new ask, check your open ones. Retract one it supersedes with `--kind retracted` in the same turn.
|
|
367
143
|
|
|
368
144
|
## Approval of a spec
|
|
369
145
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
that
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
spec; and the current version has not been approved. A Legion root spec under an armed design gate
|
|
379
|
-
always goes to approval once all three hold (`skill://legion-architect`).
|
|
380
|
-
|
|
381
|
-
Before calling `dispatch request-approval`, have a fresh read-only reader check the current spec
|
|
382
|
-
against the code and the human's words, then resolve every finding. A Legion architect uses
|
|
383
|
-
`plan-gap-analyst`, another session the read-only reader its host supplies. When all three hold,
|
|
384
|
-
request in the pass that finishes the spec: a design waiting with nothing in the human's Inbox
|
|
385
|
-
waits on nobody. When a human asks for approval while a block is open, neither request it nor hold
|
|
386
|
-
it silently: name each open block and ask them to answer or waive it. For a waiver, close it with
|
|
387
|
-
`dispatch resolve-ask --kind resolved` (their words as `--reason`), write their decision into the
|
|
388
|
-
text in their words and request. `dispatch request-approval` refuses while any block is open.
|
|
389
|
-
|
|
390
|
-
An approval request carries nothing new: a point the human has not agreed to gets its own decision
|
|
391
|
-
block first, with your recommendation, or, when it is a choice you can make yourself
|
|
392
|
-
([Before you ask](#before-you-ask), gate 1) and the human will not want a say in it, comes out of
|
|
393
|
-
the spec and is made where the work happens; an inference you cannot defend in a decision block
|
|
394
|
-
comes out of the spec. `--summary` says in one to three sentences what the human is approving and
|
|
395
|
-
nothing else: no commentary on itself or on the conversation, and no open question; after an
|
|
396
|
-
earlier approval, one sentence naming what changed since it, since the card shows that approval
|
|
397
|
-
and its `Show diff` control carries the detail. Never write "Approve" options into an ordinary
|
|
398
|
-
`dispatch ask`; only humans approve. The call, its result and its answer:
|
|
399
|
-
[Approval requests](skill://dispatch/references/documents.md#approval-requests).
|
|
146
|
+
A human approves one version. A later version makes the approval stale, unless the human's own answer to a decision block is the whole change. Then Dispatch records the approval and emits `artifact.approved`: request nothing. If the answer changes text outside its block, rewrite that text, run the fresh reader, and request again. A new version also moves an open request, which then waits on you.
|
|
147
|
+
|
|
148
|
+
- Request only when all three hold: every block is answered or waived, the human agreed to every point, and this version is not approved. A Legion root spec under an armed design gate always goes to approval then (`skill://legion-architect`).
|
|
149
|
+
- First have a fresh read-only reader check the spec against the code and the human's words, and resolve every finding. A Legion architect uses `plan-gap-analyst`. Then request in the same pass: a finished design with nothing in the Inbox waits on nobody.
|
|
150
|
+
- If the human asks for approval while a block is open, name each open block and ask them to answer or waive it. For a waiver, `dispatch resolve-ask --kind resolved` with their words as `--reason`, write the decision into the text, then request.
|
|
151
|
+
- A request carries nothing new. An unagreed point first gets a decision block with your recommendation. A choice that is yours (gate 1), where the human will not want a say, leaves the spec. An inference you cannot defend in a block leaves the spec.
|
|
152
|
+
- `--summary` is one to three sentences on what they approve, with no commentary and no question. After an earlier approval, one sentence on what changed.
|
|
153
|
+
- Only humans approve. Never put "Approve" options in a `dispatch ask`. Details: [Approval requests](skill://dispatch/references/documents.md#approval-requests).
|
|
400
154
|
|
|
401
155
|
## The Spec
|
|
402
156
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
Read the current document before changing it with `dispatch doc-read` (`--issue`, or `--project`
|
|
408
|
-
and `--artifact`, an optional `--version`, or `--ref`).
|
|
409
|
-
It prints live or versioned markdown with open marks. A live read ends with a document token; `--blocks` lists the live
|
|
410
|
-
document's block ids, tokens and table rows instead, which `dispatch doc-edit` takes to address a block that is not a typed
|
|
411
|
-
block. `--issue` with no
|
|
412
|
-
`--artifact` reads the issue specification; a project needs `--artifact`; and a `dispatch://PROJECT/artifact/<document-ref>`
|
|
413
|
-
ref supplies both, where `document-ref` is the slug (an id or a filename resolves when no document has that slug). A file
|
|
414
|
-
`dispatch artifact` uploaded reads its text at the latest or named version, or a description when it is not UTF-8 text.
|
|
415
|
-
A picture (PNG, JPEG, GIF or WebP under 3,750,000 bytes, 5 MB of base64) is written to a file, and the command prints a
|
|
416
|
-
`- picture: <path>` line with its type and size: open it with your file-read tool. That includes
|
|
417
|
-
`dispatch://agent/<session id>/artifact/<slug>@vN`, one a person sent you on the Agents page. A session is shown each picture once,
|
|
418
|
-
since the provider refuses a request over 32 MB: later reads and deliveries name it, and `dispatch doc-read` shows it again (after compaction too).
|
|
419
|
-
|
|
420
|
-
Editing one is [Editing a document](skill://dispatch/references/document-edits.md): the shape of `dispatch doc-edit`,
|
|
421
|
-
how to quote the text you mean, one `replace` per paragraph, preconditions against a stale edit, and
|
|
422
|
-
what each operation costs a block's id and its anchors.
|
|
157
|
+
- Name each version that records a decision with `dispatch doc-edit --summary`.
|
|
158
|
+
- Read the current document with `dispatch doc-read` before you change it. `--blocks` lists block ids and tokens for edits. It also shows pictures: open a written picture file with your file-read tool.
|
|
159
|
+
- Edit in place as [Editing a document](skill://dispatch/references/document-edits.md) says.
|
|
423
160
|
|
|
424
161
|
## Typed blocks
|
|
425
162
|
|
|
426
|
-
|
|
427
|
-
as [Documents](skill://dispatch/references/documents.md) says.
|
|
163
|
+
Write an `:::ask` or a callout only as [Documents](skill://dispatch/references/documents.md#typed-blocks) says.
|
|
428
164
|
|
|
429
165
|
## Artifacts
|
|
430
166
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
artifact is for a real file: something sent as-is, a long report, a binary, a screenshot.
|
|
434
|
-
|
|
435
|
-
When you do upload one, the spec links it as `dispatch://KEY/artifact/<slug>` (the slug the
|
|
436
|
-
upload prints; it renders as a link) at the place the reader needs it, and the ask that needs the
|
|
437
|
-
decision carries the same reference. A heading or a sentence naming the filename is not a
|
|
438
|
-
reference.
|
|
439
|
-
|
|
440
|
-
Uploading one (`dispatch artifact`, its slugs, versions and Markdown rules) is in
|
|
441
|
-
[Documents](skill://dispatch/references/documents.md).
|
|
167
|
+
- Text the human must read to decide (a draft, a proposal, a summary) is a section of the spec. An artifact is for a real file: sent as-is, a long report, a binary, a screenshot.
|
|
168
|
+
- Link an uploaded artifact as `dispatch://KEY/artifact/<slug>` where the reader needs it, and in the ask that needs it. A filename is not a reference. Uploading: [Documents](skill://dispatch/references/documents.md#artifacts).
|
|
442
169
|
|
|
443
170
|
## Structure over stream
|
|
444
171
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
-
|
|
448
|
-
decision with its own lifecycle — gets its own issue with the content as the issue's document
|
|
449
|
-
(spec artifact), not a message pile on an existing issue. If you are about to post a message
|
|
450
|
-
carrying a draft, a spec, or anything over a couple of paragraphs, stop: that is an issue with a
|
|
451
|
-
document, or an artifact on the issue it belongs to.
|
|
452
|
-
- **Content lives in documents; decisions live in asks; messages only announce.** A draft the
|
|
453
|
-
human must read goes in the issue's spec (see [Artifacts](#artifacts)), which the dashboard renders with versions and margins; the
|
|
454
|
-
ask that needs their word references it (`--ref`, or the `dispatch://` link inline) instead of
|
|
455
|
-
restating it. A message never carries a body a human has to scroll.
|
|
456
|
-
- **Never split one deliverable across a message + an ask that points at it.** Ask the question
|
|
457
|
-
with the document reference in the question text; the reader lands on the content in one click.
|
|
458
|
-
|
|
459
|
-
The command answers your third consecutive message on an issue with no human reply with
|
|
460
|
-
`You've sent N messages …`. That is the ledger pattern being named; stop and either wait or ask
|
|
461
|
-
once.
|
|
172
|
+
- One issue per deliverable (an email to send, a document to review, a decision with its own life), with the content as its document. A message that carries a draft, a spec or more than a couple of paragraphs is an issue or an artifact instead.
|
|
173
|
+
- Content lives in documents, decisions in asks. Messages only announce. Never split one deliverable into a message and an ask that points at it: put the reference in the question.
|
|
174
|
+
- `You've sent N messages …` means three messages in a row with no human reply. Then wait, or ask once.
|
|
462
175
|
|
|
463
176
|
## Messages
|
|
464
177
|
|
|
465
|
-
|
|
466
|
-
change a human must know about now: a deliverable landed. Nothing else — no progress updates, no
|
|
467
|
-
"starting X", no "still working", no restating the spec, no status on a timer. Your transcript is where work is narrated; the
|
|
468
|
-
pull request is where it is summarised. One message that a human reads beats ten that train them to skip you.
|
|
178
|
+
A message is a reply to a human's message, or a change a human must know now, such as a deliverable that landed. Never progress, "starting X", "still working", spec restatements or timed status. The PR summarises the work.
|
|
469
179
|
|
|
470
180
|
```bash
|
|
471
181
|
dispatch message --issue <KEY> --body-file - <<'EOF'
|
|
@@ -473,26 +183,14 @@ dispatch message --issue <KEY> --body-file - <<'EOF'
|
|
|
473
183
|
EOF
|
|
474
184
|
```
|
|
475
185
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
**Pictures.** To show a screenshot inline, pass its path with `--image` (`dispatch message`, `dispatch comment`, `dispatch ask`);
|
|
480
|
-
`dispatch read` writes the pictures what it shows embeds to files and prints their paths. Both are in [Documents](skill://dispatch/references/documents.md), "Artifacts".
|
|
481
|
-
|
|
482
|
-
A BTW, Aside or Steer frame, or a message from the Agents page, is answered as
|
|
483
|
-
[Targeted and direct messages](skill://dispatch/references/messages.md) says.
|
|
186
|
+
- A message is not a decision or document feedback (`dispatch comment`). It wakes nobody unless the issue is routed.
|
|
187
|
+
- Show a screenshot inline with `--image` on `message`, `comment` or `ask` ([Documents](skill://dispatch/references/documents.md#artifacts)).
|
|
188
|
+
- Answer BTW, Aside, Steer and Agents-page messages as [messages.md](skill://dispatch/references/messages.md) says.
|
|
484
189
|
|
|
485
190
|
## Following
|
|
486
191
|
|
|
487
|
-
You follow
|
|
488
|
-
directly. A person's reply to a comment you started, and a person's new comment on a document you
|
|
489
|
-
wrote, reach you directly too. Nothing else on an issue reaches you unless you subscribe to its
|
|
490
|
-
topic. Leaving or rejoining a thread, and the topic to subscribe to, are in
|
|
491
|
-
[Asks after they open](skill://dispatch/references/asks.md).
|
|
192
|
+
You follow each ask you open or reply to. Replies to your comments and new comments on documents you wrote also reach you. Nothing else on an issue reaches you unless you subscribe ([asks.md](skill://dispatch/references/asks.md#following)).
|
|
492
193
|
|
|
493
194
|
## References
|
|
494
195
|
|
|
495
|
-
|
|
496
|
-
[Reference forms](skill://dispatch/references/reading.md).
|
|
497
|
-
|
|
498
|
-
**Every reference is a link, never an unlinked mention.** If you name a thing that has an address, link it: another issue, ask, comment, spec, or message (the `dispatch://` forms in [Reading back](skill://dispatch/references/reading.md)), an artifact (`dispatch://KEY/artifact/<slug>`), an eval (its viewer URL), a Slack message (its permalink), a Drive file (its share link). Bare phrases like "see this eval", "his 09-04 run", "the comment above", or "per the spec" with no link are banned: they make the reader hunt for what you already had in hand, and nothing can be traversed from them. Linking every reference is what makes a body both consumable and navigable. If a thing genuinely has no linkable address, say so; otherwise the link is not optional.
|
|
196
|
+
Link every reference: an issue, ask, comment, spec or message ([reference forms](skill://dispatch/references/reading.md#reference-forms)), or an artifact. Link an eval by its viewer URL, a Slack message by its permalink, a Drive file by its share link. Never write "see this eval", "the comment above" or "per the spec" without a link. If a thing has no address, say so.
|