proctolog 0.1.0

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.
Files changed (228) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +178 -0
  4. data/app/controllers/proctolog/acceptances_controller.rb +29 -0
  5. data/app/controllers/proctolog/application_controller.rb +32 -0
  6. data/app/controllers/proctolog/bursts_controller.rb +34 -0
  7. data/app/controllers/proctolog/choices_controller.rb +30 -0
  8. data/app/controllers/proctolog/code_reviews_controller.rb +26 -0
  9. data/app/controllers/proctolog/decisions_controller.rb +33 -0
  10. data/app/controllers/proctolog/entries_controller.rb +14 -0
  11. data/app/controllers/proctolog/evidence_controller.rb +23 -0
  12. data/app/controllers/proctolog/freshness_controller.rb +27 -0
  13. data/app/controllers/proctolog/good_to_go_controller.rb +29 -0
  14. data/app/controllers/proctolog/memberships_controller.rb +20 -0
  15. data/app/controllers/proctolog/mentions_controller.rb +16 -0
  16. data/app/controllers/proctolog/moments_controller.rb +26 -0
  17. data/app/controllers/proctolog/note_params.rb +24 -0
  18. data/app/controllers/proctolog/notes_controller.rb +56 -0
  19. data/app/controllers/proctolog/open_pull_requests_controller.rb +59 -0
  20. data/app/controllers/proctolog/pictures_controller.rb +27 -0
  21. data/app/controllers/proctolog/prompts_controller.rb +28 -0
  22. data/app/controllers/proctolog/pull_request_scoped.rb +21 -0
  23. data/app/controllers/proctolog/pull_requests_controller.rb +34 -0
  24. data/app/controllers/proctolog/put_away_controller.rb +19 -0
  25. data/app/controllers/proctolog/recordings_controller.rb +28 -0
  26. data/app/controllers/proctolog/rendered_pieces_controller.rb +11 -0
  27. data/app/controllers/proctolog/review_data_controller.rb +12 -0
  28. data/app/controllers/proctolog/rules_controller.rb +20 -0
  29. data/app/controllers/proctolog/scenario_notes_controller.rb +26 -0
  30. data/app/controllers/proctolog/scenario_scoped.rb +21 -0
  31. data/app/controllers/proctolog/scenarios_controller.rb +67 -0
  32. data/app/controllers/proctolog/sitting_servers_controller.rb +30 -0
  33. data/app/controllers/proctolog/waiting_controller.rb +14 -0
  34. data/app/controllers/proctolog/with_decisions.rb +28 -0
  35. data/app/helpers/proctolog/bursts_helper.rb +52 -0
  36. data/app/helpers/proctolog/decisions_helper.rb +102 -0
  37. data/app/helpers/proctolog/desk_helper.rb +61 -0
  38. data/app/helpers/proctolog/mentions_helper.rb +27 -0
  39. data/app/helpers/proctolog/open_pull_requests_helper.rb +31 -0
  40. data/app/helpers/proctolog/prompts_helper.rb +21 -0
  41. data/app/helpers/proctolog/pull_requests_helper.rb +67 -0
  42. data/app/helpers/proctolog/recordings_helper.rb +30 -0
  43. data/app/helpers/proctolog/rounds_helper.rb +27 -0
  44. data/app/helpers/proctolog/scenarios_helper.rb +123 -0
  45. data/app/helpers/proctolog/standings_helper.rb +80 -0
  46. data/app/jobs/proctolog/application_job.rb +8 -0
  47. data/app/jobs/proctolog/ask_for_release_job.rb +9 -0
  48. data/app/jobs/proctolog/fetch_pictures_ahead_job.rb +36 -0
  49. data/app/jobs/proctolog/prune_fresh_profiles_job.rb +9 -0
  50. data/app/jobs/proctolog/read_mentions_ahead_job.rb +12 -0
  51. data/app/models/proctolog/acceptance.rb +47 -0
  52. data/app/models/proctolog/app.rb +92 -0
  53. data/app/models/proctolog/browser.rb +42 -0
  54. data/app/models/proctolog/burst.rb +268 -0
  55. data/app/models/proctolog/burst_notices.rb +143 -0
  56. data/app/models/proctolog/chapters.rb +42 -0
  57. data/app/models/proctolog/check.rb +122 -0
  58. data/app/models/proctolog/choices.rb +112 -0
  59. data/app/models/proctolog/code_review.rb +251 -0
  60. data/app/models/proctolog/decision_record.rb +12 -0
  61. data/app/models/proctolog/decisions.rb +199 -0
  62. data/app/models/proctolog/description.rb +165 -0
  63. data/app/models/proctolog/difference.rb +138 -0
  64. data/app/models/proctolog/doctor.rb +127 -0
  65. data/app/models/proctolog/evidence.rb +29 -0
  66. data/app/models/proctolog/failure.rb +7 -0
  67. data/app/models/proctolog/focus.rb +48 -0
  68. data/app/models/proctolog/fresh_sitting.rb +35 -0
  69. data/app/models/proctolog/github.rb +353 -0
  70. data/app/models/proctolog/handover/brief.rb +138 -0
  71. data/app/models/proctolog/handover/layers.rb +128 -0
  72. data/app/models/proctolog/handover/places.rb +98 -0
  73. data/app/models/proctolog/handover/taken.rb +41 -0
  74. data/app/models/proctolog/handover/worklist.rb +35 -0
  75. data/app/models/proctolog/handover.rb +123 -0
  76. data/app/models/proctolog/housekeeping.rb +23 -0
  77. data/app/models/proctolog/kit.rb +36 -0
  78. data/app/models/proctolog/marks.rb +130 -0
  79. data/app/models/proctolog/membership.rb +91 -0
  80. data/app/models/proctolog/mentions.rb +117 -0
  81. data/app/models/proctolog/note.rb +94 -0
  82. data/app/models/proctolog/outside.rb +45 -0
  83. data/app/models/proctolog/overlay/brief.rb +52 -0
  84. data/app/models/proctolog/overlay/written.rb +33 -0
  85. data/app/models/proctolog/overlay.rb +87 -0
  86. data/app/models/proctolog/owner.rb +16 -0
  87. data/app/models/proctolog/pick.rb +47 -0
  88. data/app/models/proctolog/picture.rb +138 -0
  89. data/app/models/proctolog/pieces_rendering.rb +40 -0
  90. data/app/models/proctolog/project.rb +118 -0
  91. data/app/models/proctolog/pull_request.rb +89 -0
  92. data/app/models/proctolog/recording.rb +194 -0
  93. data/app/models/proctolog/release.rb +59 -0
  94. data/app/models/proctolog/rendering.rb +303 -0
  95. data/app/models/proctolog/reports.rb +66 -0
  96. data/app/models/proctolog/response_files.rb +55 -0
  97. data/app/models/proctolog/rounds.rb +305 -0
  98. data/app/models/proctolog/route.rb +151 -0
  99. data/app/models/proctolog/rules.rb +121 -0
  100. data/app/models/proctolog/scenario.rb +126 -0
  101. data/app/models/proctolog/server.rb +273 -0
  102. data/app/models/proctolog/since.rb +108 -0
  103. data/app/models/proctolog/size.rb +30 -0
  104. data/app/models/proctolog/standing.rb +132 -0
  105. data/app/models/proctolog/theme.rb +40 -0
  106. data/app/models/proctolog/unopened/numbers.rb +48 -0
  107. data/app/models/proctolog/unopened/opening.rb +88 -0
  108. data/app/models/proctolog/unopened.rb +203 -0
  109. data/app/models/proctolog/visit.rb +26 -0
  110. data/app/views/layouts/proctolog/application.html.erb +58 -0
  111. data/app/views/proctolog/acceptances/new.html.erb +34 -0
  112. data/app/views/proctolog/bursts/_line.html.erb +28 -0
  113. data/app/views/proctolog/bursts/_merged.html.erb +23 -0
  114. data/app/views/proctolog/bursts/_moved.html.erb +16 -0
  115. data/app/views/proctolog/bursts/_notices.html.erb +39 -0
  116. data/app/views/proctolog/bursts/_put_away.html.erb +11 -0
  117. data/app/views/proctolog/bursts/_rules.html.erb +27 -0
  118. data/app/views/proctolog/bursts/_side.html.erb +49 -0
  119. data/app/views/proctolog/bursts/_side_stop.html.erb +10 -0
  120. data/app/views/proctolog/bursts/show.html.erb +54 -0
  121. data/app/views/proctolog/code_reviews/show.html.erb +33 -0
  122. data/app/views/proctolog/decisions/_alternative.html.erb +5 -0
  123. data/app/views/proctolog/decisions/_beneath.html.erb +21 -0
  124. data/app/views/proctolog/decisions/_box.html.erb +27 -0
  125. data/app/views/proctolog/decisions/_choices.html.erb +9 -0
  126. data/app/views/proctolog/decisions/_draft_tools.html.erb +47 -0
  127. data/app/views/proctolog/decisions/_part.html.erb +61 -0
  128. data/app/views/proctolog/decisions/_round_data.html.erb +1 -0
  129. data/app/views/proctolog/decisions/_theme.html.erb +13 -0
  130. data/app/views/proctolog/decisions/index.html.erb +75 -0
  131. data/app/views/proctolog/notes/_card.html.erb +19 -0
  132. data/app/views/proctolog/notes/_template.html.erb +41 -0
  133. data/app/views/proctolog/open_pull_requests/_side.html.erb +30 -0
  134. data/app/views/proctolog/open_pull_requests/index.html.erb +106 -0
  135. data/app/views/proctolog/prompts/show.html.erb +41 -0
  136. data/app/views/proctolog/pull_requests/_connections.html.erb +65 -0
  137. data/app/views/proctolog/pull_requests/_finish.html.erb +42 -0
  138. data/app/views/proctolog/pull_requests/_margin.html.erb +33 -0
  139. data/app/views/proctolog/pull_requests/_note.html.erb +4 -0
  140. data/app/views/proctolog/pull_requests/_outline.html.erb +26 -0
  141. data/app/views/proctolog/pull_requests/_paragraphs.html.erb +9 -0
  142. data/app/views/proctolog/pull_requests/_scenarios.html.erb +16 -0
  143. data/app/views/proctolog/pull_requests/_since.html.erb +42 -0
  144. data/app/views/proctolog/pull_requests/_standing.html.erb +51 -0
  145. data/app/views/proctolog/pull_requests/_status.html.erb +5 -0
  146. data/app/views/proctolog/pull_requests/_try.html.erb +122 -0
  147. data/app/views/proctolog/pull_requests/show.html.erb +145 -0
  148. data/app/views/proctolog/recordings/_dialog.html.erb +26 -0
  149. data/app/views/proctolog/recordings/_list.html.erb +8 -0
  150. data/app/views/proctolog/recordings/_note.html.erb +22 -0
  151. data/app/views/proctolog/recordings/index.html.erb +33 -0
  152. data/app/views/proctolog/recordings/show.html.erb +118 -0
  153. data/app/views/proctolog/scenarios/_dialog.html.erb +22 -0
  154. data/app/views/proctolog/scenarios/_note.html.erb +18 -0
  155. data/app/views/proctolog/scenarios/_open.html.erb +9 -0
  156. data/app/views/proctolog/scenarios/_scenario.html.erb +48 -0
  157. data/app/views/proctolog/scenarios/_server.html.erb +20 -0
  158. data/app/views/proctolog/scenarios/index.html.erb +62 -0
  159. data/bin/proctolog +330 -0
  160. data/completions/_proctolog +143 -0
  161. data/config/application.rb +94 -0
  162. data/config/database.yml +16 -0
  163. data/config/environment.rb +6 -0
  164. data/config/initializers/grouse.rb +113 -0
  165. data/config/initializers/grouse_notes.rb +9 -0
  166. data/config/keys.yml +6 -0
  167. data/config/routes.rb +71 -0
  168. data/config/storage.yml +4 -0
  169. data/db/migrate/20261019213542_create_grouse_tables.grouse.rb +128 -0
  170. data/db/migrate/20261019213550_create_active_storage_tables.active_storage.rb +58 -0
  171. data/docs/manual/app.md +157 -0
  172. data/docs/manual/bursts.md +129 -0
  173. data/docs/manual/deciding.md +89 -0
  174. data/docs/manual/desk.png +0 -0
  175. data/docs/manual/films.md +20 -0
  176. data/docs/manual/handover.md +93 -0
  177. data/docs/manual/pr-format.md +75 -0
  178. data/docs/manual/reading.md +233 -0
  179. data/docs/manual/unopened.md +80 -0
  180. data/docs/manual/updates.md +55 -0
  181. data/lib/proctolog/installation.rb +125 -0
  182. data/lib/proctolog/version.rb +7 -0
  183. data/public/asking.js +50 -0
  184. data/public/code-review.js +40 -0
  185. data/public/cursor.js +292 -0
  186. data/public/decision-screenshots.js +97 -0
  187. data/public/decisions.css +949 -0
  188. data/public/decisions.js +1289 -0
  189. data/public/desk.css +582 -0
  190. data/public/desk.js +126 -0
  191. data/public/favicon.png +0 -0
  192. data/public/keys.js +228 -0
  193. data/public/mentions.js +389 -0
  194. data/public/messages.js +103 -0
  195. data/public/notes.js +731 -0
  196. data/public/pick.css +99 -0
  197. data/public/plaque.png +0 -0
  198. data/public/pr-number.js +11 -0
  199. data/public/prompt.css +46 -0
  200. data/public/prompt.js +16 -0
  201. data/public/pull_request.css +805 -0
  202. data/public/recording.css +379 -0
  203. data/public/recording.js +394 -0
  204. data/public/release.js +25 -0
  205. data/public/respond.css +260 -0
  206. data/public/respond.js +95 -0
  207. data/public/review-drafts.js +949 -0
  208. data/public/review-rounds.js +1447 -0
  209. data/public/scenarios.css +253 -0
  210. data/public/scenarios.js +36 -0
  211. data/public/schemas/proctolog-response-v1.json +101 -0
  212. data/public/side.js +133 -0
  213. data/public/standing.css +478 -0
  214. data/public/terminal-apl.svg +6 -0
  215. data/public/terminal-cuneiform.svg +3 -0
  216. data/public/terminal-grain-dots.svg +6 -0
  217. data/public/terminal-grain-weave.svg +6 -0
  218. data/public/terminal-grain-wedges.svg +6 -0
  219. data/public/terminal-shades.svg +3 -0
  220. data/public/terminal.css +4426 -0
  221. data/public/toast.js +26 -0
  222. data/public/try.js +124 -0
  223. data/public/viewer.js +808 -0
  224. data/public/words.js +81 -0
  225. data/skills/proctolog-handover/SKILL.md +77 -0
  226. data/skills/proctolog-pr-writing/SKILL.md +228 -0
  227. data/skills/proctolog-pr-writing/references/example-description.md +33 -0
  228. metadata +366 -0
@@ -0,0 +1,129 @@
1
+ # Bursts, the route and where things live
2
+
3
+ ## Bursts and pull requests
4
+
5
+ The desk opens on the burst written last, so one an agent has just made is
6
+ the one waiting for you; `proctolog route` and `proctolog handover` take it too
7
+ when no burst is named. With no burst yet, it opens on the repository's open
8
+ pull requests, at `/pull_requests`. "bursts & PRs" in the pane of every page
9
+ goes there: every burst at its top, the newest first, then the pull requests.
10
+ Its own pane says no burst is open, and lists your bursts with how far each
11
+ one's decisions are. A burst put away says so beside its name in its pane.
12
+ GitHub's stacks come first, each whole from the bottom up, then the pull requests in no
13
+ stack: yours first, then those written for PRoctolog (they have decisions),
14
+ then the newest. Each line says whose it is, what it sits on when that is not
15
+ `main`, and how many decisions it asks.
16
+
17
+ - "Review alone" opens one pull request in a burst of its own, `pr-1131`.
18
+ - "Review the stack" opens a stack whole, `stack-1055`.
19
+ - Ticking several and "Review the ticked together" makes one burst of them,
20
+ named as you type or after the first one's branch. A ticked one is a top:
21
+ it brings the chain of pull requests under it, followed down by base branches.
22
+
23
+ Each writes its burst among yours, as `proctolog burst new` would. Pressing
24
+ "Review alone" or "Review the stack" again opens the burst it made the first time.
25
+
26
+ Under "Not opened" come the branches with a description written for them that
27
+ nobody has opened yet, each with "Review alone", and "Review the chain" for one
28
+ that sits on another's branch ([how](unopened.md)).
29
+
30
+ ## When a burst is done
31
+
32
+ A pull request that merges leaves the route, and goes under "Merged" at its
33
+ foot, the latest first, each with the day it went in and how far your review
34
+ of it got. While the rest of the burst is still at work they are put away
35
+ under that heading: "Show them" lists them, "Put them away" folds them again.
36
+ One closed without merging is still said to have left the burst, as before.
37
+
38
+ A burst is finished once nothing of it is open or waiting unopened and some of
39
+ it was merged. The desk then puts it away: it no longer opens on it, and the
40
+ open pull requests page counts the finished under its own bursts, "Show it"
41
+ listing them again. A finished burst's page still opens at its address, saying
42
+ so, with everything it merged.
43
+
44
+ Done with a burst before all of it went in? "Put it away", under its tally,
45
+ puts it away the same way, open pull requests and all, and "Take it out"
46
+ brings it back. The mark is kept beside your marks, not in the burst's file,
47
+ so a burst the repository shares is put away for you alone.
48
+
49
+ The desk knows a pull request merged once it has read GitHub since: "read
50
+ again", or `r`, when the pane says GitHub moved on.
51
+
52
+ ## Where bursts live
53
+
54
+ A burst and its scenarios are yours: `proctolog burst new` writes the burst to
55
+ `~/.local/share/proctolog/<owner>/<repo>/bursts/`, beside your marks, and its
56
+ scenarios go in `scenarios/` there under the same name. They hold what is
57
+ yours alone (a sitting's checkout, a handover's paths and rules), so they stay
58
+ out of Git, and every checkout of the repository on this Mac sees them.
59
+ `proctolog burst list` says where each burst the desk opens is kept.
60
+
61
+ What the repository shares lives in its `.proctolog/`: `app.yml`, how its app
62
+ is run ([how](app.md)); `project.yml`, where its decision records are kept and
63
+ the themes its decisions name ([settings](app.md#settings)); and any burst a
64
+ whole team reviews, in `bursts/` and `scenarios/`. A burst of yours wins over a
65
+ shared one of the same name. `.proctolog/local.yml`, kept out of Git, holds
66
+ what is this machine's alone.
67
+
68
+ A burst is the body of work the desk opens: the pull requests one effort made,
69
+ taken together. Its file names them, and its name is what `route` and the desk's
70
+ addresses use. A burst file still kept under `.proctolog/reviews/`, where they
71
+ were kept before bursts had their name, opens as well; one in `bursts/` wins over
72
+ one of the same name there. Addresses under `/reviews/` lead to `/bursts/`.
73
+
74
+ ```yaml
75
+ name: The first-run burst
76
+ repository: sartoria-llc/sartoria
77
+ stacks: [1055] # GitHub's native stacks, by the number GitHub shows
78
+ tops: [1086, 1083] # chains the desk follows down by base branches
79
+ pull_requests: [1100] # pull requests that stand alone
80
+ ```
81
+
82
+ A pull request nobody has opened yet is named by its branch, under `tops` or
83
+ `pull_requests`: `tops: [1086, recovery/emails]`. Once its branch is opened the
84
+ same line names the open pull request.
85
+
86
+ The route takes a burst in parts: each native stack from the bottom up, by
87
+ GitHub's own order; then each chain followed down from a top; then the pull
88
+ requests that stand alone. A top with nothing under it stands alone too. A
89
+ chain that reaches a stack's member stops there and sits on it, so a change
90
+ lower down is still carried up through it, and its layers wait on that member
91
+ being settled. A pull request shows once: in its stack before a chain, in a
92
+ chain before standing alone. GitHub's stacks are read with a small question of
93
+ their own after the reading; when GitHub cannot answer it, the descriptions
94
+ are still read, and each stack is placed as it was last read.
95
+
96
+ The head of the route says how the burst moved and where its file and GitHub
97
+ disagree, a line each. A pull request that joined or left since you last
98
+ looked is a line of the route: `x` dismisses it. The desk keeps what you have
99
+ seen in `membership.yml` beside the marks; a reading alone never moves it, a
100
+ dismissal or a handover does. A pull request that left with your choices on it
101
+ stays listed, from those choices, until a handover. A pull request on a
102
+ member's branch that the burst does not hold, a listed stack with nothing
103
+ open, a burst file under both `bursts/` and `reviews/`, and a pull request
104
+ another burst file also holds are each named, with the fix, while they are
105
+ true. The pane at the left counts them.
106
+
107
+ Marks and films live under `~/.local/share/proctolog/<owner>/<repo>`; cached
108
+ pictures and browser profiles under `~/.cache/proctolog/<owner>/<repo>`.
109
+ Worktrees of the same GitHub repository share that store.
110
+
111
+
112
+ The desk reads GitHub once and keeps that reading, also across restarts, under
113
+ the cache's `readings/`. Pages open from it without asking GitHub. The pane at
114
+ the left says when it was read; once a page is shown it asks GitHub one small
115
+ question in the background and names the pull requests that changed since.
116
+ “Read again” there (or `r`) reads everything anew, which takes a few seconds.
117
+ After a reading the desk fetches the burst's pictures in the background, so a
118
+ page that shows forty of them does not wait for them.
119
+
120
+ For a trial with separate marks and GitHub writes disabled:
121
+
122
+ ```sh
123
+ PROCTOLOG_MARKS=$(mktemp -d) PROCTOLOG_READ_ONLY=1 proctolog serve --port 4041
124
+ ```
125
+
126
+ `PROCTOLOG_READ_ONLY=1` blocks GitHub writes. Scenario buttons can still start
127
+ the project's app and run its recipes; use those only when you want to enter
128
+ that scenario.
129
+
@@ -0,0 +1,89 @@
1
+ # Deciding
2
+
3
+ On the Decisions page, `j` / `k` (or arrow keys) move between items and `[` /
4
+ `]` between pull requests; Enter opens the decision on its PR's page. `a` leaves
5
+ the implementation as is and moves on. `q` asks a question, `c` suggests a change,
6
+ and `l` leaves it for later with a backlog-task request. Type your text and press
7
+ Ctrl/⌘ + Enter to save and move on. Escape closes the editor while keeping its
8
+ draft; one with nothing typed leaves no draft. `u` undoes the last choice; To
9
+ review, Reviewed and All let you revisit items.
10
+
11
+ When no decisions match the view, “Show all decisions” brings them back with
12
+ your choices intact. When To review is empty because every decision shown is
13
+ reviewed, the desk says so; the route is available beside that button.
14
+
15
+ A question can also be asked at once, rather than in the handover. Under the
16
+ question's text, “Ask Claude now” opens a new Claude Code session in the
17
+ Claude app, in the checkout under review, with a prompt typed in: the decision
18
+ quoted with its pull request, branch and head, the pictures it rests on where
19
+ the desk keeps them on this Mac, and your question last, where you can go on
20
+ typing. It asks the session to answer and change nothing. Nothing is sent
21
+ until you send it there. “Copy prompt” copies the same prompt, for a session
22
+ already open or another agent. With decisions selected, the prompt quotes each
23
+ of them. Asking leaves the question here a draft and the decision open: once
24
+ the answer is in, choose on it as on any other, or save the question for the
25
+ handover as well.
26
+
27
+ The desk keeps these choices and unfinished drafts in `choices.json` beside the
28
+ burst's marks, so the Route, every PR page and any browser on this Mac show the
29
+ same progress. They change no GitHub checkboxes. The browser holds a copy as
30
+ well: it carries a choice across tabs at once and through a moment when the desk
31
+ is not running, then sends it on. When another page saved first (a rule
32
+ withdrawn on the Route, a choice in another browser), the page you are on takes
33
+ in what it saved and makes your step again on top of it, and says so. Choices made before the desk kept them are
34
+ taken in from the browser the first time one of its pages opens, merged like a
35
+ backup. An unrecognized rewritten decision needs review again; unrelated head or
36
+ description changes don't reopen every decision. A choice also records the
37
+ pictures its decision rests on (those it links, a pair as both halves, and any
38
+ in its own line) by their pixels: a retake with other pixels, or a picture
39
+ added or taken away, opens the decision again as “Pictures changed”, with each
40
+ picture as it was beside as it is now. A retake with the same pixels changes
41
+ nothing, and a picture the desk cannot read is “unverified” rather than changed.
42
+ The desk works pixels out as it fetches a picture, and in the background for
43
+ those it already holds, never while a page waits; a picture it has not reached
44
+ yet is “unverified” for that moment. Verification remains bound to
45
+ its recorded head. “data” in the bar holds Back up choices and Restore choices,
46
+ which merges a backup into this burst, with the agent-response import.
47
+
48
+ “By theme” in the bar lays the same decisions out by the theme each one names
49
+ (`<!-- proctolog:theme errors -->`), in the order of the project's themes, with
50
+ those of no listed theme under “other”; “By pull request” goes back. A theme's
51
+ heading is a stop for `j` / `k`, and `]` jumps between themes. `x` selects the
52
+ decision at hand, or on a heading every decision under it; Escape clears the
53
+ selection. A choice made with decisions selected answers each of them with the
54
+ same words, and `u` takes them all back at once. `b` waits while more than one
55
+ is selected, since an alternative belongs to one decision. Each answer stays its
56
+ own choice: a rewrite that reopens one leaves the others standing. The handover
57
+ carries one line per part, at its lowest pull request, listing the decisions it
58
+ answers and where else the same answer was given.
59
+
60
+ `R` on a decision you chose on makes that answer a rule, in one line, to keep
61
+ beyond this burst; on one that has a rule already, it edits it. A choice given
62
+ to several decisions at once makes one rule. The rule is a request of its own:
63
+ the handover asks the agent to write it into the project's
64
+ `CLAUDE.md`, or a decision record in a folder `decision_records` in
65
+ `.proctolog/project.yml` names, and to answer under the rule's id with that file
66
+ as evidence. Confirming that answer closes the rule alone, never the choice it
67
+ was made from. The Route lists “Rules made in this burst” at its foot, each a
68
+ line `j` / `k` rest on, with its state: written, sent, answered, confirmed. `c`
69
+ edits the one the cursor is on and `x` withdraws it. Before a handover carries
70
+ a rule, either changes it where it stands; after, the next handover carries a
71
+ replacement, naming the line it replaces, or a request to take the rule out.
72
+
73
+ Press `e` or “hand over” and the desk writes the handover as a folder beside the
74
+ burst's marks, under `handovers/`: a short brief, `handover.md`, with the rules,
75
+ how to work and how to answer; a file for each pull request with anything handed
76
+ over, under `prs/`, quoting its notes, your choices and its code comments in
77
+ full; `worklist.json`, the same requests as data; and each description as you
78
+ reviewed it, under `descriptions/`. The bar then offers “Open a new session with
79
+ it”: a new Claude Code session in the Claude app, in the checkout under review,
80
+ with one line typed in that asks it to read the brief and carry it out. The same
81
+ line goes to the clipboard, for a session you start yourself. Nothing is sent
82
+ until you send it there. When the desk does not answer, nothing is written, and
83
+ the page says so; your choices stay. The Prompt page shows what `e` would write,
84
+ file by file. “Leave as is”
85
+ adds no change request and approves no merge; existing notes still apply. “Leave
86
+ for later” asks for a task using the project's backlog convention, or a proposed
87
+ task in the report when none exists. Unfinished drafts are included as context,
88
+ never as submitted instructions.
89
+
Binary file
@@ -0,0 +1,20 @@
1
+ # Films
2
+
3
+ Films come from the capture kit, which is owner-only for now.
4
+
5
+ A film's page reads as its steps: beside it, each step's name over the picture
6
+ it opens on, and a press on one takes the film there. The pictures are taken
7
+ from the film once and kept in the cache by the film's digest; while they are
8
+ made, and on a Mac without `ffmpeg`, the names stand alone. “Fill the window”
9
+ keeps the names only, and a film without chapters has no strip.
10
+
11
+ Filmed again, a film is a new round. The capture kit's `film.rb` keeps the frame
12
+ each step opened on, as the browser gave it, in a `NAME.steps` folder beside
13
+ the film; the desk records the digest each film had beside the burst's marks
14
+ (`films.yml`) and compares a round's steps with the round before by name. A
15
+ line over the strip says what holds: “No earlier round to compare”, “Not
16
+ compared: ImageMagick missing”, “Not compared: a round without the capture
17
+ script's own frames” (frames decoded from two encodes of the same screens
18
+ differ), or how many steps changed. A changed step's name is lit and says
19
+ “Changed”; one the earlier round had not says “New step”.
20
+
@@ -0,0 +1,93 @@
1
+ # Handover and the next pass
2
+
3
+ Press `d` on a PR page to open its code in the installed Diffle: this layer only,
4
+ what GitHub's Files changed shows, so a PR high in a stack does not bring every
5
+ layer below it. The Code comments page also offers “Whole PR against main”,
6
+ cumulative for a stack.
7
+ PRoctolog uses a private checkout under the burst's store, with a pinned base
8
+ and head. Sartoria's checkout stays untouched. When GitHub has moved the PR's
9
+ head since the desk read it, `d` reads GitHub again first, a few seconds, so
10
+ Diffle opens the code the page then shows. Diffle's `c` comments, `v` marks
11
+ a file viewed, and `?` lists the keys. The PR's Code comments page shows the
12
+ threads and lets you stop its server. The outline of the PR's page counts the
13
+ comments nobody resolved and the files viewed, and counts again whenever you
14
+ come back to its tab, so closing Diffle leaves the count true.
15
+
16
+ Handing over collects current code comments and responses. Diffle
17
+ threads join the same worklist as description notes and browser choices,
18
+ including their path, line range, quoted code and reviewed head.
19
+
20
+ ## Your agent can take it itself
21
+
22
+ Tell your agent to check your PRoctolog comments. The `proctolog-handover`
23
+ skill has it run `proctolog handover` in the repository's checkout, which
24
+ writes the same folder `e` would, from what the desk keeps, with no page open,
25
+ and tells the agent where the brief is. `--part` takes one part of the burst.
26
+
27
+ A handover need not wait for the end of a review. What you decided so far
28
+ goes; what you haven't reviewed yet stays out, and the brief asks the agent to
29
+ leave it exactly as it is, since you may be reading it while it works. Choose
30
+ on, and the next handover, `e` or the agent checking again, carries only what
31
+ you decided since, with your replies to what came back.
32
+
33
+ What a handover took stays with its agent until an answer comes back: a later
34
+ handover leaves it out, so two agents never do the same work, and Returned work
35
+ lists it under "With an agent". If that agent is gone, "Hand them over again"
36
+ there, or `proctolog handover --again`, puts it in the next handover.
37
+
38
+ ## Answers
39
+
40
+ Each handover records a batch. Its brief tells the agent to return one
41
+ `proctolog-response/v1` JSON file under the burst's `responses/` folder, or to
42
+ give you that file to import. The [schema](../../public/schemas/proctolog-response-v1.json)
43
+ defines answers, completed changes, researched explanations with evidence,
44
+ verification, backlog references, blockers and questions with recommendations.
45
+ Refresh loads matching files; unrelated batches or invented request ids are
46
+ refused. An agent that writes its answer again, after a restack or a fix, gives
47
+ it a new time: the desk shows the new version and keeps the one before under
48
+ “Earlier replies and responses”, and a reply of yours stays with the version
49
+ you read. Backups include the batch history needed to match responses.
50
+
51
+ On the PR page, press `v` for Returned work. Confirm a result to close its request. Ask a follow-up, request a
52
+ correction or leave it for later to continue that same request. Returned work
53
+ is read like the rest of the page ([reading](reading.md)): `↑` / `↓` go down it
54
+ block by block, `→` / `←` open and close its folds, `[` / `]` go from response
55
+ to response, and Esc goes back to where `v` was pressed. Wherever you are in a
56
+ response, `a` confirms it, `q` replies or asks, `c` requests a correction, and
57
+ `l` defers. Ctrl/⌘ + Enter saves the reply; `e` exports the next pass.
58
+
59
+ What the agent wrote is drawn as GitHub draws markdown. Under Evidence, the
60
+ pictures it names are shown, read from where they are on this Mac: two named
61
+ alike but for `before` and `after` stand side by side as one, and Space looks
62
+ at one closely, a pair compared each way as the description's are. The desk
63
+ shows only pictures a response names. The files and pages it names follow, and
64
+ Verification says how many of the agent's checks passed, a failed one reversed.
65
+ You can also ask a new question outside the PR items explicitly.
66
+ “Review changes” (`d` while focused on a response) compares the exact head you
67
+ reviewed with the returned committed head, even before publication. “Whole PR
68
+ against main” is available alongside it. A correction's next pass starts from
69
+ the previously returned head. No code changes means no extra diff to review.
70
+ Returned work opens with one line of what is waiting, then what asks something
71
+ of you: questions, results to confirm or push back on, requests reopened for the
72
+ next pass. Everything else is folded under “Background”: requests an agent still
73
+ holds, closed ones, drafts kept from earlier wording, and “Description changes
74
+ since this handover”, which draws the paragraphs added or rewritten in the
75
+ current GitHub description, pictures included, against the copy the desk kept
76
+ when it wrote the handover. “Ask or request something else” sits at the foot.
77
+ “What you reviewed” recalls the original decision.
78
+ Prompt remains available for the combined review across all PRs.
79
+
80
+ The next handover includes only unresolved requests that need the agent. Items
81
+ waiting for your answer stay out until you reply, and items still with an
82
+ agent until it answers. Confirmed work stays closed;
83
+ reimporting a response does not reopen it. Optional follow-ups are shown
84
+ separately and add no work unless you choose to ask for it. Closing review
85
+ requests doesn't waive current-head verification, scenarios, dependency or
86
+ rollout checks, or your final merge and release approval.
87
+ Choices follow their stable reference, or exact words for older descriptions,
88
+ when decisions move. Earlier wording and
89
+ unfinished drafts are retained for recovery; a reply never jumps to a different
90
+ decision just because its position changed. Requests from PRs that leave the
91
+ open burst, and choices replaced by new ones, stay in history instead of
92
+ creating another pass.
93
+
@@ -0,0 +1,75 @@
1
+ # Writing a PR the desk reads
2
+
3
+ ## Check a description
4
+
5
+ ```sh
6
+ proctolog check 1062 # an open pull request, as GitHub holds it now
7
+ proctolog check --file body.md # a description before it is published
8
+ proctolog themes # the themes a decision may name, and what each means
9
+ ```
10
+
11
+ `check` reads a description with the desk's own parser and its own picture
12
+ names, and says on which line what would keep the desk from reading it well
13
+ (a fault): no decisions section, a decision with no bold lead, running onto a
14
+ second line, with no `Alternative:` or no theme the project lists, a picture
15
+ link that names no uploaded picture or several, half a before/after pair, a
16
+ reference kept twice. More than five blocking decisions is a warning. It
17
+ exits 0 with no faults, 1 with faults, and 2 when `gh` could not be asked.
18
+ `--file` has GitHub render the file first, through its Markdown endpoint,
19
+ which only renders and keeps nothing.
20
+
21
+ ## PR format
22
+
23
+ The skill in `skills/proctolog-pr-writing/` teaches an agent this format, with a
24
+ whole example in its `references/example-description.md`. `proctolog install`
25
+ links it into `~/.claude/skills/` and `~/.agents/skills/`. Keep the project's
26
+ template (Summary, Changes, Verification) and add:
27
+
28
+ ```markdown
29
+ ## How to test locally
30
+
31
+ **A named scenario.**
32
+ 1. Do this. Expect that.
33
+
34
+ ## Decisions for the owner
35
+
36
+ - [ ] **The implementation does this.** Why it was chosen and who it affects. See [phone wrapping](#screenshot-card-phone). Alternative: another behavior, with its cost. <!-- proctolog:theme fit -->
37
+
38
+ ### Non-blocking
39
+
40
+ - [ ] **A choice a default settles.** Why. Alternative: the other default. <!-- proctolog:theme copy -->
41
+ ```
42
+
43
+ The parser needs these exact second-level headings, top-level one-line task
44
+ items, and `Alternative:` for the alternative. Give each item a distinct bold
45
+ lead. Blocking decisions come first, five at most; those a default can settle
46
+ go under `### Non-blocking`. A description with no such heading has every
47
+ decision blocking. Each decision ends with its theme,
48
+ `<!-- proctolog:theme NAME -->`, one of those `proctolog themes` prints; the
49
+ marker is hidden on GitHub and is no part of the decision's words. When
50
+ rewriting an existing decision, retain its handover's `source.decision.key`
51
+ after the lead: `<!-- proctolog:decision KEY -->`. These invisible references
52
+ keep a settled choice settled when its prose changes. Omit resolved decisions
53
+ from the active list if appropriate; their review history is retained. Never
54
+ reuse a reference for a new choice. Scenario registries
55
+ refer to the bold scenario headings above numbered steps.
56
+
57
+ For a decision about display or rendering, the PR writer chooses which images
58
+ show the point and links to them in that decision: `[a useful label](#screenshot-image-name)`.
59
+ `image-name` must match the screenshot's exact, unique `alt` text in this PR,
60
+ for example `<img ... alt="card-phone">` above. Put the link beside the claim
61
+ it illustrates, before `Alternative:`, and use several links when useful.
62
+ PRoctolog resolves these references to its cached images and previews them
63
+ inline with their captions. Missing or ambiguous names are reported in the
64
+ preview. Keep names stable when retaking an image; update references when
65
+ renaming it. References are optional for decisions that need no visual proof.
66
+
67
+ List real choices here. Put test gaps in Verification under “Not verified”, and
68
+ implementation facts in Changes. Keep the description about the final change
69
+ against `main`, not a review-iteration diary. A GitHub checkbox is legacy review data; the
70
+ browser's “Leave as is” choice means no new implementation change. It is not
71
+ proof of verification or permission to merge. Descriptions written before the
72
+ grades need no rewrite to use the queue: all their decisions count as blocking.
73
+ `proctolog check --file body.md` says whether a description reads well before
74
+ it is published.
75
+
@@ -0,0 +1,233 @@
1
+ # Reading a PR by keyboard
2
+
3
+ Every page with keys has a bar at its foot that names the few that matter where
4
+ you are (Reading, Deciding 3 of 21, Writing, Returned work). `?` docks the list
5
+ of them all above that bar, where it stays while you work, from page to page,
6
+ until `?` puts it away. A key that can do nothing says why in a line above
7
+ the bar.
8
+
9
+ Below a PR's title, “review decisions” starts with the first blocking decision
10
+ still to review; “returned work” appears when an answer waits for you. The same
11
+ row offers the route, the previous and next PR, and the next one to review.
12
+ Their keys stay the same: `f`, `v`, `h`, `K`, `J` and `N`. This row gives way
13
+ while you decide; Escape brings the reading back.
14
+
15
+ Each of those lines, and each line a page opens with after a form, is kept.
16
+ `m`, or “messages” at the right of the bar, lists them newest first, each with
17
+ its time and the page it was said on, a link back to that page when it was
18
+ another; `m` or Escape puts the list away. The list is this browser's and
19
+ keeps the last eighty.
20
+
21
+ A pull request's page has a cursor: a `>` in the gutter at the block the reading
22
+ rests on. Only that block carries keys, in the margin beside it, and they lead
23
+ the docked list as “This block”. An outline at the right names the page's
24
+ sections, marks the one the cursor is in, and counts only what waits for you;
25
+ a press there goes to that section. Below them, Code comments counts the
26
+ Diffle comments nobody resolved, and Files viewed how far you got in the code
27
+ last opened; both lead to the Code comments page. In a window under about
28
+ 1,300 pixels wide the outline gives way to the reading.
29
+
30
+ Under the outline, Try it runs the app for a pull request that has scenarios.
31
+ It first says what a scenario needs before it tries this pull request, a bead
32
+ to each as Standing has them: a checkout that can run the app, with this pull
33
+ request's latest commit in it, and the server up on it. What is still open is
34
+ white. When the checkout falls short, "How to fix it" opens a popup that says
35
+ what is wrong in plain words and gives the commands that make a checkout of
36
+ this pull request which can run, and the lines that point the burst's sitting
37
+ at it, each with a button that copies it. Under the beads is a button for each
38
+ scenario, named for it, which wakes once the server is up: it makes the
39
+ scenario's state, signs its member in and opens a browser on the page where its
40
+ steps begin. A press on start or stop leaves the page where it is, and the
41
+ server goes on in the background until it is stopped. When it has stopped
42
+ without the desk, the end of its log shows while the pointer is on that line.
43
+ `t` goes to Try it. In a narrower window it waits at the foot of the page.
44
+
45
+ On the Route, `j` / `k` select a PR and Enter opens it. Each line shows how many
46
+ of its decisions you have reviewed, and whose it is when it is not yours; the
47
+ line the cursor is on opens out with the rest: its layer, what is open, its
48
+ pictures and words, and when it last changed. `N` opens the next PR with
49
+ decisions left. Clicking a title opens that PR. Clicking elsewhere on a row,
50
+ or tabbing to one of its links, selects it and shows its actions. In a narrow
51
+ window those actions wrap under the selected row. On
52
+ a PR's page, `j` / `k` or the up/down arrows move through headings, description
53
+ blocks, pictures, decisions and returned work, as below. `[` / `]` jump between
54
+ sections; Enter or Right opens a section, Left closes it. Home / End reach the
55
+ first / last item. Tab / Shift+Tab reach links, buttons and fields. `J` / `K` open the
56
+ next / previous PR, `N` the next one with decisions to review, and `h` returns
57
+ to the Route. `G`, on the Route or a PR's page, opens the PR on GitHub in a tab
58
+ of its own.
59
+
60
+ How the keys move is the same everywhere on a PR's page:
61
+
62
+ - `↓` and `j` are one key, `↑` and `k` the other. They go to the next block
63
+ the page shows, or the one before, in the order it is read from the top,
64
+ returned work included. Nothing shown is passed over: a fold that is shut is
65
+ one block, its heading, and a block taller than the window is read a
66
+ screenful at a time before the next. They stop at the first and the last
67
+ block, and never jump elsewhere.
68
+ - `>` in the margin marks the block, with a line under it as far down as the
69
+ block goes; the keys of that block stand beside it, and the bar at the foot
70
+ names where you are: Reading, Returned work 2 of 4, Deciding 3 of 21.
71
+ - `←` and `→` go sideways. On a fold they close and open it. While deciding,
72
+ the decisions stand in a row of beads, and they go along it.
73
+ - `[` and `]` go from heading to heading: the sections, Returned work, and each
74
+ response in it.
75
+ - Where one thing fills the page, a decision being decided, `↑` `↓` and `j`
76
+ `k` scroll it. In a picture looked at closely the arrows move the picture.
77
+ - Esc goes back one step: out of a picture to the block it was opened from,
78
+ out of a decision to the page, out of returned work to where `v` was pressed.
79
+
80
+ The page opens on the description. After it come the sections of its review,
81
+ reached by the same keys: Standing (what must be met, and Good to go),
82
+ Scenarios (each one's steps, and what you saw of it), Connections, Notes and
83
+ Handover. A picture a step names opens at a press, as Space opens one. With the cursor on the title, what
84
+ can be done with the whole pull request stands beside it.
85
+
86
+ A burst can be taken a part at a time. On the Route, `p` shows the part the
87
+ cursor is in alone; every page you go to from there keeps that focus, the
88
+ pane says which part it is, and `P` brings the whole burst back from any page.
89
+ Focused, the route, the decisions, the scenarios and the handover hold that
90
+ part alone, `J`, `K` and `N` stay within it, and the pane counts the decisions
91
+ left in the part against the burst. A pull request opened from outside the
92
+ part stands apart in the pane. A handover of one part says the rest of the
93
+ burst is outside it, and names the chains that sit on it, so a change to it is
94
+ carried up through them.
95
+
96
+ A pane at the left of every page lists the route, each PR with its count
97
+ (`x` all reviewed, `~` some, no mark for none yet, `-` when it has none), and
98
+ marks the one you are on. A `*` before a title means GitHub moved on since the
99
+ desk read it. Hold the pointer on a row and a card beside the pane gives its
100
+ title in full, says each of its marks in words, and links to it on GitHub
101
+ (and to “read again” when it moved).
102
+
103
+ The desk has no colour. What you are on and what waits for you is white and
104
+ bold; what is settled is grey. A bead says the same of anything that is
105
+ counted: hollow while it waits, solid once it is settled, ringed where you are.
106
+
107
+ Reading passes over the decisions like any other block: `j` / `k` and the arrows
108
+ never open one. Enter on a decision, a click on it, or one of its choice keys
109
+ opens it to decide.
110
+
111
+ Space on a picture, or on a decision that links pictures, opens it over the
112
+ whole window. The wheel, a pinch, `+` and `-` zoom; a drag or the arrows move
113
+ it; `0` fits it and `1` shows its own size; `[` / `]` go through the other
114
+ pictures. A click there marks a point and Shift with a drag marks a region: the
115
+ place stays on the picture, everything around it dimmed, and the note's form
116
+ opens beside it, with the viewer as it was, zoom and all. ⌘ Enter saves the
117
+ note and leaves it drawn there for the next; Escape puts the form away while it
118
+ is empty. The picture's notes are drawn on it, and a click on one opens it
119
+ beside its box with its words: ⌘ Enter saves it written over, in the same
120
+ place, and Withdraw takes it back off the picture. Escape puts it away while
121
+ nothing in it is changed. Escape, or the ✕ at the top
122
+ right, closes the viewer and nothing else: you are back on the block, or the
123
+ decision, you opened it from. Once it closes, the page comes back at the last
124
+ note written; while deciding, it stays on the decision, and the note shows the
125
+ next time the page loads.
126
+
127
+ Two pictures named `NAME-before` and `NAME-after` are one picture of a change:
128
+ the description shows them side by side under one name, and a decision links
129
+ them as `#screenshot-NAME`. In the viewer, `s` shows them side by side, `w`
130
+ swipes (the after picture over the before, up to a divider that a drag or the
131
+ arrows move), `b` blinks from one to the other at each press, `o` lays the
132
+ after picture half seen through over the before, and `d` lights only what
133
+ differs. `n` goes from one changed region to the next, each outlined on the
134
+ pictures. The caption says “Comparing…” until the regions are found, then how
135
+ many there are, “Identical”, “Different sizes: compared from the top left”, or
136
+ “Regions need ImageMagick” on a Mac without it. A mark goes on the half it is
137
+ made on side by side, and on the one showing in blink; swipe, onion skin and
138
+ difference take none. Comparisons are kept in the cache, by the pictures'
139
+ pixels.
140
+
141
+ A run of pictures that no decision or other line of the description links
142
+ folds where it stood, with its captions, into one “More pictures (N)”, opened
143
+ like a section with Enter. For Sartoria's capture kit,
144
+ `integrations/sartoria/compare.rb` (required after `kit.rb`) shoots a screen
145
+ `before "NAME"` and `after "NAME"` and `Capture.compare` compares the pairs
146
+ before anything is uploaded: it drops a pair whose pixels match, groups pairs
147
+ of one size that show the same change, and writes `compare.json` listing what
148
+ to upload.
149
+
150
+ Press `f` to jump straight to the first unreviewed decision; on Standing's
151
+ "Its decisions are reviewed", Enter does the same. Deciding shows the
152
+ decisions alone, a line each, and the one at hand opened out: its words, its
153
+ choices as a menu, each beside its key, and its linked screenshots under them.
154
+ A row of beads above shows which of the PR's decisions are done and which one
155
+ this is; `←` / `→` move along them, `↑` / `↓` and `j` / `k` scroll the one
156
+ shown, and Escape brings the whole page back.
157
+ Focusing a decision
158
+ activates its actions: `a` leaves it as is, `q` asks a question, `c` suggests a
159
+ change, and `l` leaves it for later. Saving advances to the next unreviewed
160
+ decision on this PR. Ctrl/⌘ + Enter saves text; Escape closes a draft without
161
+ discarding it, then Escape returns to the section heading. `u` undoes the last
162
+ choice, wherever you are on the page. Once every blocking decision is
163
+ reviewed, the page shows where the decisions end: what is reviewed and how many
164
+ non-blocking still wait; what to do next, where `g` marks the PR good to go,
165
+ `N` opens the next PR with decisions to review, `e` hands over and
166
+ `h` goes back to the Route; and every decision on a line under its grade, with
167
+ what you chose on it or what holds it. Each grade says what it asks of you: a
168
+ blocking decision needs your answer before the work goes on, and a non-blocking
169
+ one has a sensible default, so that left as is, what the agent built stands.
170
+ `j` / `k` (or the arrows) go down the lines. `→` unfolds a line to its
171
+ decision's own words and your choice in full, `←` folds it again, and a click
172
+ does either; a screenshot its words name opens the decision, where its
173
+ pictures are. Enter or a choice's key opens the decision of the line it rests
174
+ on; Escape from that decision comes back to
175
+ its line, and Escape from the lines brings the whole page back. Under the whole
176
+ page the panel keeps only what to do next. `g` and `e` work from anywhere on
177
+ the page outside an editor. No separate decisions page is needed.
178
+ “To review” shows only decisions still needing a choice: one you chose on, or
179
+ one already ticked on GitHub, is not asked again. “All decisions” lets you
180
+ revisit them; their original wording stays in review history.
181
+
182
+ A description may grade its decisions: those under a `### Non-blocking`
183
+ heading are non-blocking, the rest blocking. The non-blocking fold away under
184
+ that heading, which the reading rests on like any other; Enter or Right opens
185
+ it. Deciding goes through the blocking decisions alone: `f`, `N` and "Deciding
186
+ 3 of 8" pass over the non-blocking, which still count toward "its decisions
187
+ are reviewed". `A` (on that heading, on the panel after the last blocking
188
+ decision, or anywhere on the page) leaves every non-blocking decision that
189
+ waits for nothing as it is, in one gesture: it passes over one you starred,
190
+ one the burst file names, one with a draft, a question or an answer, and says
191
+ which and why. The panel says it before you press: “leave 10 as is · 2 wait
192
+ for you: 1 starred, 1 drafted”, and each of those two lines says what holds it. `u` takes the whole gesture back. A decision left that way opens
193
+ again, saying why, if a rewrite promotes it to blocking or changes its words;
194
+ one you left by itself keeps the usual rules. The handover gives each pull
195
+ request's gesture one line. The Route and the Decisions page count the grades
196
+ apart, "3 blocking · 12 non-blocking", and say "over five" where there are
197
+ more than five blocking.
198
+
199
+ `b` (Use alternative) records the decision's exact suggested alternative as a
200
+ change request. It opens one line under the decision for a note, where an
201
+ alternative names more than one route and you say which you mean; Enter saves
202
+ and moves on, with the line empty or not, and the note follows the alternative
203
+ as “My note: …”. `b` again on that decision shows the note to change. It uses
204
+ the same saved choices, undo, backups and handover as a change you type. It requests an
205
+ implementation change; it does not approve a merge or mark verification done.
206
+ The button appears only when the writer supplied an alternative other than
207
+ “none”.
208
+
209
+ `s` opens or closes a decision's referenced screenshots beside it. Clicking a
210
+ screenshot reference also opens that preview. Your decision keeps focus;
211
+ Escape closes the preview, and moving to another decision closes it too.
212
+
213
+ `n` opens a note on the focused block or whole picture (on a decision too), and
214
+ `w` opens a note on the whole PR. `c` always means “suggest a change” on a
215
+ decision. Drawing a particular picture region still uses the pointer. Shortcuts
216
+ leave typing and browser modifier keys alone.
217
+
218
+
219
+ A `#` and a number, typed into any box of the desk (a note, an answer to a
220
+ decision, a rule), looks among every pull request of the repository, open,
221
+ merged or closed, and lists those it may be just under the `#`: the one with
222
+ that very number first, then those whose number begins so, newest first. `↑`
223
+ / `↓` (or Ctrl+N / Ctrl+P) choose, and Tab or Enter puts the one chosen in place
224
+ of what you typed. You may not mean a pull request at all: Esc puts the list
225
+ away and leaves the `#` as typed, and so does writing on past it or leaving it
226
+ behind. That Esc is the list's alone, so the draft, form or dialog around the
227
+ box stays open; with no list showing, Esc does what it always did. The first `#`
228
+ on a repository the desk has never read takes some seconds while it reads the
229
+ whole history, which it then keeps.
230
+
231
+ Wherever the desk shows what you or the agent wrote, a `#` that names a pull
232
+ request is a link to it with its title beside, and its state when it is no
233
+ longer open. One of the burst's own goes to its page here; any other to GitHub.