@davmash/bygone 0.9.8 → 0.10.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 (68) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/README.md +74 -1
  3. package/cli/commandSpec.js +2 -0
  4. package/cli/completions.js +3 -3
  5. package/cli/present.js +28 -10
  6. package/cli/tour.js +22 -1
  7. package/cli/tourExport.js +147 -0
  8. package/cli/tourFile.js +109 -4
  9. package/cli/tourHistory.js +31 -1
  10. package/completions/_bygone +1 -1
  11. package/completions/bygone +1 -1
  12. package/completions/bygone.fish +1 -1
  13. package/docs/change-tour-format.md +85 -68
  14. package/docs/explore.md +14 -3
  15. package/docs/generating-change-tours.md +84 -46
  16. package/docs/present.md +103 -14
  17. package/docs/product-surface.md +19 -8
  18. package/docs/sharing-tours.md +95 -0
  19. package/docs/visual-walkthrough/README.md +89 -0
  20. package/docs/visual-walkthrough/build-tour.mjs +54 -0
  21. package/docs/visual-walkthrough/capture-desktop.cjs +42 -0
  22. package/docs/visual-walkthrough/capture-desktop.mjs +21 -0
  23. package/docs/visual-walkthrough/captures.md +49 -0
  24. package/docs/visual-walkthrough/create-demo.mjs +57 -0
  25. package/docs/visual-walkthrough/deconstructed-demo.bygone +100 -0
  26. package/docs/visual-walkthrough/images/01-two-files.png +0 -0
  27. package/docs/visual-walkthrough/images/02-many-panels.png +0 -0
  28. package/docs/visual-walkthrough/images/03-directories.png +0 -0
  29. package/docs/visual-walkthrough/images/04-search.png +0 -0
  30. package/docs/visual-walkthrough/images/05-repository-history.png +0 -0
  31. package/docs/visual-walkthrough/images/06-file-history.png +0 -0
  32. package/docs/visual-walkthrough/images/07-branch-review.png +0 -0
  33. package/docs/visual-walkthrough/images/08-tour-reader.png +0 -0
  34. package/docs/visual-walkthrough/images/09-focused-step.png +0 -0
  35. package/docs/visual-walkthrough/images/10-deconstructed.png +0 -0
  36. package/docs/visual-walkthrough/images/11-exploration.png +0 -0
  37. package/docs/visual-walkthrough/images/12-authoring.png +0 -0
  38. package/docs/visual-walkthrough/images/13-export.png +0 -0
  39. package/docs/visual-walkthrough/images/14-vscode.png +0 -0
  40. package/docs/visual-walkthrough/images/15-cli.png +0 -0
  41. package/docs/visual-walkthrough/narrative.md +134 -0
  42. package/docs/visual-walkthrough/outline.md +52 -0
  43. package/docs/visual-walkthrough/walkthrough.bygone +340 -0
  44. package/docs/walkthrough.md +6 -101
  45. package/examples/bygone-history.bygone +11 -44
  46. package/examples/marker-focus.bygone +116 -0
  47. package/examples/navigation-lab.bygone.yaml +401 -336
  48. package/examples/tour-orientation.bygone +349 -0
  49. package/media/diff.worker.js +13 -3
  50. package/media/webview.css +1 -1
  51. package/media/webview.js +394 -319
  52. package/out/changeTour.js +865 -397
  53. package/out/deepLink.js +167 -0
  54. package/out/historyDirectory.js +66 -0
  55. package/out/standalone-main.js +20514 -16821
  56. package/out/tourCoverage.js +850 -386
  57. package/out/tourDocument.js +97 -0
  58. package/package.json +1 -1
  59. package/schemas/change-tour-source.schema.json +91 -64
  60. package/skills/pr-tour-guide/SKILL.md +144 -128
  61. package/skills/pr-tour-guide/references/expectations-and-feedback.md +57 -0
  62. package/standalone/index.html +10 -25
  63. package/web/export-bootstrap.js +62 -0
  64. package/web/export-licenses.txt +78 -0
  65. package/web/export-runtime.json +12 -0
  66. package/web/index.html +54 -47
  67. package/web/presenter.css +332 -178
  68. package/web/web-host.js +239 -137
@@ -2,6 +2,7 @@ const { execFileSync } = require('child_process');
2
2
  const { realpathSync } = require('fs');
3
3
  const { TextDecoder } = require('util');
4
4
  const path = require('path');
5
+ const { buildHistoryDirectoryEntries } = require('../out/historyDirectory.js');
5
6
  const { parseNameStatusZ } = require('../out/gitComparison.js');
6
7
 
7
8
  const DEFAULT_HISTORY_MAX_FILE_BYTES = 2 * 1024 * 1024;
@@ -412,6 +413,30 @@ function createTourHistory(manifest) {
412
413
  rightLabel: `${rightPath} @ ${commit.slice(0, 7)}` };
413
414
  },
414
415
  compare,
416
+ changedFiles(input) {
417
+ input = requireInput(input);
418
+ if (!Array.isArray(input.commits) || input.commits.length > 32) throw new Error('Expected displayed revisions.');
419
+ const commits = input.commits.map(commit => commit === null ? null : validateCommit(root, commit));
420
+ const paths = new Set();
421
+ for (let index = 1; index < commits.length; index++) {
422
+ const pair = [commits[index - 1], commits[index]];
423
+ if (pair[0] === pair[1]) continue;
424
+ const output = pair.includes(null)
425
+ ? git(root, ['ls-tree', '-r', '--name-only', '-z', pair.find(Boolean)])
426
+ : git(root, ['diff', '--name-only', '--no-renames', '--no-ext-diff', '-z', ...pair, '--']);
427
+ output.split('\0').filter(Boolean).forEach(file => paths.add(file));
428
+ }
429
+ const changed = [...paths].sort();
430
+ const inventories = input.includeEntries || input.includeFiles ? commits.map(commit => new Set(commit
431
+ ? git(root, ['ls-tree', '-r', '--name-only', '-z', commit]).split('\0').filter(Boolean) : [])) : [];
432
+ return { paths: changed, ...(input.includeFiles ? {
433
+ files: [...new Set(inventories.flatMap(inventory => [...inventory]))].sort().map(path => ({
434
+ kind: 'text-diff', path, changeKind: paths.has(path) ? 'modified' : 'unchanged'
435
+ }))
436
+ } : {}), ...(input.includeEntries ? {
437
+ entries: buildHistoryDirectoryEntries(changed, inventories)
438
+ } : {}) };
439
+ },
415
440
  compareMany(input) {
416
441
  input = requireInput(input);
417
442
  if (!Array.isArray(input.commits) || input.commits.length < 2) throw new Error('Comparison requires at least two commits.');
@@ -422,9 +447,14 @@ function createTourHistory(manifest) {
422
447
  to: commits[index + 1],
423
448
  ...(input.path !== undefined ? { path: input.path } : {})
424
449
  }));
450
+ const files = aggregateComparisonFiles(commits, comparisons);
425
451
  return {
426
452
  commits,
427
- files: aggregateComparisonFiles(commits, comparisons)
453
+ files,
454
+ entries: buildHistoryDirectoryEntries(files.map(file => file.path), commits.map((commit, index) => {
455
+ const inventory = new Set(git(root, ['ls-tree', '-r', '--name-only', '-z', commit]).split('\0').filter(Boolean));
456
+ return new Set(files.filter(file => inventory.has(file.comparisonPanels[index].path)).map(file => file.path));
457
+ }))
428
458
  };
429
459
  }
430
460
  };
@@ -60,7 +60,7 @@ _bygone() {
60
60
  '--help:Show command help'
61
61
  )
62
62
  shells=('zsh:Z shell' 'bash:Bash' 'fish:Fish shell')
63
- tour_actions=('context:Build structured change evidence' 'coverage:Measure authored tour coverage' 'validate:Validate source and anchors' 'compile:Compile a repository-bound manifest' 'schema:Print the source schema')
63
+ tour_actions=('context:Build structured change evidence' 'coverage:Measure authored tour coverage' 'validate:Validate source and anchors' 'compile:Compile a repository-bound manifest' 'export:Export a portable HTML tour' 'schema:Print the source schema')
64
64
 
65
65
  if (( CURRENT == 2 )); then
66
66
  _describe 'bygone command' root_items
@@ -23,7 +23,7 @@ _bygone() {
23
23
  ;;
24
24
  tour)
25
25
  if (( COMP_CWORD == 2 )); then
26
- COMPREPLY=( $(compgen -W 'context coverage validate compile schema' -- "$cur") )
26
+ COMPREPLY=( $(compgen -W 'context coverage validate compile export schema' -- "$cur") )
27
27
  elif [[ "${COMP_WORDS[2]}" == "context" ]]; then
28
28
  refs="$(_bygone_git_refs)"
29
29
  if [[ "$prev" =~ ^(--base|-m|--main)$ ]]; then
@@ -18,7 +18,7 @@ complete -c bygone -n '__fish_use_subcommand' -s C -r -d 'Run as if Bygone start
18
18
  complete -c bygone -n '__fish_use_subcommand' -s h -l help -d 'Show command help'
19
19
  complete -c bygone -n '__fish_use_subcommand' -s v -l version -d 'Show the installed version'
20
20
  complete -c bygone -n '__fish_seen_subcommand_from completion' -a 'zsh bash fish' -d 'Shell'
21
- complete -c bygone -n '__fish_seen_subcommand_from tour' -a 'context coverage validate compile schema' -d 'Tour action'
21
+ complete -c bygone -n '__fish_seen_subcommand_from tour' -a 'context coverage validate compile export schema' -d 'Tour action'
22
22
  complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l base -r -a '(__bygone_git_refs)' -d 'Set the change-context base ref'
23
23
  complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l output -s o -r -d 'Write the change context'
24
24
  complete -c bygone -n 'string match -q "*tour context*" -- (commandline -opc)' -l max-patch-bytes -r -d 'Maximum included patch size per file'
@@ -8,54 +8,89 @@ suffix, and explicitly supplied files are validated by content rather than
8
8
  rejected by extension.
9
9
 
10
10
  An authored source is Git-backed, not portable: resolving refs and anchors
11
- requires the corresponding local repository and Git objects. Version 2 and 3
11
+ requires the corresponding local repository and Git objects. Version 2, 4, and 5
12
12
  compiled manifests remain bound to that repository so the presenter can load
13
13
  live file history. Version 1 manifests remain readable as legacy portable
14
- artifacts, without the mode switcher. Version 3 adds independent authored
15
- tours, scene directory overviews, and review notes; versions 1 and 2 remain
16
- accepted without those fields.
14
+ artifacts, without the mode switcher. Version 4 supports independent authored
15
+ tours and scene directory overviews; versions 1 and 2 remain accepted without
16
+ those fields.
17
17
 
18
- ## Version 3 stability and compatibility
18
+ ## Version 5 stability and compatibility
19
19
 
20
- Format version **3 is the stable authoring contract for Bygone 0.9.2**. The
21
- application version (`0.9.2`) and document version (`version: 3`) are separate:
22
- UI fixes, navigation changes, and application patch releases do not require
23
- rewriting a tour or incrementing its format version.
20
+ Format version **5** is the current authoring contract. Application and document
21
+ versions are separate; UI fixes do not require rewriting a tour.
24
22
 
25
- | Document version | Reader support in 0.9.2 | Contract |
23
+ | Document version | Reader support | Contract |
26
24
  | --- | --- | --- |
27
25
  | 1 | Supported | Legacy source and portable compiled manifests |
28
26
  | 2 | Supported | Repository-bound manifests, real revision stacks, and endpoint walkthroughs |
29
- | 3 | Supported; use for new sources | Version 2 capabilities plus independent authored tours, scene directory overviews, and review notes |
30
- | Greater than 3 | Rejected with an upgrade message | Never interpreted as version 3 |
31
-
32
- The v3 field names, types, required fields, enum values, and meanings are fixed
27
+ | 3 | Retired | Remove the top-level `review` block, set source `version: 4`, and recompile |
28
+ | 4 | Supported | Independent authored tours and scene directory overviews; no Review Notes |
29
+ | 5 | Use for new sources | Optional opening, conclusion, and chapter previews; explicit overview purpose |
30
+ | Greater than 5 | Rejected with an upgrade message | Never interpreted as version 5 |
31
+
32
+ Version 4 removes the `review` field and the separate Review Notes panel.
33
+ Concepts, boundaries, tradeoffs, and unresolved questions belong in scene or
34
+ step narrative. Clearly distinguish an unknown from a supported conclusion and
35
+ state the next check that would resolve it. Neither source nor compiled manifests
36
+ accept a `review` field; existing v3 documents receive a migration error.
37
+
38
+ The v5 field names, types, required fields, enum values, and meanings are fixed
33
39
  by the [source schema](../schemas/change-tour-source.schema.json) and the
34
- semantic rules in this document. Valid v3 sources and compiled manifests must
35
- remain readable by later compatible releases; required fields must not be
36
- added, existing fields removed, or evidence and mode semantics repurposed under
37
- the same format number. New syntax that existing v3 readers cannot accept
38
- requires a new document version, even when the new field is optional. Fixes
39
- that enforce the documented contract do not make malformed documents valid.
40
+ semantic rules in this document. Breaking syntax or semantic changes require
41
+ a new document version. Fixes enforcing the documented contract do not make
42
+ malformed documents valid.
40
43
 
41
44
  The source is strict: unknown properties are errors, not an extension
42
45
  mechanism. JSON Schema covers document structure; `bygone tour validate`
43
46
  additionally checks IDs and references, Git objects, unique anchor matches,
44
- stage coverage, comparison endpoints, and review freshness. A schema-only pass
47
+ stage coverage, and comparison endpoints. A schema-only pass
45
48
  does not prove that the source compiles. Validate against the intended local
46
49
  repository before sharing a tour.
47
50
 
48
51
  Keep authored YAML as the editable source. Compiled JSON is generated evidence,
49
- not a second authoring syntax; v2/v3 manifests retain repository identity and
52
+ not a second authoring syntax; v2/v4/v5 manifests retain repository identity and
50
53
  resolved Git objects. Stable format support does not make missing repositories
51
54
  or pruned objects available, and does not promise byte-identical generated
52
55
  timestamps or presentation layout. Pin full commit IDs in `range` when the
53
56
  underlying comparison must stay fixed.
54
57
 
55
- The compatibility checks cover v1/v2 acceptance, v3-only field gates,
56
- independent authored modes, overview evidence and fallback semantics, review
57
- freshness, and rejection of future versions. Run `npm test` before releasing a
58
- parser, compiler, or schema change; update those checks with any new contract.
58
+ The compatibility checks cover v1/v2 acceptance, v4-only field gates,
59
+ independent authored modes, overview evidence and fallback semantics, retired
60
+ v3 rejection, removed-field rejection, and rejection of future versions. Run
61
+ `npm test` before releasing a parser, compiler, or schema change; update those
62
+ checks with any new contract.
63
+
64
+ ## Opening and conclusion passages
65
+
66
+ Version 5 adds optional `opening` and `conclusion` at the document root and
67
+ inside each independently authored `tours.historical` or `tours.deconstructed`.
68
+ Each belongs to that narrative; one mode does not inherit another mode’s prose.
69
+ Switching modes stops narration and restores the selected mode’s reading position.
70
+ Returning from file exploration keeps the current passage and paused speech position.
71
+
72
+ ```yaml
73
+ version: 5
74
+ opening:
75
+ title: What this tour will establish
76
+ summary: Explain the problem, the review question, and the route through the evidence.
77
+ bullets:
78
+ - Name the boundaries this tour will and will not cover.
79
+ conclusion:
80
+ title: What the evidence established
81
+ summary: Summarize the supported behavior and its consequence for the reviewer.
82
+ bullets:
83
+ - State any remaining uncertainty and the next check that would resolve it.
84
+ ```
85
+
86
+ Both passages require nonblank `title` and `summary`; optional `bullets` contain
87
+ nonblank strings. Unknown fields are rejected. They are narrative reading
88
+ positions, not scenes or evidence: they add no files, steps, or coverage.
89
+ The opening extends the title page, and the conclusion follows the last step.
90
+ Keyboard navigation, narration, search, and heading links include both, including
91
+ image-only guides. A conclusion link uses `part=conclusion`; requesting it in a
92
+ mode without a conclusion reports an unavailable target. Legacy tours remain
93
+ readable and receive no invented closing.
59
94
 
60
95
  ## Opening and compiling a source
61
96
 
@@ -88,7 +123,7 @@ once. When omitted, the presenter falls back to `title`, then a generic tour lab
88
123
 
89
124
  ## Independent authored tours
90
125
 
91
- Version 3 can supply `tours.historical.chapters` and
126
+ Version 4 can supply `tours.historical.chapters` and
92
127
  `tours.deconstructed.chapters`. Each uses the chapter and scene structure below,
93
128
  with the document's shared range, anchors, and connections. This lets one file
94
129
  explain actual revisions and also teach the change through synthetic stages.
@@ -110,17 +145,35 @@ See `examples/navigation-lab.bygone.yaml` for both tours in one file, and
110
145
  [presentation navigation](./present.md#explore-and-follow-tours) for History and
111
146
  Compare.
112
147
 
148
+ ## Chapter previews
149
+
150
+ Version 5 chapters may include a nonblank `summary`: one or two sentences
151
+ explaining what comes next and why. It is optional in root chapters and each
152
+ independently authored mode. The compiler preserves it in the corresponding
153
+ compiled chapters and derived modes.
154
+
155
+ Only chapters with summaries have presentation and narration stops. Chapters
156
+ without summaries remain in the contents; selecting their heading or opening
157
+ a chapter link goes to their first scene. Scene-title links alone do not create
158
+ a chapter introduction. Earlier format versions accept chapters without this field.
159
+
113
160
  ## Scene directory overviews
114
161
 
115
- In version 3, an authored walkthrough, stacked-diff, or deconstructed-diff scene may carry a
162
+ In versions 4 and 5, an authored walkthrough, stacked-diff, or deconstructed-diff scene may carry a
116
163
  directory overview for the presenter to render alongside the current scene:
117
164
 
118
165
  ```yaml
119
166
  overview:
120
167
  kind: directory-diff
168
+ purpose: See which web layers changed together before tracing their interaction.
121
169
  path: web
122
170
  ```
123
171
 
172
+ Version 5 requires a nonblank `purpose`: explain what the inventory establishes
173
+ and why it is useful at this point. A scene without an explicit `overview` previews
174
+ its first step’s evidence with a “Coming up” caption and no active annotation.
175
+ Title, chapter, discussion, and conclusion passages show narrative only.
176
+
124
177
  `path` is optional and is relative to the repository root. Omit it or use `.`
125
178
  for the root directory. Absolute paths, backslashes, and `..` path segments are
126
179
  rejected. The compiler preserves this evidence on the corresponding compiled
@@ -150,7 +203,7 @@ Use an explicit authored Historical scene to choose a narrower real comparison.
150
203
  ## Structure
151
204
 
152
205
  ```yaml
153
- version: 3
206
+ version: 4
154
207
  title: A reviewer-facing title
155
208
  windowTitle: PR-1234
156
209
  sourceUrl: https://example.test/pull/123
@@ -207,42 +260,6 @@ the claim while the code is visible and avoids repeating it in scene framing.
207
260
 
208
261
  Narrative text supports inline Markdown links such as `[ticket](https://example.com/ticket)`. HTTP and HTTPS destinations open outside the tour; link labels remain visible and clickable during narration highlighting. Authored HTML, other URL schemes, and local-file destinations are treated as plain text. This is link support, not a general Markdown renderer.
209
262
 
210
- The source schema has no ad hoc `notes` field. In v3, use the top-level `review`
211
- block below for evidence-linked review observations and unresolved questions;
212
- do not present those questions as settled step rationale.
213
-
214
- ## Review notes
215
-
216
- The optional v3 `review` block records authored interpretation separately from
217
- the narrative and deterministic evidence. It contains `baseOid`, `headOid`, and
218
- a nonempty `items` array. Both OIDs must be full 40- or 64-character hexadecimal
219
- Git IDs, matching the resolved **merge base** and head, respectively. A changed
220
- range makes the review stale and compilation fails rather than silently
221
- carrying the conclusions forward.
222
-
223
- Each item has a unique nonblank `id`, a `kind` (`concept`, `boundary`,
224
- `tradeoff`, or `question`), nonblank `title` and `body`, and an `evidence` array
225
- of `{ sceneId, stepId }` references to endpoint walkthrough steps in the root
226
- `chapters` (not scenes defined only inside an independent `tours` mode).
227
- Synthetic stage IDs and stacked-diff step IDs are not walkthrough evidence.
228
- Claims require at least one reference. Questions may use an empty evidence
229
- array but require a nonblank `nextCheck`; other items may also supply it.
230
- Validation confirms the references, not the truth of an author's claim or the
231
- state of an external deployment.
232
-
233
- For example, add this item to `review.items` alongside the structure above:
234
-
235
- ```yaml
236
- - id: check-caller
237
- kind: question
238
- title: Is the caller compatible?
239
- body: The source shows persistence, but the deployed caller has not been checked.
240
- evidence:
241
- - sceneId: decision-flow
242
- stepId: persist-first
243
- nextCheck: Verify the deployed caller contract against this exact head revision.
244
- ```
245
-
246
263
  ## Requirements
247
264
 
248
265
  A walkthrough step may carry an optional `requirement` that names the stated
@@ -272,7 +289,7 @@ results search the compiled base and head snapshots, open the exact file and
272
289
  side, and preserve **Return to tour** so exploration does not lose authored
273
290
  context.
274
291
 
275
- Version 2 and 3 tours show one mode control for moving among live Git History,
292
+ Version 2 and 4 tours show one mode control for moving among live Git History,
276
293
  arbitrary Compare ranges, and the authored tours available in that manifest.
277
294
  Previously compiled version 2 deconstructed tours retain their authored final
278
295
  endpoint walkthrough as **Final tour** beside **Deconstructed tour**. Other
@@ -285,9 +302,9 @@ only when every panel is a real selected Git revision. Use a
285
302
  [deconstructed-diff example](../examples/deconstructed-diff.bygone) when
286
303
  the teaching order is clearer than the real commit history; its cumulative
287
304
  panels are synthetic explanation stages and must never be described as
288
- commits. In versions 2 and 3, a `deconstructed-diff` scene in root `chapters`
305
+ commits. In versions 2, 4, and 5, a `deconstructed-diff` scene in root `chapters`
289
306
  requires a real `stack` with the same base and final endpoints and nonempty
290
- walkthrough `steps` for compatibility. In version 3, a scene authored inside
307
+ walkthrough `steps` for compatibility. In versions 4 and 5, a scene authored inside
291
308
  `tours.deconstructed` may omit both because that tour is synthetic by design.
292
309
  Explicit `tours.historical` content supplies its own explanation of real
293
310
  revisions. Bygone does not infer a real stack from Git history. Every changed
package/docs/explore.md CHANGED
@@ -6,10 +6,13 @@ prescribed reading order.
6
6
  ## Start a comparison
7
7
 
8
8
  - The **File** menu contains the familiar new/open/save lifecycle. **New Blank
9
- Comparison** opens a writable comparison without source paths.
10
- - **File → Compare Files…** accepts two or more files. Select one item at a time when
9
+ Comparison** opens two writable blank panels without source paths.
10
+ - **File → Compare Files…** accepts one or more files. Select one item at a time when
11
11
  the files live in different folders, or select several together. Two files open a side-by-side
12
- comparison; additional files open the focused multi-panel strip.
12
+ comparison; additional files open the focused multi-panel strip. Cancel the second
13
+ file picker to review your first selection and choose **Open File**. The summary
14
+ also offers **Select More…** and **Add Blank Panel**; add blank panels repeatedly
15
+ to include as many as you need before choosing **Compare**.
13
16
  - **File → Compare Directories…** uses the same additive selection flow for two or
14
17
  more directory trees.
15
18
  - Drag files or directories into the window for the same selection-count
@@ -58,6 +61,14 @@ The focused strip shows an adjacent pair when space permits and one readable
58
61
  panel on narrow windows. Use the strip buttons, panel headers, gutters, wheel,
59
62
  or `Alt+Left`/`Alt+Right` to change focus.
60
63
 
64
+ In a file comparison panel strip, drag a panel title to move it, or open its **⋮** menu and choose
65
+ **Move left** or **Move right**. Hold a drag near either edge to reach hidden
66
+ panels; press `Escape` to cancel. Edits, undo history, and save destinations
67
+ travel with the panel. Adjacent diffs and copy arrows follow the new order.
68
+ Comparisons built from the commit selector keep revision order and cannot be
69
+ rearranged. Explicitly opened comparison panels (including command-line revision
70
+ comparisons) can still be moved. History and authored tours keep their original order.
71
+
61
72
  - `Cmd/Ctrl+F` searches the active pane.
62
73
  - `Cmd/Ctrl+Shift+F` searches either the panes currently displayed by the strip
63
74
  or every loaded panel in the comparison, using the explicit scope selector.
@@ -4,6 +4,9 @@ Bygone treats an LLM as a narrative planner and evidence selector, not as the au
4
4
 
5
5
  For agents that support repository skills, use the agent-agnostic [`pr-tour-guide` skill](../skills/pr-tour-guide/SKILL.md). It packages the complete evidence, authoring, validation, and handoff workflow without depending on a particular agent vendor.
6
6
 
7
+ For optional v5 audience metadata, expected-behavior framing, and the investigation
8
+ workflow for reader concerns, see [Expectations and reader feedback](../skills/pr-tour-guide/references/expectations-and-feedback.md).
9
+
7
10
  Install it with the skills CLI:
8
11
 
9
12
  ```sh
@@ -50,7 +53,8 @@ Use `bygone tour schema` to print the current JSON Schema. The checked-in schema
50
53
 
51
54
  ## Narrative constraints
52
55
 
53
- - Prefer one reviewer question per scene and three to seven steps per scene.
56
+ - Give each scene one explanatory job. Choose the number of steps needed to
57
+ develop it; do not split or pad an argument to meet a step-count target.
54
58
  - Lead with contracts, invariants, or architectural boundaries before their consumers.
55
59
  - Pair behavior with the tests or evidence that prove it.
56
60
  - Keep mechanical, generated, and lockfile changes out of the authored narrative unless they alter the reviewer’s conclusion; they remain visible in the complete Files rail.
@@ -59,7 +63,50 @@ Use `bygone tour schema` to print the current JSON Schema. The checked-in schema
59
63
  - Avoid claims about runtime behavior, safety, or intent that have no linked evidence.
60
64
  - Use connections sparingly. A connection should answer “how are these two facts related?”
61
65
  - Preserve access to the complete change instead of presenting the tour as exhaustive review.
62
- - In a version 3 source, keep unresolved questions and review decisions in the top-level `review` block rather than presenting them as settled scene narration.
66
+ - Put concepts, boundaries, and tradeoffs beside their evidence in scene or step narrative. Label unresolved questions explicitly and state the next check that would resolve them; do not present them as settled conclusions.
67
+
68
+ ## Explain the causal link
69
+
70
+ Before selecting files, write what the reader should be able to explain after
71
+ each scene. “We inspected the handler” is an activity; “layout notifications
72
+ could invoke synchronization without a position change” is an understanding.
73
+ Merge scenes that produce the same answer, including a separate test scene
74
+ when its checks simply complete the explanation already underway.
75
+
76
+ Keep the connection from behavior to mechanism to evidence in the main path.
77
+ Do not hide the reason a change works behind a scope disclosure or replace it
78
+ with an inventory of files and revisions. Use enough prose to explain the
79
+ inference. A shorter description can require more reader effort when it removes
80
+ the causal link.
81
+
82
+ For example, “Ignore layout events” names an action. This explains its effect:
83
+
84
+ > Neither scroll position changed, so the guard redraws the connectors and
85
+ > returns before either synchronizer runs. This prevents a layout event from
86
+ > undoing the code reveal. Events that do change a position continue through
87
+ > the handler.
88
+
89
+ Use a title that states the important finding, then focus the code or assertion
90
+ that supports it. Include a preserved behavior, tradeoff, or uncertainty when
91
+ it affects that finding. These are writing responsibilities, not mandatory
92
+ claim/cause/proof fields or repeated labels on every slide.
93
+
94
+ Compare the small fix in [marker-focus.bygone](../examples/marker-focus.bygone)
95
+ with the multi-commit [navigation lab](../examples/navigation-lab.bygone.yaml).
96
+ The latter uses multiple questions within one comparison before deliberately
97
+ isolating the later correction. Its synthetic mode separates teaching stages
98
+ from real history; generated focus steps are not additional explanatory scenes.
99
+ Each constructed stage's narration appears at its first evidence step. Later
100
+ focuses retain their code targets and offer **Read stage explanation** instead
101
+ of repeating the paragraph. Write the stage narration to cover its argument
102
+ as a whole, and use the scene introduction to explain why the stages belong together.
103
+
104
+ After validation, walk the compiled route. Check for repeated stage narration,
105
+ unnecessary setup stops, and evidence that does not support the adjacent claim.
106
+ Compiling successfully establishes source validity, not reader understanding.
107
+ Ask an unfamiliar reader what changed, why the mechanism works, what evidence
108
+ supports it, and what remains unverified. At a transition, also ask whether the
109
+ comparison changed. Use those observations to choose further viewer changes.
63
110
 
64
111
  ## Anchor rules
65
112
 
@@ -75,7 +122,7 @@ The missing-tour buttons in History and Compare supply a short handoff like:
75
122
 
76
123
  ```text
77
124
  Read and follow the Bygone tour skill at /path/to/SKILL.md.
78
- Create a v3 deconstructed tour for /path/to/repository, from <base OID> to <head OID>.
125
+ Create a v5 deconstructed tour for /path/to/repository, from <base OID> to <head OID>.
79
126
  Scope: <selected paths, or the whole repository>.
80
127
  Additional context: …
81
128
  ```
@@ -95,46 +142,37 @@ use **Reset prompt** to regenerate their file reference and workspace context.
95
142
 
96
143
  The generated prose remains a proposal. Validation proves that its evidence exists and is reproducible; a reviewer must still judge whether its interpretation is correct.
97
144
 
98
- ## Optional review notes
99
-
100
- A version 3 authored source may add a top-level `review` block when a reviewer needs a
101
- small set of concepts, boundaries, tradeoffs, or open questions alongside the
102
- walkthrough. This is opt-in: the Present header shows a **Review notes** button
103
- only when the compiled manifest includes review notes, and the button opens a
104
- read-only panel. The panel is an authored interpretation layer; its linked
105
- scene/step evidence is checked, while its conclusions remain claims for the
106
- reviewer to assess. The complete Files rail remains available and unchanged.
107
-
108
- Review notes pin the exact range they describe:
109
-
110
- ```yaml
111
- review:
112
- baseOid: 292fe9248c5c49f762489dc688296fc100d120bc
113
- headOid: 75b6d7c0303124ec314aa790d6b808c4a9d9ea0e
114
- items:
115
- - id: range-contract
116
- kind: concept
117
- title: The range has one historical boundary
118
- body: The note explains the invariant a reviewer should keep in mind.
119
- evidence:
120
- - sceneId: review-pipeline
121
- stepId: establish-boundary
122
- ```
123
-
124
- Each item uses one of `concept`, `boundary`, `tradeoff`, or `question`.
125
- Concept, boundary, and tradeoff items need at least one link to an existing
126
- walkthrough scene and step. A question may leave `evidence` empty, but it must
127
- include a `nextCheck` describing the follow-up that would resolve it. Evidence
128
- resolves against the **Final walkthrough**. If the reader is in history or a
129
- revisions view, following an evidence link first returns to that final range
130
- before selecting the scene and step.
131
-
132
- The `baseOid` pin is the resolved merge-base OID, which may differ from the
133
- requested base ref; `headOid` is the resolved head OID. Both pins must match
134
- the resolved range. Compilation rejects a review whose pins describe a changed
135
- range, and imported manifests reject a review whose pins do not match the
136
- manifest range. `tour validate` checks the shape, OIDs, and scene/step
137
- grounding of review notes; it does not verify that an authored interpretation
138
- is semantically correct. It also does not run or attest to external checks such
139
- as tests, CI, or the `nextCheck` follow-up. Those claims belong in the note only
140
- when the author has evidence for them.
145
+ ## Frame the reading path
146
+
147
+ Use version 5 opening and conclusion passages to state the tour’s question and
148
+ recap what its evidence established. Give each authored mode its own framing.
149
+ The Intro is an explicit outline entry. Its “What you'll see” route links to
150
+ chapters, or scenes when there are no chapters. Lists use simple reference
151
+ numbers; headings and narration use plain titles.
152
+ Start the opening with the concrete behavior added or fixed and why it matters.
153
+ Keep that outcome to one or two sentences, then introduce the route.
154
+ Write the opening to explain the problem and the sequence of questions the route
155
+ will answer. Use scene titles that communicate those questions or findings.
156
+ The generated itinerary supplies navigation facts, not the reason the work matters.
157
+
158
+ Add optional v5 `chapter.summary` only when one or two brief sentences help
159
+ explain what comes next and why. Chapters without previews stay in the contents
160
+ but are skipped as presentation and narration stops; scene-title links are not
161
+ a substitute for preview prose.
162
+
163
+ A scene answers one reviewer question; steps provide the supporting evidence.
164
+ Multiple scenes may examine the same comparison when each has a different
165
+ question. Merge scenes that merely repeat a question across files.
166
+
167
+ Before the first step, explain why this scene comes next, what evidence will
168
+ appear, and what the reader should notice in connected prose. Do not repeat the
169
+ chapter route or list every file and revision in each introduction. Keep the
170
+ rationale visible; evidence headers and navigation carry reference details.
171
+ Use an explicit directory overview
172
+ only when the inventory itself supports that question, and state its `purpose`.
173
+ Without one, the viewer previews the first step. The comparison caption identifies
174
+ resolved revisions or synthetic stages; prose should explain why a transition
175
+ matters. A new scene or file does not inherently mean a new comparison. Close
176
+ by connecting the mechanism back to the promised behavior and stating material
177
+ limits, rather than reciting the chapter titles. Include any remaining checks without adding
178
+ fake code stops. See [the format](change-tour-format.md) for the fields.