@mjasnikovs/pi-task 0.24.3 → 0.24.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/assets/card.png +0 -0
- package/assets/card.svg +39 -0
- package/assets/hero.png +0 -0
- package/assets/hero.svg +50 -85
- package/dist/task/final-gate.d.ts +57 -6
- package/dist/task/final-gate.js +72 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|
|
|
5
5
|
# pi-task
|
|
6
6
|
|
package/assets/card.png
ADDED
|
Binary file
|
package/assets/card.svg
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Liberation Sans', Arial, sans-serif" role="img" aria-label="pi-task — Deterministic AI Workflows. Five fixed phases: refine, research, grill, compose, critique.">
|
|
2
|
+
<defs>
|
|
3
|
+
<clipPath id="frame"><rect x="0" y="0" width="960" height="600"/></clipPath>
|
|
4
|
+
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
|
5
|
+
<stop offset="0" stop-color="#0d1117"/><stop offset="1" stop-color="#010409"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="hl" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
+
<stop offset="0" stop-color="#b183f9"/><stop offset="1" stop-color="#8957e5"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
</defs>
|
|
11
|
+
<rect width="960" height="600" fill="url(#bg)"/><g clip-path="url(#frame)" fill="none" stroke="#a371f7" stroke-linecap="round" stroke-linejoin="round" opacity="0.26"><path d="M224.4 600.0L252.1 539.1L270.6 559.4L302.9 486.3L326.0 506.6L356.1 451.8L383.8 470.1L411.5 423.4L432.3 437.6L455.4 397.0L473.9 439.6L492.4 421.4L520.1 478.2L543.2 462.0L577.8 516.8L603.2 500.5L631.0 553.3L654.1 537.1L686.4 600.0" stroke-width="1.4" opacity="0.16"/><path d="M666.6 600.0L692.7 547.5L710.2 565.0L740.7 502.0L762.4 519.5L790.7 472.3L816.9 488.0L843.0 447.8L862.6 460.0L884.4 425.0L901.8 461.8L919.2 446.0L945.4 495.0L967.2 481.0L999.8 528.3L1023.8 514.3L1049.9 559.8L1071.7 545.8L1102.2 600.0" stroke-width="1.4" opacity="0.16"/><path d="M660.0 250.0L330.0 600M660.0 250.0L412.5 600M660.0 250.0L495.0 600M660.0 250.0L577.5 600M660.0 250.0L660.0 600M660.0 250.0L742.5 600M660.0 250.0L825.0 600M660.0 250.0L907.5 600M660.0 250.0L990.0 600" stroke-width="1" opacity="0.1"/><path d="M369.6 495.0L369.6 600M396.0 530.0L396.0 600M442.2 404.0L442.2 600M475.2 439.0L475.2 600M518.1 344.5L518.1 600M557.7 376.0L557.7 600M597.3 295.5L597.3 600M627.0 320.0L627.0 600M660.0 250.0L660.0 600M686.4 323.5L686.4 600M712.8 292.0L712.8 600M752.4 390.0L752.4 600M785.4 362.0L785.4 600M834.9 456.5L834.9 600M871.2 428.5L871.2 600M910.8 519.5L910.8 600M943.8 491.5L943.8 600" stroke-width="1" opacity="0.13"/><path d="M330.0 600.0L369.6 495.0L396.0 530.0L442.2 404.0L475.2 439.0L518.1 344.5L557.7 376.0L597.3 295.5L627.0 320.0L660.0 250.0L686.4 323.5L712.8 292.0L752.4 390.0L785.4 362.0L834.9 456.5L871.2 428.5L910.8 519.5L943.8 491.5L990.0 600.0" stroke-width="2.2" opacity="0.55"/><path d="M330.0 600.0L396.0 530.0L475.2 439.0L557.7 376.0L627.0 320.0L660.0 250.0" stroke-width="1.8" stroke-dasharray="7 6" opacity="0.75"/><circle cx="330.0" cy="600.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="396.0" cy="530.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="475.2" cy="439.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="557.7" cy="376.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="627.0" cy="320.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="660.0" cy="250.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/></g>
|
|
12
|
+
<g transform="translate(44,28) scale(0.95)" fill="none" stroke="#a371f7" stroke-width="2.21" stroke-linecap="round" stroke-linejoin="round">
|
|
13
|
+
<path d="M30.18 4.98A20 20 0 1 0 41.66 14.61"/>
|
|
14
|
+
<path d="M13.5 17H34.5M19.5 17V32M28.5 17V32"/>
|
|
15
|
+
</g>
|
|
16
|
+
<text x="98" y="62" font-size="36" font-weight="700" fill="#e6edf3" letter-spacing="-0.5">pi-task</text>
|
|
17
|
+
<text x="44" y="258" font-size="104" font-weight="700" fill="#e6edf3" letter-spacing="-4">Deterministic</text>
|
|
18
|
+
<text x="44" y="372" font-size="104" font-weight="700" fill="url(#hl)" letter-spacing="-4">AI Workflows.</text>
|
|
19
|
+
<rect x="44" y="404" width="104" height="7" rx="3.5" fill="#8957e5"/>
|
|
20
|
+
<rect x="98.2" y="452" width="66" height="66" rx="14.5" fill="#1e1633" stroke="#a371f7" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
21
|
+
<g transform="translate(113.8,467.6) scale(1.45)" fill="none" stroke="#a371f7" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M9 13h6M9 17h4"/></g>
|
|
22
|
+
<text x="131.2" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">REFINE</text>
|
|
23
|
+
<path d="M208.4 485h20M222.4 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
24
|
+
<rect x="272.6" y="452" width="66" height="66" rx="14.5" fill="#0d2440" stroke="#58a6ff" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
25
|
+
<g transform="translate(288.2,467.6) scale(1.45)" fill="none" stroke="#58a6ff" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M20.5 20.5 16 16"/></g>
|
|
26
|
+
<text x="305.6" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">RESEARCH</text>
|
|
27
|
+
<path d="M382.8 485h20M396.8 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
28
|
+
<rect x="447.0" y="452" width="66" height="66" rx="14.5" fill="#33172a" stroke="#f778ba" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
29
|
+
<g transform="translate(462.6,467.6) scale(1.45)" fill="none" stroke="#f778ba" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 11.5a8.5 8.5 0 0 1-8.5 8.5 8.4 8.4 0 0 1-3.8-.9L3.5 21l1.9-4.7a8.4 8.4 0 0 1-.9-3.8 8.5 8.5 0 0 1 8.5-8.5 8.5 8.5 0 0 1 7.5 7.5z"/><path d="M9.6 9.4a2.6 2.6 0 0 1 5 .9c0 1.7-2.5 2.6-2.5 2.6"/><path d="M12 16.4h.01"/></g>
|
|
30
|
+
<text x="480.0" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">GRILL</text>
|
|
31
|
+
<path d="M557.2 485h20M571.2 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
32
|
+
<rect x="621.4" y="452" width="66" height="66" rx="14.5" fill="#0f2a1b" stroke="#3fb950" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
33
|
+
<g transform="translate(637.0,467.6) scale(1.45)" fill="none" stroke="#3fb950" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M12.5 20.5H21"/><path d="M16.7 3.6a2.1 2.1 0 0 1 3 3L7.5 18.8 3.5 20l1.2-4z"/></g>
|
|
34
|
+
<text x="654.4" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">COMPOSE</text>
|
|
35
|
+
<path d="M731.6 485h20M745.6 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
36
|
+
<rect x="795.8" y="452" width="66" height="66" rx="14.5" fill="#2d2410" stroke="#d29922" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
37
|
+
<g transform="translate(811.4,467.6) scale(1.45)" fill="none" stroke="#d29922" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21.5s7.5-3.8 7.5-9.5V5.2L12 2.5 4.5 5.2V12c0 5.7 7.5 9.5 7.5 9.5z"/></g>
|
|
38
|
+
<text x="828.8" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">CRITIQUE</text>
|
|
39
|
+
</svg>
|
package/assets/hero.png
CHANGED
|
Binary file
|
package/assets/hero.svg
CHANGED
|
@@ -1,92 +1,57 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif" role="img" aria-label="pi-task
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Liberation Sans', Arial, sans-serif" role="img" aria-label="pi-task — Deterministic AI Workflows. Every request runs a fixed pipeline: refine to clarify and structure it, research to gather information in parallel, grill to cross-examine the findings, compose to write the implementation spec, critique to check it for quality and completeness.">
|
|
2
2
|
<defs>
|
|
3
|
-
<clipPath id="frame"><rect x="
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
.arw { fill:none; stroke:#6e7681; stroke-width:2.07; stroke-linecap:round; stroke-linejoin:round; }
|
|
10
|
-
</style>
|
|
11
|
-
</defs>
|
|
12
|
-
|
|
13
|
-
<rect x="6" y="6" width="948" height="588" rx="18" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
|
|
14
|
-
|
|
15
|
-
<!-- ── watermark ── -->
|
|
16
|
-
<defs>
|
|
17
|
-
<linearGradient id="mtFade" gradientUnits="userSpaceOnUse" x1="6" y1="0" x2="688" y2="0">
|
|
18
|
-
<stop offset="0" stop-color="#fff" stop-opacity="1"/>
|
|
19
|
-
<stop offset="0.55" stop-color="#fff" stop-opacity="0.9"/>
|
|
20
|
-
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
|
|
3
|
+
<clipPath id="frame"><rect x="0" y="0" width="960" height="600"/></clipPath>
|
|
4
|
+
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
|
5
|
+
<stop offset="0" stop-color="#0d1117"/><stop offset="1" stop-color="#010409"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="hl" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
+
<stop offset="0" stop-color="#b183f9"/><stop offset="1" stop-color="#8957e5"/>
|
|
21
9
|
</linearGradient>
|
|
22
|
-
<mask id="mtMask"><rect x="0" y="0" width="960" height="600" fill="url(#mtFade)"/></mask>
|
|
23
10
|
</defs>
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
<path d="M264.1 330.1L6.0 594.0M264.1 330.1L130.7 594.0M264.1 330.1L255.4 594.0M264.1 330.1L380.1 594.0M264.1 330.1L504.8 594.0M264.1 330.1L629.5 594.0" stroke-width="1" opacity="0.08"/>
|
|
27
|
-
<path d="M56.8 538.9L56.8 594.0M95.9 556.3L95.9 594.0M148.1 475.1L148.1 594.0M191.6 495.4L191.6 594.0M226.4 405.5L226.4 594.0M264.1 330.1L264.1 594.0M290.2 382.3L290.2 594.0M316.3 364.9L316.3 594.0M351.1 443.2L351.1 594.0M385.9 422.9L385.9 594.0M423.6 489.6L423.6 594.0M458.4 469.3L458.4 594.0M499.0 530.2L499.0 594.0M539.6 515.7L539.6 594.0M586.0 567.9L586.0 594.0" stroke-width="1" opacity="0.07"/>
|
|
28
|
-
<path d="M6.0 594.0L56.8 538.9L95.9 556.3L148.1 475.1L191.6 495.4L226.4 405.5L264.1 330.1L290.2 382.3L316.3 364.9L351.1 443.2L385.9 422.9L423.6 489.6L458.4 469.3L499.0 530.2L539.6 515.7L586.0 567.9L629.5 594.0" stroke-width="2" opacity="0.30"/>
|
|
29
|
-
<circle cx="6.0" cy="594.0" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
30
|
-
<circle cx="148.1" cy="475.1" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
31
|
-
<circle cx="264.1" cy="330.1" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
32
|
-
<circle cx="351.1" cy="443.2" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
33
|
-
<circle cx="458.4" cy="469.3" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
34
|
-
<circle cx="586.0" cy="567.9" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
|
|
35
|
-
</g>
|
|
36
|
-
|
|
37
|
-
<!-- ── logo lockup · π in a broken circle, drawn as paths (no font dependency) ── -->
|
|
38
|
-
<g transform="translate(371,59) scale(1.2500)" fill="none" stroke="#a371f7" stroke-width="2.40" stroke-linecap="round" stroke-linejoin="round">
|
|
11
|
+
<rect width="960" height="600" fill="url(#bg)"/><g clip-path="url(#frame)" fill="none" stroke="#a371f7" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"><path d="M137.6 600.0L164.5 560.3L182.4 573.6L213.8 525.9L236.2 539.2L265.3 503.5L292.2 515.4L319.0 485.0L339.2 494.2L361.6 467.8L379.5 495.5L397.4 483.6L424.3 520.7L446.7 510.1L480.3 545.8L505.0 535.2L531.8 569.6L554.2 559.0L585.6 600.0" stroke-width="1.4" opacity="0.16"/><path d="M566.4 600.0L591.7 565.8L608.6 577.2L638.2 536.2L659.3 547.6L686.8 516.8L712.1 527.0L737.5 500.8L756.5 508.8L777.6 486.0L794.5 509.9L811.4 499.7L836.7 531.6L857.9 522.5L889.5 553.3L912.8 544.1L938.1 573.8L959.2 564.7L988.8 600.0" stroke-width="1.4" opacity="0.16"/><path d="M560.0 372.0L240.0 600M560.0 372.0L320.0 600M560.0 372.0L400.0 600M560.0 372.0L480.0 600M560.0 372.0L560.0 600M560.0 372.0L640.0 600M560.0 372.0L720.0 600M560.0 372.0L800.0 600M560.0 372.0L880.0 600" stroke-width="1" opacity="0.1"/><path d="M278.4 531.6L278.4 600M304.0 554.4L304.0 600M348.8 472.3L348.8 600M380.8 495.1L380.8 600M422.4 433.6L422.4 600M460.8 454.1L460.8 600M499.2 401.6L499.2 600M528.0 417.6L528.0 600M560.0 372.0L560.0 600M585.6 419.9L585.6 600M611.2 399.4L611.2 600M649.6 463.2L649.6 600M681.6 445.0L681.6 600M729.6 506.5L729.6 600M764.8 488.3L764.8 600M803.2 547.6L803.2 600M835.2 529.3L835.2 600" stroke-width="1" opacity="0.13"/><path d="M240.0 600.0L278.4 531.6L304.0 554.4L348.8 472.3L380.8 495.1L422.4 433.6L460.8 454.1L499.2 401.6L528.0 417.6L560.0 372.0L585.6 419.9L611.2 399.4L649.6 463.2L681.6 445.0L729.6 506.5L764.8 488.3L803.2 547.6L835.2 529.3L880.0 600.0" stroke-width="2.2" opacity="0.55"/><path d="M240.0 600.0L304.0 554.4L380.8 495.1L460.8 454.1L528.0 417.6L560.0 372.0" stroke-width="1.8" stroke-dasharray="7 6" opacity="0.75"/><circle cx="240.0" cy="600.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="304.0" cy="554.4" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="380.8" cy="495.1" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="460.8" cy="454.1" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="528.0" cy="417.6" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="560.0" cy="372.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><path d="M560.0 372.0L560.0 324.0" stroke-width="2.6" opacity="0.95"/><path d="M560.0 324.0h44l-10 13h-34z" fill="#8957e5" stroke="none"/><text x="575.0" y="335.0" font-size="15" font-weight="700" fill="#fff" stroke="none">π</text></g>
|
|
12
|
+
<g transform="translate(44,34) scale(0.82)" fill="none" stroke="#a371f7" stroke-width="2.56" stroke-linecap="round" stroke-linejoin="round">
|
|
39
13
|
<path d="M30.18 4.98A20 20 0 1 0 41.66 14.61"/>
|
|
40
14
|
<path d="M13.5 17H34.5M19.5 17V32M28.5 17V32"/>
|
|
41
15
|
</g>
|
|
42
|
-
<text x="
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<
|
|
46
|
-
<text x="
|
|
47
|
-
<text x="
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<
|
|
51
|
-
<
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<
|
|
57
|
-
<
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
<text x="
|
|
66
|
-
<
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<
|
|
72
|
-
<
|
|
73
|
-
<
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
<
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
</
|
|
83
|
-
<text x="662" y="509.8" class="ph">critique</text>
|
|
84
|
-
<path class="arw" d="M732 503.5h17.2M743.5 496.8l6.7 6.7-6.7 6.7"/>
|
|
85
|
-
<g transform="translate(766,492.5) scale(0.9167)" stroke="#3fb950">
|
|
86
|
-
<path class="ic" d="M14 2.5H6.5a2 2 0 0 0-2 2v15a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8z"/>
|
|
87
|
-
<path class="ic" d="M14 2.5V8h5.5"/>
|
|
88
|
-
<path class="ic" d="M8.5 13.5h7M8.5 17.5h7"/>
|
|
89
|
-
</g>
|
|
90
|
-
<text x="797" y="509.8" class="ph" font-weight="600" fill="#3fb950">a spec</text>
|
|
91
|
-
|
|
16
|
+
<text x="90" y="63" font-size="30" font-weight="700" fill="#e6edf3" letter-spacing="-0.5">pi-task</text>
|
|
17
|
+
<text x="44" y="212" font-size="62" font-weight="700" fill="#e6edf3" letter-spacing="-2">Deterministic</text>
|
|
18
|
+
<text x="44" y="280" font-size="62" font-weight="700" fill="url(#hl)" letter-spacing="-2">AI Workflows.</text>
|
|
19
|
+
<rect x="44" y="312" width="72" height="4" rx="2" fill="#8957e5"/>
|
|
20
|
+
<text x="44" y="356" font-size="17" fill="#8b949e">pi-task orchestrates every request</text>
|
|
21
|
+
<text x="44" y="381" font-size="17" fill="#8b949e">through a fixed pipeline to produce</text>
|
|
22
|
+
<text x="44" y="406" font-size="17" fill="#8b949e">implementation specs you can trust.</text>
|
|
23
|
+
<rect x="470.0" y="132" width="74" height="74" rx="16.3" fill="#1e1633" stroke="#a371f7" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
24
|
+
<g transform="translate(489.0,151.0) scale(1.5)" fill="none" stroke="#a371f7" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M9 13h6M9 17h4"/></g>
|
|
25
|
+
<text x="507.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">REFINE</text>
|
|
26
|
+
<text x="507.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Clarify and</text>
|
|
27
|
+
<text x="507.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">structure the</text>
|
|
28
|
+
<text x="507.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">request</text>
|
|
29
|
+
<path d="M546.5 169h14M554.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
30
|
+
<rect x="563.0" y="132" width="74" height="74" rx="16.3" fill="#0d2440" stroke="#58a6ff" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
31
|
+
<g transform="translate(582.0,151.0) scale(1.5)" fill="none" stroke="#58a6ff" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M20.5 20.5 16 16"/></g>
|
|
32
|
+
<text x="600.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">RESEARCH</text>
|
|
33
|
+
<text x="600.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Parallel research</text>
|
|
34
|
+
<text x="600.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">agents gather</text>
|
|
35
|
+
<text x="600.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">information</text>
|
|
36
|
+
<path d="M639.5 169h14M647.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
+
<rect x="656.0" y="132" width="74" height="74" rx="16.3" fill="#33172a" stroke="#f778ba" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
38
|
+
<g transform="translate(675.0,151.0) scale(1.5)" fill="none" stroke="#f778ba" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 11.5a8.5 8.5 0 0 1-8.5 8.5 8.4 8.4 0 0 1-3.8-.9L3.5 21l1.9-4.7a8.4 8.4 0 0 1-.9-3.8 8.5 8.5 0 0 1 8.5-8.5 8.5 8.5 0 0 1 7.5 7.5z"/><path d="M9.6 9.4a2.6 2.6 0 0 1 5 .9c0 1.7-2.5 2.6-2.5 2.6"/><path d="M12 16.4h.01"/></g>
|
|
39
|
+
<text x="693.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">GRILL</text>
|
|
40
|
+
<text x="693.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Cross-examine</text>
|
|
41
|
+
<text x="693.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">findings to</text>
|
|
42
|
+
<text x="693.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">surface gaps</text>
|
|
43
|
+
<path d="M732.5 169h14M740.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
44
|
+
<rect x="749.0" y="132" width="74" height="74" rx="16.3" fill="#0f2a1b" stroke="#3fb950" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
45
|
+
<g transform="translate(768.0,151.0) scale(1.5)" fill="none" stroke="#3fb950" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M12.5 20.5H21"/><path d="M16.7 3.6a2.1 2.1 0 0 1 3 3L7.5 18.8 3.5 20l1.2-4z"/></g>
|
|
46
|
+
<text x="786.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">COMPOSE</text>
|
|
47
|
+
<text x="786.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Create detailed</text>
|
|
48
|
+
<text x="786.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">implementation</text>
|
|
49
|
+
<text x="786.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">spec</text>
|
|
50
|
+
<path d="M825.5 169h14M833.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
|
|
51
|
+
<rect x="842.0" y="132" width="74" height="74" rx="16.3" fill="#2d2410" stroke="#d29922" stroke-opacity="0.28" stroke-width="1.2"/>
|
|
52
|
+
<g transform="translate(861.0,151.0) scale(1.5)" fill="none" stroke="#d29922" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21.5s7.5-3.8 7.5-9.5V5.2L12 2.5 4.5 5.2V12c0 5.7 7.5 9.5 7.5 9.5z"/></g>
|
|
53
|
+
<text x="879.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">CRITIQUE</text>
|
|
54
|
+
<text x="879.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Self-critique for</text>
|
|
55
|
+
<text x="879.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">quality and</text>
|
|
56
|
+
<text x="879.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">completeness</text>
|
|
92
57
|
</svg>
|
|
@@ -40,12 +40,15 @@ export interface FinalGateOutcome {
|
|
|
40
40
|
*/
|
|
41
41
|
openDebts?: AcceptDebt[];
|
|
42
42
|
/**
|
|
43
|
-
* Set (with the UNOBSERVED note) when the gate
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
43
|
+
* Set (with the UNOBSERVED note) when the gate could not OBSERVE something it was
|
|
44
|
+
* supposed to. Two independent triggers, either or both:
|
|
45
|
+
* - nothing dynamic ran at all — no command was discoverable, or every discovered
|
|
46
|
+
* one skipped as an environment gap (unobservedVerdict);
|
|
47
|
+
* - a served app's boot command was discovered and SKIPPED, whatever else ran
|
|
48
|
+
* (bootSkipVerdict, mx5 run 18 — test suites may not stand in for a launch).
|
|
49
|
+
* `ok` is still true (the statics did pass and there is nothing to fix), but this is
|
|
50
|
+
* NOT a PASS: the caller must record it as UNOBSERVED, never as "checked and fine".
|
|
51
|
+
* Absent ⇒ everything the gate meant to observe, it observed.
|
|
49
52
|
*/
|
|
50
53
|
unobserved?: string;
|
|
51
54
|
}
|
|
@@ -347,6 +350,54 @@ export declare function unobservedVerdict(args: {
|
|
|
347
350
|
/** Of those, how many actually RAN (a real pass or a real fail). */
|
|
348
351
|
observed: number;
|
|
349
352
|
}): string | null;
|
|
353
|
+
/**
|
|
354
|
+
* The SAME third verdict, at the door unobservedVerdict cannot reach: the boot
|
|
355
|
+
* check specifically (mx5 run 18, validated).
|
|
356
|
+
*
|
|
357
|
+
* Run 18 shipped an app with no HTTP server behind a converged final gate. Its
|
|
358
|
+
* `src/server/index.ts` ends at `export {app}` — no `Bun.serve`, no
|
|
359
|
+
* `export default app`, no `start` script — so `bun run src/server/index.ts` exits
|
|
360
|
+
* 0 immediately and the product cannot be started at all. The gate's boot command
|
|
361
|
+
* resolved to `bun run dev`, whose body begins `docker compose … up -d`; the gate
|
|
362
|
+
* sandbox had no docker, so the boot SKIPPED as an environment gap. Skips
|
|
363
|
+
* contribute nothing to `dynObserved`, and `bun run test`, `test:ct`, `build`,
|
|
364
|
+
* `lint`, `seed` and `migrate` all ran — so `dynObserved > 0`, the full-skip
|
|
365
|
+
* blindness guard (observabilityGapFailure) stayed correctly quiet, and the trail
|
|
366
|
+
* read `final-gate: autofix converged — statics + … passed` with 24/24 tasks green.
|
|
367
|
+
*
|
|
368
|
+
* The defect is that "the app was never observed to boot" and "the app booted
|
|
369
|
+
* fine" produced BYTE-IDENTICAL gate output. That is the class scripts/ab-verdict.ts
|
|
370
|
+
* exists to kill one layer up: absence of evidence rendered in the shape of
|
|
371
|
+
* evidence. So a discovered-but-skipped boot now names itself, and — unlike every
|
|
372
|
+
* other skip — it CANNOT be cancelled by observations from other commands.
|
|
373
|
+
* Component tests are the trap here, not the alibi: run 18 had 51 green Playwright
|
|
374
|
+
* CT tests, and CT mounts components in a browser without ever assembling or
|
|
375
|
+
* starting the server.
|
|
376
|
+
*
|
|
377
|
+
* DECIDED, do not silently re-open:
|
|
378
|
+
* - NOT a FAIL. A boot skip on a docker-less box is a genuine environment gap, and
|
|
379
|
+
* failing it re-creates run 16's unfalsifiable-FAIL mistake pointing the other
|
|
380
|
+
* way. UNOBSERVED blocks nothing while being loud and durable (the caller records
|
|
381
|
+
* it as final-gate debt the next run re-surfaces), and it keeps "boot never ran"
|
|
382
|
+
* out of the autofix child's seed — a child cannot fix a missing docker, so the
|
|
383
|
+
* highest-probability response would be to FABRICATE a bootable command, the
|
|
384
|
+
* class that refuted the `## verified tooling` harvest.
|
|
385
|
+
* - BOTH skip flavours count. Run 18's skip carried `spawnFailed: false` (127 inside
|
|
386
|
+
* the script chain, not an ENOENT on the runner), so keying off spawnFailed would
|
|
387
|
+
* have missed the actual defect.
|
|
388
|
+
* - SERVED APPS ONLY. `expectServer === false` (a CLI/library project) is fenced off
|
|
389
|
+
* deliberately: a CLI whose `dev` script needs an absent tool has no server to be
|
|
390
|
+
* unobserved, and widening the lever there buys warnings nobody can act on.
|
|
391
|
+
*/
|
|
392
|
+
export declare function bootSkipVerdict(args: {
|
|
393
|
+
/** `bin args…` of the DISCOVERED boot command; null ⇒ nothing to boot, which is
|
|
394
|
+
* not the same thing as a boot that was not observed. */
|
|
395
|
+
label: string | null;
|
|
396
|
+
/** Did the boot check end in `skip` (either flavour)? */
|
|
397
|
+
skipped: boolean;
|
|
398
|
+
/** Does this project stand up an HTTP server (detectsServedApp)? */
|
|
399
|
+
expectServer: boolean;
|
|
400
|
+
}): string | null;
|
|
350
401
|
export { taskThatIntroduced };
|
|
351
402
|
/**
|
|
352
403
|
* Run the final gate: static analysis first, then the lockfile consistency
|
package/dist/task/final-gate.js
CHANGED
|
@@ -37,6 +37,13 @@
|
|
|
37
37
|
* database is genuinely reachable-but-mis-wired — which is exactly the class the
|
|
38
38
|
* per-task gates kept excusing — and the caller puts a human on the decision
|
|
39
39
|
* (accept / leave failed), so a genuine external gap can still be overridden.
|
|
40
|
+
*
|
|
41
|
+
* A skip is never silent, though. A DISCOVERED boot command that never ran is its
|
|
42
|
+
* own verdict (bootSkipVerdict, mx5 run 18) — nothing else the gate observed can
|
|
43
|
+
* cancel it. Validation harnesses for that lever:
|
|
44
|
+
* scripts/boot-skip-baserate.ts base rate, shipped gate, before the change
|
|
45
|
+
* scripts/boot-skip-verdict-ab.ts two-armed deterministic A/B + invariants
|
|
46
|
+
* scripts/boot-skip-fp-suite.ts zero-FP arms over every local repo
|
|
40
47
|
*/
|
|
41
48
|
import { spawn, spawnSync } from 'node:child_process';
|
|
42
49
|
import { existsSync, readFileSync } from 'node:fs';
|
|
@@ -911,6 +918,53 @@ export function unobservedVerdict(args) {
|
|
|
911
918
|
return (`UNOBSERVED — NOT a pass: ${why}; statics passed, but this run produced NO evidence `
|
|
912
919
|
+ 'that the assembled product builds, boots or works.');
|
|
913
920
|
}
|
|
921
|
+
/**
|
|
922
|
+
* The SAME third verdict, at the door unobservedVerdict cannot reach: the boot
|
|
923
|
+
* check specifically (mx5 run 18, validated).
|
|
924
|
+
*
|
|
925
|
+
* Run 18 shipped an app with no HTTP server behind a converged final gate. Its
|
|
926
|
+
* `src/server/index.ts` ends at `export {app}` — no `Bun.serve`, no
|
|
927
|
+
* `export default app`, no `start` script — so `bun run src/server/index.ts` exits
|
|
928
|
+
* 0 immediately and the product cannot be started at all. The gate's boot command
|
|
929
|
+
* resolved to `bun run dev`, whose body begins `docker compose … up -d`; the gate
|
|
930
|
+
* sandbox had no docker, so the boot SKIPPED as an environment gap. Skips
|
|
931
|
+
* contribute nothing to `dynObserved`, and `bun run test`, `test:ct`, `build`,
|
|
932
|
+
* `lint`, `seed` and `migrate` all ran — so `dynObserved > 0`, the full-skip
|
|
933
|
+
* blindness guard (observabilityGapFailure) stayed correctly quiet, and the trail
|
|
934
|
+
* read `final-gate: autofix converged — statics + … passed` with 24/24 tasks green.
|
|
935
|
+
*
|
|
936
|
+
* The defect is that "the app was never observed to boot" and "the app booted
|
|
937
|
+
* fine" produced BYTE-IDENTICAL gate output. That is the class scripts/ab-verdict.ts
|
|
938
|
+
* exists to kill one layer up: absence of evidence rendered in the shape of
|
|
939
|
+
* evidence. So a discovered-but-skipped boot now names itself, and — unlike every
|
|
940
|
+
* other skip — it CANNOT be cancelled by observations from other commands.
|
|
941
|
+
* Component tests are the trap here, not the alibi: run 18 had 51 green Playwright
|
|
942
|
+
* CT tests, and CT mounts components in a browser without ever assembling or
|
|
943
|
+
* starting the server.
|
|
944
|
+
*
|
|
945
|
+
* DECIDED, do not silently re-open:
|
|
946
|
+
* - NOT a FAIL. A boot skip on a docker-less box is a genuine environment gap, and
|
|
947
|
+
* failing it re-creates run 16's unfalsifiable-FAIL mistake pointing the other
|
|
948
|
+
* way. UNOBSERVED blocks nothing while being loud and durable (the caller records
|
|
949
|
+
* it as final-gate debt the next run re-surfaces), and it keeps "boot never ran"
|
|
950
|
+
* out of the autofix child's seed — a child cannot fix a missing docker, so the
|
|
951
|
+
* highest-probability response would be to FABRICATE a bootable command, the
|
|
952
|
+
* class that refuted the `## verified tooling` harvest.
|
|
953
|
+
* - BOTH skip flavours count. Run 18's skip carried `spawnFailed: false` (127 inside
|
|
954
|
+
* the script chain, not an ENOENT on the runner), so keying off spawnFailed would
|
|
955
|
+
* have missed the actual defect.
|
|
956
|
+
* - SERVED APPS ONLY. `expectServer === false` (a CLI/library project) is fenced off
|
|
957
|
+
* deliberately: a CLI whose `dev` script needs an absent tool has no server to be
|
|
958
|
+
* unobserved, and widening the lever there buys warnings nobody can act on.
|
|
959
|
+
*/
|
|
960
|
+
export function bootSkipVerdict(args) {
|
|
961
|
+
if (args.label === null || !args.skipped || !args.expectServer)
|
|
962
|
+
return null;
|
|
963
|
+
// Deliberately short: the run-level trail slices the reason at 300 chars and this
|
|
964
|
+
// note leads it, so the command name always survives.
|
|
965
|
+
return (`boot check: \`${args.label}\` NEVER RAN (environment gap) — the app was not observed `
|
|
966
|
+
+ 'to start, and no test suite substitutes for that.');
|
|
967
|
+
}
|
|
914
968
|
/**
|
|
915
969
|
* Boot check hit an address-in-use bind failure. If the port is held by one of OUR
|
|
916
970
|
* own orphaned gate children (a `dev`/`start` run), reap it and retry the boot once
|
|
@@ -1107,6 +1161,10 @@ export async function runFinalIntegrationGate(cwd, timeoutMs = 900_000, bootGrac
|
|
|
1107
1161
|
// Boot + render ALWAYS runs (mx5 run 13): it is independent of test results by
|
|
1108
1162
|
// construction, and it carries the run's most load-bearing signal — earlier
|
|
1109
1163
|
// failures no longer shadow it. Its failures rank FIRST in the aggregate.
|
|
1164
|
+
// A boot that never RAN is its own verdict (mx5 run 18 — see bootSkipVerdict);
|
|
1165
|
+
// it lives outside the dynObserved counters on purpose, so the test/build
|
|
1166
|
+
// commands that did run cannot cancel it.
|
|
1167
|
+
let bootUnobserved = null;
|
|
1110
1168
|
if (boot) {
|
|
1111
1169
|
const label = `${boot[0]} ${boot[1].join(' ')}`;
|
|
1112
1170
|
dynAttempted += 1;
|
|
@@ -1142,6 +1200,11 @@ export async function runFinalIntegrationGate(cwd, timeoutMs = 900_000, bootGrac
|
|
|
1142
1200
|
dynObserved += 1;
|
|
1143
1201
|
else if (b.spawnFailed)
|
|
1144
1202
|
dynSpawnFailures += 1;
|
|
1203
|
+
bootUnobserved = bootSkipVerdict({
|
|
1204
|
+
label,
|
|
1205
|
+
skipped: b.outcome === 'skip',
|
|
1206
|
+
expectServer
|
|
1207
|
+
});
|
|
1145
1208
|
if (b.outcome === 'fail') {
|
|
1146
1209
|
fail(`boot check: \`${label}\` ${b.detail}`, 0);
|
|
1147
1210
|
}
|
|
@@ -1213,7 +1276,15 @@ export async function runFinalIntegrationGate(cwd, timeoutMs = 900_000, bootGrac
|
|
|
1213
1276
|
// (integration commands not runnable here)`, which is the identical "we never checked"
|
|
1214
1277
|
// silence wearing different words. Unchanged when anything at all was observed, so a
|
|
1215
1278
|
// project with runnable commands is byte-for-byte unaffected.
|
|
1216
|
-
|
|
1279
|
+
// Two independent UNOBSERVED notes, either or both of which may apply: the boot
|
|
1280
|
+
// never ran (run 18), and/or NOTHING dynamic ran at all. The boot note leads
|
|
1281
|
+
// because it names a concrete command and the trail line is sliced at 300 chars.
|
|
1282
|
+
const unobserved = [
|
|
1283
|
+
bootUnobserved,
|
|
1284
|
+
unobservedVerdict({ discovered: dynAttempted, observed: dynObserved })
|
|
1285
|
+
]
|
|
1286
|
+
.filter(n => n !== null)
|
|
1287
|
+
.join(' ');
|
|
1217
1288
|
return withDebts({
|
|
1218
1289
|
ok: true,
|
|
1219
1290
|
...(unobserved ? { unobserved } : {}),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mjasnikovs/pi-task",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.5",
|
|
4
4
|
"description": "Deterministic task planning and spec-orchestration for local models — crash-safe /task pipelines with verify/enforce gates, a real-time remote web view, and web/docs/fetch/worker subagent tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -85,6 +85,6 @@
|
|
|
85
85
|
"extensions": [
|
|
86
86
|
"dist/index.js"
|
|
87
87
|
],
|
|
88
|
-
"image": "https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/
|
|
88
|
+
"image": "https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/card.png"
|
|
89
89
|
}
|
|
90
90
|
}
|