@cyber-dash-tech/revela 0.9.0 → 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.
package/README.md CHANGED
@@ -140,7 +140,9 @@ Disable presentation mode when done:
140
140
  /revela init prepare the workspace for a deck project
141
141
  /revela review check whether context, structure, and evidence are ready
142
142
  /revela remember <text> save an explicit user/workflow preference
143
+ /revela refine open unified Edit/Inspect refinement workspace
143
144
  /revela edit open visual editor for the only deck in decks/
145
+ /revela inspect open Evidence Inspector for Cmd/Ctrl-click review
144
146
 
145
147
  /revela designs list installed designs
146
148
  /revela designs <name> activate a design
@@ -159,7 +161,7 @@ Disable presentation mode when done:
159
161
  /revela pptx <file> export an HTML deck to editable PPTX in the same directory
160
162
  ```
161
163
 
162
- Most `/revela` commands run locally with zero LLM cost. `/revela init`, `/revela review`, `/revela remember`, `/revela designs-new`, and `/revela designs-edit` start AI-assisted workflows because they need to read or update project files. `/revela edit` opens a local visual editor and then sends user comments back into the current OpenCode session when the user submits them.
164
+ Most `/revela` commands run locally with zero LLM cost. `/revela init`, `/revela review`, `/revela remember`, `/revela designs-new`, and `/revela designs-edit` start AI-assisted workflows because they need to read or update project files. `/revela refine` opens a local browser workspace with Edit and Inspect tabs that share the same Cmd/Ctrl-click element references. Edit sends targeted comments back into the current OpenCode session; Inspect renders deterministic Source/Purpose preprocessing first before lazy LLM-generated cards arrive, has no chat box, and does not edit the deck.
163
165
 
164
166
  ---
165
167
 
@@ -188,8 +190,9 @@ Use Revela as a guided deck-production mode:
188
190
  4. Give the agent a clear deck task: audience, goal, language, number of slides, source requirements, and output path.
189
191
  5. Use `/revela review` before writing if the deck needs research, citations, or a confirmed slide plan.
190
192
  6. Let the agent write the HTML deck under `decks/`.
191
- 7. Use `/revela edit` for visual comments and targeted revisions.
192
- 8. Export with `/revela pdf <file>` or `/revela pptx <file>`.
193
+ 7. Use `/revela refine` for visual comments, targeted revisions, and optional Source/Purpose inspection of selected deck elements.
194
+ 8. Use `/revela edit` or `/revela inspect` directly only if you need the older single-purpose shells.
195
+ 9. Export with `/revela pdf <file>` or `/revela pptx <file>`.
193
196
 
194
197
  `/revela review` checks for practical readiness problems: unclear audience, missing source material, unfinished research, unsupported claims, weak source trace, incomplete slide structure, missing design/layout information, or lightweight narrative issues such as weak so-what, missing risk/assumption handling, and abrupt transitions. It does not write the final deck.
195
198
 
@@ -558,6 +561,14 @@ A custom domain is a folder containing `INDUSTRY.md`.
558
561
 
559
562
  ## Visual Editing
560
563
 
564
+ Use the unified refinement workspace for normal post-write review and revision:
565
+
566
+ ```text
567
+ /revela refine
568
+ ```
569
+
570
+ `/revela refine` opens the only HTML deck in `decks/` with two tabs. Use `Ctrl`/`Cmd` + click once to reference deck elements, then choose Edit for fast natural-language change comments or Inspect for read-only Source and Purpose review. Inspect does not mutate the deck; Edit remains the mutation path.
571
+
561
572
  Open the visual editor for the only HTML deck in `decks/`:
562
573
 
563
574
  ```text
@@ -566,7 +577,7 @@ Open the visual editor for the only HTML deck in `decks/`:
566
577
 
567
578
  `/revela edit` does not accept a target in Revela 0.8. If `decks/` contains exactly one `.html` file, Revela opens it. If `decks/` contains zero or multiple `.html` files, Revela asks you to generate a deck first or move extra decks to separate workspaces.
568
579
 
569
- The editor opens in your browser. Use `Ctrl`/`Cmd` + click to reference deck elements, write a natural-language comment, then send it back to OpenCode. Revela sends a structured edit prompt that includes the deck file, slide context, selected element metadata, and your comment.
580
+ The older edit-only shell opens in your browser. Use `Ctrl`/`Cmd` + click to reference deck elements, write a natural-language comment, then send it back to OpenCode. Revela sends a structured edit prompt that includes the deck file, slide context, selected element metadata, and your comment.
570
581
 
571
582
  LLM tool equivalent: `revela-edit` with no target. This lets the agent open the same editor when you say things like “I want to edit the deck”.
572
583
 
@@ -574,6 +585,20 @@ For existing decks, `/revela edit` prepares whatever minimal project context is
574
585
 
575
586
  ---
576
587
 
588
+ ## Evidence Inspector
589
+
590
+ Open the Evidence Inspector for the only HTML deck in `decks/`, or use the Inspect tab in `/revela refine`:
591
+
592
+ ```text
593
+ /revela inspect
594
+ ```
595
+
596
+ The inspector opens in your browser with the deck on the left and fixed cards on the right: Source and Purpose. Use `Ctrl`/`Cmd` + click to reference deck elements exactly like `/revela edit`, then click `Inspect Selection`. Selection is locked while the request is being processed.
597
+
598
+ The inspector is not chat and has no freeform prompt. It does not mutate `DECKS.json` or the deck HTML. It uses recorded slide specs, narrative state, and slide-level evidence trace as grounded context. Deterministic preprocessing appears immediately; lazy LLM judgment then refines the Source and Purpose cards without inventing edits.
599
+
600
+ ---
601
+
577
602
  ## Export
578
603
 
579
604
  PDF export:
package/README.zh-CN.md CHANGED
@@ -139,7 +139,9 @@ Create a 6-slide HTML deck on humanoid robotics supply chains. Cite the main mar
139
139
  /revela init 为当前 deck 项目准备工作区
140
140
  /revela review 检查上下文、结构和证据是否 ready
141
141
  /revela remember <text> 保存明确的用户/工作流偏好
142
+ /revela refine 打开统一的 Edit/Inspect refinement workspace
142
143
  /revela edit 打开 decks/ 下唯一 deck 的可视化编辑器
144
+ /revela inspect 打开 Cmd/Ctrl-click 式 Evidence Inspector
143
145
 
144
146
  /revela designs 列出已安装 design
145
147
  /revela designs <name> 激活某个 design
@@ -158,7 +160,7 @@ Create a 6-slide HTML deck on humanoid robotics supply chains. Cite the main mar
158
160
  /revela pptx <file> 将 HTML deck 导出为同目录可编辑 PPTX
159
161
  ```
160
162
 
161
- 大多数 `/revela` 命令都在本地执行,不消耗 LLM token。`/revela init`、`/revela review`、`/revela remember`、`/revela designs-new` 和 `/revela designs-edit` 会启动 AI 辅助流程,因为它们需要读取或更新项目状态。`/revela edit` 会打开本地可视化编辑器,并在用户提交评论后把修改请求发回当前 OpenCode 会话。
163
+ 大多数 `/revela` 命令都在本地执行,不消耗 LLM token。`/revela init`、`/revela review`、`/revela remember`、`/revela designs-new` 和 `/revela designs-edit` 会启动 AI 辅助流程,因为它们需要读取或更新项目状态。`/revela refine` 会打开一个本地浏览器 workspace,里面有 Edit 和 Inspect 两个 tab,并共享同一套 Cmd/Ctrl-click 元素引用。Edit 会把精准修改评论发回当前 OpenCode 会话;Inspect 会先渲染确定性 Source/Purpose 预处理结果,再 lazy 显示 LLM 生成的卡片。它没有聊天框,也不会修改 deck。
162
164
 
163
165
  ---
164
166
 
@@ -187,8 +189,9 @@ Create a 6-slide HTML deck on humanoid robotics supply chains. Cite the main mar
187
189
  4. 给 agent 一个清楚的 deck 任务:受众、目标、语言、页数、来源要求和输出路径。
188
190
  5. 如果 deck 需要调研、引用或已确认的 slide plan,写作前先运行 `/revela review`。
189
191
  6. 让 agent 把 HTML deck 写到 `decks/` 下。
190
- 7. 用 `/revela edit` 做可视化评论和精准修改。
191
- 8. `/revela pdf <file>` 或 `/revela pptx <file>` 导出。
192
+ 7. 用 `/revela refine` 对选中 deck 元素做可视化评论、精准修改,以及可选的 Source/Purpose 检查。
193
+ 8. 只有在需要旧的单一功能 shell 时,才单独使用 `/revela edit` 或 `/revela inspect`。
194
+ 9. 用 `/revela pdf <file>` 或 `/revela pptx <file>` 导出。
192
195
 
193
196
  `/revela review` 检查的是实际生产问题:受众是否清楚、是否缺来源材料、调研是否完成、关键 claim 是否有证据、source trace 是否太弱、页面结构是否完整、design/layout 信息是否齐全,以及轻量叙事问题,例如 so-what 不清晰、缺少风险/假设处理或转场突兀。它不会写最终 deck。
194
197
 
@@ -523,6 +526,14 @@ Prompt 注入规则:
523
526
 
524
527
  ## 可视化编辑
525
528
 
529
+ 正常的写后 review 和修改建议使用统一 refinement workspace:
530
+
531
+ ```text
532
+ /revela refine
533
+ ```
534
+
535
+ `/revela refine` 会打开 `decks/` 下唯一的 HTML deck,并提供两个 tab。使用 `Ctrl`/`Cmd` + click 先引用 deck 元素,然后在 Edit 里快速写自然语言修改评论,或在 Inspect 里做只读 Source 和 Purpose 检查。Inspect 不会修改 deck;真正的 mutation 仍然只走 Edit。
536
+
526
537
  打开 `decks/` 下唯一 HTML deck 的可视化编辑器:
527
538
 
528
539
  ```text
@@ -531,7 +542,7 @@ Prompt 注入规则:
531
542
 
532
543
  Revela 0.8 中 `/revela edit` 不接受 target。如果 `decks/` 下正好有一个 `.html` 文件,Revela 会打开它。如果 `decks/` 下没有 HTML 或有多个 HTML,Revela 会提示先生成 deck,或把多余 deck 移到独立 workspace。
533
544
 
534
- 编辑器会在浏览器中打开。使用 `Ctrl`/`Cmd` + 点击 deck 元素来引用它们,写一段自然语言评论,然后发送回 OpenCode。Revela 会把 deck 文件、slide 上下文、选中元素 metadata 和你的评论整理成结构化 edit prompt。
545
+ 旧的 edit-only shell 会在浏览器中打开。使用 `Ctrl`/`Cmd` + 点击 deck 元素来引用它们,写一段自然语言评论,然后发送回 OpenCode。Revela 会把 deck 文件、slide 上下文、选中元素 metadata 和你的评论整理成结构化 edit prompt。
535
546
 
536
547
  对应的 LLM tool:`revela-edit`,不需要 target。因此当你说“我要编辑这个 deck”时,agent 也可以主动打开同一个编辑器。
537
548
 
@@ -539,6 +550,20 @@ Revela 0.8 中 `/revela edit` 不接受 target。如果 `decks/` 下正好有一
539
550
 
540
551
  ---
541
552
 
553
+ ## Evidence Inspector
554
+
555
+ 打开 `decks/` 下唯一 HTML deck 的 Evidence Inspector,或直接使用 `/revela refine` 里的 Inspect tab:
556
+
557
+ ```text
558
+ /revela inspect
559
+ ```
560
+
561
+ Inspector 会在浏览器中打开,左侧是 deck,右侧是固定卡片:Source 和 Purpose。使用 `Ctrl`/`Cmd` + click 像 `/revela edit` 一样引用 deck 元素,然后点击 `Inspect Selection`。请求处理期间,deck 选择会被锁定。
562
+
563
+ Inspector 不是聊天,也没有自由输入框。它不会修改 `DECKS.json` 或 deck HTML。它使用已记录的 slide spec、narrative state 和 slide-level evidence trace 作为 grounded context。确定性预处理会立即显示;LLM judgment 随后 lazy 更新 Source 和 Purpose 卡片,不会强行生成编辑动作。
564
+
565
+ ---
566
+
542
567
  ## 导出
543
568
 
544
569
  PDF 导出:
@@ -193,10 +193,10 @@ Every generated presentation must use this exact HTML skeleton:
193
193
  <style>/* all CSS here */</style>
194
194
  </head>
195
195
  <body>
196
- <section class="slide cover-slide" slide-qa="false" data-index="0">
196
+ <section class="slide cover-slide" slide-qa="false" data-slide-index="1">
197
197
  <div class="slide-canvas"> ... </div>
198
198
  </section>
199
- <section class="slide" slide-qa="true" data-index="1">
199
+ <section class="slide" slide-qa="true" data-slide-index="2">
200
200
  <div class="slide-canvas"> ... </div>
201
201
  </section>
202
202
  <script>/* all JS here */</script>
@@ -507,7 +507,7 @@ These rules are mandatory for Monet.
507
507
 
508
508
  ### Layout Types
509
509
 
510
- Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. Use the QA column to decide which value to write. Fetch any layout with the `revela-designs` tool (`action: "read"`, `layout: "<name>"`).
510
+ Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. It must also set `data-slide-index="N"`, where `N` is the 1-based `DECKS.json` `slides[].index` value. Use the QA column to decide which value to write. Fetch any layout with the `revela-designs` tool (`action: "read"`, `layout: "<name>"`).
511
511
 
512
512
  <!-- @layout:fullbleed:start qa=false -->
513
513
  #### Fullbleed
@@ -518,7 +518,7 @@ Structural intent:
518
518
  - Single slot: place one `image-title` component directly inside `.page`. The component is self-contained — it manages its own image, blur, overlay, and text layers internally.
519
519
 
520
520
  ```html
521
- <section class="slide" slide-qa="false" data-index="N">
521
+ <section class="slide" slide-qa="false" data-slide-index="N">
522
522
  <div class="slide-canvas">
523
523
  <div class="page" style="padding:0;">
524
524
 
@@ -550,7 +550,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
550
550
 
551
551
 
552
552
  ```html
553
- <section class="slide" slide-qa="true" data-index="N">
553
+ <section class="slide" slide-qa="true" data-slide-index="N">
554
554
  <div class="slide-canvas">
555
555
  <div class="page" style="padding:0;overflow:hidden;">
556
556
  <div class="narrative-grid">
@@ -610,7 +610,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
610
610
 
611
611
 
612
612
  ```html
613
- <section class="slide" slide-qa="true" data-index="N">
613
+ <section class="slide" slide-qa="true" data-slide-index="N">
614
614
  <div class="slide-canvas">
615
615
  <div class="page" style="padding:0;overflow:hidden;">
616
616
  <div class="narrative-grid narrative-grid--reverse">
@@ -649,7 +649,7 @@ Structural intent:
649
649
  Every slot accepts 1 or more components. Add or remove child divs to control column count — 3 is the default, but 4 or 5 columns work equally well.
650
650
 
651
651
  ```html
652
- <section class="slide" slide-qa="true" data-index="N">
652
+ <section class="slide" slide-qa="true" data-slide-index="N">
653
653
  <div class="slide-canvas">
654
654
  <div class="page">
655
655
  <div style="display:flex;flex-direction:column;gap:10px;margin-bottom:28px;max-width:520px;">
@@ -714,7 +714,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
714
714
 
715
715
 
716
716
  ```html
717
- <section class="slide" slide-qa="true" data-index="N">
717
+ <section class="slide" slide-qa="true" data-slide-index="N">
718
718
  <div class="slide-canvas">
719
719
  <div class="page" style="overflow:hidden;">
720
720
  <div class="halves-grid" style="flex:1;min-height:0;">
@@ -768,7 +768,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
768
768
 
769
769
 
770
770
  ```html
771
- <section class="slide" slide-qa="true" data-index="N">
771
+ <section class="slide" slide-qa="true" data-slide-index="N">
772
772
  <div class="slide-canvas">
773
773
  <div class="page" style="padding:0;">
774
774
  <div class="stacked-grid">
@@ -117,7 +117,7 @@ Every generated presentation must use this exact HTML skeleton:
117
117
  <style>/* all CSS here */</style>
118
118
  </head>
119
119
  <body>
120
- <section class="slide" slide-qa="false" data-index="0">
120
+ <section class="slide" slide-qa="false" data-slide-index="1">
121
121
  <div class="slide-canvas"><div class="page">...</div></div>
122
122
  </section>
123
123
  <script>/* all JS here */</script>
@@ -246,7 +246,7 @@ new SlidePresentation();
246
246
 
247
247
  ### Layout Types
248
248
 
249
- Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. Use the QA flag on each layout marker.
249
+ Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. Use the QA flag on each layout marker. It must also set `data-slide-index="N"`, where `N` is the 1-based `DECKS.json` `slides[].index` value.
250
250
 
251
251
  <!-- @layout:fullbleed:start qa=false -->
252
252
  #### Fullbleed
@@ -254,7 +254,7 @@ Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`.
254
254
  Full-page layout for a single dominant component such as `image-title`, a large `svg-motif`, or a sparse title field.
255
255
 
256
256
  ```html
257
- <section class="slide" slide-qa="false" data-index="N">
257
+ <section class="slide" slide-qa="false" data-slide-index="N">
258
258
  <div class="slide-canvas">
259
259
  <div class="page" style="padding:0;">
260
260
  <!-- [slot: content] — usually image-title, svg-motif, or a custom hero component -->
@@ -270,7 +270,7 @@ Full-page layout for a single dominant component such as `image-title`, a large
270
270
  Asymmetric two-column layout. Use when one side needs more visual or reading weight.
271
271
 
272
272
  ```html
273
- <section class="slide" slide-qa="true" data-index="N">
273
+ <section class="slide" slide-qa="true" data-slide-index="N">
274
274
  <div class="slide-canvas">
275
275
  <div class="page" style="padding:0;">
276
276
  <div class="narrative-grid">
@@ -295,7 +295,7 @@ Asymmetric two-column layout. Use when one side needs more visual or reading wei
295
295
  Mirrored asymmetric two-column layout. Same structure as `narrative`, with the wider column on the right.
296
296
 
297
297
  ```html
298
- <section class="slide" slide-qa="true" data-index="N">
298
+ <section class="slide" slide-qa="true" data-slide-index="N">
299
299
  <div class="slide-canvas">
300
300
  <div class="page" style="padding:0;">
301
301
  <div class="narrative-grid narrative-grid--reverse">
@@ -314,7 +314,7 @@ Mirrored asymmetric two-column layout. Same structure as `narrative`, with the w
314
314
  Equal-column layout for parallel ideas, feature groups, proof points, or compact component showcases.
315
315
 
316
316
  ```html
317
- <section class="slide" slide-qa="true" data-index="N">
317
+ <section class="slide" slide-qa="true" data-slide-index="N">
318
318
  <div class="slide-canvas">
319
319
  <div class="page">
320
320
  <div style="display:flex;flex-direction:column;gap:10px;margin-bottom:28px;max-width:620px;">
@@ -343,7 +343,7 @@ Equal-column layout for parallel ideas, feature groups, proof points, or compact
343
343
  Symmetric two-column layout for direct comparison, paired evidence, or split workflows.
344
344
 
345
345
  ```html
346
- <section class="slide" slide-qa="true" data-index="N">
346
+ <section class="slide" slide-qa="true" data-slide-index="N">
347
347
  <div class="slide-canvas">
348
348
  <div class="page" style="padding:0;">
349
349
  <div class="halves-grid">
@@ -367,7 +367,7 @@ Symmetric two-column layout for direct comparison, paired evidence, or split wor
367
367
  Two-row layout for a compact header/summary above a larger evidence, chart, or flow area.
368
368
 
369
369
  ```html
370
- <section class="slide" slide-qa="true" data-index="N">
370
+ <section class="slide" slide-qa="true" data-slide-index="N">
371
371
  <div class="slide-canvas">
372
372
  <div class="page" style="padding:0;">
373
373
  <div class="stacked-grid">
@@ -131,10 +131,10 @@ Every generated presentation must use this exact HTML skeleton:
131
131
  <style>/* all CSS here */</style>
132
132
  </head>
133
133
  <body>
134
- <section class="slide cover-slide" slide-qa="false" data-index="0">
134
+ <section class="slide cover-slide" slide-qa="false" data-slide-index="1">
135
135
  <div class="slide-canvas"> ... </div>
136
136
  </section>
137
- <section class="slide" slide-qa="true" data-index="1">
137
+ <section class="slide" slide-qa="true" data-slide-index="2">
138
138
  <div class="slide-canvas"> ... </div>
139
139
  </section>
140
140
  <script>/* all JS here */</script>
@@ -445,7 +445,7 @@ These rules are mandatory for Summit.
445
445
 
446
446
  ### Layout Types
447
447
 
448
- Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. Use the QA column to decide which value to write. Fetch any layout with the `revela-designs` tool (`action: "read"`, `layout: "<name>"`).
448
+ Each `<section class="slide">` must set `slide-qa="true"` or `slide-qa="false"`. It must also set `data-slide-index="N"`, where `N` is the 1-based `DECKS.json` `slides[].index` value. Use the QA column to decide which value to write. Fetch any layout with the `revela-designs` tool (`action: "read"`, `layout: "<name>"`).
449
449
 
450
450
  <!-- @layout:fullbleed:start qa=false -->
451
451
  #### Fullbleed
@@ -456,7 +456,7 @@ Structural intent:
456
456
  - Single slot: place one `image-title` component directly inside `.page`. The component is self-contained — it manages its own image, blur, overlay, and text layers internally.
457
457
 
458
458
  ```html
459
- <section class="slide" slide-qa="false" data-index="N">
459
+ <section class="slide" slide-qa="false" data-slide-index="N">
460
460
  <div class="slide-canvas">
461
461
  <div class="page" style="padding:0;">
462
462
 
@@ -488,7 +488,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
488
488
 
489
489
 
490
490
  ```html
491
- <section class="slide" slide-qa="true" data-index="N">
491
+ <section class="slide" slide-qa="true" data-slide-index="N">
492
492
  <div class="slide-canvas">
493
493
  <div class="page" style="padding:0;overflow:hidden;">
494
494
  <div class="narrative-grid">
@@ -548,7 +548,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
548
548
 
549
549
 
550
550
  ```html
551
- <section class="slide" slide-qa="true" data-index="N">
551
+ <section class="slide" slide-qa="true" data-slide-index="N">
552
552
  <div class="slide-canvas">
553
553
  <div class="page" style="padding:0;overflow:hidden;">
554
554
  <div class="narrative-grid narrative-grid--reverse">
@@ -587,7 +587,7 @@ Structural intent:
587
587
  Every slot accepts 1 or more components. Add or remove child divs to control column count — 3 is the default, but 4 or 5 columns work equally well.
588
588
 
589
589
  ```html
590
- <section class="slide" slide-qa="true" data-index="N">
590
+ <section class="slide" slide-qa="true" data-slide-index="N">
591
591
  <div class="slide-canvas">
592
592
  <div class="page">
593
593
  <div style="display:flex;flex-direction:column;gap:10px;margin-bottom:28px;max-width:520px;">
@@ -652,7 +652,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
652
652
 
653
653
 
654
654
  ```html
655
- <section class="slide" slide-qa="true" data-index="N">
655
+ <section class="slide" slide-qa="true" data-slide-index="N">
656
656
  <div class="slide-canvas">
657
657
  <div class="page" style="overflow:hidden;">
658
658
  <div class="halves-grid" style="flex:1;min-height:0;">
@@ -706,7 +706,7 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
706
706
 
707
707
 
708
708
  ```html
709
- <section class="slide" slide-qa="true" data-index="N">
709
+ <section class="slide" slide-qa="true" data-slide-index="N">
710
710
  <div class="slide-canvas">
711
711
  <div class="page" style="padding:0;">
712
712
  <div class="stacked-grid">
@@ -28,7 +28,9 @@ export async function handleHelp(
28
28
  `\`/revela disable\` — disable slide generation mode\n` +
29
29
  `\`/revela init\` — initialize or refresh workspace DECKS.json\n` +
30
30
  `\`/revela review\` — review current deck readiness before writing HTML\n` +
31
+ `\`/revela refine\` — open unified Edit/Inspect refinement workspace\n` +
31
32
  `\`/revela edit\` — open visual editor for the only deck in decks/\n` +
33
+ `\`/revela inspect\` — open Evidence Inspector for click-to-inspect review\n` +
32
34
  `\`/revela remember <text>\` — save an explicit preference to DECKS.json\n` +
33
35
  `\`/revela designs\` — list installed designs\n` +
34
36
  `\`/revela designs <name>\` — activate a design\n` +
@@ -0,0 +1,23 @@
1
+ import { openInspectDeck } from "../inspect/open"
2
+
3
+ export async function handleInspect(
4
+ options: { client: any; sessionID: string; workspaceRoot: string },
5
+ send: (text: string) => Promise<void>,
6
+ ): Promise<void> {
7
+ try {
8
+ const result = openInspectDeck("", {
9
+ client: options.client,
10
+ sessionID: options.sessionID,
11
+ workspaceRoot: options.workspaceRoot,
12
+ })
13
+ await send(
14
+ `Opened Evidence Inspector for the only deck in \`decks/\`.\n` +
15
+ `File: \`${result.deck.file}\`\n` +
16
+ `${result.stateNote}\n` +
17
+ `URL: ${result.url}\n\n` +
18
+ `Use Ctrl/Cmd-click in the browser to reference deck elements exactly like /revela edit, then click Inspect Selection. Deterministic Source/Purpose preprocessing appears first, followed by lazy LLM-generated cards. Selection is locked while the request is processed. There is no chat box or freeform prompt.`
19
+ )
20
+ } catch (e: any) {
21
+ await send(`**Inspect failed:** ${e.message || String(e)}`)
22
+ }
23
+ }
@@ -0,0 +1,26 @@
1
+ import { openRefineDeck } from "../refine/open"
2
+ import type { RefineMode } from "../refine/server"
3
+
4
+ export async function handleRefine(
5
+ options: { client: any; sessionID: string; workspaceRoot: string; mode?: RefineMode },
6
+ send: (text: string) => Promise<void>,
7
+ ): Promise<void> {
8
+ try {
9
+ const result = openRefineDeck("", {
10
+ client: options.client,
11
+ sessionID: options.sessionID,
12
+ workspaceRoot: options.workspaceRoot,
13
+ mode: options.mode ?? "edit",
14
+ })
15
+
16
+ await send(
17
+ `Opened Revela Refine for the only deck in \`decks/\`.\n` +
18
+ `File: \`${result.deck.file}\`\n` +
19
+ `${result.stateNote}\n` +
20
+ `URL: ${result.url}\n\n` +
21
+ `Use Ctrl/Cmd-click in the browser to reference deck elements. The Edit tab sends targeted change comments; the Inspect tab reviews the same selection with Source/Purpose cards and does not edit the deck.`
22
+ )
23
+ } catch (e: any) {
24
+ await send(`**Refine failed:** ${e.message || String(e)}`)
25
+ }
26
+ }
@@ -22,6 +22,9 @@ Goal:
22
22
  - For substantial decision decks, use the read-only Task subagent \`revela-narrative-reviewer\` for independent rubric-based critique of narrative brief and slide-plan alignment. Do not self-certify semantic narrative quality in the primary agent.
23
23
  - Treat \`revela-narrative-reviewer\` findings as advisory critique only. Do not represent them as \`revela-decks\` readiness issues, blockers, or authoritative \`writeReadiness\`.
24
24
  - Treat source trace mapping as part of evidence readiness: when research findings have been read, relevant findings should appear in slide-level \`slides[].evidence[]\` records rather than only in raw research files.
25
+ - When \`revela-decks review\` returns \`evidenceCandidates\`, treat them as conservative binding candidates only. They are not proof that the full slide is supported, and they are not automatically applied to \`slides[].evidence[]\`. If a candidate has \`sourceKind: "researchesFallback"\`, say it was discovered from workspace \`researches/\` files that are not currently referenced by \`researchPlan\`.
26
+ - When an evidence candidate includes \`evidenceDraft\`, report it as a proposed slide evidence record with its \`candidateId\`; it still requires explicit user/agent confirmation before calling \`revela-decks\` action \`applyEvidenceCandidates\`. Also report \`unsupportedScope\` and \`recommendedRewrite\` so partial evidence is not stretched to future-state claims.
27
+ - When a missing-evidence issue has \`evidenceCandidateSearch\`, use it to explain search coverage: which \`researchPlan\` findings were searched, which fallback \`researches/**/*.md\` files were searched, and any near misses that were below binding threshold.
25
28
 
26
29
  Current state:
27
30
  - ${state}
@@ -36,7 +39,7 @@ Workspace boundary rules:
36
39
  Workflow:
37
40
  1. Call \`revela-decks\` with action \`read\` for the current workspace deck.
38
41
  2. If no current deck exists but the conversation contains enough deck context, call \`revela-decks\` action \`upsertDeck\` with goal, outputPath, theme, requiredInputs, researchPlan, and narrativeBrief if the story intent is clear. Do not invent or ask for a deck key; the tool uses the workspace folder name internally.
39
- 3. If \`researchPlan[].status\` is \`done\` or \`read\` and \`researchPlan[].findingsFile\` exists, verify that evidence-sensitive slide claims are backed by compact \`slides[].evidence[]\` records that reference the relevant findings file or source material where known.
42
+ 3. If \`researchPlan[].status\` is \`done\` or \`read\` and \`researchPlan[].findingsFile\` exists, verify that evidence-sensitive slide claims are backed by compact \`slides[].evidence[]\` records that reference the relevant findings file or source material where known. The review tool may surface conservative \`evidenceCandidates\` for missing evidence by matching slide text against those findings files, and may fall back to bounded workspace \`researches/**/*.md\` discovery when the research plan has no matching findings file; report these as candidate bindings, not as already-bound evidence.
40
43
  4. If a user-confirmed slide plan is available, call \`revela-decks\` action \`upsertSlides\` with every slide's title, purpose, narrativeRole, layout, components, structured content, evidence, visuals, and status. Use only lightweight narrativeRole values that are clear from the plan: \`context\`, \`tension\`, \`evidence\`, \`recommendation\`, \`risk\`, \`ask\`, \`appendix\`, or \`close\`.
41
44
  5. Prefer evidence records with \`findingsFile\`, \`sourcePath\`, \`location\`, \`quote\`, \`url\`, \`caveat\`, \`extractedTextPath\`, or \`extractedManifestPath\` when those fields are known from research files or extracted workspace materials.
42
45
  6. Do not invent quotes, page references, locations, URLs, caveats, or extraction paths. If source trace is missing, preserve the blocker or warning and report exactly what trace is needed.
@@ -44,7 +47,7 @@ Workflow:
44
47
  8. For substantial decision decks, preserve a compact \`narrativeBrief\` through \`upsertDeck\` when the conversation or confirmed plan supports it. Do not invent stakeholder beliefs, objections, or risks; leave gaps visible if unknown.
45
48
  9. For substantial decision decks, launch the Task subagent with \`subagent_type: "revela-narrative-reviewer"\` after deck/slides are up to date. Ask it to read the current \`DECKS.json\`, run only its fixed rubric, use stable finding IDs, return \`Findings: none\` when all checks pass, and avoid optional pre-write improvements. Do not ask it to write state, call \`revela-decks review\`, or produce HTML.
46
49
  10. Call \`revela-decks\` action \`review\`. The tool computes and writes \`writeReadiness\` plus structured readiness issues for the current workspace deck.
47
- 11. Briefly report whether the deck is ready. If blocked, list the exact blockers returned by the tool. If warnings exist, list them after blockers as residual risks; separate evidence/source warnings from narrative warnings when possible. If the reviewer returned findings, include them in a separate \`Narrative reviewer notes\` section and label them advisory.
50
+ 11. Briefly report whether the deck is ready. If blocked, list the exact blockers returned by the tool. If warnings exist, list them after blockers as residual risks; separate evidence/source warnings from narrative warnings when possible. If the review result includes \`evidenceCandidates\`, add a separate \`Candidate evidence bindings\` section with candidateId, slide index/title, supported claim scope, sourceKind, findingsFile/sourcePath, quote/snippet, caveat, evidenceDraft summary, unsupportedScope, and recommendedRewrite. Tell the user they may explicitly ask to apply selected candidate IDs; do not apply them during review. If candidates are absent but \`evidenceCandidateSearch\` is present, briefly report searched file counts and the best near misses so the user can tell whether review failed to search or searched but did not find a bindable match. If the reviewer returned findings, include them in a separate \`Narrative reviewer notes\` section and label them advisory.
48
51
 
49
52
  Minimum conditions for \`ready\`:
50
53
  - Topic, audience, slide count, language, and visual style/design are decided.
@@ -68,6 +71,9 @@ Report format:
68
71
  - Do not invent evidence or silently downgrade blockers. Use the tool result as authoritative.
69
72
  - Do not convert \`revela-narrative-reviewer\` advisory findings into tool readiness issues. Keep them separate from \`revela-decks review\` blockers and warnings, and preserve the reviewer's stable finding IDs when reporting them.
70
73
  - When reporting weak evidence, say whether the missing trace is \`findingsFile\`, \`sourcePath\`, \`location\`, \`quote\`, \`url\`, or \`caveat\` if that is clear from the reviewed materials.
74
+ - When reporting candidate evidence bindings, distinguish partial support from full-slide support. Never say a candidate supports unrelated future-state, recommendation, roadmap, or product-vision claims unless the candidate explicitly supports those claims.
75
+ - Treat \`evidenceDraft\` as a proposed record, not a mutation. Do not call \`upsertSlides\` to bind it. Only call \`revela-decks\` action \`applyEvidenceCandidates\` with explicit \`candidateIds\` if the user asks to apply candidate bindings.
76
+ - When reporting candidate search diagnostics, do not present near misses as evidence. Say they are below binding threshold and use them only to explain why no candidate was returned.
71
77
 
72
78
  Rules:
73
79
  - Do not write or overwrite \`decks/*.html\` during review.