dsh-plugin-guide 0.4.4 → 0.4.6

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.
@@ -0,0 +1,82 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1100" height="660" viewBox="0 0 1100 660" role="img" aria-label="dsh-plugin-guide assembly and routing">
2
+ <defs>
3
+ <linearGradient id="lineGrad" x1="0" y1="0" x2="1" y2="0">
4
+ <stop offset="0" stop-color="#4B67B4" stop-opacity=".15"/>
5
+ <stop offset=".5" stop-color="#4B67B4" stop-opacity=".9"/>
6
+ <stop offset="1" stop-color="#4B67B4" stop-opacity=".15"/>
7
+ </linearGradient>
8
+ <filter id="soft" x="-40%" y="-40%" width="180%" height="200%">
9
+ <feDropShadow dx="0" dy="9" stdDeviation="12" flood-color="#1b1735" flood-opacity="0.10"/>
10
+ </filter>
11
+ <pattern id="dots" width="28" height="28" patternUnits="userSpaceOnUse">
12
+ <circle cx="1.3" cy="1.3" r="1.3" fill="#f2f0f8"/>
13
+ </pattern>
14
+ </defs>
15
+ <rect width="1100" height="660" fill="#ffffff"/>
16
+ <rect width="1100" height="660" fill="url(#dots)" opacity=".5"/>
17
+ <text x="50" y="62" fill="#141419" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="32" font-weight="700">dsh-plugin-guide</text>
18
+ <text x="50" y="90" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="16">assembly and routing · the guide asks, dsh-standards decides</text>
19
+ <rect x="50" y="108" width="1000" height="1.6" rx="1" fill="#e6e3f0"/>
20
+ <g filter="url(#soft)">
21
+ <rect x="50" y="190" width="176" height="118" rx="17" fill="#fcfcfe" stroke="#e6e3f0" stroke-width="1.3"/>
22
+ </g>
23
+ <circle cx="74" cy="214" r="12" fill="#ece7f9"/>
24
+ <text x="74" y="219" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="11.5" font-weight="700">01</text>
25
+ <text x="138.0" y="256" text-anchor="middle" fill="#141419" font-family="ui-monospace, monospace" font-size="15.5" font-weight="700">cordis.patch.yml</text>
26
+ <text x="138.0" y="282" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">one inserted row</text>
27
+ <path d="M231 249.0 C241.0 249.0, 241.0 249.0, 251 249.0" stroke="url(#lineGrad)" stroke-width="2.2" fill="none"/>
28
+ <path d="M241 244.0 l8 5 -8 5" fill="none" stroke="#4B67B4" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
29
+ <g filter="url(#soft)">
30
+ <rect x="256" y="190" width="176" height="118" rx="17" fill="#fcfcfe" stroke="#4B67B4" stroke-width="2.6"/>
31
+ </g>
32
+ <circle cx="280" cy="214" r="12" fill="#ece7f9"/>
33
+ <text x="280" y="219" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="11.5" font-weight="700">02</text>
34
+ <text x="344.0" y="256" text-anchor="middle" fill="#141419" font-family="ui-monospace, monospace" font-size="15.5" font-weight="700">index.js</text>
35
+ <text x="344.0" y="282" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">ctx.skills.register</text>
36
+ <path d="M437 249.0 C447.0 249.0, 447.0 249.0, 457 249.0" stroke="url(#lineGrad)" stroke-width="2.2" fill="none"/>
37
+ <path d="M447 244.0 l8 5 -8 5" fill="none" stroke="#4B67B4" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
38
+ <g filter="url(#soft)">
39
+ <rect x="462" y="190" width="176" height="118" rx="17" fill="#fcfcfe" stroke="#e6e3f0" stroke-width="1.3"/>
40
+ </g>
41
+ <circle cx="486" cy="214" r="12" fill="#ece7f9"/>
42
+ <text x="486" y="219" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="11.5" font-weight="700">03</text>
43
+ <text x="550.0" y="256" text-anchor="middle" fill="#141419" font-family="ui-monospace, monospace" font-size="15.5" font-weight="700">SKILL.md</text>
44
+ <text x="550.0" y="282" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">the skill body</text>
45
+ <path d="M643 249.0 C653.0 249.0, 653.0 249.0, 663 249.0" stroke="url(#lineGrad)" stroke-width="2.2" fill="none"/>
46
+ <path d="M653 244.0 l8 5 -8 5" fill="none" stroke="#4B67B4" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
47
+ <g filter="url(#soft)">
48
+ <rect x="668" y="190" width="176" height="118" rx="17" fill="#fcfcfe" stroke="#e6e3f0" stroke-width="1.3"/>
49
+ </g>
50
+ <circle cx="692" cy="214" r="12" fill="#ece7f9"/>
51
+ <text x="692" y="219" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="11.5" font-weight="700">04</text>
52
+ <text x="756.0" y="256" text-anchor="middle" fill="#141419" font-family="ui-monospace, monospace" font-size="15.5" font-weight="700">docs/levels.md</text>
53
+ <text x="756.0" y="282" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">ENTRY / FLOW / BOOST</text>
54
+ <path d="M849 249.0 C859.0 249.0, 859.0 249.0, 869 249.0" stroke="url(#lineGrad)" stroke-width="2.2" fill="none"/>
55
+ <path d="M859 244.0 l8 5 -8 5" fill="none" stroke="#4B67B4" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
56
+ <g filter="url(#soft)">
57
+ <rect x="874" y="190" width="176" height="118" rx="17" fill="#fcfcfe" stroke="#16a34a" stroke-width="2.6"/>
58
+ </g>
59
+ <circle cx="898" cy="214" r="12" fill="#ece7f9"/>
60
+ <text x="898" y="219" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="11.5" font-weight="700">05</text>
61
+ <text x="962.0" y="256" text-anchor="middle" fill="#141419" font-family="ui-monospace, monospace" font-size="15.5" font-weight="700">dsh-standards</text>
62
+ <text x="962.0" y="282" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">dsh-levels verdict</text>
63
+ <g filter="url(#soft)">
64
+ <rect x="256" y="378" width="176" height="58" rx="15" fill="#ece7f9" stroke="#4B67B4" stroke-width="1.2"/>
65
+ </g>
66
+ <text x="344" y="404" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="13" font-weight="700">ENTRY</text>
67
+ <text x="344" y="423" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">installs</text>
68
+ <g filter="url(#soft)">
69
+ <rect x="462" y="378" width="176" height="58" rx="15" fill="#ece7f9" stroke="#4B67B4" stroke-width="1.2"/>
70
+ </g>
71
+ <text x="550" y="404" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="13" font-weight="700">FLOW</text>
72
+ <text x="550" y="423" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">works daily</text>
73
+ <g filter="url(#soft)">
74
+ <rect x="668" y="378" width="176" height="58" rx="15" fill="#ece7f9" stroke="#4B67B4" stroke-width="1.2"/>
75
+ </g>
76
+ <text x="756" y="404" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="13" font-weight="700">BOOST</text>
77
+ <text x="756" y="423" text-anchor="middle" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">faster</text>
78
+ <rect x="50" y="476" width="1000" height="58" rx="15" fill="#fcfcfe" stroke="#e6e3f0"/>
79
+ <text x="74" y="502" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="13" font-weight="700">route / dsh-levels</text>
80
+ <text x="74" y="522" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">the guide explains what to check; the verdict belongs to dsh-standards</text>
81
+ <text x="50" y="596" fill="#4d5261" font-family="ui-monospace, monospace" font-size="13">Apache-2.0 · PerryLink DSH plugin family</text>
82
+ </svg>
@@ -0,0 +1,55 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1100" height="660" viewBox="0 0 1100 660" role="img" aria-label="dsh-plugin-guide three-level ladder ending in a routing arrow">
2
+ <defs>
3
+ <filter id="soft" x="-40%" y="-40%" width="180%" height="200%">
4
+ <feDropShadow dx="0" dy="9" stdDeviation="12" flood-color="#1b1735" flood-opacity="0.55"/>
5
+ </filter>
6
+ <pattern id="dots" width="28" height="28" patternUnits="userSpaceOnUse">
7
+ <circle cx="1.3" cy="1.3" r="1.3" fill="#182031"/>
8
+ </pattern>
9
+ <marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
10
+ <path d="M0 0 L10 5 L0 10 z" fill="#3fb950"/>
11
+ </marker>
12
+ </defs>
13
+ <rect width="1100" height="660" fill="#0d1117"/>
14
+ <rect width="1100" height="660" fill="url(#dots)" opacity=".5"/>
15
+ <text x="50" y="58" fill="#f0f3f9" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="32" font-weight="700">dsh-plugin-guide</text>
16
+ <text x="50" y="86" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="16">three levels, deepening questions · the guide asks, dsh-standards decides</text>
17
+ <text x="50" y="122" fill="#8496f5" font-family="ui-sans-serif, system-ui, sans-serif" font-size="14" font-weight="700" letter-spacing="1.5">ADOPTION DEPTH</text>
18
+ <line x1="38" y1="150" x2="38" y2="482" stroke="#8496f5" stroke-width="2" stroke-dasharray="4 6" opacity=".6"/>
19
+
20
+ <rect x="50" y="150" width="392" height="92" rx="18" fill="#161b26" stroke="#2a3142" stroke-width="1.3" filter="url(#soft)"/>
21
+ <circle cx="82" cy="196" r="17" fill="#242d42"/>
22
+ <text x="82" y="202" text-anchor="middle" fill="#8496f5" font-family="ui-monospace, monospace" font-size="14" font-weight="700">1</text>
23
+ <text x="116" y="186" fill="#f0f3f9" font-family="ui-monospace, monospace" font-size="20" font-weight="700">ENTRY</text>
24
+ <text x="116" y="210" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">入门 · 6 个问题</text>
25
+ <text x="116" y="230" fill="#737b8d" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">能装上、能跑、不崩</text>
26
+ <line x1="38" y1="196" x2="50" y2="196" stroke="#8496f5" stroke-width="1.6" opacity=".35"/>
27
+ <rect x="84" y="268" width="392" height="92" rx="18" fill="#161b26" stroke="#2a3142" stroke-width="1.3" filter="url(#soft)"/>
28
+ <circle cx="116" cy="314" r="17" fill="#242d42"/>
29
+ <text x="116" y="320" text-anchor="middle" fill="#8496f5" font-family="ui-monospace, monospace" font-size="14" font-weight="700">2</text>
30
+ <text x="150" y="304" fill="#f0f3f9" font-family="ui-monospace, monospace" font-size="20" font-weight="700">FLOW</text>
31
+ <text x="150" y="328" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">顺畅 · 7 个问题</text>
32
+ <text x="150" y="348" fill="#737b8d" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">日常任务顺、错误可恢复</text>
33
+ <line x1="38" y1="314" x2="84" y2="314" stroke="#8496f5" stroke-width="1.6" opacity=".35"/>
34
+ <rect x="118" y="386" width="392" height="92" rx="18" fill="#161b26" stroke="#8496f5" stroke-width="2.4" filter="url(#soft)"/>
35
+ <circle cx="150" cy="432" r="17" fill="#242d42"/>
36
+ <text x="150" y="438" text-anchor="middle" fill="#8496f5" font-family="ui-monospace, monospace" font-size="14" font-weight="700">3</text>
37
+ <text x="184" y="422" fill="#f0f3f9" font-family="ui-monospace, monospace" font-size="20" font-weight="700">BOOST</text>
38
+ <text x="184" y="446" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">加速 · 5 个问题</text>
39
+ <text x="184" y="466" fill="#737b8d" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">提效证据可复现</text>
40
+ <line x1="38" y1="432" x2="118" y2="432" stroke="#8496f5" stroke-width="1.6" opacity=".35"/>
41
+ <path d="M510 432 L690 432" stroke="#3fb950" stroke-width="2.6" fill="none" marker-end="url(#arr)"/>
42
+ <text x="512" y="418" fill="#3fb950" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">verdict to</text>
43
+ <rect x="700" y="300" width="350" height="264" rx="20" fill="#161b26" stroke="#3fb950" stroke-width="2.4" filter="url(#soft)"/>
44
+ <text x="726" y="334" fill="#3fb950" font-family="ui-monospace, monospace" font-size="13" font-weight="700">dsh-standards</text>
45
+ <text x="726" y="366" fill="#f0f3f9" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">DSC-01...13 static checks</text>
46
+ <text x="726" y="394" fill="#f0f3f9" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">L1-L3 runtime measurement</text>
47
+ <text x="726" y="422" fill="#f0f3f9" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">dsh-levels verdict</text>
48
+ <line x1="726" y1="444" x2="1024" y2="444" stroke="#182031" stroke-width="2"/>
49
+ <text x="726" y="470" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">certification, scoring, ranking: none of them here</text>
50
+ <text x="726" y="494" fill="#737b8d" font-family="ui-monospace, monospace" font-size="12">guide asks · standards decides</text>
51
+ <text x="726" y="530" fill="#8496f5" font-family="ui-monospace, monospace" font-size="12">ENTRY / FLOW / BOOST</text>
52
+ <rect x="50" y="560" width="1000" height="52" rx="14" fill="#121824" stroke="#2a3142"/>
53
+ <text x="74" y="582" fill="#8496f5" font-family="ui-monospace, monospace" font-size="12.5" font-weight="700">route / dsh-levels</text>
54
+ <text x="74" y="602" fill="#a8b1c4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">every question has an owner: the guide says what to check, the verdict belongs to the checker</text>
55
+ </svg>
@@ -0,0 +1,55 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1100" height="660" viewBox="0 0 1100 660" role="img" aria-label="dsh-plugin-guide three-level ladder ending in a routing arrow">
2
+ <defs>
3
+ <filter id="soft" x="-40%" y="-40%" width="180%" height="200%">
4
+ <feDropShadow dx="0" dy="9" stdDeviation="12" flood-color="#1b1735" flood-opacity="0.10"/>
5
+ </filter>
6
+ <pattern id="dots" width="28" height="28" patternUnits="userSpaceOnUse">
7
+ <circle cx="1.3" cy="1.3" r="1.3" fill="#f2f0f8"/>
8
+ </pattern>
9
+ <marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
10
+ <path d="M0 0 L10 5 L0 10 z" fill="#16a34a"/>
11
+ </marker>
12
+ </defs>
13
+ <rect width="1100" height="660" fill="#ffffff"/>
14
+ <rect width="1100" height="660" fill="url(#dots)" opacity=".5"/>
15
+ <text x="50" y="58" fill="#141419" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="32" font-weight="700">dsh-plugin-guide</text>
16
+ <text x="50" y="86" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="16">three levels, deepening questions · the guide asks, dsh-standards decides</text>
17
+ <text x="50" y="122" fill="#4B67B4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="14" font-weight="700" letter-spacing="1.5">ADOPTION DEPTH</text>
18
+ <line x1="38" y1="150" x2="38" y2="482" stroke="#4B67B4" stroke-width="2" stroke-dasharray="4 6" opacity=".6"/>
19
+
20
+ <rect x="50" y="150" width="392" height="92" rx="18" fill="#ffffff" stroke="#e6e3f0" stroke-width="1.3" filter="url(#soft)"/>
21
+ <circle cx="82" cy="196" r="17" fill="#ece7f9"/>
22
+ <text x="82" y="202" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="14" font-weight="700">1</text>
23
+ <text x="116" y="186" fill="#141419" font-family="ui-monospace, monospace" font-size="20" font-weight="700">ENTRY</text>
24
+ <text x="116" y="210" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">入门 · 6 个问题</text>
25
+ <text x="116" y="230" fill="#8f94a4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">能装上、能跑、不崩</text>
26
+ <line x1="38" y1="196" x2="50" y2="196" stroke="#4B67B4" stroke-width="1.6" opacity=".35"/>
27
+ <rect x="84" y="268" width="392" height="92" rx="18" fill="#ffffff" stroke="#e6e3f0" stroke-width="1.3" filter="url(#soft)"/>
28
+ <circle cx="116" cy="314" r="17" fill="#ece7f9"/>
29
+ <text x="116" y="320" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="14" font-weight="700">2</text>
30
+ <text x="150" y="304" fill="#141419" font-family="ui-monospace, monospace" font-size="20" font-weight="700">FLOW</text>
31
+ <text x="150" y="328" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">顺畅 · 7 个问题</text>
32
+ <text x="150" y="348" fill="#8f94a4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">日常任务顺、错误可恢复</text>
33
+ <line x1="38" y1="314" x2="84" y2="314" stroke="#4B67B4" stroke-width="1.6" opacity=".35"/>
34
+ <rect x="118" y="386" width="392" height="92" rx="18" fill="#ffffff" stroke="#4B67B4" stroke-width="2.4" filter="url(#soft)"/>
35
+ <circle cx="150" cy="432" r="17" fill="#ece7f9"/>
36
+ <text x="150" y="438" text-anchor="middle" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="14" font-weight="700">3</text>
37
+ <text x="184" y="422" fill="#141419" font-family="ui-monospace, monospace" font-size="20" font-weight="700">BOOST</text>
38
+ <text x="184" y="446" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="15">加速 · 5 个问题</text>
39
+ <text x="184" y="466" fill="#8f94a4" font-family="ui-sans-serif, system-ui, sans-serif" font-size="12.5">提效证据可复现</text>
40
+ <line x1="38" y1="432" x2="118" y2="432" stroke="#4B67B4" stroke-width="1.6" opacity=".35"/>
41
+ <path d="M510 432 L690 432" stroke="#16a34a" stroke-width="2.6" fill="none" marker-end="url(#arr)"/>
42
+ <text x="512" y="418" fill="#16a34a" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">verdict to</text>
43
+ <rect x="700" y="300" width="350" height="264" rx="20" fill="#ffffff" stroke="#16a34a" stroke-width="2.4" filter="url(#soft)"/>
44
+ <text x="726" y="334" fill="#16a34a" font-family="ui-monospace, monospace" font-size="13" font-weight="700">dsh-standards</text>
45
+ <text x="726" y="366" fill="#141419" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">DSC-01...13 static checks</text>
46
+ <text x="726" y="394" fill="#141419" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">L1-L3 runtime measurement</text>
47
+ <text x="726" y="422" fill="#141419" font-family="ui-sans-serif, system-ui, sans-serif" font-size="17">dsh-levels verdict</text>
48
+ <line x1="726" y1="444" x2="1024" y2="444" stroke="#f2f0f8" stroke-width="2"/>
49
+ <text x="726" y="470" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">certification, scoring, ranking: none of them here</text>
50
+ <text x="726" y="494" fill="#8f94a4" font-family="ui-monospace, monospace" font-size="12">guide asks · standards decides</text>
51
+ <text x="726" y="530" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="12">ENTRY / FLOW / BOOST</text>
52
+ <rect x="50" y="560" width="1000" height="52" rx="14" fill="#f7f5fc" stroke="#e6e3f0"/>
53
+ <text x="74" y="582" fill="#4B67B4" font-family="ui-monospace, monospace" font-size="12.5" font-weight="700">route / dsh-levels</text>
54
+ <text x="74" y="602" fill="#4d5261" font-family="ui-sans-serif, system-ui, sans-serif" font-size="13">every question has an owner: the guide says what to check, the verdict belongs to the checker</text>
55
+ </svg>
package/docs/flow.md CHANGED
@@ -32,42 +32,114 @@ a rewrite is detectable.
32
32
  "schema": "dsh-flow-evidence/2",
33
33
  "evidenceId": "01JCM8Z6R4W1V2K3N4P5Q6R7S8",
34
34
  "generatedAt": "2026-11-06T12:00:00Z",
35
- "producer": { "kind": "local", "runner": "flow-collect 0.1.0", "runUrl": null, "actor": "author" },
35
+ "producer": {
36
+ "command": [
37
+ "node",
38
+ "40-checker/bin/dsh-flow-collect.mjs",
39
+ "--package",
40
+ "."
41
+ ],
42
+ "at": "2026-11-06T12:00:00Z",
43
+ "kind": "local",
44
+ "runner": "flow-collect 0.1.0",
45
+ "actor": "author"
46
+ },
36
47
  "subject": {
37
- "package": "@acme/dsh-hello",
48
+ "name": "@acme/dsh-hello",
38
49
  "version": "0.1.0",
39
50
  "source": "npm",
40
- "integrity": "sha512-…",
41
- "tarballSha256": "sha256:…",
51
+ "integrity": "sha512-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
52
+ "tarballSha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
42
53
  "commit": "ce7073d51254c26cd63b22a60835b8f948deb447",
43
- "treeSha256": "sha256:…"
54
+ "treeSha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
55
+ "treeStable": true
56
+ },
57
+ "host": {
58
+ "dsh": "0.2.2-alpha.2",
59
+ "dshCommit": null,
60
+ "cordis": "4.0.6-alpha.1",
61
+ "node": "v24.11.0",
62
+ "platform": "linux-x64"
44
63
  },
45
- "host": { "dsh": "0.2.2-alpha.2", "dshCommit": null, "cordis": "4.0.6-alpha.1", "node": "v24.11.0", "platform": "linux-x64" },
46
64
  "journeys": {
47
65
  "J1": {
48
66
  "status": "pass",
49
- "kind": "observed",
67
+ "limitations": [],
50
68
  "checks": [
51
69
  {
52
70
  "id": "J1.install",
53
- "status": "pass",
54
- "command": ["dsh", "plugin", "add", "."],
71
+ "kind": "observed",
72
+ "command": [
73
+ "dsh",
74
+ "plugin",
75
+ "add",
76
+ "."
77
+ ],
55
78
  "exitCode": 0,
56
79
  "startedAt": "2026-11-06T11:00:01Z",
57
80
  "endedAt": "2026-11-06T11:00:09Z",
58
- "stdout": { "path": "logs/J1.install.out", "sha256": "sha256:…" },
59
- "assertions": [{ "claim": "row visible in dump", "observed": true }]
81
+ "stdout": {
82
+ "path": "logs/J1.install.out",
83
+ "sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
84
+ },
85
+ "assertions": [
86
+ {
87
+ "claim": "row visible in dump",
88
+ "observed": true
89
+ }
90
+ ],
91
+ "durationMs": 8000
60
92
  }
61
- ],
62
- "limitations": []
93
+ ]
94
+ },
95
+ "J2": {
96
+ "status": "not-run",
97
+ "reason": "not collected in this example",
98
+ "checks": []
99
+ },
100
+ "J3": {
101
+ "status": "not-run",
102
+ "reason": "not collected in this example",
103
+ "checks": []
104
+ },
105
+ "J4": {
106
+ "status": "not-run",
107
+ "reason": "not collected in this example",
108
+ "checks": []
109
+ },
110
+ "J5": {
111
+ "status": "not-run",
112
+ "reason": "not collected in this example",
113
+ "checks": []
63
114
  },
64
- "J8": { "status": "na", "reason": "no dsh.client" }
115
+ "J6": {
116
+ "status": "not-run",
117
+ "reason": "not collected in this example",
118
+ "checks": []
119
+ },
120
+ "J7": {
121
+ "status": "not-run",
122
+ "reason": "not collected in this example",
123
+ "checks": []
124
+ },
125
+ "J8": {
126
+ "status": "na",
127
+ "reason": "no dsh.client",
128
+ "checks": []
129
+ }
130
+ },
131
+ "claims": {
132
+ "claimLevel": "self-attested",
133
+ "notClaimed": [
134
+ "certification",
135
+ "security audit"
136
+ ],
137
+ "method": "structural example: one observed J1 run; J2-J8 not collected"
65
138
  },
66
- "totals": { "pass": 7, "na": 1, "fail": 0 },
67
- "conclusion": "flow-pass",
68
- "claims": { "claimLevel": "self-attested", "notClaimed": ["certification", "security audit"] },
69
- "chain": { "seq": 12, "prev": "sha256:…", "entrySha256": "sha256:…" },
70
- "signature": null
139
+ "conclusion": "flow-warn",
140
+ "chain": {
141
+ "evidenceHash": "sha256:ee0364bfd26362dca8265c04b7609f6d489c100826c4778e46a1f9f56f3aa138"
142
+ }
71
143
  }
72
144
  ```
73
145
 
@@ -93,40 +165,22 @@ Honesty rules for the file itself:
93
165
  Put the limitation in `limitations[]` instead of dropping the row.
94
166
 
95
167
  <a id="what-the-checker-reads"></a>
96
- ### What reads this file today
97
-
98
- `dsh-levels --flow-evidence` does **not** read the nested v2 shape yet. Its
99
- reader wants a flat map and only reads `status`:
100
-
101
- ```json
102
- {
103
- "J1": { "status": "pass", "evidence": "add → dump → remove; logs/J1.*.out" },
104
- "J2": { "status": "pass", "evidence": "same row id disable/enable; two dumps" }
105
- }
106
- ```
107
-
108
- - Accepted values are `pass`, `fail`, `not-run`, `manual`. Anything else,
109
- including `na` and `warn`, is silently downgraded to `not-run`.
110
- - FLOW becomes `runtime` only at **8/8 pass**. One `na` gives `7/8` and
111
- `not-run` — which is the honest answer for a package with no client, but it
112
- is not a pass.
113
- - The flat map has no binding, no hash, and no host. A hand-written 8-pass file
114
- passes. That is why the v2 file above exists: keep the flat map as the
115
- projection, and keep the v2 file plus logs as the thing you can defend.
116
-
117
- Project the v2 file to the flat map before running the audit:
118
-
119
- ```sh
120
- node -e '
121
- const fs = require("node:fs");
122
- const evidence = require("./flow-evidence.json");
123
- const flat = {};
124
- for (const [id, journey] of Object.entries(evidence.journeys)) {
125
- flat[id] = { status: journey.status, evidence: journey.reason ?? journey.checks?.[0]?.id ?? null };
126
- }
127
- fs.writeFileSync("flow-flat.json", JSON.stringify(flat, null, 2));
128
- '
129
- ```
168
+ ### What reads this file
169
+
170
+ `dsh-levels --flow-evidence` reads this nested shape directly since
171
+ `dsh-standards` 1.3.0. The flat `{ "J1": { "status": "pass" } }` map and the
172
+ older `dsh-flow-journey/1` / `dsh-flow-runtime/1` files are `deprecated` and
173
+ never count as a pass.
174
+
175
+ - Every journey claimed as `pass` needs at least one `checks[]` entry with
176
+ `exitCode: 0`, an observed (non-`static`) kind, and a log hash.
177
+ - `na` is a skip with a reason, not a pass. A package with no client ends at
178
+ 7/8 and `not-run` — that is the honest answer.
179
+ - `runtime` is reserved for `sandbox-attested` evidence (`producer.kind =
180
+ "sandbox"` or `claims.claimLevel = "sandbox-attested"`). Self-attested or CI
181
+ evidence keeps its pass count but lands on `not-run`.
182
+ - The file binds subject, host, and a recomputable `chain.evidenceHash`; a
183
+ hand-written flat 8-pass file no longer passes.
130
184
 
131
185
  <a id="minimum-evidence-per-journey"></a>
132
186
  ## Minimum evidence per journey
@@ -186,7 +240,7 @@ the audit is
186
240
  The three-layer audit reads FLOW evidence through `--flow-evidence`:
187
241
 
188
242
  ```sh
189
- npx -p dsh-standards dsh-levels ./my-plugin --flow-evidence flow-flat.json --format json
243
+ npx -p dsh-standards dsh-levels ./my-plugin --flow-evidence flow-evidence.json --format json
190
244
  ```
191
245
 
192
246
  ## Author checklist
package/docs/rules.md CHANGED
@@ -22,8 +22,8 @@ incomplete/not-run, `3` usage error. `WARN` is not a clean pass and
22
22
  The JSON report also carries a sibling `advice[]` array: one entry per live
23
23
  detail, with `title`, `why`, `fix`, `docsUrl`, `severity`, and `evidence`. It is
24
24
  additive and never changes the verdict (turn it off with `--no-advice`). The
25
- `docsUrl` is built from a release-pinned base (`v0.4.3` in the current rule
26
- table); if it points at an older page, this table is the current mapping.
25
+ `docsUrl` follows the checker's `DOCS_BASE` (currently `v0.4.4`); if it points
26
+ at an older page, this table is the current mapping.
27
27
 
28
28
  <a id="scope-matrix"></a>
29
29
  ## Which checks run in which scope
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-guide",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "description": "A practical guide to DSH plugin quality: ENTRY checks, FLOW checks, and BOOST guidance. Community guide; not official, not a certification, not a ranking.",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/README-zh.md DELETED
@@ -1,82 +0,0 @@
1
- <div align="center">
2
-
3
- # dsh-plugin-guide
4
-
5
- **DSH 插件质量指南:ENTRY、FLOW、BOOST。**
6
-
7
- 社区指南,不是官方标准、不是认证、不是排名。
8
-
9
- [![npm](https://img.shields.io/npm/v/dsh-plugin-guide)](https://www.npmjs.com/package/dsh-plugin-guide)
10
- [![CI](https://github.com/PerryLink/dsh-plugin-guide/actions/workflows/verify.yml/badge.svg)](https://github.com/PerryLink/dsh-plugin-guide/actions/workflows/verify.yml)
11
- [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
-
13
- [English](README.md) · [简体中文](README-zh.md)
14
-
15
- </div>
16
-
17
- ---
18
-
19
- ## 这是什么
20
-
21
- `dsh-plugin-guide` 是 DSH 插件的**指南层**:解释要检查什么、为什么重要,以及
22
- 判定应该由哪个工具负责。它不做认证、不打分、不排名。
23
-
24
- | 包 | 角色 |
25
- |---|---|
26
- | **`dsh-plugin-guide`** | 本包:文字指南、三层地图、agent skill |
27
- | **`dsh-standards`** | 执行总包:ENTRY/FLOW 检查、三层审计、规范文件 |
28
- | **`dsh-plugin-spec`** | 底层规则文本与条款来源 |
29
- | **`dsh-primer`** | 旧的构建/脚手架技能和 CLI(原 `dsh-plugin-guide` 0.3.x) |
30
-
31
- ## 三层
32
-
33
- | 层 | 回答 | 能否判定 |
34
- |---|---|---|
35
- | **ENTRY** | 能不能被识别、安装、启动 | 能:recognized / runtime / failed / incomplete / unavailable |
36
- | **FLOW** | 用户能不能装、配、用、升级、卸载 | 有 runtime 证据时能;否则 `not-run` |
37
- | **BOOST** | 有没有用好 Cordis | 不给插件级判定;按实践登记证据 |
38
-
39
- 三条轨道,不是三个等级;它们相加不等于分数或证书。
40
-
41
- 先读一页地图:[docs/levels.md](docs/levels.md)。
42
-
43
- ## 安装
44
-
45
- ```sh
46
- dsh plugin --profile web add dsh-plugin-guide
47
- ```
48
-
49
- 然后在审查插件时让 agent 使用 `dsh-plugin-guide` 技能。它会将检查交给
50
- `dsh-standards`,将构建/脚手架工作指向 `dsh-primer`。
51
-
52
- ## 检查插件
53
-
54
- ```sh
55
- # 只做 ENTRY 识别(不声明 runtime)
56
- npx dsh-standards ./my-plugin --scope entry --entry-claim static
57
-
58
- # 三层审计;没跑的层保持 not-run / not-measured
59
- npx -p dsh-standards dsh-levels ./my-plugin --format json
60
- ```
61
-
62
- `recognized` 不是通过,`static` 不是通过,`not-run` 也不是通过。
63
-
64
- ## 0.4.0 改了什么
65
-
66
- - 旧的 agent skill 和 `dsh-plugin-dev` CLI 已迁到
67
- [`dsh-primer`](https://github.com/PerryLink/dsh-primer)。
68
- - 本包现在是**指南层**:三层地图、检查路由、证据规则。
69
- - 旧 0.3.x npm 版本已标记 deprecated,已有安装仍可用;0.4.0 是产品切换,
70
- 锁在 `^0.3` 的用户不会自动升级。
71
- - 检查在 [`dsh-standards`](https://github.com/PerryLink/dsh-standards),不在本包。
72
-
73
- ## 边界
74
-
75
- - 不做官方背书、认证、认可或安全审计。
76
- - 不做评分、排名或市场门禁。
77
- - 不伪造 runtime 证据:`static` ≠ `runtime`,`not-run` ≠ `pass`。
78
- - BOOST 是建议和证据,不是插件等级。
79
-
80
- ## 许可
81
-
82
- Apache-2.0。见 [LICENSE](LICENSE) 与 [NOTICE.md](NOTICE.md)。