1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//! **The block a ball's text is authored in**, and the four acts that hang off
//! it (bl-f7ae; DESIGN §4.35).
//!
//! Split from [`super::wall`] at the design-time budget on the seam the pane
//! draws: that section is what the aimed wall HOLDS, and this is what an
//! operator would do to one of them. It is one block with two subjects — a
//! ball that does not exist yet and a ball this wall holds — because authoring
//! a ball's words is one act, which is the fold upstream's own
//! `actions/verbs/balls/edit` already made.
//!
//! # The way out comes first, and it says what it keeps
//!
//! §4.20's rule, and it is the rule here for the reason it is there: the
//! control an operator reaches for by reflex must be the one that changes
//! nothing. Escape reaches it too, on `Model::escape`'s ladder, where the
//! block sits inside the pane rather than instead of it.
//!
//! # `close` is armed and the other three are not
//!
//! §4.20 divides on one test — *undone by doing the other thing* — and three
//! of the four pass it. `create` is undone by a close or a release of the ball
//! it filed; `update` is undone by writing the old words back, and a `note` is
//! an append that claims nothing; `release` is undone by `assign`, which is on
//! the board one section up. `close` is the one with no verb that reverses it:
//! it folds `main` into the worktree, squashes the work onto the branch and
//! removes the worktree.
//!
//! So it takes §4.20's ENABLEMENT: the control is dark until the box holds the
//! ball's own id, and **the refusal is spelled beside it**, because a greyed
//! control says a thing is not live and nothing about what would make it live.
//! It does not take §4.20's other half — a covering pane of its own — and that
//! is an argument rather than an omission. That pane exists because
//! `delete-workspace`'s subject is a row in a routine surface an operator moves
//! through quickly, *"and a mis-aimed click there must not be able to land on
//! this"*. This block is already two deliberate gestures deep — a covering
//! pane, then a control on one row of it — and the arming is a third; a click
//! cannot arrive here by accident, and the id typed back is what says which
//! ball the operator meant.
//!
//! **The arming names its own subject**, which is why nothing records which
//! ball is armed: the box holds an id, and the control it enables is the one
//! on the ball with that id. And it is never spent on firing (§4.20): a
//! refusal is the common case — the engine declines while the gate fails — and
//! clearing the box would charge a retype for the engine's *no*.
use crate;
/// The control that opens the block on a ball that does not exist yet.
pub const FILE: &str = "file a ball…";
/// The control that opens it on a ball this wall holds.
pub const ACT: &str = "act on it…";
/// The control that claims a ready ball for the aimed wall — on a board row
/// rather than in the block, because the row is its subject.
pub const CLAIM: &str = "claim it for this wall";
/// The way out, which changes nothing. It is not the pane's own `done`,
/// because two controls reading the same word on one screen are one control to
/// everything that aims at a word — the operator, the accessibility tree and
/// the harness alike.
pub const DONE: &str = "done with this ball";
/// What the block says it is about, with no ball.
pub const NEW: &str = "a ball that does not exist yet";
/// The control that files it.
pub const FILE_IT: &str = "file it";
/// The control that amends it.
pub const AMEND: &str = "amend it";
/// The control that lets it go.
pub const RELEASE: &str = "let it go";
/// The control that delivers it.
pub const DELIVER: &str = "deliver it";
/// What the project box asks for.
pub const PROJECT_HINT: &str = "project";
/// What the title box asks for.
pub const TITLE_HINT: &str = "title";
/// What the body box asks for.
pub const BODY_HINT: &str = "body";
/// What the journal box asks for.
pub const NOTE_HINT: &str = "a note for its journal";
/// What the arming box asks for.
pub const ARM_HINT: &str = "the ball's id";
/// The refusal spelled beside a filing that cannot go.
pub const UNFILEABLE: &str = "a project and a title are what files a ball";
/// The refusal spelled beside an amendment that would change nothing.
pub const UNAMENDABLE: &str = "type a title, a body or a note to amend it";
/// **What an act with no missing parameter says**, which is nothing: `release`
/// is offered whenever there is a ball to release.
pub const NOTHING: &str = "";
/// The refusal spelled beside the one act that is armed.
pub const UNARMED: &str = "type the ball's id to deliver it — a close cannot be undone";
/// Paint the block, if one is open, and take the clicks on it.
/// **What the block is about**, said before it offers anything — §4.20's rule,
/// because no control has room to name its subject and an act on the wrong
/// ball is the thing a sentence here prevents.
/// The boxes, bound to the block's own words rather than to a copy compared
/// afterwards: a draft is what the block holds, so an edit is a write to it and
/// there is no second value for the two to disagree about.
/// One box that takes text, with the id the keyboard's own gate compares
/// against (`crate::ui::keys`).
/// The four acts, each dark until its own gesture composes — the enablement
/// and the envelope read off one fact rather than two
/// (`crate::ui::model::board::acts`). Answers the gesture a click composed, if
/// one did.
///
/// **The order is §4.20's**: what changes a thing first, what ends it under.
/// **One act: its word, its parity token, the gesture it would send and the
/// sentence that says why it cannot.**
///
/// The gesture's absence IS the enablement, so a control can never be live and
/// unable to compose. An empty `why` is an act with no missing parameter —
/// `release` is offered whenever there is a ball — and prints nothing.