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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +23 -0
- data/README.md +178 -0
- data/app/controllers/proctolog/acceptances_controller.rb +29 -0
- data/app/controllers/proctolog/application_controller.rb +32 -0
- data/app/controllers/proctolog/bursts_controller.rb +34 -0
- data/app/controllers/proctolog/choices_controller.rb +30 -0
- data/app/controllers/proctolog/code_reviews_controller.rb +26 -0
- data/app/controllers/proctolog/decisions_controller.rb +33 -0
- data/app/controllers/proctolog/entries_controller.rb +14 -0
- data/app/controllers/proctolog/evidence_controller.rb +23 -0
- data/app/controllers/proctolog/freshness_controller.rb +27 -0
- data/app/controllers/proctolog/good_to_go_controller.rb +29 -0
- data/app/controllers/proctolog/memberships_controller.rb +20 -0
- data/app/controllers/proctolog/mentions_controller.rb +16 -0
- data/app/controllers/proctolog/moments_controller.rb +26 -0
- data/app/controllers/proctolog/note_params.rb +24 -0
- data/app/controllers/proctolog/notes_controller.rb +56 -0
- data/app/controllers/proctolog/open_pull_requests_controller.rb +59 -0
- data/app/controllers/proctolog/pictures_controller.rb +27 -0
- data/app/controllers/proctolog/prompts_controller.rb +28 -0
- data/app/controllers/proctolog/pull_request_scoped.rb +21 -0
- data/app/controllers/proctolog/pull_requests_controller.rb +34 -0
- data/app/controllers/proctolog/put_away_controller.rb +19 -0
- data/app/controllers/proctolog/recordings_controller.rb +28 -0
- data/app/controllers/proctolog/rendered_pieces_controller.rb +11 -0
- data/app/controllers/proctolog/review_data_controller.rb +12 -0
- data/app/controllers/proctolog/rules_controller.rb +20 -0
- data/app/controllers/proctolog/scenario_notes_controller.rb +26 -0
- data/app/controllers/proctolog/scenario_scoped.rb +21 -0
- data/app/controllers/proctolog/scenarios_controller.rb +67 -0
- data/app/controllers/proctolog/sitting_servers_controller.rb +30 -0
- data/app/controllers/proctolog/waiting_controller.rb +14 -0
- data/app/controllers/proctolog/with_decisions.rb +28 -0
- data/app/helpers/proctolog/bursts_helper.rb +52 -0
- data/app/helpers/proctolog/decisions_helper.rb +102 -0
- data/app/helpers/proctolog/desk_helper.rb +61 -0
- data/app/helpers/proctolog/mentions_helper.rb +27 -0
- data/app/helpers/proctolog/open_pull_requests_helper.rb +31 -0
- data/app/helpers/proctolog/prompts_helper.rb +21 -0
- data/app/helpers/proctolog/pull_requests_helper.rb +67 -0
- data/app/helpers/proctolog/recordings_helper.rb +30 -0
- data/app/helpers/proctolog/rounds_helper.rb +27 -0
- data/app/helpers/proctolog/scenarios_helper.rb +123 -0
- data/app/helpers/proctolog/standings_helper.rb +80 -0
- data/app/jobs/proctolog/application_job.rb +8 -0
- data/app/jobs/proctolog/ask_for_release_job.rb +9 -0
- data/app/jobs/proctolog/fetch_pictures_ahead_job.rb +36 -0
- data/app/jobs/proctolog/prune_fresh_profiles_job.rb +9 -0
- data/app/jobs/proctolog/read_mentions_ahead_job.rb +12 -0
- data/app/models/proctolog/acceptance.rb +47 -0
- data/app/models/proctolog/app.rb +92 -0
- data/app/models/proctolog/browser.rb +42 -0
- data/app/models/proctolog/burst.rb +268 -0
- data/app/models/proctolog/burst_notices.rb +143 -0
- data/app/models/proctolog/chapters.rb +42 -0
- data/app/models/proctolog/check.rb +122 -0
- data/app/models/proctolog/choices.rb +112 -0
- data/app/models/proctolog/code_review.rb +251 -0
- data/app/models/proctolog/decision_record.rb +12 -0
- data/app/models/proctolog/decisions.rb +199 -0
- data/app/models/proctolog/description.rb +165 -0
- data/app/models/proctolog/difference.rb +138 -0
- data/app/models/proctolog/doctor.rb +127 -0
- data/app/models/proctolog/evidence.rb +29 -0
- data/app/models/proctolog/failure.rb +7 -0
- data/app/models/proctolog/focus.rb +48 -0
- data/app/models/proctolog/fresh_sitting.rb +35 -0
- data/app/models/proctolog/github.rb +353 -0
- data/app/models/proctolog/handover/brief.rb +138 -0
- data/app/models/proctolog/handover/layers.rb +128 -0
- data/app/models/proctolog/handover/places.rb +98 -0
- data/app/models/proctolog/handover/taken.rb +41 -0
- data/app/models/proctolog/handover/worklist.rb +35 -0
- data/app/models/proctolog/handover.rb +123 -0
- data/app/models/proctolog/housekeeping.rb +23 -0
- data/app/models/proctolog/kit.rb +36 -0
- data/app/models/proctolog/marks.rb +130 -0
- data/app/models/proctolog/membership.rb +91 -0
- data/app/models/proctolog/mentions.rb +117 -0
- data/app/models/proctolog/note.rb +94 -0
- data/app/models/proctolog/outside.rb +45 -0
- data/app/models/proctolog/overlay/brief.rb +52 -0
- data/app/models/proctolog/overlay/written.rb +33 -0
- data/app/models/proctolog/overlay.rb +87 -0
- data/app/models/proctolog/owner.rb +16 -0
- data/app/models/proctolog/pick.rb +47 -0
- data/app/models/proctolog/picture.rb +138 -0
- data/app/models/proctolog/pieces_rendering.rb +40 -0
- data/app/models/proctolog/project.rb +118 -0
- data/app/models/proctolog/pull_request.rb +89 -0
- data/app/models/proctolog/recording.rb +194 -0
- data/app/models/proctolog/release.rb +59 -0
- data/app/models/proctolog/rendering.rb +303 -0
- data/app/models/proctolog/reports.rb +66 -0
- data/app/models/proctolog/response_files.rb +55 -0
- data/app/models/proctolog/rounds.rb +305 -0
- data/app/models/proctolog/route.rb +151 -0
- data/app/models/proctolog/rules.rb +121 -0
- data/app/models/proctolog/scenario.rb +126 -0
- data/app/models/proctolog/server.rb +273 -0
- data/app/models/proctolog/since.rb +108 -0
- data/app/models/proctolog/size.rb +30 -0
- data/app/models/proctolog/standing.rb +132 -0
- data/app/models/proctolog/theme.rb +40 -0
- data/app/models/proctolog/unopened/numbers.rb +48 -0
- data/app/models/proctolog/unopened/opening.rb +88 -0
- data/app/models/proctolog/unopened.rb +203 -0
- data/app/models/proctolog/visit.rb +26 -0
- data/app/views/layouts/proctolog/application.html.erb +58 -0
- data/app/views/proctolog/acceptances/new.html.erb +34 -0
- data/app/views/proctolog/bursts/_line.html.erb +28 -0
- data/app/views/proctolog/bursts/_merged.html.erb +23 -0
- data/app/views/proctolog/bursts/_moved.html.erb +16 -0
- data/app/views/proctolog/bursts/_notices.html.erb +39 -0
- data/app/views/proctolog/bursts/_put_away.html.erb +11 -0
- data/app/views/proctolog/bursts/_rules.html.erb +27 -0
- data/app/views/proctolog/bursts/_side.html.erb +49 -0
- data/app/views/proctolog/bursts/_side_stop.html.erb +10 -0
- data/app/views/proctolog/bursts/show.html.erb +54 -0
- data/app/views/proctolog/code_reviews/show.html.erb +33 -0
- data/app/views/proctolog/decisions/_alternative.html.erb +5 -0
- data/app/views/proctolog/decisions/_beneath.html.erb +21 -0
- data/app/views/proctolog/decisions/_box.html.erb +27 -0
- data/app/views/proctolog/decisions/_choices.html.erb +9 -0
- data/app/views/proctolog/decisions/_draft_tools.html.erb +47 -0
- data/app/views/proctolog/decisions/_part.html.erb +61 -0
- data/app/views/proctolog/decisions/_round_data.html.erb +1 -0
- data/app/views/proctolog/decisions/_theme.html.erb +13 -0
- data/app/views/proctolog/decisions/index.html.erb +75 -0
- data/app/views/proctolog/notes/_card.html.erb +19 -0
- data/app/views/proctolog/notes/_template.html.erb +41 -0
- data/app/views/proctolog/open_pull_requests/_side.html.erb +30 -0
- data/app/views/proctolog/open_pull_requests/index.html.erb +106 -0
- data/app/views/proctolog/prompts/show.html.erb +41 -0
- data/app/views/proctolog/pull_requests/_connections.html.erb +65 -0
- data/app/views/proctolog/pull_requests/_finish.html.erb +42 -0
- data/app/views/proctolog/pull_requests/_margin.html.erb +33 -0
- data/app/views/proctolog/pull_requests/_note.html.erb +4 -0
- data/app/views/proctolog/pull_requests/_outline.html.erb +26 -0
- data/app/views/proctolog/pull_requests/_paragraphs.html.erb +9 -0
- data/app/views/proctolog/pull_requests/_scenarios.html.erb +16 -0
- data/app/views/proctolog/pull_requests/_since.html.erb +42 -0
- data/app/views/proctolog/pull_requests/_standing.html.erb +51 -0
- data/app/views/proctolog/pull_requests/_status.html.erb +5 -0
- data/app/views/proctolog/pull_requests/_try.html.erb +122 -0
- data/app/views/proctolog/pull_requests/show.html.erb +145 -0
- data/app/views/proctolog/recordings/_dialog.html.erb +26 -0
- data/app/views/proctolog/recordings/_list.html.erb +8 -0
- data/app/views/proctolog/recordings/_note.html.erb +22 -0
- data/app/views/proctolog/recordings/index.html.erb +33 -0
- data/app/views/proctolog/recordings/show.html.erb +118 -0
- data/app/views/proctolog/scenarios/_dialog.html.erb +22 -0
- data/app/views/proctolog/scenarios/_note.html.erb +18 -0
- data/app/views/proctolog/scenarios/_open.html.erb +9 -0
- data/app/views/proctolog/scenarios/_scenario.html.erb +48 -0
- data/app/views/proctolog/scenarios/_server.html.erb +20 -0
- data/app/views/proctolog/scenarios/index.html.erb +62 -0
- data/bin/proctolog +330 -0
- data/completions/_proctolog +143 -0
- data/config/application.rb +94 -0
- data/config/database.yml +16 -0
- data/config/environment.rb +6 -0
- data/config/initializers/grouse.rb +113 -0
- data/config/initializers/grouse_notes.rb +9 -0
- data/config/keys.yml +6 -0
- data/config/routes.rb +71 -0
- data/config/storage.yml +4 -0
- data/db/migrate/20261019213542_create_grouse_tables.grouse.rb +128 -0
- data/db/migrate/20261019213550_create_active_storage_tables.active_storage.rb +58 -0
- data/docs/manual/app.md +157 -0
- data/docs/manual/bursts.md +129 -0
- data/docs/manual/deciding.md +89 -0
- data/docs/manual/desk.png +0 -0
- data/docs/manual/films.md +20 -0
- data/docs/manual/handover.md +93 -0
- data/docs/manual/pr-format.md +75 -0
- data/docs/manual/reading.md +233 -0
- data/docs/manual/unopened.md +80 -0
- data/docs/manual/updates.md +55 -0
- data/lib/proctolog/installation.rb +125 -0
- data/lib/proctolog/version.rb +7 -0
- data/public/asking.js +50 -0
- data/public/code-review.js +40 -0
- data/public/cursor.js +292 -0
- data/public/decision-screenshots.js +97 -0
- data/public/decisions.css +949 -0
- data/public/decisions.js +1289 -0
- data/public/desk.css +582 -0
- data/public/desk.js +126 -0
- data/public/favicon.png +0 -0
- data/public/keys.js +228 -0
- data/public/mentions.js +389 -0
- data/public/messages.js +103 -0
- data/public/notes.js +731 -0
- data/public/pick.css +99 -0
- data/public/plaque.png +0 -0
- data/public/pr-number.js +11 -0
- data/public/prompt.css +46 -0
- data/public/prompt.js +16 -0
- data/public/pull_request.css +805 -0
- data/public/recording.css +379 -0
- data/public/recording.js +394 -0
- data/public/release.js +25 -0
- data/public/respond.css +260 -0
- data/public/respond.js +95 -0
- data/public/review-drafts.js +949 -0
- data/public/review-rounds.js +1447 -0
- data/public/scenarios.css +253 -0
- data/public/scenarios.js +36 -0
- data/public/schemas/proctolog-response-v1.json +101 -0
- data/public/side.js +133 -0
- data/public/standing.css +478 -0
- data/public/terminal-apl.svg +6 -0
- data/public/terminal-cuneiform.svg +3 -0
- data/public/terminal-grain-dots.svg +6 -0
- data/public/terminal-grain-weave.svg +6 -0
- data/public/terminal-grain-wedges.svg +6 -0
- data/public/terminal-shades.svg +3 -0
- data/public/terminal.css +4426 -0
- data/public/toast.js +26 -0
- data/public/try.js +124 -0
- data/public/viewer.js +808 -0
- data/public/words.js +81 -0
- data/skills/proctolog-handover/SKILL.md +77 -0
- data/skills/proctolog-pr-writing/SKILL.md +228 -0
- data/skills/proctolog-pr-writing/references/example-description.md +33 -0
- 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.
|