5
5
6
6
# FRACAS — Feature Requests As a Constant Agent-monitored Stream
7
7
8
-
Removed:
Use this skill when the user asks to capture feature requests or to
9
-
Removed:
track a feature in `REQUESTS.org`.
8
+
Added:
## Overview
10
9
11
-
Removed:
`REQUESTS.org` is a flat stream. Each request is a top-level heading.
12
-
Removed:
The newest request comes first. There are no container or topical
13
-
Removed:
headings. Scope, impact, and kind are expressed as tags on each
14
-
Removed:
heading, not by position.
10
+
Added:
FRACAS keeps every feature request in one Org file, `REQUESTS.org`.
11
+
Added:
Dedicated Emacs tools write that file. The work follows three steps:
15
12
16
-
Removed:
Keep the session open across prompts. Treat each prompt as a separate
17
-
Removed:
feature request. Do not merge requests. Do not build, test, commit, or
18
-
Removed:
start an agent.
13
+
Added:
1. Capture the request at the top of the stream.
14
+
Added:
2. Track its status while the work runs.
15
+
Added:
3. Close it with commit evidence and test evidence.
19
16
17
+
Added:
## Usage
18
+
Added:
19
+
Added:
Use this skill when the user does one of these things:
20
+
Added:
21
+
Added:
- The user states a feature request, a defect, or a change to make.
22
+
Added:
- The user asks you to record or capture a request.
23
+
Added:
- The user asks for the status of a request, or asks to change it.
24
+
Added:
- The user asks you to close, cancel, or block a request.
25
+
Added:
- The user asks what requests are open.
26
+
Added:
27
+
Added:
Treat each prompt as one separate feature request. Do not merge two
28
+
Added:
requests. Do not build, test, commit, or start an agent for a capture.
29
+
Added:
20
30
The current prompt is the feature request:
21
31
22
32
$ARGUMENTS
23
33
24
-
Removed:
If the prompt is empty, ask for one line that describes the feature
34
+
Added:
If the prompt is empty, ask the user for one line that describes the
25
35
request. Then stop. Capture the next prompt as the next request.
26
36
27
-
Removed:
## Use the dedicated FRACAS MCP tools
37
+
Added:
## Core Concepts
28
38
29
-
Removed:
This skill provides dedicated Emacs Model Context Protocol (MCP)
30
-
Removed:
tools. Use them for every interaction with `REQUESTS.org`. Do not edit
31
-
Removed:
the file as raw text. Do not use shell or file tools to capture,
32
-
Removed:
change status, log, or verify an entry.
39
+
Added:
### The stream
33
40
34
-
Removed:
The dedicated tools avoid a security prompt. The generic `eval-elisp`
35
-
Removed:
tool passes its code through the Emacs security form walker. The
36
-
Removed:
walker prompts for each file function, such as `find-file-noselect`
37
-
Removed:
and `save-buffer`. The FRACAS tools register as normal MCP tools. They
38
-
Removed:
run through the tool dispatch path, which does not use the walker. The
39
-
Removed:
read-only tools also carry a `readOnlyHint` annotation. The MCP client
40
-
Removed:
can approve a read-only tool without a prompt.
41
+
Added:
`REQUESTS.org` is a flat stream. Each request is a top-level heading.
42
+
Added:
The newest request comes first. The file holds no container heading and
43
+
Added:
no topical heading. Tags on the heading give the kind, the scope, and
44
+
Added:
the impact. The position of a heading gives only its age.
41
45
42
-
Removed:
Each FRACAS tool takes a `root` argument. Set `root` to the absolute
43
-
Removed:
path of the project directory that contains `REQUESTS.org`. The tools
44
-
Removed:
operate only on that one file.
46
+
Added:
### The Org ID is the handle
45
47
46
-
Removed:
### Install the tools once per session
48
+
Added:
Every request carries an Org ID. Each tool that changes an entry needs
49
+
Added:
that ID. Never select an entry by its title text, because two titles
50
+
Added:
can match. Run `fracas-list` to get the ID of each entry.
47
51
48
-
Removed:
Load the tool file one time in the running Emacs before you use the
49
-
Removed:
tools. Run this with the Emacs MCP `eval-elisp` tool:
52
+
Added:
### The file owns the status sequence
50
53
51
-
Removed:
```elisp
52
-
Removed:
(load "/home/blendux/git/hito/.kiro/skills/fracas/fracas-tools.el" nil t)
53
-
Removed:
```
54
+
Added:
The `#+TODO:` line in the file preamble declares the keyword sequence.
55
+
Added:
The tools read that line. The tools never declare their own keywords.
56
+
Added:
To change the keywords, edit the `#+TODO:` line.
54
57
55
-
Removed:
Confirm the tools are present. This expression returns the thirteen
56
-
Removed:
FRACAS tool names:
58
+
Added:
### Evidence, not silence
57
59
58
-
Removed:
```elisp
59
-
Removed:
(seq-filter (lambda (name) (string-prefix-p "fracas-" name))
60
-
Removed:
(mapcar (lambda (tool) (alist-get 'name tool))
61
-
Removed:
(mcp-server-tools-list)))
62
-
Removed:
```
60
+
Added:
Three transitions demand a written reason or written evidence:
63
61
64
-
Removed:
If the load fails, stop and report the problem. Do not fall back to
65
-
Removed:
raw file edits.
62
+
Added:
- `BLOCKED` needs a reason.
63
+
Added:
- `CANCELLED` needs a reason.
64
+
Added:
- `DONE` needs a commit hash and a test recap.
66
65
67
-
Removed:
### The FRACAS tools
66
+
Added:
The tools refuse these transitions without that text. A stalled request
67
+
Added:
or a dropped request therefore always states why.
68
68
69
-
Removed:
- `fracas-inspect` — return the file's TODO keyword sequence and the
70
-
Removed:
closed tag vocabulary. Read-only.
71
-
Removed:
- `fracas-list` — list the top-level request entries, newest first,
72
-
Removed:
with each entry's Org ID, title, state, `SCHEDULED` time, and tags.
73
-
Removed:
Takes an optional `state` or `tag` filter. Read-only.
74
-
Removed:
- `fracas-capture` — create a TODO request as a top-level heading at
75
-
Removed:
the top of the stream. Applies tags, records the capture time as an
76
-
Removed:
inactive `SCHEDULED` timestamp, wraps the body to 72 columns, and
77
-
Removed:
assigns an Org ID.
78
-
Removed:
- `fracas-set-status` — set the TODO keyword of an entry. Rejects
79
-
Removed:
`DONE`.
80
-
Removed:
- `fracas-cancel` — set an entry to `CANCELLED` with a required
81
-
Removed:
reason.
82
-
Removed:
- `fracas-block` — set an entry to `BLOCKED` with a required reason.
83
-
Removed:
- `fracas-check` — manage a request's checkbox list to split a complex
84
-
Removed:
task into sub-tasks. Add an item, toggle one, or list them. A `[/]`
85
-
Removed:
cookie tracks progress.
86
-
Removed:
- `fracas-log` — append a timestamped progress note to an entry's
87
-
Removed:
`:LOGBOOK:` drawer. Append-only.
88
-
Removed:
- `fracas-retag` — replace an entry's tags with a validated set from
89
-
Removed:
the closed vocabulary.
90
-
Removed:
- `fracas-set-result` — write the structured `- result ::` line
91
-
Removed:
(commit hash and test recap) for an entry.
92
-
Removed:
- `fracas-complete` — set an entry to `DONE`. Records the result
93
-
Removed:
evidence, then confirms Org inserted the `CLOSED` timestamp. Never
94
-
Removed:
writes the timestamp itself.
95
-
Removed:
- `fracas-show` — return the full content of an entry: heading, state,
96
-
Removed:
tags, timestamps, body, logbook, checklist, and result. Read-only.
97
-
Removed:
- `fracas-verify` — return the heading, TODO state, `CLOSED`
98
-
Removed:
timestamp, and tags of an entry. Read-only.
69
+
Added:
### Which tool sets which state
99
70
100
-
Removed:
Use `fracas-show` to read an entry's full content and `fracas-retag`
101
-
Removed:
to re-tag it. These are the sanctioned tools for those actions,
102
-
Removed:
because the Emacs MCP `org-*` tools cannot operate on this file.
71
+
Added:
Pick the tool from the target state:
103
72
104
-
Removed:
## The tag vocabulary
73
+
Added:
- Target `IN-PROGRESS`, `TESTING`, or `TESTED` → `fracas-set-status`
74
+
Added:
- Target `BLOCKED` → `fracas-block`, with a reason
75
+
Added:
- Target `CANCELLED` → `fracas-cancel`, with a reason
76
+
Added:
- Target `DONE` → `fracas-complete`, with commit and test evidence
105
77
106
-
Removed:
Every request carries one kind tag and one scope tag. An impact tag is
107
-
Removed:
optional and marks an exception. Add the `doctrine` flag when the
108
-
Removed:
request touches or deviates from Heavy Duty doctrine. The vocabulary is
109
-
Removed:
closed; `fracas-capture` rejects any other tag. The tags are short and
110
-
Removed:
bare, with no axis prefix. The three axes use distinct words, so a
111
-
Removed:
bare tag stays unambiguous.
78
+
Added:
### The tag vocabulary
112
79
113
-
Removed:
Kind — the change type. Choose one:
80
+
Added:
Every request carries one kind tag and one scope tag. The impact axis
81
+
Added:
and the misc axis are optional. The vocabulary is closed, so
82
+
Added:
`fracas-capture` rejects any other tag. The tools hold the vocabulary as
83
+
Added:
an alist keyed by axis. `fracas-inspect` returns the same grouping. The
84
+
Added:
tags are short and bare, with no axis prefix. The four axes use distinct
85
+
Added:
words, so a bare tag stays unambiguous.
114
86
87
+
Added:
Kind — the type of change. Choose one:
88
+
Added:
115
89
- `feat` — a new capability.
116
90
- `fix` — a defect repair.
117
-
Removed:
- `refactor` — a change that keeps behaviour.
91
+
Added:
- `refactor` — a change that keeps the behavior.
118
92
- `chore` — maintenance or tooling.
119
93
- `docs` — documentation only.
120
94
121
-
Removed:
Scope — the layer the change touches. Choose one:
95
+
Added:
Scope — the layer that the change touches. Choose one:
122
96
123
97
- `core` — pure domain (`hito.core`).
124
-
Removed:
- `app` — service, ports, adapters (`hito.app`).
98
+
Added:
- `app` — service, ports, and adapters (`hito.app`).
125
99
- `web` — Dream and dream-html (`hito.web`).
126
-
Removed:
- `ui` — visual style, layout, interaction.
100
+
Added:
- `ui` — visual style, layout, and interaction.
127
101
128
-
Removed:
Impact — an optional exception flag. Add one only when it applies:
102
+
Added:
Impact — optional. The two tags are opposite ends of one scale, so
103
+
Added:
choose at most one:
129
104
130
-
Removed:
- `trivial` — a trivial change, such as a cosmetic or one-line fix.
131
-
Removed:
- `major` — a potential major rework.
105
+
Added:
- `minor` — a small change, such as a cosmetic fix or a one-line fix.
106
+
Added:
- `major` — a possible major rework.
132
107
133
-
Removed:
Leave the impact tag off for an ordinary request.
108
+
Added:
Leave the impact axis empty for an ordinary request.
134
109
135
-
Removed:
Infer the tags from the request text at capture time. You may re-tag
136
-
Removed:
an entry later, with `fracas-retag`, as the feature shape changes.
110
+
Added:
Misc — optional flags. Add one only when it applies:
137
111
138
-
Removed:
## Step 1 — Capture at the top of the stream
112
+
Added:
- `doctrine` — the request touches Heavy Duty doctrine, or deviates
113
+
Added:
from it.
139
114
140
-
Removed:
Run `fracas-inspect` first. Read the TODO keyword sequence and the tag
141
-
Removed:
vocabulary.
115
+
Added:
Infer the tags from the request text when you capture it. You can
116
+
Added:
re-tag an entry later with `fracas-retag`, as the shape of the feature
117
+
Added:
changes.
142
118
119
+
Added:
## Install the tools once per session
120
+
Added:
121
+
Added:
The tools live in `fracas-tools.el`, beside this file. Load that file
122
+
Added:
one time in the running Emacs. Use the generic `eval-elisp` tool for
123
+
Added:
the load only.
124
+
Added:
125
+
Added:
Pass the project directory of your own session in `project`. Do not
126
+
Added:
write an absolute path from a home directory into the form, because that
127
+
Added:
path differs on every machine.
128
+
Added:
129
+
Added:
```elisp
130
+
Added:
(let* ((project "/the/project/directory/you/work/in")
131
+
Added:
(tools (expand-file-name ".kiro/skills/fracas/fracas-tools.el"
132
+
Added:
project)))
133
+
Added:
(unless (file-readable-p tools)
134
+
Added:
(error "No FRACAS tools at %s" tools))
135
+
Added:
(load tools nil t))
136
+
Added:
```
137
+
Added:
138
+
Added:
The tool file then finds the project root itself. It searches upward
139
+
Added:
from its own directory for `REQUESTS.org`. The search assumes no
140
+
Added:
directory layout, so the same file works on every machine. The result
141
+
Added:
becomes `fracas-project-root`, and every tool uses it by default.
142
+
Added:
143
+
Added:
Do not depend on the Emacs `default-directory`. That directory often
144
+
Added:
sits outside the project, and the search then finds no stream file.
145
+
Added:
146
+
Added:
Then verify that the tools are present. This expression returns the
147
+
Added:
thirteen tool names:
148
+
Added:
149
+
Added:
```elisp
150
+
Added:
(seq-filter (lambda (name) (string-prefix-p "fracas-" name))
151
+
Added:
(mcp-server-tools-list-names))
152
+
Added:
```
153
+
Added:
154
+
Added:
If the load fails, stop and report the problem. Do not edit
155
+
Added:
`REQUESTS.org` as raw text instead.
156
+
Added:
157
+
Added:
### If the tools are not callable
158
+
Added:
159
+
Added:
The tools register inside Emacs. The MCP client lists its tools when it
160
+
Added:
connects, so a mid-session load can leave the tools absent from your own
161
+
Added:
tool list. In that case, call each tool through the dispatch path:
162
+
Added:
163
+
Added:
```elisp
164
+
Added:
(mcp-server-tools-call "fracas-list" '((state . "TODO")))
165
+
Added:
```
166
+
Added:
167
+
Added:
This path runs the same handler as a direct tool call. To make the tools
168
+
Added:
callable directly, load `fracas-tools.el` from the Emacs init file.
169
+
Added:
170
+
Added:
### Why dedicated tools
171
+
Added:
172
+
Added:
The generic `eval-elisp` tool sends its code through the Emacs security
173
+
Added:
form walker. The walker prompts for each file function, such as
174
+
Added:
`find-file-noselect` and `save-buffer`. The FRACAS tools register as
175
+
Added:
normal MCP tools, and tool dispatch does not use the walker. The
176
+
Added:
read-only tools also carry a `readOnlyHint` annotation, so the client
177
+
Added:
can approve them without a prompt.
178
+
Added:
179
+
Added:
You **MUST** use these tools for every change to `REQUESTS.org`.
180
+
Added:
181
+
Added:
- You **MUST NOT** edit the file as raw text, because raw edits break
182
+
Added:
the timestamps, the IDs, and the tag alignment.
183
+
Added:
- You **MUST NOT** use a shell tool or a file tool for an entry, because
184
+
Added:
those tools apply no validation.
185
+
Added:
186
+
Added:
## The FRACAS tools
187
+
Added:
188
+
Added:
Each tool accepts an optional `root` argument. `root` names the project
189
+
Added:
directory. When you omit it, the tools use `fracas-project-root`. Set
190
+
Added:
`root` only for a different project.
191
+
Added:
192
+
Added:
| Tool | Purpose | Read-only |
193
+
Added:
|---|---|---|
194
+
Added:
| `fracas-inspect` | Report the keyword sequence and the tag axes. | Yes |
195
+
Added:
| `fracas-list` | List entries, newest first, with ID, title, state, and tags. Accepts a `state` or `tag` filter. | Yes |
196
+
Added:
| `fracas-show` | Report one entry in full: body, logbook, checklist, and result. | Yes |
197
+
Added:
| `fracas-verify` | Report the heading, state, `CLOSED` time, and tags of one entry. | Yes |
198
+
Added:
| `fracas-capture` | Create a `TODO` request at the top of the stream. | No |
199
+
Added:
| `fracas-set-status` | Set the keyword of an entry. Refuses `DONE`. | No |
200
+
Added:
| `fracas-block` | Set `BLOCKED` and record a required reason. | No |
201
+
Added:
| `fracas-cancel` | Set `CANCELLED` and record a required reason. | No |
202
+
Added:
| `fracas-check` | Add, toggle, or list the checklist items of one request. | No |
203
+
Added:
| `fracas-log` | Append a timestamped note to the `:LOGBOOK:` drawer. | No |
204
+
Added:
| `fracas-retag` | Replace the tags of an entry with a validated set. | No |
205
+
Added:
| `fracas-set-result` | Write the `- result ::` line. | No |
206
+
Added:
| `fracas-complete` | Set `DONE` after it records the result evidence. | No |
207
+
Added:
208
+
Added:
Use `fracas-show` to read one entry, and `fracas-retag` to re-tag it.
209
+
Added:
These are the correct tools for those two actions, because the generic
210
+
Added:
Emacs `org-*` tools cannot operate on this file.
211
+
Added:
212
+
Added:
For the exact arguments and the result shape of each tool, read
213
+
Added:
`references/tools.md`.
214
+
Added:
215
+
Added:
## Step 1 — Capture the request
216
+
Added:
143
217
Run `fracas-capture` with these arguments:
144
218
145
-
Removed:
- `root` — the project directory.
146
219
- `title` — a short imperative title under 60 characters.
147
220
- `body` — the full request text.
148
-
Removed:
- `tags` — the inferred tags: one kind, one scope, an optional impact
149
-
Removed:
(`trivial` or `major`), plus optional `doctrine`.
221
+
Added:
- `tags` — one kind tag, one scope tag, and any optional tag.
150
222
151
-
Removed:
The tool inserts the entry as a top-level heading at the top of the
152
-
Removed:
file, so the newest request is first. It records the capture time as
153
-
Removed:
an inactive `SCHEDULED` timestamp, applies the tags, wraps the body to
154
-
Removed:
72 columns, and returns the new entry's Org ID. Report the Org ID.
223
+
Added:
The tool inserts the entry at the top of the file. It records the
224
+
Added:
capture time as an inactive `SCHEDULED` timestamp. It applies the tags,
225
+
Added:
wraps the body to 72 columns, and assigns an Org ID. Report that ID to
226
+
Added:
the user.
155
227
156
228
Keep the request text unchanged. If the text holds separate ideas,
157
-
Removed:
format the body as a list. Pass the body as plain text; do not
158
-
Removed:
pre-wrap it.
229
+
Added:
write the body as a list. Pass the body as plain text, because the tool
230
+
Added:
wraps it.
159
231
160
-
Removed:
## Step 2 — Track the status
232
+
Added:
If `fracas-capture` rejects a tag, run `fracas-inspect` to read the
233
+
Added:
vocabulary. Then fix the tag and re-run the capture.
161
234
162
-
Removed:
Find the entry first. Run `fracas-list` to get each entry's Org ID,
163
-
Removed:
title, state, and tags. Pass a `state` or `tag` filter to narrow the
164
-
Removed:
list, for example `IN-PROGRESS`. Use the Org ID for every later call.
165
-
Removed:
Do not match an entry by its title text.
235
+
Added:
Then proceed to Step 2 when work starts on the request.
166
236
167
-
Removed:
Read the current status with `fracas-verify` before you change a
168
-
Removed:
keyword. Use one keyword from the sequence that `fracas-inspect`
169
-
Removed:
returned.
237
+
Added:
## Step 2 — Track the status
170
238
171
-
Removed:
Run `fracas-set-status` for a status change to any open keyword:
239
+
Added:
First find the entry. Run `fracas-list` to read the ID, the title, the
240
+
Added:
state, and the tags of each entry. Pass a `state` filter or a `tag`
241
+
Added:
filter to narrow the list. Use the ID for every later call.
172
242
173
-
Removed:
- `TODO` — Capture the request. Do not start work.
174
-
Removed:
- `IN-PROGRESS` — Start work.
175
-
Removed:
- `TESTING` — Run tests. The tests do not pass.
176
-
Removed:
- `TESTED` — Tests pass. No commit exists.
177
-
Removed:
- `BLOCKED` — Work cannot continue. Use `fracas-block` with a reason.
178
-
Removed:
- `CANCELLED` — Stop work on purpose. Use `fracas-cancel` with a
179
-
Removed:
reason.
243
+
Added:
Read the current state with `fracas-verify` before you change a
244
+
Added:
keyword. Then run `fracas-set-status` with one open keyword:
180
245
181
-
Removed:
Change the keyword only after you observe the current status. Run
182
-
Removed:
`fracas-verify` after the change to confirm the keyword.
246
+
Added:
- `TODO` — the request is captured. Work has not started.
247
+
Added:
- `IN-PROGRESS` — work has started.
248
+
Added:
- `TESTING` — the tests run. The tests do not pass.
249
+
Added:
- `TESTED` — the tests pass. No commit exists.
183
250
184
-
Removed:
#### Cancel or block with a reason
251
+
Added:
Run `fracas-verify` again after the change to confirm the keyword.
185
252
186
-
Removed:
Record a required reason when you cancel or block a request, so the
187
-
Removed:
decision is never silent. Use `fracas-cancel` for the `CANCELLED`
188
-
Removed:
transition and `fracas-block` for the `BLOCKED` transition. Do not use
189
-
Removed:
`fracas-set-status` for these two transitions. Each tool needs a
190
-
Removed:
`reason` and writes it to the entry.
253
+
Added:
### Block or cancel with a reason
191
254
192
-
Removed:
The file owns the TODO sequence. The `#+TODO:` line in the file
193
-
Removed:
preamble declares it. The tools read that sequence; they never define
194
-
Removed:
their own. To change the keywords, edit the `#+TODO:` line.
255
+
Added:
Run `fracas-block` when work cannot continue. Run `fracas-cancel` when
256
+
Added:
you stop work on purpose. Each tool needs a `reason`, and writes it to
257
+
Added:
the entry.
195
258
196
-
Removed:
### Split a complex task with a checklist
259
+
Added:
You **MUST NOT** use `fracas-set-status` here, because it records no reason.
197
260
198
-
Removed:
Run `fracas-check` to break one request into sub-tasks that share the
199
-
Removed:
request. Use it when a request is large enough to track in parts, but
200
-
Removed:
not large enough to become its own stream entries.
261
+
Added:
### Split a large request with a checklist
201
262
263
+
Added:
Run `fracas-check` when one request is large enough to track in parts:
264
+
Added:
202
265
- `action` `add` — append an unchecked item. Needs `item`.
203
-
Removed:
- `action` `toggle` — flip a matching item done or undone. Needs
204
-
Removed:
`item`.
205
-
Removed:
- `action` `list` — return the items and their state.
266
+
Added:
- `action` `toggle` — flip one matching item. Needs `item`.
267
+
Added:
- `action` `list` — report the items and their state.
206
268
207
-
Removed:
The tool keeps the items in a `Checklist [/]:` block in the request
208
-
Removed:
body. The `[/]` cookie tracks completed items against the total. The
209
-
Removed:
items stay inside the one request; they are not separate stream
210
-
Removed:
entries and they have no independent TODO keyword. For genuinely
211
-
Removed:
independent work, capture a new request instead.
269
+
Added:
The tool keeps the items in a `Checklist [/]:` block in the body. The
270
+
Added:
`[/]` cookie counts the completed items against the total. The items
271
+
Added:
stay inside the one request. They are not separate entries, and they
272
+
Added:
carry no keyword of their own. For independent work, capture a new
273
+
Added:
request instead.
212
274
213
275
### Record progress in the logbook
214
276
215
-
Removed:
Run `fracas-log` to add a progress note during an agentic session:
277
+
Added:
Run `fracas-log` with a `note` to record progress during a session. The
278
+
Added:
tool prepends a timestamped item to the `:LOGBOOK:` drawer. The logbook
279
+
Added:
is append-only. The tool never rewrites an earlier note, and never
280
+
Added:
rewrites the body.
216
281
217
-
Removed:
- `root` — the project directory.
218
-
Removed:
- `id` — the Org ID of the entry.
219
-
Removed:
- `note` — the progress note.
282
+
Added:
Then proceed to Step 3 when every closing criterion is met.
220
283
221
-
Removed:
The tool appends a timestamped item to the entry's `:LOGBOOK:`
222
-
Removed:
drawer. The logbook is append-only. It never rewrites an earlier note
223
-
Removed:
or the request body.
284
+
Added:
## Step 3 — Close the request
224
285
225
-
Removed:
### Complete with result evidence
286
+
Added:
Check each criterion before you close a request. Copy this list and mark
287
+
Added:
each item:
226
288
227
-
Removed:
For `DONE`, use `fracas-complete`, not `fracas-set-status`. Set `DONE`
228
-
Removed:
only when all of these are true:
289
+
Added:
- [ ] The build passes.
290
+
Added:
- [ ] The tests pass.
291
+
Added:
- [ ] The files have the required format.
292
+
Added:
- [ ] A commit exists.
229
293
230
-
Removed:
- The build passes.
231
-
Removed:
- Tests pass.
232
-
Removed:
- The files have the required format.
233
-
Removed:
- A commit exists.
294
+
Added:
If one criterion fails, do not close the request. Set the state with
295
+
Added:
`fracas-set-status` instead. Then fix the failure and re-run this
296
+
Added:
check.
234
297
235
-
Removed:
Run `fracas-complete` with these arguments:
298
+
Added:
When every item is marked, run `fracas-complete` with these arguments:
236
299
237
-
Removed:
- `root` — the project directory.
238
300
- `id` — the Org ID of the entry.
239
-
Removed:
- `commit` — the commit hash for the completed work.
301
+
Added:
- `commit` — the commit hash of the completed work.
240
302
- `tests` — a short test recap, for example `215 pass`.
303
+
Added:
- `model` — optional. The agent that did the work.
304
+
Added:
- `notes` — optional. A short tail, such as a root cause.
241
305
242
-
Removed:
The tool writes a `- result :: commit=… tests=…` line, sets `DONE`,
243
-
Removed:
lets Org's configured logging add the `CLOSED` timestamp, and confirms
244
-
Removed:
the timestamp. Do not add or edit the timestamp yourself. The entry
245
-
Removed:
stays where it is in the stream; there is no refile step. Use
246
-
Removed:
`fracas-set-result` on its own to record the result line before
247
-
Removed:
completion.
306
+
Added:
The tool writes the result line, sets `DONE`, then confirms that Org
307
+
Added:
recorded the `CLOSED` timestamp. Org writes that timestamp, because the
308
+
Added:
file sets `org-log-done` to `time`.
248
309
249
-
Removed:
Record each prompt as its own request. If you cannot complete a
250
-
Removed:
request, record the request and the failure.
310
+
Added:
You **MUST NOT** write or edit that timestamp, because Org owns it.
311
+
Added:
312
+
Added:
The result line takes this form. It stays on one line, because the
313
+
Added:
reader reads one line:
314
+
Added:
315
+
Added:
```org
316
+
Added:
- result :: model=example-agent commit=3051af0 tests=243 pass; short root cause
317
+
Added:
```
318
+
Added:
319
+
Added:
The entry stays in place in the stream. There is no refile step.
320
+
Added:
321
+
Added:
Run `fracas-verify` last. Verify that the state is `DONE` and that the
322
+
Added:
`CLOSED` timestamp is present. To write the result line before you close
323
+
Added:
the request, run `fracas-set-result` on its own.
324
+
Added:
325
+
Added:
## Test the tools
326
+
Added:
327
+
Added:
The tools carry a test suite. Run it after any change to
328
+
Added:
`fracas-tools.el`:
329
+
Added:
330
+
Added:
```sh
331
+
Added:
.kiro/skills/fracas/run-tests.sh
332
+
Added:
```
333
+
Added:
334
+
Added:
The suite needs no MCP framework and no configuration. Each test uses a
335
+
Added:
temporary stream file, so the project stream file stays unchanged.
336
+
Added:
337
+
Added:
## Common mistakes
338
+
Added:
339
+
Added:
- **Editing the file as raw text.** The tools keep the timestamps, the
340
+
Added:
IDs, and the tag alignment correct. Raw edits do not.
341
+
Added:
- **Selecting an entry by title.** Two titles can match. Use the Org ID
342
+
Added:
from `fracas-list`.
343
+
Added:
- **Using `fracas-set-status` for `DONE`.** That call fails by design.
344
+
Added:
Use `fracas-complete`, which demands the evidence.
345
+
Added:
- **Writing a `CLOSED` timestamp.** Org writes it. The tool only
346
+
Added:
confirms it.
347
+
Added:
- **Merging two requests.** Record each prompt as its own request.
348
+
Added:
349
+
Added:
If you cannot complete a request, record the request and record the
350
+
Added:
failure.