thurview 0.17.0 → 0.17.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thurview",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Guided, evidence-anchored reviews of agent-written code. A coding agent authors the review; you read, ask, comment and decide in the browser.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -294,8 +294,9 @@ nothing: keep `--timeout` under that limit and run `wait` again on `timeout`.
294
294
  When the tool can run a command in the background and wake you when it exits,
295
295
  run `wait` that way, so the user has the terminal back while they read.
296
296
 
297
- While `wait` runs the reader's page says an agent is listening, and says the
298
- opposite within seconds of it returning. Do not loop it to look present: a
297
+ While `wait` runs, and while you answer a `question` it returned, the
298
+ reader's page says an agent is listening; it says the opposite within
299
+ seconds of `wait` returning anything else. Do not loop it to look present: a
299
300
  question asked with nobody waiting is queued, not lost, and `thurview`
300
301
  reports it as `needsAgent` the next time you run any command in the
301
302
  worktree.
@@ -3,6 +3,51 @@
3
3
  `data.yaml` holds typed inputs. `review.md` references them by id. Validation
4
4
  is strict: an unknown key fails `publish`.
5
5
 
6
+ ## Choosing a shape
7
+
8
+ Pick a component by the question the reader is asking. One shape answers one
9
+ question; used for another it is decoration the reader has to decode.
10
+
11
+ | The reader is asking | Shape |
12
+ | ------------------------------------------------------ | ---------------------------- |
13
+ | in what order, and between whom? | `sequence` |
14
+ | where does the journey go, and where does it branch? | `flow` |
15
+ | how did we get here, and what did the change do to it? | `callstack` |
16
+ | what shape is the data, and who reads or writes it? | `database` |
17
+ | what does this code actually say? | `peek`, or an anchor link |
18
+ | what parts is this system in, and what moved? | `map.yaml`, not a fence |
19
+ | why this way and not the other way? | **none** — prose and anchors |
20
+
21
+ Only the fences in this file render. A `mermaid`, `plantuml`, `dot` or `d2`
22
+ fence is a publish error rather than a plain code block (see
23
+ [Fences thurview does not render](#fences-thurview-does-not-render)); to quote
24
+ diagram source as code, fence it as `text`.
25
+
26
+ ### A design choice is a comparison
27
+
28
+ Reach for a diagram of a design and what you draw is the design you picked: the
29
+ happy path, the way it works. That tells the reader what was built and nothing
30
+ about what was rejected or why — which is the question a design document, and a
31
+ review that made a non-obvious call, is there to answer.
32
+
33
+ The vocabulary compares along two axes and no others:
34
+
35
+ - **One call path, base against head.** `callstack`, in a review. Every frame
36
+ it reports as added or removed is checked against the pinned diff, and an
37
+ explainer and a design have no diff, so there both lists must be the same
38
+ frames in the same order. `publish` refuses most of what differs; the rest it
39
+ renders as unchanged, the diff being over the callee anchor alone. Either way
40
+ only the head list reaches the reader, and nothing contrasts.
41
+ - **Structure, before against after.** `map.yaml`'s `base` beside `nodes` —
42
+ the system as it stands against the system the change or the design would
43
+ leave. See [Software map](software-map.md).
44
+
45
+ **Neither axis is option A against option B.** Both put today against the one
46
+ outcome you shipped or propose, so write the choice instead: a short paragraph
47
+ per option, each anchored to the code it would land in or to the constraint
48
+ that rules it out, and the reason the loser lost. That is the argument. A
49
+ picture of the winner is not.
50
+
6
51
  ## data.yaml
7
52
 
8
53
  ```yaml
@@ -139,17 +139,13 @@ A claim you cannot anchor is a question, not a fact. Write it as one.
139
139
 
140
140
  ## Diagrams
141
141
 
142
- Use the fenced components for behaviour that prose explains badly:
143
-
144
- - `sequence` for temporal behaviour across actors
145
- - `flow` for a user journey and where it branches
146
- - `callstack` for call-flow differences between base and head
147
- - `database` for persisted-state structure and the operations on it
148
-
149
- Each message, frame, step and operation carries an anchor, so the reader can
150
- open the code behind every arrow. `mermaid` and the other general diagram
151
- languages are a publish error rather than a fifth option: thurview draws only
152
- what it can anchor. See [Components](components.md).
142
+ Use a fenced component for behaviour that prose explains badly, and pick it by
143
+ the question the reader is asking: [Choosing a shape](components.md#choosing-a-shape)
144
+ holds one row per question, including the ones whose answer is no diagram at
145
+ all. Frames, steps and operations carry an anchor, and a message carries an
146
+ anchor or the code it stands for, so the reader can open what is behind the
147
+ arrow. `mermaid` and the other general diagram languages are a publish error
148
+ rather than another option: thurview draws only what it can anchor.
153
149
 
154
150
  Add a diagram only when it materially helps. A document with one good
155
151
  sequence diagram beats one with four.
@@ -111,7 +111,9 @@ While `thurview wait` runs it writes a heartbeat to
111
111
  it back as one of two sentences: an agent is listening now, or nothing is
112
112
  listening and what you send is queued until one checks in. Nothing else
113
113
  writes it, so presence is never inferred and never faked. A heartbeat older
114
- than 15 seconds is a dead `wait`, not an agent.
114
+ than 15 seconds is a dead `wait`, not an agent. When `wait` returns
115
+ `question` it leaves a last heartbeat that holds for ten minutes, since you
116
+ are answering and will wait again; the next `wait` takes over from it.
115
117
 
116
118
  That is why a question asked while you are away is not lost and does not need
117
119
  you to sit in `wait`: it is queued, `thurview` reports it as `needsAgent` the
@@ -130,7 +132,7 @@ thurview threads resolve <threadId> --review <id>
130
132
  ${THURVIEW_HOME:-~/.thurview}/
131
133
  ├── THURVIEW.md user guidance (optional)
132
134
  ├── server.json running server, if any
133
- ├── agents/<id>.json heartbeat of a running `wait`, removed when it ends
135
+ ├── agents/<id>.json heartbeat of a running `wait`, or of an agent answering what it returned
134
136
  ├── forge/<id>.json what the forge last said of the change request: head, state, CI, last pass posted
135
137
  ├── passes/<id>.json the submission `forge pass` wrote, for `forge submit`
136
138
  └── reviews/<id>/
@@ -180,7 +182,8 @@ again.
180
182
  `thurview threads get <id>` truncates bodies over 1500 characters; pass
181
183
  `--full` when the hint says so.
182
184
 
183
- While `wait` runs, the reader's page says an agent is listening; when it
184
- returns, the page says the opposite within seconds. Do not leave `wait`
185
+ While `wait` runs, and while you answer the question it returned, the
186
+ reader's page says an agent is listening; when it returns anything else, the
187
+ page says the opposite within seconds. Do not leave `wait`
185
188
  running to look present when you are not going to answer, and do not loop it
186
189
  to keep a queue drained: the queue survives you, and the reader is told so.
@@ -173,9 +173,27 @@ finishes is a design nobody decided on. A shape that works:
173
173
  code that exists at the pinned commit; a plain fence is a sketch. The reader
174
174
  tells them apart at a glance, and that difference is the whole trust model.
175
175
 
176
- Sequence diagrams work for a proposed flow: give a message a `code:` string
177
- rather than an `anchor:` where the code does not exist yet, and an `anchor:`
178
- where it does. See the `thurview` skill's Components reference for the shape.
176
+ **Pick the diagram by the reader's question, or draw none.** The `thurview`
177
+ skill's Components reference carries the table under "Choosing a shape" and the
178
+ shape of every fence. Two rows decide most design documents:
179
+
180
+ - A proposed flow across actors is a `sequence`: give a message a `code:`
181
+ string where the code does not exist yet, and an `anchor:` where it does.
182
+ - **A choice between two designs is not a diagram.** Drawing the one you picked
183
+ shows the reader how it works and never why it beat the other. That argument
184
+ is prose with anchors, under **What was considered and dropped** above.
185
+
186
+ No component renders two options side by side, and a design has no diff, so a
187
+ `callstack` here must list the same frames in the same order on both sides.
188
+ `publish` refuses most of what differs; the rest it renders as unchanged,
189
+ because the diff runs on the callee anchor alone and a `{ calls: [...] }` hop
190
+ whose parent differs reads as the same frame. Either way the reader never sees
191
+ the base list.
192
+
193
+ The map is the one before-and-after the vocabulary carries, and it puts today
194
+ against your one proposal rather than one proposal against another: `base` for
195
+ the structure as it stands, `nodes` for the structure proposed (step 5). It
196
+ shows what the design moves, never why that beat the alternative.
179
197
 
180
198
  ### 5. Map the shape, when there is one
181
199
 
@@ -250,6 +268,9 @@ A design with no stated cost and no rejected alternative reads as advocacy, and
250
268
  readers approve it without deciding anything — which is the failure this whole
251
269
  document kind exists to prevent.
252
270
 
271
+ A diagram of the design you picked is not a stated cost. It renders the option
272
+ that won, so it reads as advocacy too, however carefully it is drawn.
273
+
253
274
  ## Completion criteria
254
275
 
255
276
  Report completion only when all of these hold: