@openprd/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.openprd/README.md +82 -0
  2. package/.openprd/benchmarks/evidence/milvus-io-ai-code-review-gets-better-when-models-debate-claude-vs-gemini-vs-code.md +14 -0
  3. package/.openprd/benchmarks/evidence/nolanlawson-com-using-ai-to-write-better-code-more-slowly.md +14 -0
  4. package/.openprd/benchmarks/index.md +37 -0
  5. package/.openprd/benchmarks/sources.yaml +56 -0
  6. package/.openprd/config.yaml +50 -0
  7. package/.openprd/discovery/config.json +21 -0
  8. package/.openprd/engagements/active/flows.md +30 -0
  9. package/.openprd/engagements/active/handoff.md +9 -0
  10. package/.openprd/engagements/active/intake.md +15 -0
  11. package/.openprd/engagements/active/prd.md +161 -0
  12. package/.openprd/engagements/active/review.html +61 -0
  13. package/.openprd/engagements/active/roles.md +21 -0
  14. package/.openprd/engagements/work-units/wu-20260524015648-6d33ded7.json +23 -0
  15. package/.openprd/exports/.gitkeep +0 -0
  16. package/.openprd/knowledge/index.json +7 -0
  17. package/.openprd/quality/config.json +229 -0
  18. package/.openprd/reviews/v0001.html +1256 -0
  19. package/.openprd/schema/diagram-architecture.schema.yaml +49 -0
  20. package/.openprd/schema/diagram-product-flow.schema.yaml +52 -0
  21. package/.openprd/schema/prd.schema.yaml +121 -0
  22. package/.openprd/sessions/.gitkeep +0 -0
  23. package/.openprd/standards/config.json +88 -0
  24. package/.openprd/standards/file-manual-template.md +28 -0
  25. package/.openprd/standards/folder-readme-template.md +28 -0
  26. package/.openprd/state/.gitkeep +0 -0
  27. package/.openprd/state/changes.json +12 -0
  28. package/.openprd/state/current.json +169 -0
  29. package/.openprd/state/version-index.json +15 -0
  30. package/.openprd/state/versions/.gitkeep +0 -0
  31. package/.openprd/state/versions/v0001.json +121 -0
  32. package/.openprd/state/versions/v0001.md +161 -0
  33. package/.openprd/templates/agent/intake.md +6 -0
  34. package/.openprd/templates/agent/prd.md +21 -0
  35. package/.openprd/templates/b2b/intake.md +6 -0
  36. package/.openprd/templates/b2b/prd.md +24 -0
  37. package/.openprd/templates/base/intake.md +18 -0
  38. package/.openprd/templates/base/prd.md +67 -0
  39. package/.openprd/templates/company/README.md +10 -0
  40. package/.openprd/templates/consumer/intake.md +6 -0
  41. package/.openprd/templates/consumer/prd.md +19 -0
  42. package/.openprd/templates/diagram/architecture.contract.json +53 -0
  43. package/.openprd/templates/diagram/product-flow.contract.json +76 -0
  44. package/.openprd/templates/industry/README.md +16 -0
  45. package/.openprd/templates/manifest.yaml +27 -0
  46. package/.openprd/templates/project/README.md +14 -0
  47. package/.openprd/templates/session/README.md +14 -0
  48. package/AGENTS.md +44 -0
  49. package/CONTRIBUTING.md +30 -0
  50. package/LICENSE +21 -0
  51. package/README.md +727 -0
  52. package/README_CN.md +583 -0
  53. package/SECURITY.md +23 -0
  54. package/bin/openprd.js +5 -0
  55. package/docs/assets/openprd-capability-overview-en.png +0 -0
  56. package/docs/assets/openprd-capability-overview-zh.png +0 -0
  57. package/docs/assets/openprd-learning-html.png +0 -0
  58. package/docs/assets/openprd-quality-html.png +0 -0
  59. package/docs/assets/openprd-review-html.png +0 -0
  60. package/docs/assets/openprd-scenario-overview.png +0 -0
  61. package/docs/assets/openprd-scenario-overview.svg +114 -0
  62. package/docs/assets/openprd-self-evolving-mechanisms-en.png +0 -0
  63. package/docs/assets/openprd-self-evolving-mechanisms-zh.png +0 -0
  64. package/docs/assets/openprd-visual-compare-case-study-en.png +0 -0
  65. package/docs/assets/openprd-visual-compare-case-study-zh.png +0 -0
  66. package/package.json +59 -0
  67. package/scripts/openprd-dev-check.mjs +5 -0
  68. package/scripts/openprd-review-presentation.mjs +82 -0
  69. package/skills/openprd-benchmark-router/SKILL.md +92 -0
  70. package/skills/openprd-benchmark-router/agents/openai.yaml +4 -0
  71. package/skills/openprd-benchmark-router/references/benchmark-sources.md +74 -0
  72. package/skills/openprd-benchmark-router/references/evaluation-lenses.md +66 -0
  73. package/skills/openprd-benchmark-router/references/source-policy.md +35 -0
  74. package/skills/openprd-diagram-review/SKILL.md +91 -0
  75. package/skills/openprd-diagram-review/agents/openai.yaml +4 -0
  76. package/skills/openprd-diagram-review/examples/architecture-zh.md +8 -0
  77. package/skills/openprd-diagram-review/examples/product-flow-zh.md +7 -0
  78. package/skills/openprd-diagram-review/references/cocoon-patterns.md +17 -0
  79. package/skills/openprd-diagram-review/references/diagram-contracts.md +126 -0
  80. package/skills/openprd-diagram-review/references/review-checklist.md +10 -0
  81. package/skills/openprd-discovery-loop/SKILL.md +196 -0
  82. package/skills/openprd-discovery-loop/agents/openai.yaml +3 -0
  83. package/skills/openprd-harness/SKILL.md +179 -0
  84. package/skills/openprd-harness/agents/openai.yaml +4 -0
  85. package/skills/openprd-harness/examples/full-workflow-zh.md +9 -0
  86. package/skills/openprd-harness/references/command-map.md +71 -0
  87. package/skills/openprd-harness/references/examples.md +26 -0
  88. package/skills/openprd-harness/references/usage-guide.md +335 -0
  89. package/skills/openprd-harness/references/workflow-gates.md +51 -0
  90. package/skills/openprd-learning-review/SKILL.md +75 -0
  91. package/skills/openprd-learning-review/agents/openai.yaml +4 -0
  92. package/skills/openprd-learning-review/references/content-contract.md +125 -0
  93. package/skills/openprd-learning-review/references/ebook-reader.md +46 -0
  94. package/skills/openprd-learning-review/references/evidence-manifest.md +55 -0
  95. package/skills/openprd-learning-review/references/genre-library.md +43 -0
  96. package/skills/openprd-learning-review/references/prompt-engineering.md +71 -0
  97. package/skills/openprd-learning-review/references/quality-rubric.md +28 -0
  98. package/skills/openprd-learning-review/references/retrieval-worked-example.md +40 -0
  99. package/skills/openprd-learning-review/references/style-packs/xianxia-cultivation.prompt.md +67 -0
  100. package/skills/openprd-quality/SKILL.md +101 -0
  101. package/skills/openprd-requirement-intake/SKILL.md +76 -0
  102. package/skills/openprd-requirement-intake/agents/openai.yaml +4 -0
  103. package/skills/openprd-requirement-intake/references/prd-template-lenses.md +105 -0
  104. package/skills/openprd-requirement-intake/references/routing-rubric.md +64 -0
  105. package/skills/openprd-router/SKILL.md +40 -0
  106. package/skills/openprd-shared/SKILL.md +142 -0
  107. package/skills/openprd-shared/agents/openai.yaml +4 -0
  108. package/skills/openprd-shared/references/language-and-review.md +50 -0
  109. package/skills/openprd-shared/references/operating-rules.md +65 -0
  110. package/skills/openprd-shared/references/skill-architecture.md +70 -0
  111. package/skills/openprd-standards/SKILL.md +79 -0
  112. package/skills/openprd-standards/agents/openai.yaml +4 -0
  113. package/src/agent-integration.js +1717 -0
  114. package/src/benchmark.js +873 -0
  115. package/src/cli/args.js +460 -0
  116. package/src/cli/print.js +1423 -0
  117. package/src/codex-hook-runner-template.mjs +2422 -0
  118. package/src/dev-standards.js +372 -0
  119. package/src/diagram-core.js +1047 -0
  120. package/src/diagram-workspace.js +262 -0
  121. package/src/discovery.js +709 -0
  122. package/src/fleet.js +531 -0
  123. package/src/fs-utils.js +83 -0
  124. package/src/growth.js +545 -0
  125. package/src/html-artifacts.js +3803 -0
  126. package/src/knowledge.js +668 -0
  127. package/src/language-policy.js +142 -0
  128. package/src/learning-review.js +1655 -0
  129. package/src/loop.js +1290 -0
  130. package/src/openprd.js +1136 -0
  131. package/src/openspec/change-lifecycle.js +359 -0
  132. package/src/openspec/change-validate.js +248 -0
  133. package/src/openspec/constants.js +12 -0
  134. package/src/openspec/execute.js +300 -0
  135. package/src/openspec/generate.js +692 -0
  136. package/src/openspec/paths.js +111 -0
  137. package/src/openspec/tasks.js +352 -0
  138. package/src/prd-core.js +656 -0
  139. package/src/quality-html-artifact.js +1414 -0
  140. package/src/quality-learning.js +658 -0
  141. package/src/quality.js +1262 -0
  142. package/src/review-presentation.js +240 -0
  143. package/src/run-harness.js +1470 -0
  144. package/src/self-update.js +329 -0
  145. package/src/session-binding.js +140 -0
  146. package/src/source-inventory.js +224 -0
  147. package/src/standards.js +914 -0
  148. package/src/time.js +33 -0
  149. package/src/visual-compare.js +216 -0
  150. package/src/work-unit-migration.js +232 -0
  151. package/src/work-unit.js +88 -0
  152. package/src/workspace-core.js +1706 -0
  153. package/src/workspace-registry.js +162 -0
  154. package/src/workspace-workflow.js +1797 -0
@@ -0,0 +1,1256 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Verify 边界与历史项目刷新</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: light;
10
+ --review-bg: #f6f8fb;
11
+ --review-panel: #ffffff;
12
+ --review-panel-soft: #f9fafb;
13
+ --review-text: #172033;
14
+ --review-muted: #667085;
15
+ --review-line: #d8dee8;
16
+ --review-blue: #2563eb;
17
+ --review-teal: #0f766e;
18
+ --review-indigo: #4f46e5;
19
+ --review-amber: #b45309;
20
+ --review-red: #dc2626;
21
+ --review-green: #15803d;
22
+ --review-mono: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
23
+ }
24
+ * { box-sizing: border-box; }
25
+ body {
26
+ margin: 0;
27
+ background: var(--review-bg);
28
+ color: var(--review-text);
29
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
30
+ overflow-x: hidden;
31
+ }
32
+ .review-page {
33
+ max-width: 1220px;
34
+ margin: 0 auto;
35
+ padding: 28px 22px 120px;
36
+ }
37
+ .review-topbar {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: flex-start;
41
+ gap: 16px;
42
+ margin-bottom: 16px;
43
+ }
44
+ .review-brand {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ min-height: 34px;
48
+ border: 1px solid var(--review-line);
49
+ border-radius: 999px;
50
+ background: var(--review-panel);
51
+ color: var(--review-muted);
52
+ padding: 0 12px;
53
+ font-size: 13px;
54
+ font-weight: 700;
55
+ letter-spacing: 0;
56
+ }
57
+ .review-kicker {
58
+ margin: 0 0 6px;
59
+ color: var(--review-muted);
60
+ font-size: 13px;
61
+ font-weight: 800;
62
+ letter-spacing: 0;
63
+ }
64
+ .review-overview,
65
+ .review-map {
66
+ border: 1px solid var(--review-line);
67
+ border-radius: 8px;
68
+ background: var(--review-panel);
69
+ box-shadow: 0 16px 34px rgba(15, 23, 42, 0.06);
70
+ }
71
+ .review-overview {
72
+ display: block;
73
+ padding: 24px;
74
+ }
75
+ .review-overview-copy,
76
+ .review-panel {
77
+ min-width: 0;
78
+ }
79
+ .review-overview h1,
80
+ .review-map h2,
81
+ .review-panel h3 {
82
+ margin: 0;
83
+ color: var(--review-text);
84
+ letter-spacing: 0;
85
+ overflow-wrap: anywhere;
86
+ }
87
+ .review-overview h1 {
88
+ font-size: 32px;
89
+ line-height: 1.16;
90
+ word-break: break-word;
91
+ }
92
+ .review-problem {
93
+ max-width: 760px;
94
+ margin: 12px 0 0;
95
+ color: var(--review-muted);
96
+ font-size: 16px;
97
+ line-height: 1.75;
98
+ overflow-wrap: anywhere;
99
+ }
100
+ .review-map {
101
+ margin-top: 18px;
102
+ padding: 20px;
103
+ }
104
+ .review-section-heading,
105
+ .review-panel-head {
106
+ display: flex;
107
+ gap: 12px;
108
+ align-items: flex-start;
109
+ }
110
+ .review-section-heading h2 {
111
+ font-size: 22px;
112
+ }
113
+ .review-icon {
114
+ flex: 0 0 auto;
115
+ display: inline-flex;
116
+ width: 38px;
117
+ height: 38px;
118
+ align-items: center;
119
+ justify-content: center;
120
+ border-radius: 8px;
121
+ }
122
+ .review-icon svg {
123
+ width: 22px;
124
+ height: 22px;
125
+ fill: none;
126
+ stroke: currentColor;
127
+ stroke-width: 2;
128
+ stroke-linecap: round;
129
+ stroke-linejoin: round;
130
+ }
131
+ .review-icon-map { color: var(--review-indigo); background: #eef2ff; }
132
+ .review-icon-flow { color: var(--review-teal); background: #ccfbf1; }
133
+ .review-icon-function { color: var(--review-blue); background: #dbeafe; }
134
+ .review-icon-guardrail { color: var(--review-amber); background: #fef3c7; }
135
+ .review-icon-risk { color: var(--review-red); background: #fee2e2; }
136
+ .review-map-canvas {
137
+ margin-top: 14px;
138
+ overflow-x: auto;
139
+ max-width: 100%;
140
+ }
141
+ .review-map-canvas svg {
142
+ display: block;
143
+ width: 100%;
144
+ min-width: 680px;
145
+ height: auto;
146
+ }
147
+ .review-map-bg {
148
+ fill: #f8fafc;
149
+ stroke: #e2e8f0;
150
+ }
151
+ .review-map-arrow {
152
+ fill: none;
153
+ stroke: var(--review-indigo);
154
+ stroke-width: 3;
155
+ stroke-linecap: round;
156
+ }
157
+ .review-map-link {
158
+ fill: none;
159
+ stroke: #a5b4fc;
160
+ stroke-width: 2.5;
161
+ stroke-linecap: round;
162
+ }
163
+ .review-map-node {
164
+ fill: #ffffff;
165
+ stroke: #cbd5e1;
166
+ stroke-width: 1.5;
167
+ filter: drop-shadow(0 10px 16px rgba(15, 23, 42, 0.08));
168
+ }
169
+ .review-map-center {
170
+ fill: #eef2ff;
171
+ stroke: #818cf8;
172
+ stroke-width: 1.5;
173
+ filter: drop-shadow(0 14px 18px rgba(79, 70, 229, 0.12));
174
+ }
175
+ .review-map-node.node-1 { stroke: #99f6e4; }
176
+ .review-map-node.node-2 { stroke: #bfdbfe; }
177
+ .review-map-node.node-3 { stroke: #fde68a; }
178
+ .review-map-node.node-4 { stroke: #fecaca; }
179
+ .review-map-step {
180
+ fill: var(--review-indigo);
181
+ font-size: 13px;
182
+ font-weight: 800;
183
+ }
184
+ .review-map-tag {
185
+ fill: var(--review-muted);
186
+ font-size: 11px;
187
+ font-weight: 800;
188
+ }
189
+ .review-map-tag-pill {
190
+ fill: #f8fafc;
191
+ stroke: #cbd5e1;
192
+ stroke-width: 1;
193
+ }
194
+ .review-map-tag-pill.center { fill: #e0e7ff; stroke: #a5b4fc; }
195
+ .review-map-tag-pill.node-1 { fill: #ccfbf1; stroke: #5eead4; }
196
+ .review-map-tag-pill.node-2 { fill: #dbeafe; stroke: #93c5fd; }
197
+ .review-map-tag-pill.node-3 { fill: #fef3c7; stroke: #facc15; }
198
+ .review-map-tag-pill.node-4 { fill: #fee2e2; stroke: #fca5a5; }
199
+ .review-map-tag.center { fill: var(--review-indigo); }
200
+ .review-map-tag.node-1 { fill: #0f766e; }
201
+ .review-map-tag.node-2 { fill: #2563eb; }
202
+ .review-map-tag.node-3 { fill: #b45309; }
203
+ .review-map-tag.node-4 { fill: #dc2626; }
204
+ .review-map-label {
205
+ fill: var(--review-text);
206
+ font-size: 12px;
207
+ font-weight: 680;
208
+ }
209
+ .review-map-note {
210
+ margin: 10px 0 0;
211
+ color: var(--review-muted);
212
+ font-size: 13px;
213
+ }
214
+ .review-panel-grid {
215
+ display: grid;
216
+ grid-template-columns: repeat(2, minmax(0, 1fr));
217
+ gap: 16px;
218
+ margin-top: 18px;
219
+ }
220
+ .review-panel {
221
+ min-height: 260px;
222
+ border: 1px solid var(--review-line);
223
+ border-radius: 8px;
224
+ background: var(--review-panel);
225
+ padding: 18px;
226
+ box-shadow: 0 12px 28px rgba(15, 23, 42, 0.05);
227
+ }
228
+ .review-panel h3 {
229
+ font-size: 20px;
230
+ }
231
+ .review-panel-head p {
232
+ margin: 5px 0 0;
233
+ color: var(--review-muted);
234
+ font-size: 14px;
235
+ line-height: 1.55;
236
+ }
237
+ .review-chip-row {
238
+ display: flex;
239
+ flex-wrap: wrap;
240
+ gap: 8px;
241
+ margin-top: 16px;
242
+ padding: 12px;
243
+ border-radius: 8px;
244
+ background: var(--review-panel-soft);
245
+ border: 1px solid var(--review-line);
246
+ }
247
+ .review-chip {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ width: fit-content;
251
+ max-width: 100%;
252
+ min-height: 28px;
253
+ padding: 5px 10px;
254
+ border-radius: 999px;
255
+ border: 1px solid var(--review-line);
256
+ background: #ffffff;
257
+ color: var(--review-text);
258
+ font-size: 13px;
259
+ font-weight: 750;
260
+ line-height: 1.25;
261
+ white-space: nowrap;
262
+ overflow-wrap: normal;
263
+ word-break: keep-all;
264
+ }
265
+ .review-panel-flow .review-chip { border-color: #99f6e4; background: #f0fdfa; color: #115e59; }
266
+ .review-panel-function .review-chip { border-color: #bfdbfe; background: #eff6ff; color: #1d4ed8; }
267
+ .review-panel-guardrail .review-chip { border-color: #fde68a; background: #fffbeb; color: #92400e; }
268
+ .review-panel-risk .review-chip { border-color: #fecaca; background: #fff1f2; color: #991b1b; }
269
+ .review-chip.empty {
270
+ color: var(--review-muted);
271
+ background: #ffffff;
272
+ border-color: var(--review-line);
273
+ }
274
+ .review-journey-map {
275
+ margin-top: 12px;
276
+ border: 1px solid var(--review-line);
277
+ border-radius: 8px;
278
+ background: #f8fafc;
279
+ overflow-x: auto;
280
+ overflow-y: hidden;
281
+ }
282
+ .review-journey-map svg {
283
+ display: block;
284
+ width: 100%;
285
+ min-width: 0;
286
+ min-height: 230px;
287
+ }
288
+ .review-journey-bg {
289
+ fill: #fbfdff;
290
+ stroke: none;
291
+ }
292
+ .review-journey-arrow {
293
+ fill: none;
294
+ stroke: #0d9488;
295
+ stroke-width: 2;
296
+ stroke-linecap: round;
297
+ }
298
+ .review-journey-arrow.branch {
299
+ stroke: #94a3b8;
300
+ stroke-dasharray: 5 6;
301
+ }
302
+ .review-journey-node {
303
+ fill: #ffffff;
304
+ stroke-width: 1.6;
305
+ filter: drop-shadow(0 10px 18px rgba(15, 23, 42, 0.08));
306
+ }
307
+ .review-journey-node.stage-journey { stroke: #5eead4; }
308
+ .review-journey-node.stage-step { stroke: #93c5fd; }
309
+ .review-journey-node.stage-outcome { stroke: #a5b4fc; }
310
+ .review-journey-node.stage-boundary { stroke: #fde68a; }
311
+ .review-journey-node.stage-recovery { stroke: #fecaca; }
312
+ .review-journey-dot {
313
+ fill: #0f172a;
314
+ }
315
+ .review-journey-dot.stage-journey { fill: #0d9488; }
316
+ .review-journey-dot.stage-step { fill: #2563eb; }
317
+ .review-journey-dot.stage-outcome { fill: #4f46e5; }
318
+ .review-journey-dot.stage-boundary { fill: #ca8a04; }
319
+ .review-journey-dot.stage-recovery { fill: #dc2626; }
320
+ .review-journey-number {
321
+ fill: #ffffff;
322
+ font-size: 11px;
323
+ font-weight: 850;
324
+ dominant-baseline: central;
325
+ }
326
+ .review-journey-tag {
327
+ fill: #64748b;
328
+ font-size: 12px;
329
+ font-weight: 850;
330
+ }
331
+ .review-journey-label {
332
+ fill: #0f172a;
333
+ font-size: 12px;
334
+ font-weight: 760;
335
+ }
336
+ .review-panel-list {
337
+ margin: 16px 0 0;
338
+ padding-left: 18px;
339
+ color: var(--review-text);
340
+ font-size: 15px;
341
+ line-height: 1.72;
342
+ overflow-wrap: anywhere;
343
+ }
344
+ .review-panel-list li + li {
345
+ margin-top: 9px;
346
+ }
347
+ .review-detail-summary {
348
+ font-weight: 850;
349
+ color: var(--review-text);
350
+ }
351
+ .review-detail-body {
352
+ color: var(--review-text);
353
+ }
354
+ .review-panel-list .empty {
355
+ color: var(--review-muted);
356
+ }
357
+ .review-bottom-bar {
358
+ position: fixed;
359
+ left: 0;
360
+ right: 0;
361
+ bottom: 0;
362
+ z-index: 30;
363
+ padding: 12px 22px calc(12px + env(safe-area-inset-bottom));
364
+ border-top: 1px solid var(--review-line);
365
+ background: rgba(246, 248, 251, 0.94);
366
+ box-shadow: 0 -14px 32px rgba(15, 23, 42, 0.08);
367
+ backdrop-filter: blur(14px);
368
+ }
369
+ .review-bottom-bar-inner {
370
+ display: flex;
371
+ justify-content: flex-end;
372
+ gap: 12px;
373
+ max-width: 1220px;
374
+ margin: 0 auto;
375
+ }
376
+ .review-bottom-action {
377
+ cursor: pointer;
378
+ display: inline-flex;
379
+ align-items: center;
380
+ justify-content: center;
381
+ min-width: 152px;
382
+ min-height: 48px;
383
+ border: 1px solid transparent;
384
+ border-radius: 12px;
385
+ padding: 0 20px;
386
+ font: inherit;
387
+ font-size: 16px;
388
+ font-weight: 850;
389
+ letter-spacing: 0;
390
+ line-height: 1;
391
+ white-space: nowrap;
392
+ box-shadow: 0 8px 18px rgba(15, 23, 42, 0.06);
393
+ transition: background-color 160ms ease, border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease;
394
+ }
395
+ .review-bottom-action.revise {
396
+ border-color: #fecaca;
397
+ background: #fff1f2;
398
+ color: #b42318;
399
+ }
400
+ .review-bottom-action.confirm {
401
+ border-color: #bbf7d0;
402
+ background: #ecfdf3;
403
+ color: #067647;
404
+ }
405
+ .review-bottom-action:hover,
406
+ .review-bottom-action:focus-visible {
407
+ box-shadow: 0 10px 22px rgba(15, 23, 42, 0.1);
408
+ transform: translateY(-1px);
409
+ outline: none;
410
+ }
411
+ .review-bottom-action.revise:hover,
412
+ .review-bottom-action.revise:focus-visible {
413
+ border-color: #fda4af;
414
+ background: #ffe4e6;
415
+ }
416
+ .review-bottom-action.confirm:hover,
417
+ .review-bottom-action.confirm:focus-visible {
418
+ border-color: #86efac;
419
+ background: #dcfce7;
420
+ }
421
+ .review-bottom-action:active {
422
+ box-shadow: 0 4px 10px rgba(15, 23, 42, 0.08);
423
+ transform: translateY(0);
424
+ }
425
+ @media (max-width: 860px) {
426
+ .review-overview {
427
+ grid-template-columns: 1fr;
428
+ }
429
+ .review-panel-grid {
430
+ grid-template-columns: 1fr;
431
+ }
432
+ }
433
+ @media (max-width: 620px) {
434
+ .review-page { padding: 18px 12px 128px; }
435
+ .review-topbar { align-items: flex-start; flex-direction: column; }
436
+ .review-overview { padding: 18px; }
437
+ .review-overview h1 {
438
+ font-size: 26px;
439
+ word-break: break-all;
440
+ }
441
+ .review-problem { word-break: break-all; }
442
+ .review-map-canvas svg { min-width: 0; }
443
+ .review-journey-map svg { min-width: 620px; }
444
+ .review-section-heading h2 { font-size: 20px; }
445
+ .review-bottom-bar { padding-inline: 12px; }
446
+ .review-bottom-bar-inner {
447
+ display: grid;
448
+ grid-template-columns: 1fr 1fr;
449
+ gap: 8px;
450
+ }
451
+ .review-bottom-action {
452
+ justify-content: center;
453
+ padding-inline: 10px;
454
+ font-size: 15px;
455
+ }
456
+ }
457
+ </style>
458
+ </head>
459
+ <body>
460
+ <main class="review-page">
461
+ <header class="review-topbar">
462
+ <div class="review-brand">OpenPrd / 评审面板</div>
463
+ </header>
464
+
465
+ <section class="review-overview" aria-labelledby="reviewOverviewTitle">
466
+ <div class="review-overview-copy">
467
+ <p class="review-kicker">需求概览</p>
468
+ <h1 id="reviewOverviewTitle">Verify 边界与历史项目刷新</h1>
469
+ <p class="review-problem">修复 OpenPrd verify 边界,避免外部参考目录和 reference discovery 污染主验证,并刷新历史项目生成物。</p>
470
+ </div>
471
+ </section>
472
+
473
+
474
+ <section class="review-map" aria-labelledby="reviewMapTitle">
475
+ <div class="review-section-heading">
476
+ <span class="review-icon review-icon-map" aria-hidden="true"><svg viewBox="0 0 24 24" role="img" aria-label="图谱"><path d="M12 5v14" /><path d="M5 8h14" /><path d="M7 16h10" /><circle cx="12" cy="5" r="2" /><circle cx="5" cy="8" r="2" /><circle cx="19" cy="8" r="2" /><circle cx="7" cy="16" r="2" /><circle cx="17" cy="16" r="2" /></svg></span>
477
+ <div>
478
+ <h2 id="reviewMapTitle">需求关系图</h2>
479
+ </div>
480
+ </div>
481
+ <div class="review-map-canvas">
482
+ <svg viewBox="0 0 960 336" role="img" aria-label="需求关系图" preserveAspectRatio="xMidYMid meet">
483
+ <rect class="review-map-bg" x="2" y="2" width="956" height="332" rx="8" />
484
+ <path class="review-map-link" d="M 480 168 L 250 94" /><path class="review-map-link" d="M 480 168 L 710 94" /><path class="review-map-link" d="M 480 168 L 250 242" /><path class="review-map-link" d="M 480 168 L 710 242" />
485
+
486
+ <g>
487
+ <rect class="review-map-node node-1" x="128" y="51" width="244" height="86" rx="8" />
488
+
489
+ <rect class="review-map-tag-pill node-1" x="223" y="59" width="54" height="26" rx="13" />
490
+ <text class="review-map-tag node-1" x="250" y="76" text-anchor="middle">目标</text>
491
+
492
+ <text class="review-map-label" x="156" y="100" text-anchor="start"><tspan x="156" dy="0">让主验证只关注当前项目源码和当</tspan><tspan x="156" dy="14">前实现门禁</tspan></text>
493
+ </g>
494
+
495
+ <g>
496
+ <rect class="review-map-node node-2" x="588" y="51" width="244" height="86" rx="8" />
497
+
498
+ <rect class="review-map-tag-pill node-2" x="683" y="59" width="54" height="26" rx="13" />
499
+ <text class="review-map-tag node-2" x="710" y="76" text-anchor="middle">范围</text>
500
+
501
+ <text class="review-map-label" x="616" y="100" text-anchor="start"><tspan x="616" dy="0">调整runcontext与runverify</tspan><tspan x="616" dy="14">对discovery的纳入规则</tspan></text>
502
+ </g>
503
+
504
+ <g>
505
+ <rect class="review-map-node node-3" x="128" y="199" width="244" height="86" rx="8" />
506
+
507
+ <rect class="review-map-tag-pill node-3" x="223" y="207" width="54" height="26" rx="13" />
508
+ <text class="review-map-tag node-3" x="250" y="224" text-anchor="middle">流程</text>
509
+
510
+ <text class="review-map-label" x="156" y="248" text-anchor="start"><tspan x="156" dy="0">维护者运行openprdrun.</tspan><tspan x="156" dy="14">--context或openprdrun.</tspan><tspan x="156" dy="14">--verify时,只看到当前项目主</tspan><tspan x="156" dy="14">验证状态;仓库中存在research</tspan><tspan x="156" dy="14">、toolkit-sources、</tspan><tspan x="156" dy="14">marketplace-candidates等</tspan><tspan x="156" dy="14">参考目录时,默认不会被当成本项</tspan><tspan x="156" dy="14">目源码说明书缺口直接淹没结果;</tspan><tspan x="156" dy="14">维护者可以继续按需显式</tspan><tspan x="156" dy="14">classify-external</tspan></text>
511
+ </g>
512
+
513
+ <g>
514
+ <rect class="review-map-node node-4" x="588" y="199" width="244" height="86" rx="8" />
515
+
516
+ <rect class="review-map-tag-pill node-4" x="683" y="207" width="54" height="26" rx="13" />
517
+ <text class="review-map-tag node-4" x="710" y="224" text-anchor="middle">风险</text>
518
+
519
+ <text class="review-map-label" x="616" y="248" text-anchor="start"><tspan x="616" dy="0">本次只收敛默认边界,不自动猜测</tspan><tspan x="616" dy="14">每个历史项目全部external</tspan><tspan x="616" dy="14">reference清单;如果某些项目</tspan><tspan x="616" dy="14">还需要更细的目录级归类,仍由维</tspan><tspan x="616" dy="14">护者显式确认和补充</tspan></text>
520
+ </g>
521
+
522
+
523
+ <g class="review-map-center-group">
524
+ <rect class="review-map-center" x="330" y="124" width="300" height="88" rx="8" />
525
+
526
+ <rect class="review-map-tag-pill center" x="439" y="133" width="82" height="26" rx="13" />
527
+ <text class="review-map-tag center" x="480" y="150" text-anchor="middle">问题定义</text>
528
+
529
+ <text class="review-map-label center" x="360" y="176" text-anchor="start"><tspan x="360" dy="0">修复OpenPrdverify边界,避免</tspan><tspan x="360" dy="14">外部参考目录和reference</tspan><tspan x="360" dy="14">discovery污染主验证,并刷新历</tspan><tspan x="360" dy="14">史项目生成物</tspan></text>
530
+ </g>
531
+
532
+ </svg>
533
+ </div>
534
+ </section>
535
+
536
+ <section class="review-panel-grid" aria-label="固定评审项">
537
+
538
+ <section class="review-panel review-panel-flow">
539
+ <header class="review-panel-head">
540
+ <span class="review-icon review-icon-flow" aria-hidden="true"><svg viewBox="0 0 24 24" role="img" aria-label="流程"><path d="M5 6.5h6.4a3.6 3.6 0 0 1 3.6 3.6v.8" /><path d="M15 17.5H8.6A3.6 3.6 0 0 1 5 13.9v-.8" /><path d="m12 8.5 3-3 3 3" /><path d="m8 15.5-3 3-3-3" /></svg></span>
541
+ <div>
542
+ <h3>主流程与边界情况</h3>
543
+ <p>确认用户旅程、关键步骤和恢复路径是否已经讲清楚,能否进入实现前确认</p>
544
+ </div>
545
+ </header>
546
+ <div class="review-chip-row" aria-label="主流程与边界情况重点摘要">
547
+ <span class="review-chip">用量额度不变</span><span class="review-chip">重点说明</span>
548
+ </div>
549
+
550
+ <div class="review-journey-map" aria-label="主流程小图">
551
+ <svg viewBox="0 0 680 320" role="img" aria-label="用户旅程、关键步骤、边界情况和恢复路径" preserveAspectRatio="xMidYMid meet">
552
+ <defs>
553
+ <marker id="reviewJourneyArrow" markerWidth="10" markerHeight="10" refX="9" refY="5" orient="auto">
554
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="#0d9488" />
555
+ </marker>
556
+ </defs>
557
+ <rect class="review-journey-bg" x="2" y="2" width="676" height="316" rx="8" />
558
+ <path class="review-journey-arrow" d="M 202 88 H 248" marker-end="url(#reviewJourneyArrow)" />
559
+ <path class="review-journey-arrow" d="M 432 88 H 478" marker-end="url(#reviewJourneyArrow)" />
560
+ <path class="review-journey-arrow branch" d="M 340 134 V 164 H 236 V 190" marker-end="url(#reviewJourneyArrow)" />
561
+ <path class="review-journey-arrow branch" d="M 340 134 V 164 H 454 V 190" marker-end="url(#reviewJourneyArrow)" />
562
+ <g>
563
+ <rect class="review-journey-node stage-journey" x="26" y="40" width="176" height="96" rx="8" />
564
+ <circle class="review-journey-dot stage-journey" cx="56" cy="64" r="12" />
565
+ <text class="review-journey-number" x="56" y="64" text-anchor="middle">1</text>
566
+ <text class="review-journey-tag" x="114" y="66" text-anchor="middle">用户旅程</text>
567
+ <text class="review-journey-label" x="114" y="92" text-anchor="middle"><tspan x="114" dy="0">维护者运行openprdrun</tspan></text>
568
+ </g>
569
+ <g>
570
+ <rect class="review-journey-node stage-step" x="252" y="40" width="176" height="96" rx="8" />
571
+ <circle class="review-journey-dot stage-step" cx="282" cy="64" r="12" />
572
+ <text class="review-journey-number" x="282" y="64" text-anchor="middle">2</text>
573
+ <text class="review-journey-tag" x="340" y="66" text-anchor="middle">关键步骤</text>
574
+ <text class="review-journey-label" x="340" y="92" text-anchor="middle"><tspan x="340" dy="0">重点说明</tspan></text>
575
+ </g>
576
+ <g>
577
+ <rect class="review-journey-node stage-outcome" x="478" y="40" width="176" height="96" rx="8" />
578
+ <circle class="review-journey-dot stage-outcome" cx="508" cy="64" r="12" />
579
+ <text class="review-journey-number" x="508" y="64" text-anchor="middle">3</text>
580
+ <text class="review-journey-tag" x="566" y="66" text-anchor="middle">结果确认</text>
581
+ <text class="review-journey-label" x="566" y="92" text-anchor="middle"><tspan x="566" dy="0">--verify时</tspan></text>
582
+ </g>
583
+ <g>
584
+ <rect class="review-journey-node stage-boundary" x="126" y="194" width="220" height="88" rx="8" />
585
+ <circle class="review-journey-dot stage-boundary" cx="158" cy="218" r="12" />
586
+ <text class="review-journey-number" x="158" y="218" text-anchor="middle">B</text>
587
+ <text class="review-journey-tag" x="236" y="220" text-anchor="middle">边界情况</text>
588
+ <text class="review-journey-label" x="236" y="246" text-anchor="middle"><tspan x="236" dy="0">待确认边界情况</tspan></text>
589
+ </g>
590
+ <g>
591
+ <rect class="review-journey-node stage-recovery" x="356" y="194" width="220" height="88" rx="8" />
592
+ <circle class="review-journey-dot stage-recovery" cx="388" cy="218" r="12" />
593
+ <text class="review-journey-number" x="388" y="218" text-anchor="middle">R</text>
594
+ <text class="review-journey-tag" x="466" y="220" text-anchor="middle">恢复路径</text>
595
+ <text class="review-journey-label" x="466" y="246" text-anchor="middle"><tspan x="466" dy="0">重点说明</tspan></text>
596
+ </g>
597
+ </svg>
598
+ </div>
599
+
600
+ <ul class="review-panel-list"><li><strong class="review-detail-summary">用量额度不变</strong><span class="review-detail-body">:维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external。</span></li><li><strong class="review-detail-summary">重点说明</strong><span class="review-detail-body">:reference discovery 仍然混入 run context 或 run verify</span></li><li><strong class="review-detail-summary">重点说明</strong><span class="review-detail-body">:standards verify 继续被 research 或 toolkit-sources 之类参考目录的说明书缺口淹没</span></li><li><strong class="review-detail-summary">重点说明</strong><span class="review-detail-body">:fleet 更新后历史项目仍保留旧的 verify 噪音行为</span></li></ul>
601
+ </section>
602
+
603
+
604
+ <section class="review-panel review-panel-function">
605
+ <header class="review-panel-head">
606
+ <span class="review-icon review-icon-function" aria-hidden="true"><svg viewBox="0 0 24 24" role="img" aria-label="功能"><path d="M5 7h14" /><path d="M5 12h14" /><path d="M5 17h14" /><circle cx="8" cy="7" r="2" /><circle cx="16" cy="12" r="2" /><circle cx="11" cy="17" r="2" /></svg></span>
607
+ <div>
608
+ <h3>功能与约束</h3>
609
+ <p>区分必须交付、非功能要求和当前依赖假设</p>
610
+ </div>
611
+ </header>
612
+ <div class="review-chip-row" aria-label="功能与约束重点摘要">
613
+ <span class="review-chip empty">暂无功能、非功能要求或依赖约束。</span>
614
+ </div>
615
+
616
+ <ul class="review-panel-list"><li class="empty">暂无功能、非功能要求或依赖约束。</li></ul>
617
+ </section>
618
+
619
+
620
+ <section class="review-panel review-panel-guardrail">
621
+ <header class="review-panel-head">
622
+ <span class="review-icon review-icon-guardrail" aria-hidden="true"><svg viewBox="0 0 24 24" role="img" aria-label="护栏"><path d="M12 3 5 6v5c0 4.4 2.8 8.4 7 9.8 4.2-1.4 7-5.4 7-9.8V6l-7-3Z" /><path d="M9 12.2 11 14l4-4.4" /></svg></span>
623
+ <div>
624
+ <h3>业务成本与滥用护栏</h3>
625
+ <p>涉及免费额度、消耗型成本或第三方调用时,先确认限制、报警和止损动作</p>
626
+ </div>
627
+ </header>
628
+ <div class="review-chip-row" aria-label="业务成本与滥用护栏重点摘要">
629
+ <span class="review-chip empty">暂无业务成本或滥用护栏。</span>
630
+ </div>
631
+
632
+ <ul class="review-panel-list"><li class="empty">暂无业务成本或滥用护栏。</li></ul>
633
+ </section>
634
+
635
+
636
+ <section class="review-panel review-panel-risk">
637
+ <header class="review-panel-head">
638
+ <span class="review-icon review-icon-risk" aria-hidden="true"><svg viewBox="0 0 24 24" role="img" aria-label="风险"><path d="M12 4 3.5 19h17L12 4Z" /><path d="M12 9v4" /><path d="M12 16.5h.01" /></svg></span>
639
+ <div>
640
+ <h3>开放问题与风险</h3>
641
+ <p>需求定稿前还没关掉的问题要留在这里,不要默默假定解决</p>
642
+ </div>
643
+ </header>
644
+ <div class="review-chip-row" aria-label="开放问题与风险重点摘要">
645
+ <span class="review-chip">本次只收敛默认边界</span>
646
+ </div>
647
+
648
+ <ul class="review-panel-list"><li><strong class="review-detail-summary">本次只收敛默认边界</strong><span class="review-detail-body">:本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充</span></li></ul>
649
+ </section>
650
+
651
+ </section>
652
+
653
+ <nav class="review-bottom-bar" aria-label="评审决定">
654
+ <div class="review-bottom-bar-inner">
655
+ <button type="button" class="review-bottom-action revise" data-copy-value="OpenPrD Review: 需要调整
656
+
657
+ 命令:
658
+
659
+ openprd review . --mark needs-revision --version &#39;v0001&#39; --digest &#39;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&#39; --work-unit &#39;wu-20260524015648-6d33ded7&#39; --notes &#39;说明需要调整的点&#39;
660
+
661
+ 上下文:
662
+
663
+ {
664
+ &quot;versionId&quot;: &quot;v0001&quot;,
665
+ &quot;title&quot;: &quot;Verify 边界与历史项目刷新&quot;,
666
+ &quot;digest&quot;: &quot;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&quot;,
667
+ &quot;workUnitId&quot;: &quot;wu-20260524015648-6d33ded7&quot;,
668
+ &quot;targetRoot&quot;: &quot;/Users/chaojifeng/Projects/harness-engineer/openprd&quot;,
669
+ &quot;reviewStatus&quot;: &quot;pending-confirmation&quot;,
670
+ &quot;recommendedActions&quot;: [
671
+ &quot;确认问题与目标&quot;,
672
+ &quot;确认范围内 / 范围外&quot;,
673
+ &quot;确认主流程与失败路径&quot;,
674
+ &quot;确认关键风险与开放问题&quot;
675
+ ],
676
+ &quot;sectionKeys&quot;: [
677
+ &quot;meta&quot;,
678
+ &quot;problem&quot;,
679
+ &quot;users&quot;,
680
+ &quot;goals&quot;,
681
+ &quot;scope&quot;,
682
+ &quot;scenarios&quot;,
683
+ &quot;requirements&quot;,
684
+ &quot;businessGuardrails&quot;,
685
+ &quot;constraints&quot;,
686
+ &quot;risks&quot;,
687
+ &quot;handoff&quot;,
688
+ &quot;typeSpecific&quot;
689
+ ],
690
+ &quot;presentationContract&quot;: {
691
+ &quot;intent&quot;: &quot;这些限制用于反馈给 Agent 重新概括,不由 HTML 模板截断原文。&quot;,
692
+ &quot;expectedDataShape&quot;: {
693
+ &quot;reviewPresentation&quot;: {
694
+ &quot;diagram&quot;: {
695
+ &quot;type&quot;: &quot;map&quot;,
696
+ &quot;note&quot;: &quot;默认用关系图;只有确认为线性流程时改为 flow,并用 flowEdges 明确哪些节点有箭头。&quot;
697
+ },
698
+ &quot;mapNodes&quot;: {
699
+ &quot;problem&quot;: {
700
+ &quot;title&quot;: &quot;问题定义&quot;,
701
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
702
+ },
703
+ &quot;goal&quot;: {
704
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
705
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
706
+ },
707
+ &quot;scope&quot;: {
708
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
709
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
710
+ },
711
+ &quot;flow&quot;: {
712
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
713
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
714
+ },
715
+ &quot;risk&quot;: {
716
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
717
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
718
+ }
719
+ },
720
+ &quot;flowNodes&quot;: [
721
+ {
722
+ &quot;id&quot;: &quot;step1&quot;,
723
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
724
+ },
725
+ {
726
+ &quot;id&quot;: &quot;step2&quot;,
727
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
728
+ },
729
+ {
730
+ &quot;id&quot;: &quot;step3&quot;,
731
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
732
+ }
733
+ ],
734
+ &quot;flowEdges&quot;: [
735
+ {
736
+ &quot;from&quot;: &quot;step1&quot;,
737
+ &quot;to&quot;: &quot;step2&quot;
738
+ },
739
+ {
740
+ &quot;from&quot;: &quot;step2&quot;,
741
+ &quot;to&quot;: &quot;step3&quot;
742
+ }
743
+ ],
744
+ &quot;panels&quot;: {
745
+ &quot;flow&quot;: [
746
+ {
747
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
748
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
749
+ }
750
+ ],
751
+ &quot;function&quot;: [
752
+ {
753
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
754
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
755
+ }
756
+ ],
757
+ &quot;guardrail&quot;: [
758
+ {
759
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
760
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
761
+ }
762
+ ],
763
+ &quot;risk&quot;: [
764
+ {
765
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
766
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
767
+ }
768
+ ]
769
+ }
770
+ }
771
+ },
772
+ &quot;rules&quot;: [
773
+ {
774
+ &quot;id&quot;: &quot;review-map-card-text&quot;,
775
+ &quot;area&quot;: &quot;需求关系图 / 需求流程图&quot;,
776
+ &quot;target&quot;: &quot;图中每个卡片的正文&quot;,
777
+ &quot;maxChars&quot;: 30,
778
+ &quot;action&quot;: &quot;请写入 reviewPresentation.mapNodes.*.text 或 reviewPresentation.flowNodes[].text,重写成用户一眼能扫懂的短句,不要靠省略号或截断。&quot;
779
+ },
780
+ {
781
+ &quot;id&quot;: &quot;review-map-card-title&quot;,
782
+ &quot;area&quot;: &quot;需求关系图 / 需求流程图&quot;,
783
+ &quot;target&quot;: &quot;图中卡片标题胶囊&quot;,
784
+ &quot;maxChars&quot;: 15,
785
+ &quot;action&quot;: &quot;请写入 reviewPresentation.mapNodes.*.title,重写成短标题,优先使用业务词,不使用内部技术词。&quot;
786
+ },
787
+ {
788
+ &quot;id&quot;: &quot;review-highlight-chip&quot;,
789
+ &quot;area&quot;: &quot;四个评审卡片&quot;,
790
+ &quot;target&quot;: &quot;重点摘要胶囊&quot;,
791
+ &quot;maxChars&quot;: 15,
792
+ &quot;action&quot;: &quot;请重写成短标签,保留结论,不要堆叠长句。&quot;
793
+ },
794
+ {
795
+ &quot;id&quot;: &quot;review-panel-detail-format&quot;,
796
+ &quot;area&quot;: &quot;四个评审卡片&quot;,
797
+ &quot;target&quot;: &quot;明细分点&quot;,
798
+ &quot;format&quot;: &quot;- **摘要内容**:明细一句话&quot;,
799
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.&lt;kind&gt;[],把每个明细改写为“加粗短摘要 + 一句话说明”,方便用户先扫重点再读细节。&quot;
800
+ }
801
+ ]
802
+ },
803
+ &quot;presentationFeedback&quot;: [
804
+ {
805
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
806
+ &quot;area&quot;: &quot;需求关系图&quot;,
807
+ &quot;target&quot;: &quot;问题定义卡片正文&quot;,
808
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.problem.text&quot;,
809
+ &quot;currentChars&quot;: 67,
810
+ &quot;maxChars&quot;: 30,
811
+ &quot;currentText&quot;: &quot;修复 OpenPrd verify 边界,避免外部参考目录和 reference discovery 污染主验证,并刷新历史项目生成物&quot;,
812
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
813
+ },
814
+ {
815
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
816
+ &quot;area&quot;: &quot;需求关系图&quot;,
817
+ &quot;target&quot;: &quot;范围卡片正文&quot;,
818
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.scope.text&quot;,
819
+ &quot;currentChars&quot;: 45,
820
+ &quot;maxChars&quot;: 30,
821
+ &quot;currentText&quot;: &quot;调整 run context 与 run verify 对 discovery 的纳入规则&quot;,
822
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
823
+ },
824
+ {
825
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
826
+ &quot;area&quot;: &quot;需求关系图&quot;,
827
+ &quot;target&quot;: &quot;流程卡片正文&quot;,
828
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.flow.text&quot;,
829
+ &quot;currentChars&quot;: 184,
830
+ &quot;maxChars&quot;: 30,
831
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external&quot;,
832
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
833
+ },
834
+ {
835
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
836
+ &quot;area&quot;: &quot;需求关系图&quot;,
837
+ &quot;target&quot;: &quot;风险卡片正文&quot;,
838
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.risk.text&quot;,
839
+ &quot;currentChars&quot;: 76,
840
+ &quot;maxChars&quot;: 30,
841
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
842
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
843
+ },
844
+ {
845
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
846
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
847
+ &quot;target&quot;: &quot;明细 1&quot;,
848
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[0]&quot;,
849
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
850
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external。&quot;,
851
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
852
+ },
853
+ {
854
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
855
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
856
+ &quot;target&quot;: &quot;明细 2&quot;,
857
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[1]&quot;,
858
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
859
+ &quot;currentText&quot;: &quot;reference discovery 仍然混入 run context 或 run verify&quot;,
860
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[1],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
861
+ },
862
+ {
863
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
864
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
865
+ &quot;target&quot;: &quot;明细 3&quot;,
866
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[2]&quot;,
867
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
868
+ &quot;currentText&quot;: &quot;standards verify 继续被 research 或 toolkit-sources 之类参考目录的说明书缺口淹没&quot;,
869
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[2],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
870
+ },
871
+ {
872
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
873
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
874
+ &quot;target&quot;: &quot;明细 4&quot;,
875
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[3]&quot;,
876
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
877
+ &quot;currentText&quot;: &quot;fleet 更新后历史项目仍保留旧的 verify 噪音行为&quot;,
878
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[3],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
879
+ },
880
+ {
881
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
882
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
883
+ &quot;target&quot;: &quot;明细 1&quot;,
884
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[0]&quot;,
885
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
886
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external。&quot;,
887
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
888
+ },
889
+ {
890
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
891
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
892
+ &quot;target&quot;: &quot;明细 2&quot;,
893
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[1]&quot;,
894
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
895
+ &quot;currentText&quot;: &quot;reference discovery 仍然混入 run context 或 run verify&quot;,
896
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[1],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
897
+ },
898
+ {
899
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
900
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
901
+ &quot;target&quot;: &quot;明细 3&quot;,
902
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[2]&quot;,
903
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
904
+ &quot;currentText&quot;: &quot;standards verify 继续被 research 或 toolkit-sources 之类参考目录的说明书缺口淹没&quot;,
905
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[2],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
906
+ },
907
+ {
908
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
909
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
910
+ &quot;target&quot;: &quot;明细 4&quot;,
911
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[3]&quot;,
912
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
913
+ &quot;currentText&quot;: &quot;fleet 更新后历史项目仍保留旧的 verify 噪音行为&quot;,
914
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[3],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
915
+ },
916
+ {
917
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
918
+ &quot;area&quot;: &quot;开放问题与风险&quot;,
919
+ &quot;target&quot;: &quot;明细 1&quot;,
920
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.risk[0]&quot;,
921
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
922
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
923
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.risk[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
924
+ },
925
+ {
926
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
927
+ &quot;area&quot;: &quot;开放问题与风险&quot;,
928
+ &quot;target&quot;: &quot;明细 1&quot;,
929
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.risk[0]&quot;,
930
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
931
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
932
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.risk[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
933
+ }
934
+ ],
935
+ &quot;exportedAt&quot;: &quot;2026-05-29T17:14:49.721Z&quot;
936
+ }" title="openprd review . --mark needs-revision --version &#39;v0001&#39; --digest &#39;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&#39; --work-unit &#39;wu-20260524015648-6d33ded7&#39; --notes &#39;说明需要调整的点&#39;">
937
+ 需要调整
938
+ </button>
939
+ <button type="button" class="review-bottom-action confirm" data-copy-value="OpenPrD Review: 认可方案
940
+
941
+ 命令:
942
+
943
+ openprd review . --mark confirmed --version &#39;v0001&#39; --digest &#39;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&#39; --work-unit &#39;wu-20260524015648-6d33ded7&#39;
944
+
945
+ 上下文:
946
+
947
+ {
948
+ &quot;versionId&quot;: &quot;v0001&quot;,
949
+ &quot;title&quot;: &quot;Verify 边界与历史项目刷新&quot;,
950
+ &quot;digest&quot;: &quot;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&quot;,
951
+ &quot;workUnitId&quot;: &quot;wu-20260524015648-6d33ded7&quot;,
952
+ &quot;targetRoot&quot;: &quot;/Users/chaojifeng/Projects/harness-engineer/openprd&quot;,
953
+ &quot;reviewStatus&quot;: &quot;pending-confirmation&quot;,
954
+ &quot;recommendedActions&quot;: [
955
+ &quot;确认问题与目标&quot;,
956
+ &quot;确认范围内 / 范围外&quot;,
957
+ &quot;确认主流程与失败路径&quot;,
958
+ &quot;确认关键风险与开放问题&quot;
959
+ ],
960
+ &quot;sectionKeys&quot;: [
961
+ &quot;meta&quot;,
962
+ &quot;problem&quot;,
963
+ &quot;users&quot;,
964
+ &quot;goals&quot;,
965
+ &quot;scope&quot;,
966
+ &quot;scenarios&quot;,
967
+ &quot;requirements&quot;,
968
+ &quot;businessGuardrails&quot;,
969
+ &quot;constraints&quot;,
970
+ &quot;risks&quot;,
971
+ &quot;handoff&quot;,
972
+ &quot;typeSpecific&quot;
973
+ ],
974
+ &quot;presentationContract&quot;: {
975
+ &quot;intent&quot;: &quot;这些限制用于反馈给 Agent 重新概括,不由 HTML 模板截断原文。&quot;,
976
+ &quot;expectedDataShape&quot;: {
977
+ &quot;reviewPresentation&quot;: {
978
+ &quot;diagram&quot;: {
979
+ &quot;type&quot;: &quot;map&quot;,
980
+ &quot;note&quot;: &quot;默认用关系图;只有确认为线性流程时改为 flow,并用 flowEdges 明确哪些节点有箭头。&quot;
981
+ },
982
+ &quot;mapNodes&quot;: {
983
+ &quot;problem&quot;: {
984
+ &quot;title&quot;: &quot;问题定义&quot;,
985
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
986
+ },
987
+ &quot;goal&quot;: {
988
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
989
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
990
+ },
991
+ &quot;scope&quot;: {
992
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
993
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
994
+ },
995
+ &quot;flow&quot;: {
996
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
997
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
998
+ },
999
+ &quot;risk&quot;: {
1000
+ &quot;title&quot;: &quot;15 字以内标题&quot;,
1001
+ &quot;text&quot;: &quot;30 字以内的图中正文&quot;
1002
+ }
1003
+ },
1004
+ &quot;flowNodes&quot;: [
1005
+ {
1006
+ &quot;id&quot;: &quot;step1&quot;,
1007
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
1008
+ },
1009
+ {
1010
+ &quot;id&quot;: &quot;step2&quot;,
1011
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
1012
+ },
1013
+ {
1014
+ &quot;id&quot;: &quot;step3&quot;,
1015
+ &quot;text&quot;: &quot;30 字以内的流程卡片正文&quot;
1016
+ }
1017
+ ],
1018
+ &quot;flowEdges&quot;: [
1019
+ {
1020
+ &quot;from&quot;: &quot;step1&quot;,
1021
+ &quot;to&quot;: &quot;step2&quot;
1022
+ },
1023
+ {
1024
+ &quot;from&quot;: &quot;step2&quot;,
1025
+ &quot;to&quot;: &quot;step3&quot;
1026
+ }
1027
+ ],
1028
+ &quot;panels&quot;: {
1029
+ &quot;flow&quot;: [
1030
+ {
1031
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
1032
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
1033
+ }
1034
+ ],
1035
+ &quot;function&quot;: [
1036
+ {
1037
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
1038
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
1039
+ }
1040
+ ],
1041
+ &quot;guardrail&quot;: [
1042
+ {
1043
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
1044
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
1045
+ }
1046
+ ],
1047
+ &quot;risk&quot;: [
1048
+ {
1049
+ &quot;summary&quot;: &quot;15 字内标签&quot;,
1050
+ &quot;detail&quot;: &quot;用户能读懂的一句话说明&quot;
1051
+ }
1052
+ ]
1053
+ }
1054
+ }
1055
+ },
1056
+ &quot;rules&quot;: [
1057
+ {
1058
+ &quot;id&quot;: &quot;review-map-card-text&quot;,
1059
+ &quot;area&quot;: &quot;需求关系图 / 需求流程图&quot;,
1060
+ &quot;target&quot;: &quot;图中每个卡片的正文&quot;,
1061
+ &quot;maxChars&quot;: 30,
1062
+ &quot;action&quot;: &quot;请写入 reviewPresentation.mapNodes.*.text 或 reviewPresentation.flowNodes[].text,重写成用户一眼能扫懂的短句,不要靠省略号或截断。&quot;
1063
+ },
1064
+ {
1065
+ &quot;id&quot;: &quot;review-map-card-title&quot;,
1066
+ &quot;area&quot;: &quot;需求关系图 / 需求流程图&quot;,
1067
+ &quot;target&quot;: &quot;图中卡片标题胶囊&quot;,
1068
+ &quot;maxChars&quot;: 15,
1069
+ &quot;action&quot;: &quot;请写入 reviewPresentation.mapNodes.*.title,重写成短标题,优先使用业务词,不使用内部技术词。&quot;
1070
+ },
1071
+ {
1072
+ &quot;id&quot;: &quot;review-highlight-chip&quot;,
1073
+ &quot;area&quot;: &quot;四个评审卡片&quot;,
1074
+ &quot;target&quot;: &quot;重点摘要胶囊&quot;,
1075
+ &quot;maxChars&quot;: 15,
1076
+ &quot;action&quot;: &quot;请重写成短标签,保留结论,不要堆叠长句。&quot;
1077
+ },
1078
+ {
1079
+ &quot;id&quot;: &quot;review-panel-detail-format&quot;,
1080
+ &quot;area&quot;: &quot;四个评审卡片&quot;,
1081
+ &quot;target&quot;: &quot;明细分点&quot;,
1082
+ &quot;format&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1083
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.&lt;kind&gt;[],把每个明细改写为“加粗短摘要 + 一句话说明”,方便用户先扫重点再读细节。&quot;
1084
+ }
1085
+ ]
1086
+ },
1087
+ &quot;presentationFeedback&quot;: [
1088
+ {
1089
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
1090
+ &quot;area&quot;: &quot;需求关系图&quot;,
1091
+ &quot;target&quot;: &quot;问题定义卡片正文&quot;,
1092
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.problem.text&quot;,
1093
+ &quot;currentChars&quot;: 67,
1094
+ &quot;maxChars&quot;: 30,
1095
+ &quot;currentText&quot;: &quot;修复 OpenPrd verify 边界,避免外部参考目录和 reference discovery 污染主验证,并刷新历史项目生成物&quot;,
1096
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
1097
+ },
1098
+ {
1099
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
1100
+ &quot;area&quot;: &quot;需求关系图&quot;,
1101
+ &quot;target&quot;: &quot;范围卡片正文&quot;,
1102
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.scope.text&quot;,
1103
+ &quot;currentChars&quot;: 45,
1104
+ &quot;maxChars&quot;: 30,
1105
+ &quot;currentText&quot;: &quot;调整 run context 与 run verify 对 discovery 的纳入规则&quot;,
1106
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
1107
+ },
1108
+ {
1109
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
1110
+ &quot;area&quot;: &quot;需求关系图&quot;,
1111
+ &quot;target&quot;: &quot;流程卡片正文&quot;,
1112
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.flow.text&quot;,
1113
+ &quot;currentChars&quot;: 184,
1114
+ &quot;maxChars&quot;: 30,
1115
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external&quot;,
1116
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
1117
+ },
1118
+ {
1119
+ &quot;ruleId&quot;: &quot;review-map-card-text&quot;,
1120
+ &quot;area&quot;: &quot;需求关系图&quot;,
1121
+ &quot;target&quot;: &quot;风险卡片正文&quot;,
1122
+ &quot;jsonPath&quot;: &quot;reviewPresentation.mapNodes.risk.text&quot;,
1123
+ &quot;currentChars&quot;: 76,
1124
+ &quot;maxChars&quot;: 30,
1125
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
1126
+ &quot;action&quot;: &quot;请让 Agent 重新提炼这段内容,生成更短、更完整的表达;不要由 HTML 模板直接裁剪。&quot;
1127
+ },
1128
+ {
1129
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1130
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1131
+ &quot;target&quot;: &quot;明细 1&quot;,
1132
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[0]&quot;,
1133
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1134
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external。&quot;,
1135
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1136
+ },
1137
+ {
1138
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1139
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1140
+ &quot;target&quot;: &quot;明细 2&quot;,
1141
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[1]&quot;,
1142
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1143
+ &quot;currentText&quot;: &quot;reference discovery 仍然混入 run context 或 run verify&quot;,
1144
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[1],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1145
+ },
1146
+ {
1147
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1148
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1149
+ &quot;target&quot;: &quot;明细 3&quot;,
1150
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[2]&quot;,
1151
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1152
+ &quot;currentText&quot;: &quot;standards verify 继续被 research 或 toolkit-sources 之类参考目录的说明书缺口淹没&quot;,
1153
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[2],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1154
+ },
1155
+ {
1156
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1157
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1158
+ &quot;target&quot;: &quot;明细 4&quot;,
1159
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[3]&quot;,
1160
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1161
+ &quot;currentText&quot;: &quot;fleet 更新后历史项目仍保留旧的 verify 噪音行为&quot;,
1162
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[3],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1163
+ },
1164
+ {
1165
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1166
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1167
+ &quot;target&quot;: &quot;明细 1&quot;,
1168
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[0]&quot;,
1169
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1170
+ &quot;currentText&quot;: &quot;维护者运行 openprd run . --context 或 openprd run . --verify 时,只看到当前项目主验证状态;仓库中存在 research、toolkit-sources、marketplace-candidates 等参考目录时,默认不会被当成本项目源码说明书缺口直接淹没结果;维护者可以继续按需显式 classify-external。&quot;,
1171
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1172
+ },
1173
+ {
1174
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1175
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1176
+ &quot;target&quot;: &quot;明细 2&quot;,
1177
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[1]&quot;,
1178
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1179
+ &quot;currentText&quot;: &quot;reference discovery 仍然混入 run context 或 run verify&quot;,
1180
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[1],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1181
+ },
1182
+ {
1183
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1184
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1185
+ &quot;target&quot;: &quot;明细 3&quot;,
1186
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[2]&quot;,
1187
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1188
+ &quot;currentText&quot;: &quot;standards verify 继续被 research 或 toolkit-sources 之类参考目录的说明书缺口淹没&quot;,
1189
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[2],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1190
+ },
1191
+ {
1192
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1193
+ &quot;area&quot;: &quot;主流程与边界情况&quot;,
1194
+ &quot;target&quot;: &quot;明细 4&quot;,
1195
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.flow[3]&quot;,
1196
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1197
+ &quot;currentText&quot;: &quot;fleet 更新后历史项目仍保留旧的 verify 噪音行为&quot;,
1198
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.flow[3],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1199
+ },
1200
+ {
1201
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1202
+ &quot;area&quot;: &quot;开放问题与风险&quot;,
1203
+ &quot;target&quot;: &quot;明细 1&quot;,
1204
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.risk[0]&quot;,
1205
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1206
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
1207
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.risk[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1208
+ },
1209
+ {
1210
+ &quot;ruleId&quot;: &quot;review-panel-detail-format&quot;,
1211
+ &quot;area&quot;: &quot;开放问题与风险&quot;,
1212
+ &quot;target&quot;: &quot;明细 1&quot;,
1213
+ &quot;jsonPath&quot;: &quot;reviewPresentation.panels.risk[0]&quot;,
1214
+ &quot;expectedFormat&quot;: &quot;- **摘要内容**:明细一句话&quot;,
1215
+ &quot;currentText&quot;: &quot;本次只收敛默认边界,不自动猜测每个历史项目全部 external reference 清单;如果某些项目还需要更细的目录级归类,仍由维护者显式确认和补充&quot;,
1216
+ &quot;action&quot;: &quot;请写入 reviewPresentation.panels.risk[0],格式为 { \&quot;summary\&quot;: \&quot;15 字内标签\&quot;, \&quot;detail\&quot;: \&quot;一句话说明\&quot; }。&quot;
1217
+ }
1218
+ ],
1219
+ &quot;exportedAt&quot;: &quot;2026-05-29T17:14:49.721Z&quot;
1220
+ }" title="openprd review . --mark confirmed --version &#39;v0001&#39; --digest &#39;dc988d7a94c07d2a8070968a71ddacffb374eaeee12aa85eb93231e06dd7b077&#39; --work-unit &#39;wu-20260524015648-6d33ded7&#39;">
1221
+ 认可方案
1222
+ </button>
1223
+ </div>
1224
+ </nav>
1225
+
1226
+ <script>
1227
+ async function copyReviewText(text) {
1228
+ try {
1229
+ await navigator.clipboard.writeText(text);
1230
+ } catch (error) {
1231
+ const textarea = document.createElement('textarea');
1232
+ textarea.value = text;
1233
+ textarea.setAttribute('readonly', '');
1234
+ textarea.style.position = 'fixed';
1235
+ textarea.style.left = '-9999px';
1236
+ document.body.appendChild(textarea);
1237
+ textarea.select();
1238
+ document.execCommand('copy');
1239
+ textarea.remove();
1240
+ }
1241
+ }
1242
+ function flashCopied(button) {
1243
+ const old = button.innerHTML;
1244
+ button.textContent = '已复制';
1245
+ setTimeout(() => { button.innerHTML = old; }, 1200);
1246
+ }
1247
+ document.querySelectorAll('[data-copy-value]').forEach((button) => {
1248
+ button.addEventListener('click', async () => {
1249
+ await copyReviewText(button.dataset.copyValue || '');
1250
+ flashCopied(button);
1251
+ });
1252
+ });
1253
+ </script>
1254
+ </main>
1255
+ </body>
1256
+ </html>