Compare commits
747
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
159704dc6f | ||
|
|
6492f10f42 | ||
|
|
a525ba4d01 | ||
|
|
c261aea021 | ||
|
|
8d4fee231b | ||
|
|
307d38453f | ||
|
|
d2a8a79ac6 | ||
|
|
6c8998878d | ||
|
|
41283c8dd9 | ||
|
|
fa29cc2c95 | ||
|
|
7a4fd97526 | ||
|
|
103077dfae | ||
|
|
cd2006305e | ||
|
|
a453c6e2da | ||
|
|
16247ce7c5 | ||
|
|
b9e786e106 | ||
|
|
ccd4d83d43 | ||
|
|
3a9ac1b1b7 | ||
|
|
f2c51ffe39 | ||
|
|
ef17955369 | ||
|
|
62e467c035 | ||
|
|
4950749c5d | ||
|
|
dc2f8b409d | ||
|
|
d2aa92a729 | ||
|
|
86017a5abc | ||
|
|
799998639a | ||
|
|
755d460f0d | ||
|
|
07f9793bc6 | ||
|
|
89a40db79e | ||
|
|
84a8423611 | ||
|
|
8e79c1dc96 | ||
|
|
000afbbe19 | ||
|
|
db1a2f567b | ||
|
|
bdd05dce4d | ||
|
|
4e138b7e36 | ||
|
|
1839acb3d0 | ||
|
|
f26c7e0d09 | ||
|
|
437ef5b56b | ||
|
|
7d64b443f2 | ||
|
|
449745ee24 | ||
|
|
e66efc746f | ||
|
|
436bcc812d | ||
|
|
6086099fe4 | ||
|
|
390f468471 | ||
|
|
ef1d8d9af2 | ||
|
|
ceb7b95096 | ||
|
|
237c985f2c | ||
|
|
66c5be16f8 | ||
|
|
bedbb670e4 | ||
|
|
0591fd528c | ||
|
|
19ff3724ed | ||
|
|
741d71327a | ||
|
|
27117f3246 | ||
|
|
1b5a39dbc9 | ||
|
|
f65f0e3b8f | ||
|
|
e2df9f9493 | ||
|
|
959b497135 | ||
|
|
ef08b873ce | ||
|
|
2f975808bb | ||
|
|
273f10e954 | ||
|
|
f349738257 | ||
|
|
577bf75051 | ||
|
|
79df31ccf6 | ||
|
|
72812878c0 | ||
|
|
cea115ecd9 | ||
|
|
4c3b15d8d6 | ||
|
|
45d21ac032 | ||
|
|
4e713fce19 | ||
|
|
428b7d0fef | ||
|
|
5ddc8dceac | ||
|
|
f901b9bee3 | ||
|
|
2f9604a12f | ||
|
|
893122781d | ||
|
|
f367d73231 | ||
|
|
5fa480904d | ||
|
|
0618de21eb | ||
|
|
d5012d3e16 | ||
|
|
28d53aadf2 | ||
|
|
4fb75ec324 | ||
|
|
091ee764a4 | ||
|
|
439f967cb8 | ||
|
|
80d6861aba | ||
|
|
d2ec533585 | ||
|
|
b52b7c963c | ||
|
|
89910a1a29 | ||
|
|
7ee2b78bbb | ||
|
|
0b2ce6ca1f | ||
|
|
bca8ba6ed9 | ||
|
|
5c9331e848 | ||
|
|
bb6bc9f6a1 | ||
|
|
845817d3bf | ||
|
|
1d98921a45 | ||
|
|
7ede927d5a | ||
|
|
6081448a7e | ||
|
|
70162d5001 | ||
|
|
b975812c18 | ||
|
|
1251c0ca70 | ||
|
|
dd40c41f45 | ||
|
|
428d255b27 | ||
|
|
38d25582b2 | ||
|
|
cdc0a5da33 | ||
|
|
c96cc49d0a | ||
|
|
9bd1550715 | ||
|
|
81fa035a1c | ||
|
|
371fd7c6e5 | ||
|
|
d231f41300 | ||
|
|
97555bb5a1 | ||
|
|
d62ab6e1de | ||
|
|
217a4828d7 | ||
|
|
bc2b8513f7 | ||
|
|
73122c10fd | ||
|
|
b84db7fac7 | ||
|
|
911df3df77 | ||
|
|
acf1f5fb53 | ||
|
|
1044b39c3f | ||
|
|
a729d68600 | ||
|
|
b83886554f | ||
|
|
5a8bcebdf4 | ||
|
|
a479d3e32d | ||
|
|
f399d7383c | ||
|
|
e8e019eb76 | ||
|
|
3c2fd5d760 | ||
|
|
1ca5663298 | ||
|
|
b28d64c3c6 | ||
|
|
76c800542c | ||
|
|
cca073f8aa | ||
|
|
c0f4c184ca | ||
|
|
8c8fb01426 | ||
|
|
052408392d | ||
|
|
cfb215ab0c | ||
|
|
3501e0dffe | ||
|
|
af683af2d2 | ||
|
|
90b1a1fccb | ||
|
|
5954021cc5 | ||
|
|
108088d811 | ||
|
|
ca2ad18ded | ||
|
|
d2e6a2a1a7 | ||
|
|
e275a80f4c | ||
|
|
2745f3d516 | ||
|
|
8f7b87a29e | ||
|
|
2a7b659be4 | ||
|
|
3dd680683c | ||
|
|
49c9e19074 | ||
|
|
ddd2f86e26 | ||
|
|
fac79dc962 | ||
|
|
71a39002fb | ||
|
|
58904c441a | ||
|
|
1e812b793b | ||
|
|
ff8aa6bcbf | ||
|
|
2b213a8add | ||
|
|
021aca8d5e | ||
|
|
21b14ba440 | ||
|
|
5c242d9620 | ||
|
|
31565c9b9e | ||
|
|
99f31e0055 | ||
|
|
4cda83b748 | ||
|
|
13e76d3544 | ||
|
|
85b6d9f027 | ||
|
|
8daf9eacb7 | ||
|
|
48672e4317 | ||
|
|
eb998f0ad4 | ||
|
|
9cbb5b9b71 | ||
|
|
108666664a | ||
|
|
5abf16f9e6 | ||
|
|
78c98a34d1 | ||
|
|
68f1ddbd5a | ||
|
|
71284cdc92 | ||
|
|
03ad525fcc | ||
|
|
af9e940873 | ||
|
|
b547203fde | ||
|
|
9728b533b4 | ||
|
|
9c4d1559fd | ||
|
|
e0ec8ce78a | ||
|
|
9de04f7266 | ||
|
|
eea26f9174 | ||
|
|
0b1e9fdc5b | ||
|
|
277af3dec3 | ||
|
|
3bfd1ca07d | ||
|
|
0e635ba6b4 | ||
|
|
017ac70876 | ||
|
|
5428837605 | ||
|
|
87482df956 | ||
|
|
a13fb6933b | ||
|
|
d775e09688 | ||
|
|
f1ab40bf01 | ||
|
|
c92bc447cc | ||
|
|
6f68bb8d95 | ||
|
|
f39127b752 | ||
|
|
a6f9019edd | ||
|
|
2865abb65a | ||
|
|
f6eb11e567 | ||
|
|
ee750363d2 | ||
|
|
d8f467e30f | ||
|
|
746c51c701 | ||
|
|
f9ca777afe | ||
|
|
4189b80004 | ||
|
|
6013048f68 | ||
|
|
1d626cdea6 | ||
|
|
615c02501a | ||
|
|
7a7891d467 | ||
|
|
38bd122dd0 | ||
|
|
9c0c7badcf | ||
|
|
c3798559d2 | ||
|
|
d89ace5b9c | ||
|
|
1994d2d668 | ||
|
|
1c3ec71361 | ||
|
|
e7333f2e4d | ||
|
|
5149ab703f | ||
|
|
1e0f2158ba | ||
|
|
f17a458a04 | ||
|
|
5f06af81cb | ||
|
|
8407ce22b4 | ||
|
|
c6ddff159f | ||
|
|
b7c890d3f6 | ||
|
|
4b1f1e593d | ||
|
|
7ee702b162 | ||
|
|
680b2a4160 | ||
|
|
076c504640 | ||
|
|
2c76675110 | ||
|
|
ceb1ee3b56 | ||
|
|
de43209643 | ||
|
|
0f7e78c164 | ||
|
|
eb2e5907ea | ||
|
|
c29eba0c70 | ||
|
|
613f412659 | ||
|
|
5d55e47e9b | ||
|
|
8066f71b51 | ||
|
|
5ad588f059 | ||
|
|
4ab696b434 | ||
|
|
d3b8bdfddc | ||
|
|
a607a1f20d | ||
|
|
520209f38c | ||
|
|
ae2d80ba5a | ||
|
|
8652041855 | ||
|
|
04f15623f2 | ||
|
|
a4ed5fb082 | ||
|
|
c884d51702 | ||
|
|
ea47e54399 | ||
|
|
d953049d7d | ||
|
|
2c7ef24a29 | ||
|
|
48c09fd709 | ||
|
|
6ebe4f7752 | ||
|
|
d4de8e26ce | ||
|
|
42c9e9144c | ||
|
|
06a9f2f5fd | ||
|
|
58143ead83 | ||
|
|
b193e3e088 | ||
|
|
e1f02ffca3 | ||
|
|
bd5f2b75c3 | ||
|
|
2bad74046e | ||
|
|
dfbfd6ed82 | ||
|
|
de1a20c007 | ||
|
|
7abc3c7751 | ||
|
|
e8103477a4 | ||
|
|
354f1e1081 | ||
|
|
8a5b341e5e | ||
|
|
2232149be0 | ||
|
|
a766048f29 | ||
|
|
168951b668 | ||
|
|
519730e7d3 | ||
|
|
27f6b3366c | ||
|
|
07782704d4 | ||
|
|
e58355e7e3 | ||
|
|
ce62d23502 | ||
|
|
4c1b8c3d0a | ||
|
|
8578bc1c29 | ||
|
|
77b5276fd3 | ||
|
|
b21638f56c | ||
|
|
08edc767b5 | ||
|
|
4cd4ae9cb5 | ||
|
|
061136d798 | ||
|
|
ecdc52fce9 | ||
|
|
406c057025 | ||
|
|
3eac7f8eae | ||
|
|
79a0e45dbc | ||
|
|
2e2fdae8ef | ||
|
|
d802778104 | ||
|
|
de5f3ba49e | ||
|
|
74aca6f6c5 | ||
|
|
2a23b8d770 | ||
|
|
54d325aeb4 | ||
|
|
6dc78e3f2a | ||
|
|
108b6dc787 | ||
|
|
395de19639 | ||
|
|
cc25201c4f | ||
|
|
66f04e0424 | ||
|
|
5f9797fdd6 | ||
|
|
b4d2b3a442 | ||
|
|
155e039e66 | ||
|
|
b4786b407a | ||
|
|
a59d935bd3 | ||
|
|
6e95e497f7 | ||
|
|
ef12c6b185 | ||
|
|
e6f68496b4 | ||
|
|
be517417ff | ||
|
|
3fc0dd0bde | ||
|
|
89eb59505b | ||
|
|
2601bfa9f0 | ||
|
|
8a15cca567 | ||
|
|
ece35c391c | ||
|
|
6c3ac08c54 | ||
|
|
0e14e7c14e | ||
|
|
2704b8c4bd | ||
|
|
d5338f9244 | ||
|
|
e447f177e0 | ||
|
|
962b769989 | ||
|
|
52a786c780 | ||
|
|
f33415c7e2 | ||
|
|
3e03e53627 | ||
|
|
794e43a534 | ||
|
|
9f721ba437 | ||
|
|
4a5e28067e | ||
|
|
ab7658c1f2 | ||
|
|
6cc0065d15 | ||
|
|
4cd4a06e98 | ||
|
|
f164483e62 | ||
|
|
faf9bb0a82 | ||
|
|
df150647c4 | ||
|
|
6434df13aa | ||
|
|
9f664c751a | ||
|
|
1d27f6c90a | ||
|
|
98c85a1d9e | ||
|
|
1f198ccb43 | ||
|
|
5fb8c393c5 | ||
|
|
7c424e7d38 | ||
|
|
5fa0846dcf | ||
|
|
19c3ec45eb | ||
|
|
bdc11c771d | ||
|
|
35fba2b6fb | ||
|
|
bf4bf4da09 | ||
|
|
d25ca6ff3c | ||
|
|
79ee5c4388 | ||
|
|
2081fd5bda | ||
|
|
8fcfa6e016 | ||
|
|
c14083a45a | ||
|
|
861c351a96 | ||
|
|
50b261e7e2 | ||
|
|
54245e3292 | ||
|
|
a63b40f460 | ||
|
|
8684344e92 | ||
|
|
5f52c72b45 | ||
|
|
839783b2e6 | ||
|
|
717ff8db01 | ||
|
|
249b55ec3f | ||
|
|
5885850726 | ||
|
|
bc484338df | ||
|
|
43c9216ef8 | ||
|
|
ec3a1c621d | ||
|
|
2edffafc2b | ||
|
|
627c8f36ff | ||
|
|
01ba4c157a | ||
|
|
6f790faed9 | ||
|
|
79ca0f7f81 | ||
|
|
8fd75228e4 | ||
|
|
dcbd04aacd | ||
|
|
870bcc76a5 | ||
|
|
c383178f7f | ||
|
|
97df2c8a28 | ||
|
|
6eda265bf2 | ||
|
|
147a600577 | ||
|
|
0dd5be8e7a | ||
|
|
8c42729e5b | ||
|
|
5e0b023a7b | ||
|
|
09f0ec5ebf | ||
|
|
c326c45d70 | ||
|
|
ebf6beaaf1 | ||
|
|
c91f5fc9b8 | ||
|
|
673c739909 | ||
|
|
3bc0de1762 | ||
|
|
9af2ad7cd9 | ||
|
|
12d7e69f07 | ||
|
|
142fdffb00 | ||
|
|
c4687b6816 | ||
|
|
9b161d251e | ||
|
|
a8f058c792 | ||
|
|
5ec8bae983 | ||
|
|
7f06e6567a | ||
|
|
3257cf799a | ||
|
|
70b8ed628d | ||
|
|
aadc0329d2 | ||
|
|
120044af80 | ||
|
|
dfc5263eec | ||
|
|
2646dfae7e | ||
|
|
7d087afbf6 | ||
|
|
59c59a6a70 | ||
|
|
97edfe8ae7 | ||
|
|
daf3ae68c3 | ||
|
|
df5d65dc2d | ||
|
|
4887aa33d9 | ||
|
|
b1af95ad20 | ||
|
|
865a11c628 | ||
|
|
7c2c5319f4 | ||
|
|
f62ed4db8a | ||
|
|
556fc353a8 | ||
|
|
8fd3cb855f | ||
|
|
448a24a975 | ||
|
|
d547198361 | ||
|
|
1143ae1c5a | ||
|
|
69c55a21a4 | ||
|
|
22c631cf88 | ||
|
|
a13868818c | ||
|
|
203160db4f | ||
|
|
61ae37a752 | ||
|
|
e752a7206a | ||
|
|
36b9ed450f | ||
|
|
75215bb143 | ||
|
|
8e625344e6 | ||
|
|
3ecd86dbc2 | ||
|
|
d95e044913 | ||
|
|
0717aae341 | ||
|
|
054d44f737 | ||
|
|
c04c8796f5 | ||
|
|
72e9f2f14e | ||
|
|
9e7c84a430 | ||
|
|
a04fe0a9dd | ||
|
|
9fbe9e7aea | ||
|
|
93bdad4c42 | ||
|
|
21008249ea | ||
|
|
ae5f3e425b | ||
|
|
fccef54cd6 | ||
|
|
d67f4023e1 | ||
|
|
4caafe99d3 | ||
|
|
e33dee192c | ||
|
|
02cd596139 | ||
|
|
d31b89072d | ||
|
|
b11f83c8b3 | ||
|
|
dbdae3c63f | ||
|
|
4a4590f86b | ||
|
|
25e0ae7f0d | ||
|
|
baefa90df9 | ||
|
|
c4f3c42957 | ||
|
|
3a22360a78 | ||
|
|
e4be4944d8 | ||
|
|
b2b4764f36 | ||
|
|
6ac916c785 | ||
|
|
831c8dc64e | ||
|
|
23ec2bbd7e | ||
|
|
945a61c0ed | ||
|
|
883badc1d8 | ||
|
|
135343a2e7 | ||
|
|
ff3b779fa9 | ||
|
|
24c8297df1 | ||
|
|
656b0220c4 | ||
|
|
399a9d43d3 | ||
|
|
ee16a4debc | ||
|
|
454d67d0a2 | ||
|
|
bf44d8124d | ||
|
|
5415a9478d | ||
|
|
62dd661395 | ||
|
|
e6b2144f74 | ||
|
|
9a2454037f | ||
|
|
2fc20adc23 | ||
|
|
ae5528b62f | ||
|
|
92432ad750 | ||
|
|
381db88e33 | ||
|
|
7abe13f23d | ||
|
|
a1f904b84d | ||
|
|
3d147c9e01 | ||
|
|
db23435337 | ||
|
|
7e35721a81 | ||
|
|
8ce4fcdeba | ||
|
|
0080c5b3d4 | ||
|
|
865c3f01ba | ||
|
|
37d0105319 | ||
|
|
c5cd587780 | ||
|
|
e881c47abf | ||
|
|
952020c8a5 | ||
|
|
db1f6fb6d1 | ||
|
|
66fa9d55a1 | ||
|
|
50224326aa | ||
|
|
a59e5c1ed3 | ||
|
|
5df7580a1e | ||
|
|
96223148c0 | ||
|
|
68a8fc97d2 | ||
|
|
ca28c927b2 | ||
|
|
9cf5344fc5 | ||
|
|
e5510620cc | ||
|
|
8e6b440f9a | ||
|
|
f396e1a253 | ||
|
|
39b55fb6e8 | ||
|
|
c91ed5600f | ||
|
|
35e6533986 | ||
|
|
a114fa9d0a | ||
|
|
017c4471ed | ||
|
|
c0e760d73e | ||
|
|
8f5eef94e4 | ||
|
|
c4a7eb7a2e | ||
|
|
9b7c4e279d | ||
|
|
c6fa0b2d95 | ||
|
|
a0cd3dd0e9 | ||
|
|
e578d888e3 | ||
|
|
e0680ccee0 | ||
|
|
6cc8551a6c | ||
|
|
b0225e48b8 | ||
|
|
a5df9e3728 | ||
|
|
ead96654be | ||
|
|
0430ed982d | ||
|
|
52e40b2fdc | ||
|
|
93265ae65c | ||
|
|
699db538b6 | ||
|
|
9ac540f7cf | ||
|
|
8206b5912d | ||
|
|
59d0a58e3a | ||
|
|
945ecdf64d | ||
|
|
e37a360d07 | ||
|
|
9881a061fe | ||
|
|
76729c3377 | ||
|
|
f880007639 | ||
|
|
eee2ce00e2 | ||
|
|
a729282cc1 | ||
|
|
061322d425 | ||
|
|
191e7999c0 | ||
|
|
c0239684ed | ||
|
|
d1095f854a | ||
|
|
902b383de7 | ||
|
|
ab7ab69f20 | ||
|
|
edc53a6bc9 | ||
|
|
1f0766c1d7 | ||
|
|
01f2e926b0 | ||
|
|
0a9e585c1d | ||
|
|
75e8103cdd | ||
|
|
356d06ef58 | ||
|
|
730bc73975 | ||
|
|
b4cb9fbc41 | ||
|
|
2c78428d9d | ||
|
|
88f4c7e104 | ||
|
|
3fb3368272 | ||
|
|
af435fa9bc | ||
|
|
06287aca40 | ||
|
|
6c04cb9a0b | ||
|
|
b5e623e5a1 | ||
|
|
5f7f81bdde | ||
|
|
9ca2f85b08 | ||
|
|
8b42e319e2 | ||
|
|
c8877b49a4 | ||
|
|
54a91f1b7e | ||
|
|
63d7ad788d | ||
|
|
e6619bc6c9 | ||
|
|
ac58bfdd63 | ||
|
|
a705bb3bf2 | ||
|
|
30e49d806a | ||
|
|
5f00329d44 | ||
|
|
ed33a0b00f | ||
|
|
57bbf14e1a | ||
|
|
02006fee2e | ||
|
|
466e2bf927 | ||
|
|
878517dcd2 | ||
|
|
b0ea9513e3 | ||
|
|
817c335f30 | ||
|
|
f8a1e9452e | ||
|
|
1097f35ed8 | ||
|
|
3dac71d0a5 | ||
|
|
993e407df2 | ||
|
|
c94e157b76 | ||
|
|
ca988ffc3a | ||
|
|
93bd6bdf01 | ||
|
|
ec600c8806 | ||
|
|
717c0999a5 | ||
|
|
c4d7ad8d0d | ||
|
|
6711bcf300 | ||
|
|
838b273d9c | ||
|
|
f64570ee84 | ||
|
|
94cb37075a | ||
|
|
6beb8625bf | ||
|
|
998225eb4e | ||
|
|
8de6b447ee | ||
|
|
85683f17c3 | ||
|
|
ffa8e2f25a | ||
|
|
faadebc67a | ||
|
|
748074ba9f | ||
|
|
884accd976 | ||
|
|
7377527f7c | ||
|
|
e44827823a | ||
|
|
1fdef32a4d | ||
|
|
da2dbfb108 | ||
|
|
f8230f9f59 | ||
|
|
71ca05c899 | ||
|
|
509ca60959 | ||
|
|
be91977725 | ||
|
|
22be375f1b | ||
|
|
0142ef1d3f | ||
|
|
6e4c49df61 | ||
|
|
4bf6b1bf0f | ||
|
|
d2ee3bf379 | ||
|
|
f1c182072b | ||
|
|
877ec94fc9 | ||
|
|
a5709d8bfc | ||
|
|
a5f3b0b554 | ||
|
|
3a0fd1c219 | ||
|
|
8e600311d0 | ||
|
|
ea6355a73d | ||
|
|
3cfb3a647e | ||
|
|
22af7fd342 | ||
|
|
c0f70d1a88 | ||
|
|
8b135cf47a | ||
|
|
e5126321ad | ||
|
|
982a1b75ed | ||
|
|
86c87ded89 | ||
|
|
66821b30a7 | ||
|
|
ecd3f124be | ||
|
|
41db5a9bf9 | ||
|
|
dfa966dbfc | ||
|
|
00a2459a86 | ||
|
|
d5b718b380 | ||
|
|
9e08291579 | ||
|
|
075cdfc810 | ||
|
|
b5f10ab7dc | ||
|
|
71f4c11fea | ||
|
|
8a623394da | ||
|
|
349a55fa33 | ||
|
|
83699e2011 | ||
|
|
462de32a5a | ||
|
|
630548644d | ||
|
|
d51b610f97 | ||
|
|
aea2a8a45d | ||
|
|
3b026b2f5f | ||
|
|
ecb23a1651 | ||
|
|
d7f0a718c3 | ||
|
|
f1876321c5 | ||
|
|
8940262618 | ||
|
|
69ab9f7c22 | ||
|
|
caf18dbaab | ||
|
|
7593202492 | ||
|
|
63449a8c26 | ||
|
|
0ef36b4e02 | ||
|
|
8e8d95eba4 | ||
|
|
49cc0f2e80 | ||
|
|
f7179f7a99 | ||
|
|
160c96ad1e | ||
|
|
86ce56b941 | ||
|
|
6952b265b5 | ||
|
|
38cc57e7fb | ||
|
|
7b975aaf93 | ||
|
|
3b634d66ca | ||
|
|
6fe2dcdf8e | ||
|
|
e2e76d3beb | ||
|
|
6cd2af7b72 | ||
|
|
6d289a583a | ||
|
|
667873bdbf | ||
|
|
2d4d11e476 | ||
|
|
a92dff05f8 | ||
|
|
cd07a9d846 | ||
|
|
cd86cc533c | ||
|
|
656f3fb249 | ||
|
|
5870251bdf | ||
|
|
ef0c22eae9 | ||
|
|
94aa3c1d3b | ||
|
|
a172d46c90 | ||
|
|
486ee5f41e | ||
|
|
d98872af4c | ||
|
|
20cc77573b | ||
|
|
7ae725c95d | ||
|
|
b1ba15995f | ||
|
|
fc1ee5bb55 | ||
|
|
6c52e5dddf | ||
|
|
3b4879446f | ||
|
|
b5f0081566 | ||
|
|
dcbfb6314e | ||
|
|
d2833ffded | ||
|
|
8cbade818f | ||
|
|
9ca89250b4 | ||
|
|
a984f5809f | ||
|
|
b6685af3ae | ||
|
|
63d864e1f0 | ||
|
|
6641bf4860 | ||
|
|
05cd788c13 | ||
|
|
c05bfaa9c4 | ||
|
|
f2d4194f37 | ||
|
|
10d12148dd | ||
|
|
ca29cd3b89 | ||
|
|
226eca7a9d | ||
|
|
49db85c09a | ||
|
|
4be925f56c | ||
|
|
7de73dbd33 | ||
|
|
fffdfd2721 | ||
|
|
54cc87132e | ||
|
|
94f63b1324 | ||
|
|
e729e75aaa | ||
|
|
d32fb3bc3c | ||
|
|
bcb8068ebd | ||
|
|
a2583b8114 | ||
|
|
9d477f37e7 | ||
|
|
cce36419ac | ||
|
|
05c6978d80 | ||
|
|
0da2b5db7b | ||
|
|
204d0d022f | ||
|
|
fb39bf38a1 | ||
|
|
fb44159261 | ||
|
|
3413bae7d7 | ||
|
|
d9b986853f | ||
|
|
f262815990 | ||
|
|
05a9c52217 | ||
|
|
fcae886044 | ||
|
|
1fdb4cd6f4 | ||
|
|
15e60dcbe6 | ||
|
|
a03b86e749 | ||
|
|
f678383aad | ||
|
|
1337425504 | ||
|
|
37e11e465f | ||
|
|
07978d2df5 | ||
|
|
65803c7868 | ||
|
|
a2b991adf8 | ||
|
|
f223bf44ce | ||
|
|
60348708a1 | ||
|
|
ede7acfdf6 | ||
|
|
c29d378d4c | ||
|
|
a89b7ac5de | ||
|
|
6f99ebedcc | ||
|
|
77ace64f87 | ||
|
|
a03a9da64a | ||
|
|
9bad2745f7 | ||
|
|
4772c4d6a5 | ||
|
|
425a6c66a8 | ||
|
|
d8300a0211 | ||
|
|
49abbd9519 | ||
|
|
65fa4c06ce | ||
|
|
c3d1490443 | ||
|
|
648422c966 | ||
|
|
eeb6986f16 | ||
|
|
3eef5fe1b5 | ||
|
|
01e8cd7fb0 | ||
|
|
e0ddbed1eb | ||
|
|
95abdc8d94 | ||
|
|
318aa1912b | ||
|
|
6572791e50 | ||
|
|
665c58deab | ||
|
|
c0d8badf55 | ||
|
|
3fa52f2c01 | ||
|
|
73e26c41b5 | ||
|
|
314e317a9a | ||
|
|
8c00a6e98e | ||
|
|
09c7153a04 | ||
|
|
10c29c5ae4 | ||
|
|
2998f37b5a | ||
|
|
f3b435e724 | ||
|
|
09f5e9d51a | ||
|
|
79dda10da3 | ||
|
|
1d21aae32c | ||
|
|
0335cad9ff | ||
|
|
dba335f74a | ||
|
|
3001bc6873 | ||
|
|
5c33917753 | ||
|
|
368249d677 | ||
|
|
f0de841360 | ||
|
|
f205fb7540 | ||
|
|
ba5d0ee605 | ||
|
|
6d4b700181 |
@@ -1,2 +1,3 @@
|
|||||||
/memory/
|
/memory/
|
||||||
tickets/.ticket-backend.lock
|
tickets/.ticket-backend.lock
|
||||||
|
/workspace.db*
|
||||||
|
|||||||
@@ -1,66 +1,97 @@
|
|||||||
---
|
---
|
||||||
title: 'MCP local stdio integration architecture'
|
title: 'MCP local stdio integration roadmap'
|
||||||
state: 'active'
|
state: 'active'
|
||||||
created_at: '2026-06-10T07:48:45Z'
|
created_at: '2026-06-10T07:48:45Z'
|
||||||
updated_at: '2026-06-13T15:30:22Z'
|
updated_at: '2026-06-20T05:34:00Z'
|
||||||
|
linked_tickets: ['00001KTR81P9X', '00001KV0SP0TY', '00001KVHR3WRF', '00001KVHR3WRY', '00001KVHR3WS6', '00001KVHR3WSD', '00001KVHR3WSN', '00001KVHR3WSW']
|
||||||
---
|
---
|
||||||
|
|
||||||
## Objective
|
## Goal
|
||||||
|
|
||||||
Add MCP local stdio integration to Yoi without weakening Worker history, prompt-context, scoped tool permission, or Plugin/Feature layering invariants.
|
Add MCP local stdio integration to Yoi without weakening Worker history, prompt-context, scoped tool permission, or Plugin/Feature layering invariants.
|
||||||
|
|
||||||
MCP should be implemented as a protocol-backed integration layer on top of `pod::feature`. `pod::feature` supplies the contribution/lifecycle API substrate; MCP owns its own enablement, local server trust model, command/env/secret policy, and MCP-specific permissions. MCP is not the Plugin model, and Plugin permission policy is not implemented by feature-layer authority grants.
|
MCP is a protocol-backed integration layer on top of `pod::feature`. `pod::feature` supplies contribution/lifecycle/runtime-discovered registration substrate; MCP owns its own enablement, local server trust model, command/env/secret policy, and MCP-specific permission decisions. MCP is not the Plugin model, and Plugin permission policy is not implemented by feature-layer authority grants.
|
||||||
|
|
||||||
## Strategic direction
|
## Motivation / background
|
||||||
|
|
||||||
- Baseline the implementation on MCP specification `2025-11-25`.
|
Yoi needs to integrate with external capability providers without turning them into hidden context sources or bypassing ordinary Tool/Worker safety rules. MCP is useful because it can expose tools, resources, and prompts from local protocol servers, but those server-provided declarations and results are untrusted and must be normalized through Yoi's existing authority boundaries.
|
||||||
|
|
||||||
|
The first MCP slice should focus on local stdio servers because they are concrete enough to implement and debug while keeping remote auth, OAuth, Streamable HTTP, registry distribution, sampling, and elicitation out of the initial trust boundary.
|
||||||
|
|
||||||
|
A configured local MCP server runs as a local executable. Yoi feature authority does not sandbox that executable's OS-level side effects, so command/env/secret handling and explicit local trust policy are MCP-layer responsibilities rather than generic `pod::feature` grants.
|
||||||
|
|
||||||
|
## Strategy / design direction
|
||||||
|
|
||||||
|
- Baseline the initial implementation on MCP specification `2025-11-25`.
|
||||||
- Start with local stdio MCP servers only.
|
- Start with local stdio MCP servers only.
|
||||||
- Treat MCP server metadata, tools, resources, prompts, and results as untrusted content.
|
- Treat MCP server metadata, tools, resources, prompts, and results as untrusted content.
|
||||||
- Do not allow MCP resources/prompts to be hidden context injection.
|
- Do not allow MCP resources/prompts to become hidden context injection.
|
||||||
- They must be explicit tool operations with history records.
|
- They must be explicit tool operations with history records.
|
||||||
- Use the normal Yoi tool registry, PreToolCall permission, history, and bounded result paths.
|
- Use the normal Yoi ToolRegistry, PreToolCall permission, history, and bounded result paths.
|
||||||
- Do not add private MCP-only bypasses around Worker/tool invariants.
|
- Do not add private MCP-only bypasses around Worker/tool invariants.
|
||||||
- Keep sampling and elicitation fail-closed initially.
|
- Keep sampling and elicitation fail-closed initially.
|
||||||
- Keep Streamable HTTP, remote auth, OAuth, and MCP Registry/distribution out of the first slice.
|
- Keep Streamable HTTP, remote auth, OAuth, and MCP Registry/distribution out of the first slice.
|
||||||
- Treat local stdio server execution as an explicit MCP config/trust decision, not as a `pod::feature` authority grant.
|
- Treat local stdio server execution as an explicit MCP config/trust decision, not as a `pod::feature` authority grant.
|
||||||
- Document clearly that a configured local MCP server runs as a local executable; Yoi feature authority does not sandbox its OS-level side effects.
|
- Document clearly that a configured local MCP server runs as a local executable; Yoi feature authority does not sandbox its OS-level side effects.
|
||||||
|
|
||||||
## Layering decisions
|
### Layering decisions
|
||||||
|
|
||||||
- `pod::feature` is an API/contribution substrate.
|
- `pod::feature` is an API/contribution substrate.
|
||||||
- It owns contribution declarations, provider/service lifecycle hooks, diagnostics, dynamic registration plumbing, and integration with normal Worker/ToolRegistry paths.
|
- It owns contribution declarations, provider/service lifecycle hooks, diagnostics, runtime-discovered registration plumbing, and integration with normal Worker/ToolRegistry paths.
|
||||||
- It does not own Plugin permission policy or MCP server trust policy.
|
- It does not own Plugin permission policy or MCP server trust policy.
|
||||||
- Plugin is a user-facing package/config/runtime layer over `pod::feature`.
|
- Plugin is a user-facing package/config/runtime layer over `pod::feature`.
|
||||||
- Plugin permissions are Plugin-layer policy.
|
- Plugin permissions are Plugin-layer policy.
|
||||||
- Plugin package discovery/enablement must not be conflated with MCP local server execution.
|
- Plugin package discovery/enablement must not be conflated with MCP local server execution.
|
||||||
- MCP is a separate feature-backed integration layer.
|
- MCP is a separate feature-backed integration layer.
|
||||||
- MCP enablement, command/env/secret handling, server trust, and MCP-specific permission decisions live in MCP config/implementation.
|
- MCP enablement, command/env/secret handling, server trust, and MCP-specific permission decisions live in MCP config/implementation.
|
||||||
- MCP dynamic tools/resources/prompts are exposed through the feature API and ordinary Yoi tool paths.
|
- MCP provider-discovered tools/resources/prompts are exposed through the feature API and ordinary Yoi tool paths.
|
||||||
|
|
||||||
## Work breakdown
|
### Concrete implementation tickets
|
||||||
|
|
||||||
1. `00001KTR81P9X` — Extend `pod::feature` API for protocol-backed external providers.
|
Completed prerequisites:
|
||||||
- provider/service lifecycle
|
|
||||||
- startup discovery and dynamic contribution registration
|
|
||||||
- bounded refresh semantics
|
|
||||||
- metadata/result normalization
|
|
||||||
- no feature-layer authority model for MCP/Plugin permissions
|
|
||||||
2. `00001KTR82RB7` — Implement MCP `2025-11-25` local stdio server bridge.
|
|
||||||
- explicit MCP config and trust model
|
|
||||||
- initialize/capability negotiation
|
|
||||||
- tools/resources/prompts list/call/read/get
|
|
||||||
- bounded result serialization
|
|
||||||
- list-changed diagnostics/refresh behavior
|
|
||||||
3. `00001KV0SP0TY` — Remove feature-layer HostAuthority model.
|
|
||||||
- remove authority/grant terminology from `pod::feature`
|
|
||||||
- keep real permission/trust policy in owning Plugin/MCP/manifest/tool layers
|
|
||||||
4. Later follow-ups, if needed.
|
|
||||||
- richer MCP tasks / task-support integration
|
|
||||||
- remote/HTTP transports
|
|
||||||
- OAuth / registry / package distribution
|
|
||||||
- Plugin package/runtime alignment, if an explicit MCP/plugin bridge is later approved
|
|
||||||
|
|
||||||
## Success criteria
|
- `00001KTR81P9X` — Extend `pod::feature` API for external protocol-backed capability providers.
|
||||||
|
- `00001KV0SP0TY` — Remove feature-layer HostAuthority model.
|
||||||
|
|
||||||
|
Concrete MCP implementation sequence:
|
||||||
|
|
||||||
|
1. `00001KVHR3WRF` — MCP local stdio server config and trust policy.
|
||||||
|
- explicit config, command/env/secret redaction, local executable trust boundary, no auto-start.
|
||||||
|
2. `00001KVHR3WRY` — MCP stdio JSON-RPC lifecycle client.
|
||||||
|
- subprocess lifecycle, initialize/capability negotiation, diagnostics, shutdown.
|
||||||
|
3. `00001KVHR3WS6` — MCP tools/list registration into ToolRegistry.
|
||||||
|
- provider-discovered tools, stable namespacing, schema validation, untrusted metadata normalization, no tools/call yet.
|
||||||
|
4. `00001KVHR3WSD` — MCP tools/call execution through ordinary Tool path.
|
||||||
|
- PreToolCall gate before server call, bounded result serialization, history path.
|
||||||
|
5. `00001KVHR3WSN` — MCP resources/prompts as explicit tool operations.
|
||||||
|
- resources/list/read and prompts/list/get without hidden context injection.
|
||||||
|
6. `00001KVHR3WSW` — MCP list_changed notification handling.
|
||||||
|
- deterministic safe refresh/diagnostic behavior without breaking tool schema or prompt-cache invariants.
|
||||||
|
|
||||||
|
The old broad implementation Ticket `00001KTR82RB7` is superseded by this sequence and should not be used as an implementation work item.
|
||||||
|
|
||||||
|
### Terminology
|
||||||
|
|
||||||
|
Use `runtime-discovered` or `provider-discovered` for MCP tools/resources/prompts discovered from `tools/list`, `resources/list`, or `prompts/list`. Avoid `dynamic tools` / `dynamic registry` in new MCP design prose because those phrases imply that model-visible tool schemas may change during an active LLM run.
|
||||||
|
|
||||||
|
The intended invariant is:
|
||||||
|
|
||||||
|
```text
|
||||||
|
provider-discovered at startup / provider initialization;
|
||||||
|
registered into the ordinary ToolRegistry before model exposure;
|
||||||
|
run-stable for the duration of a model request/run;
|
||||||
|
refreshed only at a safe boundary or reported as a diagnostic.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Later follow-ups
|
||||||
|
|
||||||
|
- Richer MCP task/task-support integration if ordinary tool-call fallback is insufficient.
|
||||||
|
- Streamable HTTP transport.
|
||||||
|
- OAuth / remote auth.
|
||||||
|
- Registry/package distribution.
|
||||||
|
- Explicit MCP/Plugin bridge only if separately approved; do not conflate Plugin packages with MCP local server execution.
|
||||||
|
|
||||||
|
## Success criteria / exit conditions
|
||||||
|
|
||||||
- A local mock MCP server can be configured explicitly and initialized.
|
- A local mock MCP server can be configured explicitly and initialized.
|
||||||
- Discovered MCP tools appear as ordinary Yoi tools with stable namespacing.
|
- Discovered MCP tools appear as ordinary Yoi tools with stable namespacing.
|
||||||
@@ -70,3 +101,11 @@ MCP should be implemented as a protocol-backed integration layer on top of `pod:
|
|||||||
- Secret values, command/env details, and server diagnostics are redacted where required.
|
- Secret values, command/env details, and server diagnostics are redacted where required.
|
||||||
- Local server trust boundary is documented: Yoi does not sandbox the configured executable through feature authority.
|
- Local server trust boundary is documented: Yoi does not sandbox the configured executable through feature authority.
|
||||||
- Feature, Plugin, and MCP permission/trust responsibilities are documented as separate layers.
|
- Feature, Plugin, and MCP permission/trust responsibilities are documented as separate layers.
|
||||||
|
|
||||||
|
## Decision context
|
||||||
|
|
||||||
|
- MCP is not the Plugin model; it is a protocol-backed integration layer using `pod::feature` substrate.
|
||||||
|
- `pod::feature` should provide contribution/lifecycle/runtime-discovered registration plumbing, not MCP server trust policy or Plugin package permission policy.
|
||||||
|
- MCP resources and prompts must never be hidden context injection. They are explicit operations recorded through ordinary history/tool paths.
|
||||||
|
- Provider-discovered tools are discovered at startup/provider initialization and registered before model exposure; model-visible schemas remain run-stable during a request/run.
|
||||||
|
- Local stdio server execution is a user/config trust decision. Yoi does not sandbox the local executable merely because it is configured through MCP.
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
title: "Plugin platform roadmap"
|
||||||
|
state: "active"
|
||||||
|
created_at: "2026-06-19T13:18:58Z"
|
||||||
|
updated_at: "2026-06-24T19:55:00Z"
|
||||||
|
linked_tickets: ["00001KV5R5V2S", "00001KV5W3PHA", "00001KV5W3PHW", "00001KV5W3PJ3", "00001KVFD3YSV", "00001KVFDX9AF", "00001KVFDX9AY", "00001KVG0HR96", "00001KVXHVCR5", "00001KVXK0WD3", "00001KVXK0WDH", "00001KVXK0WDQ", "00001KVXK0WDX", "00001KVXK0WE4", "00001KVXK0WEA"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Build Yoi's Plugin platform as a coherent extension system: packages are discovered and inspected safely, enabled explicitly, registered through typed Plugin surfaces, executed in a sandboxed runtime, constrained by Plugin-layer grants, and authored through SDK/templates rather than raw runtime ABI details.
|
||||||
|
|
||||||
|
The long-term platform goal is not merely to run Wasm. It is to make Plugin packages a durable, inspectable, permissioned, and authorable extension layer for Tools first, then host APIs (`https`, `fs`), and later Service / Ingress surfaces when concrete needs justify them.
|
||||||
|
|
||||||
|
## Motivation / background
|
||||||
|
|
||||||
|
The current Plugin foundation is already substantial:
|
||||||
|
|
||||||
|
- package discovery and explicit enablement resolver;
|
||||||
|
- Tool surface registration through the ordinary ToolRegistry/model-visible schema path;
|
||||||
|
- minimal sandboxed WASM Tool execution;
|
||||||
|
- Plugin permission grant enforcement;
|
||||||
|
- follow-up Tickets for read-only inspection CLI, `https`, `fs`, and Component Model migration.
|
||||||
|
|
||||||
|
The remaining work must be kept as one roadmap because the pieces constrain each other:
|
||||||
|
|
||||||
|
- Plugin authoring needs an SDK/PDK and examples, not raw pointer/length Wasm ABI hand-coding.
|
||||||
|
- `https` and `fs` host APIs must be grant-gated and shaped so they can move cleanly to typed Component Model interfaces.
|
||||||
|
- Diagnostics (`yoi plugin list/show`) are needed before the system becomes harder to debug.
|
||||||
|
- Component Model adoption should guide new host API design before a custom raw ABI becomes entrenched.
|
||||||
|
- Service / Ingress are useful for bridge-style integrations, but should come after Tool runtime, diagnostics, and host API policy are stable.
|
||||||
|
|
||||||
|
Research of common Wasm extension systems points to the same pattern: mature systems combine a package manifest, explicit capabilities, a sandbox runtime, host-provided capability APIs, language SDK/PDK bindings, templates/examples, inspection/check tooling, and versioned interfaces.
|
||||||
|
|
||||||
|
## Strategy / design direction
|
||||||
|
|
||||||
|
- Keep Plugin as a user-facing package/config/runtime layer above lower-level `pod::feature` substrate.
|
||||||
|
- `pod::feature` provides contribution/registration substrate.
|
||||||
|
- Plugin owns package discovery, enablement, grant policy, runtime selection, authoring UX, and user-facing diagnostics.
|
||||||
|
- Preserve authority boundaries.
|
||||||
|
- Package discovery is read-only inventory.
|
||||||
|
- Package presence never registers a Tool/Hook, executes Wasm, starts a Service, reads files, opens network, or injects context.
|
||||||
|
- Explicit enablement and Plugin grants are required before registration/execution/host API use.
|
||||||
|
- Tool calls/results continue through ordinary ToolRegistry and Worker history paths.
|
||||||
|
- Treat Component Model as the active Plugin runtime shape before public release.
|
||||||
|
- New typed Plugin host APIs should be designed in WIT-compatible terms.
|
||||||
|
- `runtime.kind = "wasm-component"` is the current Plugin runtime authority for new work.
|
||||||
|
- The earlier `yoi-plugin-wasm-1` raw core-Wasm compatibility bridge is retired from the active roadmap because Plugin has not been publicly released and compatibility would preserve the wrong boundary.
|
||||||
|
- Sequence the platform in usable layers:
|
||||||
|
1. Package discovery / explicit enablement / digest-pinned restore. Completed foundation.
|
||||||
|
2. Tool surface registration. Completed foundation.
|
||||||
|
3. Minimal WASM Tool execution. Completed foundation.
|
||||||
|
4. Permission grants. Completed foundation.
|
||||||
|
5. Read-only Plugin CLI inspection (`yoi plugin list/show`) for debugging discovery/enablement/grants/runtime metadata.
|
||||||
|
6. `https` and `fs` host APIs for Tool Plugins, grant-gated and WIT-compatible.
|
||||||
|
7. Remove the raw core-Wasm compatibility bridge and reject legacy runtime manifests.
|
||||||
|
8. Component Model runtime and authoring model become the only active Plugin runtime path.
|
||||||
|
9. Guest SDK/PDK, examples, `check`/`pack`/`new` authoring tooling target Component Model only.
|
||||||
|
10. Service / Ingress runtime is developed as host-managed lifecycle, event queue, output command, and diagnostics slices.
|
||||||
|
11. WebSocket support for long-lived integrations is host-owned connection driver + ingress event delivery + output command, not Plugin-owned polling with `recv(timeout)`.
|
||||||
|
- Keep Discord-style bridge goals split into two stages.
|
||||||
|
- Outbound Discord/webhook Tool is possible after `https`.
|
||||||
|
- Bidirectional Discord bridge requires Service + Ingress + WebSocket or inbound HTTP and host routing policy.
|
||||||
|
|
||||||
|
## Current implementation split
|
||||||
|
|
||||||
|
The broad Plugin runtime redesign is tracked by `00001KVXHVCR5` as context only; implementation should proceed through concrete Tickets instead of routing that umbrella as a single coding task.
|
||||||
|
|
||||||
|
1. `00001KVXK0WD3` Remove legacy raw WASM Plugin runtime.
|
||||||
|
- Deletes the active `LegacyToolAdapter` / raw-Wasm execution path.
|
||||||
|
2. `00001KVXK0WDH` Reject legacy Plugin runtime in manifest and CLI diagnostics.
|
||||||
|
- Makes `plugin.toml`, `yoi plugin check/list/show`, docs, and fixtures reflect Component Model only runtime authority.
|
||||||
|
3. `00001KVXK0WDQ` Define Plugin Service lifecycle and ingress queue runtime.
|
||||||
|
- Adds host-managed lifecycle, bounded queue, serial dispatch, backpressure, timeout, and diagnostics.
|
||||||
|
4. `00001KVXK0WDX` Add Plugin service output command model.
|
||||||
|
- Lets service handlers request side effects as grant-checked commands rather than ambient authority.
|
||||||
|
5. `00001KVXK0WE4` Add host-owned WebSocket driver for Plugin services.
|
||||||
|
- Converts incoming WS frames into ingress events and sends outbound frames through output commands.
|
||||||
|
6. `00001KVXK0WEA` Update Plugin WIT PDK templates for service event runtime.
|
||||||
|
- Aligns authoring API, WIT, PDK, templates, and docs with the new event/command execution model.
|
||||||
|
|
||||||
|
## Success criteria / exit conditions
|
||||||
|
|
||||||
|
- Users can inspect Plugin discovery/enablement/grant/runtime state through a read-only CLI without executing Plugin code.
|
||||||
|
- Plugin authors can build a Tool Plugin without writing raw memory/pointer ABI plumbing.
|
||||||
|
- Tool Plugins can safely call grant-gated `https` and `fs` host APIs.
|
||||||
|
- Component Model is the only active Plugin runtime path, with WIT-compatible host API types and measured packaging/runtime impact.
|
||||||
|
- Plugin grants remain authoritative over registration, execution, and host API calls.
|
||||||
|
- Plugin diagnostics explain missing package, invalid manifest, digest/version mismatch, missing grant, rejected schema, runtime mismatch, legacy runtime rejection, and unsupported host API cases safely.
|
||||||
|
- Raw core-Wasm Plugin compatibility is removed before public release; tests and docs no longer treat it as a current runtime.
|
||||||
|
- Documentation covers package format, Component Model runtime, host API authority, authoring SDK/templates, Service/Ingress event runtime, and operational debugging.
|
||||||
|
- Service/Ingress work is host-managed: services have lifecycle/status, ingress uses bounded queues, side effects are output commands, and WebSocket integrations use host-owned connection drivers.
|
||||||
|
|
||||||
|
## Decision context
|
||||||
|
|
||||||
|
- This Objective is roadmap context, not Ticket authority. Implementation still requires reading concrete Ticket bodies, threads, artifacts, and relations.
|
||||||
|
- Component Model direction supersedes Yoi's custom raw ABI as both long-term and current active Plugin runtime authority before public release.
|
||||||
|
- `https` / `fs` work should avoid choices that conflict with later WIT typed interfaces.
|
||||||
|
- Guest SDK work targets Component Model directly; raw ABI wrappers are not a supported transitional authoring path.
|
||||||
|
- Plugin and MCP remain separate. Component Model adoption for Plugin does not imply MCP server execution, MCP prompt/resource injection, or MCP trust policy changes.
|
||||||
|
- Plugin surfaces remain Tool / Hook / Service / Ingress; outbound side effects are Tool metadata and host API grants, not a separate surface.
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
---
|
||||||
|
title: "Team workspace control plane and runner architecture"
|
||||||
|
state: "active"
|
||||||
|
created_at: "2026-06-20T14:26:29Z"
|
||||||
|
updated_at: "2026-06-21T18:10:00Z"
|
||||||
|
linked_tickets: ["00001KVMFFYVX"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Yoi を、単一のローカル開発ディレクトリで動くエージェント実行ツールから、チームで作業・判断・実行結果を管理できるワークスペース基盤へ発展させる。
|
||||||
|
|
||||||
|
この Objective の中心は、Web から扱える管理システムを作り、その管理システムにローカル実行環境・リモート実行環境・将来のクラウド実行環境を接続できるようにすることである。管理システムは Ticket、Objective、Memory、Knowledge、Run、Artifact、Runner の正本を持つ。実行環境はその管理システムから仕事を受け取り、コード取得、作業用ディレクトリ作成、エージェント実行、検証、結果報告を行う。
|
||||||
|
|
||||||
|
この Objective は Git ホスティングサービスを作るものではない。Git は重要な Repository provider として扱うが、Yoi の Workspace は Git Repository root と同じものにしない。Yoi が作るべきものは、コード・ドキュメント・データ・成果物などの Repository と実行環境を接続しながら、人間とエージェントの作業、Ticket lifecycle、Memory/Knowledge、検証証跡、実行環境配置を管理するチームワークスペースである。
|
||||||
|
|
||||||
|
## Glossary
|
||||||
|
|
||||||
|
この Objective では、以下の語をこの意味で使う。
|
||||||
|
|
||||||
|
- Workspace: チームまたはプロジェクトの管理単位。Ticket、Objective、Memory、Knowledge、Run、Artifact、Policy、Actor、Repository を持つ。Git Repository root ではない。
|
||||||
|
- Control plane: Workspace の正本を持ち、Web UI / API / CLI から操作される管理システム。
|
||||||
|
- Runner: Control plane から仕事を受け取り、実際にエージェントやツールを動かす実行環境。最初はローカルマシン上の runner、後でリモート runner やクラウド runner を追加する。
|
||||||
|
- Repository: Workspace に接続される source/storage。コード、ドキュメント、local directory、object storage、artifact store、dataset などを含む。Git Repository も Repository の一種であり、基本的には filesystem path ではなく URI / URL で識別する。
|
||||||
|
- Repository provider: Repository の種類ごとの実装。Git、local filesystem、object store、artifact store、将来の non-Git VCS など。
|
||||||
|
- RepositoryPoint: Repository 内の特定地点。Git commit/ref/path、object store version/prefix、file snapshot/path など、provider ごとの revision/ref/snapshot/path を表す。
|
||||||
|
- Execution Workspace: Runner が Run のために作る作業用ディレクトリや container filesystem。1 つ以上の RepositoryPoint から materialize される。Git worktree、clone、sparse checkout などはこれを作る手段である。
|
||||||
|
- Ticket: チームで扱う作業単位。目的、要件、判断、議論、完了条件、関係、証跡を持つ。
|
||||||
|
- Objective: 複数の Ticket を束ねる長期目標や設計方針。
|
||||||
|
- Run: Ticket や Objective に対して行われた具体的な実行試行。どの Runner が、どの Execution Workspace で、何を実行し、どんな結果になったかを持つ。
|
||||||
|
- Artifact: Run や Ticket に紐づく成果物や証跡。diff、log、validation result、review result、report など。
|
||||||
|
- Memory: エージェントやユーザーが再利用するための要約された文脈。Ticket や Run の正本ではない。
|
||||||
|
- Knowledge: 保守された知識や設計判断。Memory より人間が維持する資料に近い。
|
||||||
|
- Actor: 人間、エージェント、システム、外部サービスなど、Workspace 上で操作や発言を行う主体。
|
||||||
|
|
||||||
|
## Motivation / background
|
||||||
|
|
||||||
|
現在の Yoi は、ローカルの `.yoi` ディレクトリ、ローカルプロセス、Ticket ファイル、ワークツリー運用によって、自分自身の開発に使えるエージェント実行環境になっている。しかし、チーム利用、Web UI、リモート実行、クラウド実行、最終的な SaaS 提供を考えると、次の前提を変える必要がある。
|
||||||
|
|
||||||
|
- Workspace を Git Repository root と同一視しない。
|
||||||
|
- ローカル filesystem 上の `.yoi` を、長期的なチーム用正本 store にしない。
|
||||||
|
- Ticket をローカル作業メモではなく、チームの作業調整 record にする。
|
||||||
|
- Ticket と実行試行を分ける。実行試行は Run として記録する。
|
||||||
|
- 管理システムと実行環境を分ける。
|
||||||
|
- まず Web から Ticket、Objective、Memory、Knowledge、Run、Artifact、Runner state を見られるようにする。
|
||||||
|
- 最初はローカルマシンを Runner として使い、後でリモート Runner、クラウド Runner、runner pool、resource allocation、quota、billing、sandboxing に拡張する。
|
||||||
|
- Git ホスティング機能を取り込むのではなく、Git Repository / worktree / clone は Repository provider と Execution Workspace materialization の手段として扱う。
|
||||||
|
|
||||||
|
OSS として Control plane、Runner、Web frontend、protocol を公開しつつ、managed service では hosted control plane、runner fleet、リソース柔軟性、team auth、backup、audit、availability、multi-tenant operations で価値を出す。
|
||||||
|
|
||||||
|
## Strategy / design direction
|
||||||
|
|
||||||
|
### 1. Control plane を先に作る
|
||||||
|
|
||||||
|
Team Workspace の正本は server-side control plane に置く。`.yoi` は local backend、single-user/self-hosted compatibility、offline/export/import、runner-local projection、migration bridge として残せるが、multi-user SaaS の正本とはみなさない。
|
||||||
|
|
||||||
|
Control plane は Ticket、Objective、Memory、Knowledge、Run、Artifact、Actor、Permission、Audit、Runner state を管理する。Web UI、CLI、TUI、将来の desktop client は、この Control plane を操作する client であり、別の正本 store を持たない。
|
||||||
|
|
||||||
|
### 2. Workspace と Repository を同一視しない
|
||||||
|
|
||||||
|
Workspace はチームまたはプロジェクトの作業管理単位である。Repository は Workspace に接続される source/storage である。Git Repository は Repository の一種にすぎない。
|
||||||
|
|
||||||
|
1 つの Workspace は複数の Repository を持てる。Repository は filesystem path ではなく URI / URL で識別する。例として `git+https://...`、`file://...`、`s3://...`、`artifact://...`、将来の VCS provider URI などを扱えるようにする。
|
||||||
|
|
||||||
|
Ticket と Objective は Repository 配下に置かず、Workspace 配下に平たく持つ。Ticket は必要に応じて対象 Repository、ref selector、path、必要 capability を持つ。Objective は複数 Ticket にまたがる target default / scope hint を持てるが、Repository の所有物にはしない。
|
||||||
|
|
||||||
|
Run は Ticket の target selector を具体的な RepositoryPoint に解決し、その RepositoryPoint から Execution Workspace を materialize する。Git worktree 相当の機能は、この Execution Workspace を作るための実装戦略として扱う。
|
||||||
|
|
||||||
|
短期的には Git を主な Repository provider とする。ただし Yoi の authority model を Git object、Git branch、Git Repository root、worktree path に固定しない。Orchestration は Git そのものではなく、`resolve_ref`、`materialize`、`diff`、`patch`、`commit`、`merge` などの Repository capability に依存する。
|
||||||
|
|
||||||
|
### 3. Ticket を team coordination record にする
|
||||||
|
|
||||||
|
Ticket は実行そのものではない。Ticket は「何を、なぜ、どの条件で完了とみなすか」を持つ。Ticket は Workspace に平たく所属し、Repository には所属しない。コードやドキュメントを対象にする Ticket は、対象 Repository / ref selector / path / intent を target として持つ。
|
||||||
|
|
||||||
|
Ticket target は intent/selector であり、実行再現性のための immutable point ではない。Run が target selector を concrete RepositoryPoint に解決し、実際にどの revision/snapshot を materialize したかを記録する。
|
||||||
|
|
||||||
|
```text
|
||||||
|
Ticket
|
||||||
|
-> target selectors: Repository + ref selector + path + intent
|
||||||
|
-> Run / Attempt
|
||||||
|
-> resolved RepositoryPoint
|
||||||
|
-> Execution Workspace
|
||||||
|
-> Artifact / Evidence
|
||||||
|
-> Review / Decision
|
||||||
|
-> Audit / Notification
|
||||||
|
```
|
||||||
|
|
||||||
|
Target 例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Ticket targets:
|
||||||
|
- repository: main-code
|
||||||
|
role: primary
|
||||||
|
ref: develop
|
||||||
|
paths: ["crates/pod/"]
|
||||||
|
intent: change
|
||||||
|
- repository: docs
|
||||||
|
role: related
|
||||||
|
ref: main
|
||||||
|
paths: ["docs/development/"]
|
||||||
|
intent: read
|
||||||
|
|
||||||
|
Run inputs:
|
||||||
|
- repository: main-code
|
||||||
|
requested_ref: develop
|
||||||
|
resolved_point: git commit abc123
|
||||||
|
mount: /workspace/main-code
|
||||||
|
```
|
||||||
|
|
||||||
|
Ticket には次の概念が必要になる。
|
||||||
|
|
||||||
|
- Actor identity: human / agent / system / service account.
|
||||||
|
- Assignment / owner / reviewer / watcher.
|
||||||
|
- Typed thread events: comment, decision, plan, review, implementation report, state transition.
|
||||||
|
- Linked Objective / Artifact / Run / Repository / RepositoryPoint / Execution Workspace.
|
||||||
|
- Permission / visibility.
|
||||||
|
- Audit trail.
|
||||||
|
- Notification / mention.
|
||||||
|
- Board / queue / planning / review / done / archived views.
|
||||||
|
- Conflict handling and concurrent editing policy.
|
||||||
|
|
||||||
|
### 4. Memory / Knowledge の本格再設計は後回しにする
|
||||||
|
|
||||||
|
Memory / Knowledge は Ticket / Run / Artifact のコピーではない。再利用可能な文脈、方針、学習された制約、保守された知識として扱う。ただし、Memory の意味論・抽出・承認・検索・staleness 処理を今この Objective で先に作り込まない。
|
||||||
|
|
||||||
|
理由は、Memory の正しい設計が Workspace control plane の record model、Actor / visibility / permission、Ticket と Run の分離、Artifact / evidence、RepositoryPoint、Runner に渡す context の監査方法に依存するためである。これらが固まる前に Memory schema だけを作ると、local `.yoi` 前提や現行 agent runtime 前提に引っ張られ、後で再設計が必要になる。
|
||||||
|
|
||||||
|
この Objective では、Memory / Knowledge について以下の platform contract だけを維持する。
|
||||||
|
|
||||||
|
- Memory / Knowledge は Control plane が扱う record だが、Ticket / Run / Artifact の authority を置き換えない。
|
||||||
|
- 将来、Memory / Knowledge の canonical storage は Workspace control plane 側に置く。
|
||||||
|
- local `.yoi` memory は compatibility、offline/export/import、runner-local projection、migration bridge として扱う。
|
||||||
|
- Personal Memory、Workspace Memory、Run Summary、Maintained Knowledge は分離が必要である。
|
||||||
|
- Generated Memory には provenance、visibility、approval、audit が必要である。
|
||||||
|
- Runner / agent に渡した Memory/Knowledge context は、将来 ContextPack などとして Run に記録できる必要がある。
|
||||||
|
|
||||||
|
本格的な Memory 再設計は、Memory の保存先を Workspace backend / control plane record に移すタイミングで回収する。それまでは低リスクな観察、問題例の収集、既存 local memory の互換維持に留める。
|
||||||
|
|
||||||
|
### 5. 管理システムと実行環境を弱結合にする
|
||||||
|
|
||||||
|
Control plane は正本と調整を持つ。Runner は実行を担当する。
|
||||||
|
|
||||||
|
初期形:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Web UI / Control Plane
|
||||||
|
-> Runner connection
|
||||||
|
-> Local machine runner
|
||||||
|
-> Existing Yoi runtime, tools, working copy, build/test commands
|
||||||
|
```
|
||||||
|
|
||||||
|
この段階では、現在ローカル管理画面が行っている Ticket 選択、エージェント起動、レビュー起動、作業用 checkout 作成、検証実行、結果表示を、Web/control plane から local runner に対して実行できるようにする。
|
||||||
|
|
||||||
|
その後で、remote runner、self-hosted runner、hosted cloud runner、runner pool、resource allocation、quota、billing、sandbox、network policy、secret distribution を追加する。
|
||||||
|
|
||||||
|
```text
|
||||||
|
Phase 1: Web control plane + local runner
|
||||||
|
Phase 2: Remote/self-hosted runner
|
||||||
|
Phase 3: Hosted cloud runner fleet
|
||||||
|
Phase 4: Resource allocation / scheduling / quotas / billing / isolation
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Web frontend を先に作る
|
||||||
|
|
||||||
|
Desktop app は対応コストが高いので、まず Web frontend を primary UI とする。
|
||||||
|
|
||||||
|
- Web: チームで使う主要 UI。
|
||||||
|
- CLI: automation、scripting、local operations。
|
||||||
|
- TUI/local panel: local runner cockpit、fallback、dogfooding surface。
|
||||||
|
- Future desktop: Web/control-plane model が安定した後に検討する optional client。
|
||||||
|
|
||||||
|
Web UI は Ticket、Objective、Memory、Knowledge、Run、Runner、Artifact を扱う。UI の都合で正本を二重化しない。
|
||||||
|
|
||||||
|
### 7. 多重起動コストと runtime placement を見直す
|
||||||
|
|
||||||
|
Cloud/remote execution を成立させるには、多数のエージェント実行を安く管理できる必要がある。logical agent session と runtime process/resource placement を分ける。
|
||||||
|
|
||||||
|
初期 Workspace DB では、Worker を canonical table として永続化しない。Host / Worker 一覧は backend-local runtime inspection や将来の Host protocol から逐次取得する live view とし、Ticket に関わった Worker は Ticket thread events と WorkerRef snapshot / TicketWorkerLink として記録する。
|
||||||
|
|
||||||
|
Worker の一元管理、データ永続化、アーカイブは将来的には必要になる。これは Host protocol、remote/self-hosted/hosted worker lifecycle、worker identity、retention policy、audit requirements が固まった後に、dedicated Worker registry / archive model として追加する。v0 で Pod metadata の代替として Worker table を作らない。
|
||||||
|
|
||||||
|
検討対象:
|
||||||
|
|
||||||
|
- Agent identity と process/runtime placement の分離。
|
||||||
|
- Provider client、tool registry、resource cache の共有可能性。
|
||||||
|
- Prompt/resource/profile resolution cache。
|
||||||
|
- Model call multiplexing and scheduling。
|
||||||
|
- Tool execution sandbox reuse。
|
||||||
|
- Plugin instance / Service runtime との統合。
|
||||||
|
- Session/event stream と runtime lifecycle の分離。
|
||||||
|
- Runner-local cache、checkout reuse、build cache、dependency cache。
|
||||||
|
|
||||||
|
## Initial phases / candidate tickets
|
||||||
|
|
||||||
|
1. **Vocabulary / architecture record**
|
||||||
|
- Workspace / Repository / RepositoryPoint / Execution Workspace / Runner / Control Plane / Run / Ticket / Memory / Knowledge の用語と境界を固める。
|
||||||
|
2. **Team-space canonical data model**
|
||||||
|
- Ticket / Objective / Target / Run / Artifact / Actor / Permission / Audit / Memory / Knowledge の entity/event model を設計する。
|
||||||
|
3. **Ticket and Run separation**
|
||||||
|
- Ticket lifecycle と execution attempt / orchestration run / validation run を分離し、Ticket thread と Run evidence の責務を明確化する。
|
||||||
|
4. **Memory storage migration boundary**
|
||||||
|
- Memory / Knowledge の本格再設計は後回しにし、まずは Workspace backend に移す時の platform contract、compatibility/cache/export 方針、将来の provenance / visibility / approval 要件だけを固定する。
|
||||||
|
5. **Control plane backend architecture**
|
||||||
|
- local `.yoi` backend と server-side canonical backend の境界、migration/export/import、compatibility mode を設計する。
|
||||||
|
6. **Web control plane MVP design**
|
||||||
|
- read-only Ticket / Objective / Memory / Knowledge / Runner state UI/API の範囲を決める。
|
||||||
|
7. **Local runner protocol design**
|
||||||
|
- Web/control plane から local runner に安全な操作を送る protocol と authority boundary を設計する。
|
||||||
|
8. **Repository and Execution Workspace materialization model**
|
||||||
|
- Repository URI、Repository provider capability、RepositoryPoint resolution、Git worktree / clone / sparse checkout / future source backend を runner-side strategy として抽象化する。
|
||||||
|
9. **Remote/hosted runner foundation**
|
||||||
|
- runner registration, heartbeat, capability advertisement, job assignment, logs/events, secrets, sandbox/resource policy を設計する。
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Git hosting service を作ること。
|
||||||
|
- `.yoi` filesystem をそのまま SaaS canonical store にすること。
|
||||||
|
- 最初から full hosted cloud execution を作ること。
|
||||||
|
- local execution / CLI / TUI / local panel を捨てること。
|
||||||
|
- Ticket を単なる issue tracker clone にすること。
|
||||||
|
- Memory を Ticket/Run audit log の代替にすること。
|
||||||
|
- Web UI のために core authority を二重化すること。
|
||||||
|
- hidden server state を LLM context に直接注入すること。
|
||||||
|
- multi-tenant auth/billing/secret/security を shortcut して実装すること。
|
||||||
|
|
||||||
|
## Success criteria / exit conditions
|
||||||
|
|
||||||
|
- Workspace / Repository / RepositoryPoint / Execution Workspace / Runner / Control Plane / Run / Ticket / Memory / Knowledge の境界が文書化されている。
|
||||||
|
- Ticket が team coordination record として、target selector / Run / Artifact / Actor / Permission / Audit と分離された model を持つ。
|
||||||
|
- `.yoi` local backend は compatibility/local backend として整理され、server-side canonical backend の設計を阻害しない。
|
||||||
|
- Web UI/API が Ticket / Objective / Runner state を中心とした read-only view を提供できる設計または MVP を持つ。Memory / Knowledge は既存 record の表示または将来 placeholder に留め、本格再設計をこの段階の必須条件にしない。
|
||||||
|
- Control plane から local runner に対して、現在のローカル管理画面相当の安全な操作を実行できる design/protocol がある。
|
||||||
|
- Git Repository root に依存しない Workspace model があり、Git Repository は Repository provider の一種として扱われている。
|
||||||
|
- Ticket と Objective は Workspace 配下に平たく存在し、Repository への所属ではなく target selector / scope hint で対象を表現する。
|
||||||
|
- Git worktree 相当は Execution Workspace materialization strategy として扱われ、Run が immutable な RepositoryPoint を記録する。
|
||||||
|
- Memory / Knowledge は Ticket / Run / Artifact の authority を置き換えない record として platform contract だけを持つ。本格的な意味論・抽出・承認・検索・staleness 処理は、Memory の保存先を Workspace backend / control plane record に移すタイミングで回収する。
|
||||||
|
- Hosted runner / resource allocation / SaaS offering に進むための後続 Ticket が切れる状態になっている。
|
||||||
|
- 既存 local dogfooding runtime を壊さず、local use と remote-capable architecture が両立している。
|
||||||
|
|
||||||
|
## Decision context
|
||||||
|
|
||||||
|
- Yoi は hosted Git tool ではなく、team workspace control plane + execution environment として設計する。
|
||||||
|
- Team-space の長期 canonical authority は server-side control plane に置く。local `.yoi` は互換/local/offline/export/import surface だが、multi-user SaaS の正本ではない。
|
||||||
|
- 実行環境と管理システムは弱結合にする。まず管理システムを独立させ、local runner を実行環境として接続する。その後に remote/self-hosted/hosted runner fleet へ進む。
|
||||||
|
- Web frontend を最初の primary team UI とする。Desktop app は web/control-plane model が安定した後に検討する。
|
||||||
|
- Git は重要な Repository provider / materialization backend として使うが、Workspace identity と authority を Git Repository root に固定しない。
|
||||||
|
- Ticket と Objective は Workspace 配下に平たく持つ。対象コードベースや ref は Repository target selector として表現し、Run が concrete RepositoryPoint に解決する。
|
||||||
|
- Memory の本格再設計は後回しにする。先に Workspace / Ticket / Repository / Host/Worker live view / Control plane の基盤を固め、Memory の保存先を Workspace backend に移すタイミングで、意味論・抽出・承認・検索・staleness 処理をまとめて回収する。
|
||||||
|
- Worker の一元管理・データ永続化・アーカイブも後続設計に回す。初期 DB では Worker を Pod metadata の代替として永続化せず、live view と Ticket-linked WorkerRef 記録に留める。
|
||||||
@@ -0,0 +1,268 @@
|
|||||||
|
---
|
||||||
|
title: "効果的な Memory システム設計・検証"
|
||||||
|
state: "active"
|
||||||
|
created_at: "2026-06-20T15:16:00Z"
|
||||||
|
updated_at: "2026-06-20T15:16:00Z"
|
||||||
|
linked_tickets: ["00001KSKBPHRG", "00001KT02TCCG", "00001KTGCAFXG", "00001KSKBPTHR"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Yoi の Memory / Knowledge / generated memory / resident context / retrieval / usage metrics を、実際の開発・設計・レビュー・オーケストレーションに効く sensemaking substrate として再設計・検証する。
|
||||||
|
|
||||||
|
この Objective でいう「効果的な Memory システム」は、単に多く保存する仕組みではなく、作業中の問いに対して relevant material を集め、根拠を検証可能にし、再表現・仮説形成・反証探索・意思決定・成果物への反映を低コストにする仕組みである。
|
||||||
|
|
||||||
|
暫定的な定義:
|
||||||
|
|
||||||
|
- foraging cost を下げる: Ticket / Objective / current question に対して、関連する memory / docs / tickets / session evidence / code references を探しやすい。
|
||||||
|
- evidence を失わない: Memory が authority そのものにならず、Ticket / docs / git history / session logs / user instruction への検証可能な入口になる。
|
||||||
|
- schema 化を支援する: raw summary ではなく、subsystem、invariant、risk、authority boundary、open question、rejected alternative、hypothesis など推論しやすい形へ再表現できる。
|
||||||
|
- hypothesis loop を支援する: 支持証拠だけでなく、代替仮説・棄却理由・反証 evidence・stale assumption を扱える。
|
||||||
|
- product に戻る: Memory に保存して終わりではなく、Ticket、review、docs、implementation、decision、report に影響を戻せる。
|
||||||
|
- stale / contradiction を扱う: 古い前提、矛盾、適用範囲外の memory を検出・降格・更新できる。
|
||||||
|
- usage を成果基準で測る: resident exposure や read count ではなく、判断・レビュー・実装・docs に効いたかを観測できる。
|
||||||
|
|
||||||
|
## Motivation / background
|
||||||
|
|
||||||
|
現在の Memory システムは「墓場化」している。保存された情報はあるが、後続の作業で自然に使われにくく、使われたとしても根拠・適用範囲・鮮度・反証可能性が弱い。結果として Memory は、作業場ではなく古い結論の倉庫になりやすい。
|
||||||
|
|
||||||
|
Pirolli & Card 2005 の sensemaking model では、分析作業は単なる保存ではなく、次の変換として捉えられる。
|
||||||
|
|
||||||
|
```text
|
||||||
|
external data sources
|
||||||
|
-> shoebox
|
||||||
|
-> evidence file
|
||||||
|
-> schema / representation
|
||||||
|
-> hypotheses
|
||||||
|
-> presentation / product
|
||||||
|
```
|
||||||
|
|
||||||
|
Yoi の現行 Memory は、この流れのうち「保存」と「一部の検索」には対応しているが、少なくとも以下が弱い。
|
||||||
|
|
||||||
|
- Ticket / task / question ごとの shoebox がない。
|
||||||
|
- shoebox から evidence snippets を切り出し、source / provenance / applicability / confidence と共に扱う evidence file がない。
|
||||||
|
- `summary`, `decision`, `request`, `knowledge` は storage taxonomy であり、sensemaking 用 schema としては粗い。
|
||||||
|
- decision は残るが、hypothesis space、alternative、rejected reason、disconfirming evidence が残りにくい。
|
||||||
|
- reviewer / orchestrator が confirmation bias を避けるための反証探索導線が弱い。
|
||||||
|
- resident exposure と explicit retrieval は観測できても、Memory が product に効いたかは測りにくい。
|
||||||
|
|
||||||
|
この Objective は、Memory 関連の設計・検証・検討・考察を一元化し、個別 Ticket がばらばらに storage、prompt、retrieval、metrics を改善して再び墓場を増やすことを防ぐための判断背景である。
|
||||||
|
|
||||||
|
## Strategy / design direction
|
||||||
|
|
||||||
|
Memory を「長期保存領域」ではなく、Yoi の multi-agent 開発における sensemaking loop の支援機構として設計する。
|
||||||
|
|
||||||
|
### 1. Pirolli & Card の stage に合わせて責務を分ける
|
||||||
|
|
||||||
|
- external data sources: Tickets、docs、git history、session logs、reports、code、user instructions。
|
||||||
|
- shoebox: 特定 Ticket / Objective / design question に対して関連しそうな材料を集めた task-bound working set。
|
||||||
|
- evidence file: shoebox から抜き出した根拠 snippet。source anchor、支持/反証、適用範囲、confidence、staleness を持つ。
|
||||||
|
- schema / representation: subsystem、invariant、risk、authority boundary、open question、hypothesis、alternative、contradiction など、推論しやすい再表現。
|
||||||
|
- hypotheses: 採用前の設計仮説、代替案、棄却条件、反証 evidence。
|
||||||
|
- product: Ticket、review、docs、implementation、decision、report、orchestration plan などの成果物。
|
||||||
|
|
||||||
|
### 2. 最初の重点は task-bound shoebox と evidence file
|
||||||
|
|
||||||
|
Memory 墓場化の最初の原因は、保存情報が現在の問いに集まらないことである。まずは Orchestrator / Intake / Reviewer が Ticket を扱う時に、関連 memory / docs / tickets / reports / prior decisions を shoebox として束ねる導線を作る。
|
||||||
|
|
||||||
|
この段階では大きな永続 schema 追加に飛びつかず、report / Ticket artifact / bounded generated context として検証してよい。
|
||||||
|
|
||||||
|
### 3. Memory を authority にしない
|
||||||
|
|
||||||
|
Memory は Ticket、docs、git history、session logs、user instruction の代替ではない。Memory は authority record への evidence index / schema / reasoning aid として扱う。
|
||||||
|
|
||||||
|
したがって、改善案は次の性質を持つべきである。
|
||||||
|
|
||||||
|
- source / provenance を辿れる。
|
||||||
|
- stale / superseded / contradicted を扱える。
|
||||||
|
- Memory の断定をそのまま authority として使わない。
|
||||||
|
- Ticket body/thread/artifacts を読まずに Objective や Memory だけで実装判断できる状態を作らない。
|
||||||
|
|
||||||
|
### 4. 反証探索を first-class にする
|
||||||
|
|
||||||
|
より効果的な Memory は、過去方針を思い出すだけでなく、現在案を疑うために使える必要がある。
|
||||||
|
|
||||||
|
Reviewer / Orchestrator / Intake の導線では、次を探せるようにする。
|
||||||
|
|
||||||
|
- supporting evidence
|
||||||
|
- contradicting evidence
|
||||||
|
- stale decisions
|
||||||
|
- rejected alternatives
|
||||||
|
- unresolved questions
|
||||||
|
- authority boundary risks
|
||||||
|
- prior failures / reports
|
||||||
|
|
||||||
|
### 5. Metrics は exposure から product impact へ寄せる
|
||||||
|
|
||||||
|
Memory が prompt に入った、または query されたことは成功ではない。評価は次を区別する。
|
||||||
|
|
||||||
|
- resident exposure
|
||||||
|
- explicit retrieval
|
||||||
|
- cited in response
|
||||||
|
- cited in Ticket / review / report
|
||||||
|
- changed requirement
|
||||||
|
- changed implementation
|
||||||
|
- contradicted / invalidated
|
||||||
|
- led to docs or decision update
|
||||||
|
|
||||||
|
### 6. 後続 Ticket は concrete slice に分割する
|
||||||
|
|
||||||
|
この Objective は中期的な設計・検証の一元化 record であり、umbrella Ticket ではない。実装や調査は、単独で実装・レビュー・close できる concrete Ticket に分割する。
|
||||||
|
|
||||||
|
候補 slice:
|
||||||
|
|
||||||
|
- Memory sensemaking 分析 report を `docs/report/` に作る。
|
||||||
|
- Ticket routing 用 Memory shoebox artifact を試作する。
|
||||||
|
- evidence snippet schema / source resolver を設計する。
|
||||||
|
- hypothesis / rejected alternative / disconfirming evidence の表現を追加する。
|
||||||
|
- Reviewer workflow に反証探索を入れる。
|
||||||
|
- Memory usage metrics を product impact oriented に拡張する。
|
||||||
|
- stale / contradiction / renewal の検出・表示を設計する。
|
||||||
|
|
||||||
|
## Success criteria / exit conditions
|
||||||
|
|
||||||
|
- Memory システムの目的が「保存」ではなく「sensemaking loop 支援」として project records / docs / prompts / workflows で一貫して説明されている。
|
||||||
|
- Pirolli & Card の `shoebox -> evidence file -> schema -> hypotheses -> product` に対応する Yoi 内の責務と非責務が整理されている。
|
||||||
|
- Ticket / Objective / docs / session logs / Memory / Knowledge の authority boundary が明確で、Memory が authority を僭称しない。
|
||||||
|
- 少なくとも一つの実作業 routing / review / design analysis で、task-bound shoebox または evidence file が生成・利用され、作業品質にどう効いたかが確認されている。
|
||||||
|
- Memory records または関連 artifacts が source / provenance / applicability / staleness / supports-or-refutes のいずれかを扱えるようになっている。
|
||||||
|
- Reviewer / Orchestrator が supporting evidence だけでなく、contradicting evidence / stale assumptions / rejected alternatives を探す導線を持っている。
|
||||||
|
- Memory usage metrics が resident exposure と product impact を区別している。
|
||||||
|
- 古い Memory が放置されるのではなく、stale / superseded / contradicted / needs-review として扱える方針がある。
|
||||||
|
- 後続の実装 Ticket が concrete slice として分割され、Objective が Ticket dependency や進捗 container として使われていない。
|
||||||
|
|
||||||
|
この Objective は、Memory が少なくとも一つの中規模設計・実装・レビュー作業で「関連情報を見つける」「根拠を確認する」「代替案/反証を検討する」「成果物へ反映する」流れを実証し、その設計方針が docs / workflows / metrics に反映された時点で `done` を検討できる。
|
||||||
|
|
||||||
|
## Decision context
|
||||||
|
|
||||||
|
- ユーザー指摘: 「Memoryシステムが完全に墓場化している」。これは保存量不足ではなく、保存情報が現在の問い・根拠・仮説・成果物に接続されない問題として扱う。
|
||||||
|
- ユーザー指示: Memory システムの設計・検証・検討・考察を Objective にまとめ、より効果的な Memory システムを作成する目標のもとで情報を一元化する。
|
||||||
|
- 「効果的」の定義は未確定だが、当面は Pirolli & Card の sensemaking process に沿って、foraging cost、evidence quality、schema usefulness、hypothesis/disconfirmation support、product impact、staleness handling を評価軸にする。
|
||||||
|
- Memory は durable project authority ではない。Ticket、docs、git history、session logs、明示 user instruction の代替として使わない。
|
||||||
|
- Objective context は判断背景であり、個別実装の authority は各 Ticket body/thread/artifacts と明示的な Ticket relations / OrchestrationPlan records にある。
|
||||||
|
- `history` に残らない context-only injection を改善案にしない。新しい context input は history に commit する原則を守る。
|
||||||
|
- Knowledge は単なる長期保存ではなく、再利用可能な schema / model / procedure / invariant として再検討する余地がある。
|
||||||
|
- Generated memory / curated Knowledge / Ticket / docs / report の境界を再定義する場合は、authority boundary と migration/staleness を明示する。
|
||||||
|
- 関連する既存 Ticket:
|
||||||
|
- `00001KSKBPHRG` — Prompt / Workflow 評価メトリクスと改善 Offer
|
||||||
|
- `00001KT02TCCG` — Memory prompt: conditional guidance and proactive lookup
|
||||||
|
- `00001KTGCAFXG` — Use .yoi/memory marker for repo-local memory root
|
||||||
|
- `00001KSKBPTHR` — ワークスペースのメモリーをLintするヘッドレスCLI
|
||||||
|
|
||||||
|
## Historical references / prior design sources
|
||||||
|
|
||||||
|
現在の Memory システムの初期設計時には、Codex Memories / Chronicle と HermesAgent を明示的な参考事例として調査していた。関連する調査・設計記録は、現在は主に以下に退避されている。
|
||||||
|
|
||||||
|
- `docs/.local/old-docs/ref/memory-systems.md`
|
||||||
|
- `docs/.local/old-docs/plan/memory.md`
|
||||||
|
- 初期設計 commit: `ca5a3d11` — `2026-04-21 メモリシステムの設計`
|
||||||
|
- 関連 commit:
|
||||||
|
- `0c1276b7` — `Memoryシステムの整理・Promptカタログチケット`
|
||||||
|
- `3d04f793` — `memoryを抽出する仕組みの実装`
|
||||||
|
- `f1b7af62` — `docs: memoryシステムの仕様変更と、動的Tool・VCSの話`
|
||||||
|
- `a2aecbf0` — `update: memoryシステムの"Phase"表記を撤廃`
|
||||||
|
|
||||||
|
### Codex Memories / Chronicle から得た設計要素
|
||||||
|
|
||||||
|
旧設計では、Codex Memories / Chronicle を `extract -> staging -> consolidation -> durable Markdown memory` の非同期パイプラインとして捉えていた。
|
||||||
|
|
||||||
|
主な参照点:
|
||||||
|
|
||||||
|
- extract と consolidation の 2 段構成。
|
||||||
|
- extract は JSON schema / structured output で分類ブレを抑える。
|
||||||
|
- consolidation は reasoning model / agentic rewrite によって、既存 memory と staging entries を統合・整理する。
|
||||||
|
- staging と durable memory を分ける。
|
||||||
|
- `MEMORY.md` は retrieval-oriented handbook として扱う。
|
||||||
|
- `memory_summary.md` は prompt-loaded high-signal context として扱う。
|
||||||
|
- `raw_memories.md` は routing layer / task inventory 的な中間層として扱う。
|
||||||
|
- workspace diff や usage 情報を使い、stale / deleted evidence / noisy entries を整理する。
|
||||||
|
- consolidation は append だけでなく、rewrite / merge / split / trim / drop / cleanup を担う。
|
||||||
|
|
||||||
|
Yoi 初期設計では、これを参考に以下を意図していた。
|
||||||
|
|
||||||
|
- activity token 閾値で extract を発火する。
|
||||||
|
- compact より前に session log range を抽出する。
|
||||||
|
- extract は `decisions`, `discussions`, `attempts`, `requests` などの候補を staging に保存する。
|
||||||
|
- 抽出時点では Knowledge 化せず、純粋な「起きたこと」に寄せる。
|
||||||
|
- consolidation が summary / decisions / requests / knowledge candidates を整理する。
|
||||||
|
- consolidation 入力に linter warnings / usage metrics / Knowledge 化候補を含める。
|
||||||
|
- stale / superseded / unused / noisy な情報を整理する。
|
||||||
|
|
||||||
|
この Objective での再解釈:
|
||||||
|
|
||||||
|
- Codex の `raw_memories.md` は、Pirolli & Card の sensemaking model では `shoebox` または `evidence file` に近い。
|
||||||
|
- Yoi は extract / consolidation という pipeline だけを継承しても不十分であり、task-bound shoebox / evidence file / hypothesis loop / product feedback がなければ Memory は再び墓場化する。
|
||||||
|
- 特に、staging を consolidation の一時入力としてだけ扱うと、後続 Ticket / Objective / review が使う探索入口にならない。
|
||||||
|
- Yoi では `raw memories` 相当の中間層を、現在の問いに紐づく working set / evidence index として再設計する必要がある。
|
||||||
|
|
||||||
|
### HermesAgent から得た設計要素
|
||||||
|
|
||||||
|
旧設計では、Nous Research HermesAgent を 3 層の memory system として整理していた。
|
||||||
|
|
||||||
|
- Persistent Memory:
|
||||||
|
- `MEMORY.md` / `USER.md`
|
||||||
|
- Markdown + SQLite / FTS5 session search
|
||||||
|
- 起動時 system prompt snapshot
|
||||||
|
- bounded character limits
|
||||||
|
- Skill Library:
|
||||||
|
- procedural memory
|
||||||
|
- `~/.hermes/skills/<name>/SKILL.md`
|
||||||
|
- `skill_manage` tool による agentic CRUD
|
||||||
|
- User Model / Honcho:
|
||||||
|
- dialectic user modeling
|
||||||
|
- 外部 service 連携
|
||||||
|
|
||||||
|
HermesAgent で特に重要だった点:
|
||||||
|
|
||||||
|
- memory / skill review は一定 turn / tool iteration ごとに background agent として起動する。
|
||||||
|
- 保存すべきものがなければ `Nothing to save.` で NOP として終了する。
|
||||||
|
- Yoi extract の「空配列許容」はこの設計からも影響を受けている。
|
||||||
|
- memory は session start 時の frozen snapshot として system prompt に入り、mid-session write で prompt cache を壊さない。
|
||||||
|
- persistent memory は bounded で、limit 超過時は deterministic eviction ではなく、agent に replace / remove を促す。
|
||||||
|
- procedural memory / skills は一般 memory から分離されている。
|
||||||
|
- SQLite FTS5 + LLM summarization による cross-session recall がある。
|
||||||
|
|
||||||
|
この Objective での再解釈:
|
||||||
|
|
||||||
|
- HermesAgent の `MEMORY.md` / `USER.md` / `skills` の分離は、Yoi の Knowledge / Workflow / prompt resource / docs / Ticket decision / generated memory の責務再整理に使える。
|
||||||
|
- reusable procedure, reviewer focus, orchestration tactic, project preference, user preference, design invariant を同じ Memory bucket に入れると墓場化しやすい。
|
||||||
|
- `Nothing to save.` / empty extraction allowed は重要だが、保存抑制だけでは効果的な Memory にはならない。保存されたものが task-bound shoebox / evidence / schema / hypothesis / product に接続される必要がある。
|
||||||
|
- frozen snapshot / prompt cache 配慮は Yoi の history/context 加工原則と整合するが、それだけでは retrieval / resurfacing / disconfirmation は解決しない。
|
||||||
|
|
||||||
|
### Lessons for the next design iteration
|
||||||
|
|
||||||
|
Codex と HermesAgent の調査から、Yoi が継承すべきものと、継承するだけでは足りないものを分ける。
|
||||||
|
|
||||||
|
継承すべきもの:
|
||||||
|
|
||||||
|
- structured extract と agentic consolidation の分離。
|
||||||
|
- staging / raw memories / durable memory の分離。
|
||||||
|
- 保存対象がなければ NOP にする発火設計。
|
||||||
|
- prompt-loaded summary と durable retrieval-oriented memory の分離。
|
||||||
|
- stale / noisy / unused entries の cleanup。
|
||||||
|
- procedural memory と declarative memory の分離。
|
||||||
|
- session search / usage metrics / linter feedback を consolidation に入れる設計。
|
||||||
|
|
||||||
|
足りないもの:
|
||||||
|
|
||||||
|
- Pirolli & Card の sensemaking stage における各 record の役割定義。
|
||||||
|
- Ticket / Objective / current question に紐づく task-bound shoebox。
|
||||||
|
- authority record へ戻れる evidence file / provenance / source anchor。
|
||||||
|
- hypothesis, alternative hypothesis, rejected reason, disconfirming evidence の first-class 表現。
|
||||||
|
- reviewer / orchestrator が confirmation bias を避けるための反証探索導線。
|
||||||
|
- resident exposure や read count ではなく product impact を測る metrics。
|
||||||
|
- stale / contradiction / renewal を作業中に resurfacing する導線。
|
||||||
|
|
||||||
|
したがって、次の Memory 設計は Codex / HermesAgent の単純なコピーではなく、以下を満たす必要がある。
|
||||||
|
|
||||||
|
```text
|
||||||
|
external data / sessions / tickets / docs / code
|
||||||
|
-> task-bound shoebox
|
||||||
|
-> evidence file with provenance
|
||||||
|
-> schema / representation
|
||||||
|
-> hypotheses and disconfirmation
|
||||||
|
-> Ticket / review / docs / implementation / decision product
|
||||||
|
-> product impact and stale-feedback metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
この Objective では、以後の Memory 関連 Ticket / report / implementation をこの historical reference と sensemaking model の両方に照らして判断する。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Pod: 任意ターンからの Fork(複数ターン巻き戻し)"
|
title: "Pod: 任意ターンからの Fork(複数ターン巻き戻し)"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-05-27T00:00:09Z"
|
created_at: "2026-05-27T00:00:09Z"
|
||||||
updated_at: "2026-05-27T00:00:09Z"
|
updated_at: '2026-06-20T16:31:29Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Migration reference
|
## Migration reference
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as no longer needed. Arbitrary-turn Pod/session fork and multi-turn rewind are not part of the current desired workflow; current restore/rewind/fork behavior is sufficient for active use, and future history editing should be reopened as a narrower current-runtime design if needed.
|
||||||
@@ -4,4 +4,22 @@
|
|||||||
|
|
||||||
Migrated from tickets/pod-session-fork.md. No legacy review file was present at migration time.
|
Migrated from tickets/pod-session-fork.md. No legacy review file was present at migration time.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:31:28Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:31:29Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as no longer needed. Arbitrary-turn Pod/session fork and multi-turn rewind are not part of the current desired workflow; current restore/rewind/fork behavior is sufficient for active use, and future history editing should be reopened as a narrower current-runtime design if needed.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Prompt / Workflow 評価メトリクスと改善 Offer"
|
title: "Prompt / Workflow 評価メトリクスと改善 Offer"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-05-27T00:00:10Z"
|
created_at: "2026-05-27T00:00:10Z"
|
||||||
updated_at: "2026-05-27T00:00:10Z"
|
updated_at: '2026-06-20T16:31:29Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Migration reference
|
## Migration reference
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as superseded/no longer needed. Workflow evaluation metrics and improvement planning have moved under the newer Memory redesign / team-workspace memory objectives, so this old prompt/workflow metrics ticket should not remain as a standalone planning item.
|
||||||
@@ -4,4 +4,22 @@
|
|||||||
|
|
||||||
Migrated from tickets/prompt-eval-metrics.md. No legacy review file was present at migration time.
|
Migrated from tickets/prompt-eval-metrics.md. No legacy review file was present at migration time.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:31:29Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:31:29Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as superseded/no longer needed. Workflow evaluation metrics and improvement planning have moved under the newer Memory redesign / team-workspace memory objectives, so this old prompt/workflow metrics ticket should not remain as a standalone planning item.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "TUI: navigation mode / block focus の設計"
|
title: "TUI: navigation mode / block focus の設計"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-05-27T00:00:15Z"
|
created_at: "2026-05-27T00:00:15Z"
|
||||||
updated_at: "2026-05-27T00:00:15Z"
|
updated_at: '2026-06-20T16:31:29Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Migration reference
|
## Migration reference
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as no longer needed. The current TUI navigation/block-focus behavior is satisfactory, so the older navigation-mode design ticket is obsolete.
|
||||||
@@ -4,4 +4,22 @@
|
|||||||
|
|
||||||
Migrated from tickets/tui-navigation-mode-design.md. No legacy review file was present at migration time.
|
Migrated from tickets/tui-navigation-mode-design.md. No legacy review file was present at migration time.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:31:29Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:31:29Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as no longer needed. The current TUI navigation/block-focus behavior is satisfactory, so the older navigation-mode design ticket is obsolete.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Audit crate responsibility boundaries"
|
title: "Audit crate responsibility boundaries"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-05-28T13:13:17Z"
|
created_at: "2026-05-28T13:13:17Z"
|
||||||
updated_at: "2026-05-28T13:13:17Z"
|
updated_at: '2026-06-20T16:45:54Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Background
|
## Background
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as completed. The crate responsibility boundary audit was already performed and recorded in artifacts/audit.md with concrete findings; any implementation cleanup should be handled by narrower follow-up tickets.
|
||||||
@@ -4,4 +4,22 @@
|
|||||||
|
|
||||||
Created by tickets.sh create.
|
Created by tickets.sh create.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:45:54Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:45:54Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as completed. The crate responsibility boundary audit was already performed and recorded in artifacts/audit.md with concrete findings; any implementation cleanup should be handled by narrower follow-up tickets.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: 'Plugin: define runtime, surface, and minimal host API model'
|
title: 'Plugin: define runtime, surface, and minimal host API model'
|
||||||
state: 'planning'
|
state: 'closed'
|
||||||
created_at: '2026-05-31T01:00:05Z'
|
created_at: '2026-05-31T01:00:05Z'
|
||||||
updated_at: '2026-06-14T17:22:23Z'
|
updated_at: '2026-06-19T13:29:26Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
Closed as superseded by durable Objective and design documentation.
|
||||||
|
|
||||||
|
This Ticket was a broad Plugin runtime/surface/host API design record rather than a concrete implementation task. The useful design decisions have been moved into durable roadmap/design context:
|
||||||
|
- Objective `00001KVG0HR9M` (`Plugin platform roadmap`) now owns the overall Plugin roadmap and sequencing context.
|
||||||
|
- `docs/design/plugin-component-model.md` records Component Model research and migration direction.
|
||||||
|
- `docs/design/plugin-packages.md` records package/runtime metadata direction.
|
||||||
|
|
||||||
|
Concrete implementation work remains tracked by implementation Tickets such as package discovery, Tool registration, WASM runtime, permission grants, CLI inspection, `https`, `fs`, and Component Model runtime migration. Future Plugin work should be filed as concrete implementation Tickets, not broad design umbrella Tickets.
|
||||||
@@ -99,4 +99,29 @@ This preserves the desired detachable shape: feature state remains in the featur
|
|||||||
- General-purpose host API は引き続き `https` と `fs` に絞る。`ingress.submit` と `diagnostics` は surface-intrinsic host calls として扱い、広い ambient capability にはしない。
|
- General-purpose host API は引き続き `https` と `fs` に絞る。`ingress.submit` と `diagnostics` は surface-intrinsic host calls として扱い、広い ambient capability にはしない。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-19T13:29:26Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-19T13:29:26Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as superseded by durable Objective and design documentation.
|
||||||
|
|
||||||
|
This Ticket was a broad Plugin runtime/surface/host API design record rather than a concrete implementation task. The useful design decisions have been moved into durable roadmap/design context:
|
||||||
|
- Objective `00001KVG0HR9M` (`Plugin platform roadmap`) now owns the overall Plugin roadmap and sequencing context.
|
||||||
|
- `docs/design/plugin-component-model.md` records Component Model research and migration direction.
|
||||||
|
- `docs/design/plugin-packages.md` records package/runtime metadata direction.
|
||||||
|
|
||||||
|
Concrete implementation work remains tracked by implementation Tickets such as package discovery, Tool registration, WASM runtime, permission grants, CLI inspection, `https`, `fs`, and Component Model runtime migration. Future Plugin work should be filed as concrete implementation Tickets, not broad design umbrella Tickets.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: 'Plugin distribution package format and discovery'
|
title: 'Plugin distribution package format and discovery'
|
||||||
state: 'done'
|
state: 'closed'
|
||||||
created_at: '2026-06-01T06:49:53Z'
|
created_at: '2026-06-01T06:49:53Z'
|
||||||
updated_at: '2026-06-14T15:56:45Z'
|
updated_at: '2026-06-15T06:33:50Z'
|
||||||
queued_by: 'workspace-panel'
|
queued_by: 'workspace-panel'
|
||||||
queued_at: '2026-06-14T15:40:15Z'
|
queued_at: '2026-06-14T15:40:15Z'
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KT0Z4BK8` (`Plugin distribution package format and discovery`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -375,4 +375,24 @@ Cleanup planned:
|
|||||||
|
|
||||||
Reviewer approved, documentation/design implementation branch merged into the orchestration branch, and documentation-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
Reviewer approved, documentation/design implementation branch merged into the orchestration branch, and documentation-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T06:33:50Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T06:33:50Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KT0Z4BK8` (`Plugin distribution package format and discovery`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Audit external dependencies and license posture"
|
title: "Audit external dependencies and license posture"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-06-01T12:36:41Z"
|
created_at: "2026-06-01T12:36:41Z"
|
||||||
updated_at: "2026-06-01T13:08:45Z"
|
updated_at: '2026-06-20T16:45:54Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Background
|
## Background
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as completed. The dependency/license audit was already performed and recorded in artifacts/audit-report.md with implementation report evidence; any dependency cleanup or third-party notice work should be tracked by narrower follow-up tickets.
|
||||||
@@ -418,4 +418,22 @@ Interpretation:
|
|||||||
- Acceptance: compare current `html5ever`/`RcDom` extractor with viable maintained alternatives; preserve bounded, safe, link-aware extraction behavior; only proceed if measurable binary/build-time benefit exists.
|
- Acceptance: compare current `html5ever`/`RcDom` extractor with viable maintained alternatives; preserve bounded, safe, link-aware extraction behavior; only proceed if measurable binary/build-time benefit exists.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:45:54Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:45:54Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as completed. The dependency/license audit was already performed and recorded in artifacts/audit-report.md with implementation report evidence; any dependency cleanup or third-party notice work should be tracked by narrower follow-up tickets.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Workspace panel Companion interface"
|
title: "Workspace panel Companion interface"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-06-07T00:16:51Z"
|
created_at: "2026-06-07T00:16:51Z"
|
||||||
updated_at: "2026-06-07T03:13:01Z"
|
updated_at: '2026-06-18T13:06:31Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Background
|
## Background
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Closed as completed by child Tickets.
|
||||||
|
|
||||||
|
The original Workspace Panel Companion interface plan has been implemented through more specific work:
|
||||||
|
- direct selected-Pod send was removed from the Panel composer path;
|
||||||
|
- Panel composer routing now targets the workspace Companion and Ticket Intake explicitly;
|
||||||
|
- workspace Companion Pod lifecycle restore/spawn/observe behavior is implemented;
|
||||||
|
- local role/session registry and Ticket claim handling were added for Panel-launched role sessions;
|
||||||
|
- project role Profile feature defaults limit Companion authority and keep Ticket orchestration / Pods / Task disabled for Companion by default.
|
||||||
|
|
||||||
|
The remaining work in this area should be tracked as targeted follow-up Tickets rather than keeping this umbrella planning Ticket open.
|
||||||
@@ -74,4 +74,31 @@ Companion work is useful but not required for near-term panel operation. The pan
|
|||||||
|
|
||||||
Decision: downgrade Companion-related follow-up priority to P2 so near-term focus can stay on Ticket role config strictness/init, Orchestrator queue automation, and workflow/compaction reliability.
|
Decision: downgrade Companion-related follow-up priority to P2 so near-term focus can stay on Ticket role config strictness/init, Orchestrator queue automation, and workflow/compaction reliability.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-18T13:06:31Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-18T13:06:31Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as completed by child Tickets.
|
||||||
|
|
||||||
|
The original Workspace Panel Companion interface plan has been implemented through more specific work:
|
||||||
|
- direct selected-Pod send was removed from the Panel composer path;
|
||||||
|
- Panel composer routing now targets the workspace Companion and Ticket Intake explicitly;
|
||||||
|
- workspace Companion Pod lifecycle restore/spawn/observe behavior is implemented;
|
||||||
|
- local role/session registry and Ticket claim handling were added for Panel-launched role sessions;
|
||||||
|
- project role Profile feature defaults limit Companion authority and keep Ticket orchestration / Pods / Task disabled for Companion by default.
|
||||||
|
|
||||||
|
The remaining work in this area should be tracked as targeted follow-up Tickets rather than keeping this umbrella planning Ticket open.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Preserve active workflows across compaction"
|
title: "Preserve active workflows across compaction"
|
||||||
state: 'done'
|
state: 'closed'
|
||||||
created_at: "2026-06-07T02:23:28Z"
|
created_at: "2026-06-07T02:23:28Z"
|
||||||
updated_at: '2026-06-14T16:26:01Z'
|
updated_at: '2026-06-15T06:33:44Z'
|
||||||
queued_by: 'workspace-panel'
|
queued_by: 'workspace-panel'
|
||||||
queued_at: '2026-06-14T15:23:07Z'
|
queued_at: '2026-06-14T15:23:07Z'
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KTFY8V80` (`Preserve active workflows across compaction`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -414,4 +414,24 @@ Cleanup planned:
|
|||||||
|
|
||||||
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T06:33:44Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T06:33:44Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KTFY8V80` (`Preserve active workflows across compaction`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Improve Pod notification injection guidance"
|
title: "Improve Pod notification injection guidance"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-06-07T07:33:13Z"
|
created_at: "2026-06-07T07:33:13Z"
|
||||||
updated_at: "2026-06-07T07:33:13Z"
|
updated_at: '2026-06-20T16:23:37Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## Background
|
## Background
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Closed as stale/currently not needed. Orchestrator role/profile/workflow notification guidance has since improved, and the broad planning issue is not currently reproducing. If similar notification-as-user-turn confusion recurs in default profiles or generic notification wrappers, create a narrower ticket against the current prompt/profile state.
|
||||||
@@ -4,4 +4,39 @@
|
|||||||
|
|
||||||
Created by LocalTicketBackend create.
|
Created by LocalTicketBackend create.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: intake at: 2026-06-20T16:20:17Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
ユーザー判断により、この Ticket は一旦 close 推奨とする。
|
||||||
|
|
||||||
|
理由:
|
||||||
|
- Ticket 作成後に Orchestrator profile / role prompt / workflow guidance の改善が複数回入っている。
|
||||||
|
- 現在の明示的な Orchestrator role では、通知を user request と誤認しているケースを最近見かけていない。
|
||||||
|
- default profile では同種の誤認がまだ起き得る可能性はあるが、現時点でこの broad な planning Ticket を残しておくほどの実害・優先度は確認されていない。
|
||||||
|
|
||||||
|
判断:
|
||||||
|
- この Ticket は stale / currently not needed として close してよい。
|
||||||
|
- 将来 default profile や generic notify_wrapper で同じ問題が再発した場合は、現在の prompt/profile 状態を前提に、より狭い concrete Ticket として切り直す。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T16:23:37Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T16:23:37Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as stale/currently not needed. Orchestrator role/profile/workflow notification guidance has since improved, and the broad planning issue is not currently reproducing. If similar notification-as-user-turn confusion recurs in default profiles or generic notification wrappers, create a narrower ticket against the current prompt/profile state.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "Ticket lifecycle commit noise を減らし commit / publication policy を一本化する"
|
title: "Ticket lifecycle commit noise を減らし commit / publication policy を一本化する"
|
||||||
state: "planning"
|
state: 'closed'
|
||||||
created_at: "2026-06-07T22:43:09Z"
|
created_at: "2026-06-07T22:43:09Z"
|
||||||
updated_at: "2026-06-11T05:45:00Z"
|
updated_at: '2026-06-18T12:22:10Z'
|
||||||
---
|
---
|
||||||
|
|
||||||
## 背景
|
## 背景
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Closed as resolved by current dogfooding workflow rather than a new broad implementation.
|
||||||
|
|
||||||
|
The active policy is now operationally established:
|
||||||
|
- do not commit one Ticket lifecycle event per Git commit mechanically;
|
||||||
|
- batch related Ticket-only updates when they belong to the same decision/work burst;
|
||||||
|
- keep implementation/code commits separate from Ticket publication commits unless a merge step requires both;
|
||||||
|
- stage only exact Ticket paths and never broad auto-commit unrelated user changes;
|
||||||
|
- use orchestration worktree/branch for active progress and publish to the main workspace at explicit merge/close/follow-up boundaries;
|
||||||
|
- keep audit evidence in Ticket files/thread/resolution even when Git commits are batched.
|
||||||
|
|
||||||
|
Future changes should be filed as targeted Tickets, such as Panel dirty-state UX, workflow prompt wording, or automated queue commit behavior.
|
||||||
@@ -4,4 +4,32 @@
|
|||||||
|
|
||||||
Created by LocalTicketBackend create.
|
Created by LocalTicketBackend create.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-18T12:22:10Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-18T12:22:10Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as resolved by current dogfooding workflow rather than a new broad implementation.
|
||||||
|
|
||||||
|
The active policy is now operationally established:
|
||||||
|
- do not commit one Ticket lifecycle event per Git commit mechanically;
|
||||||
|
- batch related Ticket-only updates when they belong to the same decision/work burst;
|
||||||
|
- keep implementation/code commits separate from Ticket publication commits unless a merge step requires both;
|
||||||
|
- stage only exact Ticket paths and never broad auto-commit unrelated user changes;
|
||||||
|
- use orchestration worktree/branch for active progress and publish to the main workspace at explicit merge/close/follow-up boundaries;
|
||||||
|
- keep audit evidence in Ticket files/thread/resolution even when Git commits are batched.
|
||||||
|
|
||||||
|
Future changes should be filed as targeted Tickets, such as Panel dirty-state UX, workflow prompt wording, or automated queue commit behavior.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: 'Implement MCP 2025-11-25 local stdio server-feature bridge'
|
title: 'Implement MCP 2025-11-25 local stdio server-feature bridge'
|
||||||
state: 'planning'
|
state: 'closed'
|
||||||
created_at: '2026-06-10T07:48:49Z'
|
created_at: '2026-06-10T07:48:49Z'
|
||||||
updated_at: '2026-06-13T15:29:21Z'
|
updated_at: '2026-06-20T05:33:15Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
readiness: 'blocked'
|
readiness: 'blocked'
|
||||||
risk_flags: ['mcp', 'prompt-context', 'permission-scope', 'secrets', 'process-exec', 'feature-api', 'trust-boundary']
|
risk_flags: ['mcp', 'prompt-context', 'permission-scope', 'secrets', 'process-exec', 'feature-api', 'trust-boundary']
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Closed as superseded by concrete MCP implementation Tickets.
|
||||||
|
|
||||||
|
This Ticket bundled config/trust policy, stdio lifecycle, tools/list registration, tools/call execution, resources/prompts operations, result serialization, and list_changed handling into one broad implementation item. That is too coarse for the current Ticket policy: Tickets should be concrete implementation tasks.
|
||||||
|
|
||||||
|
The MCP roadmap now lives in Objective `00001KTR80WMN` (`MCP local stdio integration roadmap`). Concrete follow-up Tickets are:
|
||||||
|
- `00001KVHR3WRF` — local stdio server config and trust policy;
|
||||||
|
- `00001KVHR3WRY` — stdio JSON-RPC lifecycle client;
|
||||||
|
- `00001KVHR3WS6` — server tools registration into ToolRegistry;
|
||||||
|
- `00001KVHR3WSD` — tools/call execution through ordinary Tool path;
|
||||||
|
- `00001KVHR3WSN` — resources/prompts as explicit tool operations;
|
||||||
|
- `00001KVHR3WSW` — list_changed notification handling.
|
||||||
|
|
||||||
|
Future MCP work should use those concrete Tickets or similarly scoped follow-ups, not this broad umbrella Ticket.
|
||||||
@@ -22,4 +22,34 @@ LocalTicketBackend によって作成されました。
|
|||||||
- `00001KSXRQ4G8` と `00001KT0Z4BK8` は Plugin permission を Plugin layer として扱い、MCP を初期 Plugin packaging/runtime から分離する。
|
- `00001KSXRQ4G8` と `00001KT0Z4BK8` は Plugin permission を Plugin layer として扱い、MCP を初期 Plugin packaging/runtime から分離する。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-20T05:33:15Z from: planning to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-20T05:33:15Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as superseded by concrete MCP implementation Tickets.
|
||||||
|
|
||||||
|
This Ticket bundled config/trust policy, stdio lifecycle, tools/list registration, tools/call execution, resources/prompts operations, result serialization, and list_changed handling into one broad implementation item. That is too coarse for the current Ticket policy: Tickets should be concrete implementation tasks.
|
||||||
|
|
||||||
|
The MCP roadmap now lives in Objective `00001KTR80WMN` (`MCP local stdio integration roadmap`). Concrete follow-up Tickets are:
|
||||||
|
- `00001KVHR3WRF` — local stdio server config and trust policy;
|
||||||
|
- `00001KVHR3WRY` — stdio JSON-RPC lifecycle client;
|
||||||
|
- `00001KVHR3WS6` — server tools registration into ToolRegistry;
|
||||||
|
- `00001KVHR3WSD` — tools/call execution through ordinary Tool path;
|
||||||
|
- `00001KVHR3WSN` — resources/prompts as explicit tool operations;
|
||||||
|
- `00001KVHR3WSW` — list_changed notification handling.
|
||||||
|
|
||||||
|
Future MCP work should use those concrete Tickets or similarly scoped follow-ups, not this broad umbrella Ticket.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: 'Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows'
|
title: 'Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows'
|
||||||
state: 'done'
|
state: 'closed'
|
||||||
created_at: '2026-06-13T10:54:31Z'
|
created_at: '2026-06-13T10:54:31Z'
|
||||||
updated_at: '2026-06-14T15:55:36Z'
|
updated_at: '2026-06-15T06:33:52Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
readiness: 'implementation_ready'
|
readiness: 'implementation_ready'
|
||||||
risk_flags: ['panel-ux', 'local-role-session-registry', 'pod-session-state']
|
risk_flags: ['panel-ux', 'local-role-session-registry', 'pod-session-state']
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV09WYC6` (`Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -244,4 +244,24 @@ Cleanup planned:
|
|||||||
|
|
||||||
Reviewer approved, implementation branch merged into the orchestration branch, focused validation passed in the Orchestrator worktree, and cleanup is ready. Marking Ticket done in the orchestration branch.
|
Reviewer approved, implementation branch merged into the orchestration branch, focused validation passed in the Orchestrator worktree, and cleanup is ready. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T06:33:52Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T06:33:52Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV09WYC6` (`Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: 'Panel: invalid Ticket があっても Ticket 機能全体を無効化しない'
|
title: 'Panel: invalid Ticket があっても Ticket 機能全体を無効化しない'
|
||||||
state: 'done'
|
state: 'closed'
|
||||||
created_at: '2026-06-14T14:56:51Z'
|
created_at: '2026-06-14T14:56:51Z'
|
||||||
updated_at: '2026-06-14T16:38:01Z'
|
updated_at: '2026-06-15T04:12:40Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
readiness: 'implementation_ready'
|
readiness: 'implementation_ready'
|
||||||
risk_flags: ['tui-panel', 'ticket-backend', 'partial-failure', 'diagnostics']
|
risk_flags: ['tui-panel', 'ticket-backend', 'partial-failure', 'diagnostics']
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV3A5CNH` (`Panel: invalid Ticket があっても Ticket 機能全体を無効化しない`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -351,4 +351,24 @@ Cleanup planned:
|
|||||||
|
|
||||||
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T04:12:40Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T04:12:40Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV3A5CNH` (`Panel: invalid Ticket があっても Ticket 機能全体を無効化しない`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: '対象 TUI/Panel merge commit の挙動を現行 E2E で確認する'
|
title: '対象 TUI/Panel merge commit の挙動を現行 E2E で確認する'
|
||||||
state: 'done'
|
state: 'closed'
|
||||||
created_at: '2026-06-14T15:24:05Z'
|
created_at: '2026-06-14T15:24:05Z'
|
||||||
updated_at: '2026-06-14T16:54:05Z'
|
updated_at: '2026-06-15T06:33:44Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
readiness: 'implementation_ready'
|
readiness: 'implementation_ready'
|
||||||
risk_flags: ['e2e', 'tui', 'panel', 'regression-evidence']
|
risk_flags: ['e2e', 'tui', 'panel', 'regression-evidence']
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV3BQ7Q3` (`対象 TUI/Panel merge commit の挙動を現行 E2E で確認する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -235,4 +235,24 @@ Cleanup planned:
|
|||||||
|
|
||||||
Reviewer approved, implementation/evidence branch merged into the orchestration branch, and E2E-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
Reviewer approved, implementation/evidence branch merged into the orchestration branch, and E2E-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T06:33:44Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T06:33:44Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV3BQ7Q3` (`対象 TUI/Panel merge commit の挙動を現行 E2E で確認する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-063825-1","ticket_id":"00001KV4YAAVY","kind":"accepted_plan","accepted_plan":{"summary":"Accept single-Pod View text selection/copy work. Implement mouse drag selection, highlight, Esc clear, y copy+clear, deterministic multi-item extraction, and focused tests without changing Panel row selection semantics.","branch":"impl/00001KV4YAAVY-single-pod-text-selection","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4YAAVY-single-pod-text-selection","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. This single-Pod View work is source/logically disjoint from Panel composer work enough for parallel start."},"author":"yoi-orchestrator","at":"2026-06-15T06:38:25Z"}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV4YAAVY",
|
||||||
|
"kind": "related",
|
||||||
|
"target": "00001KV072V89",
|
||||||
|
"note": "different scope: Panel row click selection vs single-Pod View text selection",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T06:09:16Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV4YAAVY",
|
||||||
|
"kind": "related",
|
||||||
|
"target": "00001KV10SN02",
|
||||||
|
"note": "mouse behavior/E2E coverage may need follow-up",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T06:09:17Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
---
|
||||||
|
title: 'single-Pod View Item text をマウスドラッグで選択・コピーできるようにする'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T06:08:19Z'
|
||||||
|
updated_at: '2026-06-15T14:59:40Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['tui', 'mouse-input', 'selection', 'clipboard', 'single-pod-view']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T06:37:00Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
single-Pod TUI の View では、端末ネイティブ選択に頼らず、Yoi 自身が View Item の表示テキストをマウスドラッグで選択できるようにする。
|
||||||
|
|
||||||
|
既存の `00001KV072V89` は `yoi panel` の View item / row click selection であり、この Ticket の対象ではない。この Ticket は Panel ではなく、通常の single-Pod conversation View に表示される Item text の選択・コピーを対象にする。
|
||||||
|
|
||||||
|
端末ネイティブ選択は不要。View 内でドラッグしたら自動的に Yoi の selection state に入り、`Esc` で解除、選択したまま `y` で copy & selection clear する。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- 対象は single-Pod TUI の View Item text。
|
||||||
|
- 主対象 Item は text-like なもの。
|
||||||
|
- UserItem
|
||||||
|
- SystemItem
|
||||||
|
- AssistantItem
|
||||||
|
- View 内の text-like Item 上で mouse drag すると、自動的に selection state に入る。
|
||||||
|
- drag start が anchor
|
||||||
|
- drag current/end が focus
|
||||||
|
- mouse release 後も selection は保持される
|
||||||
|
- 選択状態は View 上で highlight される。
|
||||||
|
- `Esc` で selection を解除する。
|
||||||
|
- selection がある状態で `y` を押すと、選択テキストを copy し、selection を解除する。
|
||||||
|
- Item を跨いだ selection を可能にする。
|
||||||
|
- text-like Item 間を跨ぐ selection は supported behavior とする。
|
||||||
|
- Item 間の copied text separator は読みやすく deterministic にする。基本は newline / blank line のどちらかを実装時に選び、test で固定する。
|
||||||
|
- 選択 text は model context / Pod history / session log / Ticket に記録しない。
|
||||||
|
- composer 入力、scroll、rewind picker、modal/popup、通常 key handling と衝突しない。
|
||||||
|
- View に mouse selection を妨げる mode は基本的に置かない。
|
||||||
|
- terminal-native text selection preservation はこの Ticket の goal ではない。
|
||||||
|
- View の drag 操作は Yoi text selection として扱う。
|
||||||
|
- 既存 Panel row click selection と混同しない。
|
||||||
|
- Panel row selection behavior を変更しない。
|
||||||
|
- single-Pod View Item text selection のみを対象にする。
|
||||||
|
|
||||||
|
## Tool / non-text Item handling
|
||||||
|
|
||||||
|
Tool 系 Item を selection range に含んだ場合のコピー仕様は未決定であり、実装前または実装中に明示判断する。
|
||||||
|
|
||||||
|
候補:
|
||||||
|
|
||||||
|
- tool系 Item を non-selectable gap として skip する
|
||||||
|
- tool系 Item は summary/placeholder text のみコピーする
|
||||||
|
- tool系 Item に selection が入ったら range boundary をそこで止める
|
||||||
|
|
||||||
|
この Ticket の必須範囲は、UserItem / SystemItem / AssistantItem の text-like Item selection である。Tool 系の扱いで設計判断が必要になった場合は、実装報告または decision comment に記録する。
|
||||||
|
|
||||||
|
## Copy target
|
||||||
|
|
||||||
|
`y` の copy target は実装時に既存 TUI/clipboard abstraction を確認して選ぶ。
|
||||||
|
|
||||||
|
優先:
|
||||||
|
|
||||||
|
- 既存 clipboard abstraction があればそれを使う。
|
||||||
|
- 無ければ最小の copy path を追加する。
|
||||||
|
|
||||||
|
OSC52 / system clipboard / internal copy buffer の選択は実装時に判断してよいが、以下を満たすこと:
|
||||||
|
|
||||||
|
- user-visible に copy 成功/失敗が分かる
|
||||||
|
- secret-like diagnostics を出さない
|
||||||
|
- selected text が model/history に混入しない
|
||||||
|
- tests で copy された text を検証できる
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- single-Pod View の UserItem / SystemItem / AssistantItem text を mouse drag で選択できる。
|
||||||
|
- 選択範囲が View 上で highlight される。
|
||||||
|
- mouse release 後も selection が保持される。
|
||||||
|
- `Esc` で selection が解除される。
|
||||||
|
- `y` で selected text が copy され、selection が解除される。
|
||||||
|
- text-like Item を跨いだ selection が deterministic な text として copy される。
|
||||||
|
- Tool 系 Item を range に含んだ時の扱いが、実装または decision comment で明示されている。
|
||||||
|
- composer / scroll / rewind picker / modal / normal key handling の既存挙動が壊れない。
|
||||||
|
- Panel row mouse selection には regression がない。
|
||||||
|
- selection/copy state は Pod history、model context、session log、Ticket records に残らない。
|
||||||
|
- Focused tests cover:
|
||||||
|
- mouse coordinate -> View Item text point mapping
|
||||||
|
- drag start/update/release selection state
|
||||||
|
- multi-item text selection extraction
|
||||||
|
- Esc clear
|
||||||
|
- y copy + clear
|
||||||
|
- non-text/tool item handling decision
|
||||||
|
- Validation: focused `cargo test -p tui ...`, `cargo fmt --check` or `cargo fmt -p tui`, `cargo check -p tui --all-targets`, and `git diff --check`.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Panel Ticket/Pod row selection.
|
||||||
|
- Terminal-native text selection preservation.
|
||||||
|
- Generic terminal scrollback selection.
|
||||||
|
- Full rich text/HTML/markdown semantic selection.
|
||||||
|
- Double-click word selection / triple-click line selection.
|
||||||
|
- Selection in every TUI widget.
|
||||||
|
- Tool item rich output copy semantics beyond the explicit decision made for this Ticket.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KV072V89` — Workspace panel の View item をマウスで選択できるようにする。Panel row click selection; not this Ticket's scope.
|
||||||
|
- `00001KV10SN02` — E2E critical path / mouse behavior coverage.
|
||||||
|
- `crates/tui/src/single_pod.rs` — single-Pod TUI View / mouse handling area.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV4YAAVY` (`single-Pod View Item text をマウスドラッグで選択・コピーできるようにする`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,286 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T06:08:19Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T06:37:00Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:38:25Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relation / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- 対象は single-Pod conversation View の text-like Item selection/copy に限定され、Panel row selection とは scope が分かれている。
|
||||||
|
- Tool/non-text Item と copy target は implementation-time decision として許容されており、binding invariants / acceptance criteria / escalation conditions が明確。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: requirements、copy target、tool/non-text handling、acceptance criteria、non-goals、related work を確認。
|
||||||
|
- Ticket relations: `00001KV072V89` と `00001KV10SN02` は related のみで blocker ではない。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。Intake peer は routing blocker ではない。
|
||||||
|
- Bounded code map: `crates/tui/src/single_pod.rs`、copy/clipboard abstraction、mouse/selection/key handling tests。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- single-Pod TUI conversation View で User/System/Assistant など text-like Item の表示テキストを mouse drag で選択し、`y` で copy、`Esc` で clear できるようにする。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- 対象は single-Pod View Item text。Panel Ticket/Pod row selection は変更しない。
|
||||||
|
- terminal-native text selection preservation は non-goal。View drag は Yoi text selection として扱う。
|
||||||
|
- selected/copy text、selection state、clipboard diagnostics は Pod history / model context / session log / Ticket records に残さない。
|
||||||
|
- composer input、scroll、rewind picker、modal/popup、normal key handling と衝突させない。
|
||||||
|
- bare Panel row mouse selection semantics は regress させない。
|
||||||
|
- Tool/non-text Item handling と copy target は実装報告または decision comment に明示する。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- UserItem / SystemItem / AssistantItem text を drag selection できる。
|
||||||
|
- drag start/update/release 後に selection state が残り、View 上で highlight される。
|
||||||
|
- `Esc` で selection clear。
|
||||||
|
- `y` で selected text を copy し、selection clear。
|
||||||
|
- text-like Item を跨いだ selection が deterministic separator で copy される。
|
||||||
|
- non-text/tool item handling decision が明示され、test で固定される。
|
||||||
|
- copy 成功/失敗が user-visible で、secret-like diagnostics を出さない。
|
||||||
|
- tests cover coordinate mapping、selection state、multi-item extraction、Esc、copy+clear、non-text/tool handling。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- Existing clipboard abstraction があれば利用。なければ testable な最小 copy path を追加してよい。
|
||||||
|
- OSC52/system clipboard/internal copy buffer の選択は既存 TUI architecture に合わせる。
|
||||||
|
- rendering/highlight 表現、selection model の internal shape、separator は実装側判断。ただし deterministic にする。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- terminal/crossterm event stream で必要な drag/release を識別できない。
|
||||||
|
- existing rendering model から text coordinate mapping を安全に取れない。
|
||||||
|
- copy target を追加すると secrets/history/model-context boundary に影響する。
|
||||||
|
- rewind/modal/composer key handling と共存できない大きな model change が必要。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- focused `cargo test -p tui ...` for single_pod selection/copy。
|
||||||
|
- `cargo check -p tui --all-targets`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- Panel row mouse selection regression test if related mouse plumbing is touched。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- selection/copy state の persistence leakage。
|
||||||
|
- mouse coordinate -> rendered text mapping correctness。
|
||||||
|
- multi-item extraction ordering/separator。
|
||||||
|
- composer/scroll/rewind/modal conflict。
|
||||||
|
- clipboard path safety and testability。
|
||||||
|
- Panel mouse behavior regression absence。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:39:16Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、single-Pod View work は同時に開始する Panel composer work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV4YAAVY at: 2026-06-15T07:02:42Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV4YAAVY`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `09f5e9d5 feat: add single-pod text selection`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/tui/src/text_selection.rs`
|
||||||
|
- New transient selection state, coordinate mapping, extraction, and focused tests.
|
||||||
|
- `crates/tui/src/app.rs`
|
||||||
|
- Local non-persistent selection state on `App`.
|
||||||
|
- `crates/tui/src/ui.rs`
|
||||||
|
- Selectable history row metadata, highlight rendering, snapshot wiring, selectable/non-text tests.
|
||||||
|
- `crates/tui/src/single_pod.rs`
|
||||||
|
- Drag mouse handling, `Esc` clear, `y` copy+clear, OSC52 copy, tests.
|
||||||
|
- `crates/tui/src/lib.rs`
|
||||||
|
- Module registration.
|
||||||
|
- `crates/tui/Cargo.toml`, `Cargo.lock`
|
||||||
|
- Added direct `base64` dependency for OSC52 clipboard payloads.
|
||||||
|
|
||||||
|
Behavior / implementation decisions:
|
||||||
|
- Selectable Items:
|
||||||
|
- `UserMessage`
|
||||||
|
- `SystemMessage`
|
||||||
|
- `AssistantText`
|
||||||
|
- Non-text/tool Items:
|
||||||
|
- tool calls, thinking, stats, greetings, alerts, turn headers, etc. are not selectable/copyable through this path.
|
||||||
|
- extraction skips non-selectable rows.
|
||||||
|
- Cross-item selection separator:
|
||||||
|
- copied text follows rendered row order and preserves selectable blank spacer rows, giving deterministic `\n\n` between adjacent text-like Items.
|
||||||
|
- Copy target:
|
||||||
|
- terminal clipboard via OSC52 (`ESC ] 52 ; c ; base64 BEL`), not OS clipboard APIs.
|
||||||
|
- avoids adding platform clipboard runtime behavior.
|
||||||
|
- Copy diagnostics:
|
||||||
|
- actionbar-only sanitized messages:
|
||||||
|
- success: `copied selected text to terminal clipboard`
|
||||||
|
- failure: `terminal clipboard write failed`
|
||||||
|
- no selected content appears in diagnostics.
|
||||||
|
- Selection persistence:
|
||||||
|
- selection state/copied text remains TUI-local only.
|
||||||
|
- not appended to Pod history, model context, session logs, Ticket records, memory, or durable state.
|
||||||
|
- Mouse tracking:
|
||||||
|
- single-Pod TUI now enables button-event drag tracking (`?1002h`) but not all-motion tracking (`?1003h`).
|
||||||
|
- Panel code was not changed.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo check -p tui --all-targets`
|
||||||
|
- Passed: `cargo test -p tui text_selection`
|
||||||
|
- Passed: `cargo test -p tui single_pod::tests`
|
||||||
|
- Passed: `cargo test -p tui ui::tests::history_rows_mark_text_items_selectable_and_non_text_unselectable`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after commit.
|
||||||
|
|
||||||
|
Residual risks / notes:
|
||||||
|
- OSC52 clipboard success means sequence written/flushed; actual clipboard acceptance depends on terminal/multiplexer policy.
|
||||||
|
- No real PTY/E2E validation was run; coverage is focused unit-level mouse/key/selection/render extraction behavior.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV4YAAVY at: 2026-06-15T07:11:34Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Reviewed child worktree only:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV4YAAVY-single-pod-text-selection`
|
||||||
|
- diff `368249d6..09f5e9d5`
|
||||||
|
- Ticket record/thread in the child worktree
|
||||||
|
- Read-only validation:
|
||||||
|
- Passed: `git diff --check 368249d6..09f5e9d5`
|
||||||
|
|
||||||
|
Implementation review:
|
||||||
|
- TUI-local selection state was added in `crates/tui/src/text_selection.rs` and wired into single-Pod rendering/input.
|
||||||
|
- Mouse drag maps terminal coordinates through `HistoryViewport` into rendered history rows.
|
||||||
|
- Drag start/update/release are handled in `single_pod.rs`; selection remains active after release.
|
||||||
|
- `Esc` clears selection before normal composer handling.
|
||||||
|
- bare `y` copies only when a selection exists; otherwise composer input remains available.
|
||||||
|
- Highlighting is applied through `range_for_row` and `highlight_line_selection`.
|
||||||
|
- Selectable item boundary is explicit:
|
||||||
|
- selectable: `UserMessage`, `SystemMessage`, `AssistantText`
|
||||||
|
- non-selectable: tool calls, thinking, notices, stats, greetings, etc.
|
||||||
|
- Tool/non-text rows are marked unselectable and extraction skips unselectable rows.
|
||||||
|
- Cross-item extraction is deterministic, with documented newline/blank-line behavior.
|
||||||
|
- Copy uses OSC52; selected text is base64 encoded before writing the OSC52 sequence.
|
||||||
|
- Copy diagnostics are generic/actionbar-local and do not include selected content.
|
||||||
|
- Selection state lives in TUI-local `App.text_selection`; no path was found that appends selected/copied text to Pod history, model context, session log, Ticket records, memory, or durable state.
|
||||||
|
- Mouse capture changes are limited to single-Pod fullscreen setup and avoid all-motion `?1003h`; Panel/multi-pod mouse row selection code was not modified.
|
||||||
|
- Composer, scroll, rewind picker, completion/key routing, and normal key handling interactions were inspected and no blocker found.
|
||||||
|
|
||||||
|
Coverage reviewed:
|
||||||
|
- coordinate mapping
|
||||||
|
- drag update/release state
|
||||||
|
- multi-row / separator extraction
|
||||||
|
- non-selectable row skipping
|
||||||
|
- Esc clear
|
||||||
|
- copy helper + clear
|
||||||
|
- UI selectable/non-selectable marking
|
||||||
|
- mouse capture mode avoiding all-motion tracking
|
||||||
|
|
||||||
|
Non-blocking notes:
|
||||||
|
- No PTY/E2E validation was run; terminal-specific OSC52/mouse behavior still depends on real terminal behavior.
|
||||||
|
- OSC52 cannot acknowledge terminal clipboard acceptance; implementation can only report write/flush success/failure.
|
||||||
|
- There is no explicit byte-size cap on OSC52 payload, but selection is bounded by visible rendered viewport rather than arbitrary full history traversal. Future hard cap/error notice would be reasonable hardening.
|
||||||
|
- A full fixture test constructing an actual `Block::ToolCall` could strengthen coverage, but the non-text path is explicit and source-inspected.
|
||||||
|
|
||||||
|
Validation not rerun by reviewer:
|
||||||
|
- Cargo validation was not rerun because review scope was read-only and Cargo writes build artifacts. Coder-reported validation was inspected as evidence.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker remains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T07:15:54Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV4YAAVY-single-pod-text-selection`
|
||||||
|
- implementation commit: `09f5e9d5 feat: add single-pod text selection`
|
||||||
|
- merge commit: `3fa52f2c merge: single-pod text selection`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV4YAAVY`.
|
||||||
|
|
||||||
|
Additional integration fix:
|
||||||
|
- Because the implementation added a direct `base64` dependency to `crates/tui/Cargo.toml` and updated `Cargo.lock`, `nix build .#yoi --no-link` first failed with stale `package.nix` `cargoHash`.
|
||||||
|
- Updated `package.nix` `cargoHash` to the new fixed-output vendor hash:
|
||||||
|
- `sha256-pIDYnbBs3U8Z3IndgH10rirv8/IdFv1WlgwpCbKXy+M=`
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo check -p tui --all-targets`
|
||||||
|
- Passed: `cargo test -p tui text_selection`
|
||||||
|
- 4 passed
|
||||||
|
- Passed: `cargo test -p tui single_pod::tests`
|
||||||
|
- 38 passed
|
||||||
|
- Passed: `cargo test -p tui ui::tests::history_rows_mark_text_items_selectable_and_non_text_unselectable`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed after hash update: `nix build .#yoi --no-link`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- OSC52 clipboard acceptance remains terminal/multiplexer dependent; implementation reports write/flush success/failure only.
|
||||||
|
- No PTY/E2E validation was run for real terminal selection/copy behavior; focused unit coverage and reviewer inspection covered selection/copy state, extraction, and persistence boundaries.
|
||||||
|
- Orchestrator worktree is clean apart from the pending `package.nix`/Ticket integration commit at the time of recording.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T07:15:54Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation branch merged into the orchestration branch, integration validation passed including Nix package hash refresh, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T14:59:40Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T14:59:40Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV4YAAVY` (`single-Pod View Item text をマウスドラッグで選択・コピーできるようにする`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-063902-1","ticket_id":"00001KV4ZDMV1","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel Alt+Enter newline bugfix. Preserve bare Enter semantics and shared composer key handling while adding focused regression coverage.","branch":"impl/00001KV4ZDMV1-panel-alt-enter-newline","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4ZDMV1-panel-alt-enter-newline","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Run in parallel with single-Pod selection work; defer Panel row hierarchy visual work to avoid overlapping Panel rendering edits."},"author":"yoi-orchestrator","at":"2026-06-15T06:39:02Z"}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
---
|
||||||
|
title: 'Panel composer で Alt+Enter 改行を SessionView と揃える'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T06:27:36Z'
|
||||||
|
updated_at: '2026-06-15T14:59:39Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['tui-input', 'ux-consistency']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T06:37:01Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Panel の Composer でも、SessionView / 通常チャット composer と同じように `Alt+Enter` で改行できるようにする。
|
||||||
|
|
||||||
|
既存 Ticket `00001KTNS1AA8` で通常 TUI と workspace Panel の composer key handling を共有する方向が実装・完了済み。thread には shared editing が `Alt+Enter newline` を含む旨も記録されている。
|
||||||
|
|
||||||
|
一方、現行の Panel key handling では `KeyCode::Enter` の submit/open 分岐が `composer_edit_action(key)` より先に処理されているため、`Alt+Enter` が `InsertNewline` として到達せず、通常 Enter と同じ挙動になる可能性がある。Panel composer でも SessionView と同じ入力体験に揃える。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Panel composer で `Alt+Enter` が draft 内の改行挿入として動作する。
|
||||||
|
- `Alt+Enter` は composer text の submit、Ticket Intake launch、Companion send、selected row open/dispatch を起こさない。
|
||||||
|
- 通常の bare `Enter` の既存 semantics は維持する。
|
||||||
|
- composer が空なら selected row / open / dispatch。
|
||||||
|
- composer に text があるなら current composer target への submit。
|
||||||
|
- 通常 SessionView 側の `Alt+Enter` 改行挙動を壊さない。
|
||||||
|
- 既存の shared `composer_keys` 方針を保ち、Panel 専用の ad-hoc key handling を増やしすぎない。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- `yoi panel` の composer に text がある状態で `Alt+Enter` を押すと、draft に newline が入る。
|
||||||
|
- composer が空、row selected、Ticket action selected などの Panel 状態でも、`Alt+Enter` は submit/open/dispatch ではなく改行編集として扱われる。
|
||||||
|
- bare `Enter` の Panel submit/open/dispatch behavior は regress しない。
|
||||||
|
- focused test で `Alt+Enter` が Panel composer newline を挿入し、submit action を返さないことを確認する。
|
||||||
|
- 既存 SessionView / normal TUI composer key tests が通る。
|
||||||
|
|
||||||
|
## Binding decisions / invariants
|
||||||
|
|
||||||
|
- `Alt+Enter` は composer editing key として扱い、Panel action key として扱わない。
|
||||||
|
- bare `Enter` と `Alt+Enter` の意味を明確に分ける。
|
||||||
|
- Panel composer は通常 TUI composer と同じ shared composer key handling 方針に従う。
|
||||||
|
- Panel row selection / Ticket action semantics、Companion / Ticket Intake target semantics は変更しない。
|
||||||
|
- bare letter shortcuts は復活させない。
|
||||||
|
|
||||||
|
## Implementation latitude
|
||||||
|
|
||||||
|
- `composer_edit_action(key)` を Enter submit/open 分岐より前に適用する、または `KeyCode::Enter` 分岐側で modifiers を明示的に見て `Alt+Enter` を除外するなど、実装方法は任せる。
|
||||||
|
- Existing tests に追加する形でも、新規 focused regression test を作る形でもよい。
|
||||||
|
- UI hint の更新は必要なら最小限に行う。主目的は key behavior の修正。
|
||||||
|
|
||||||
|
## Readiness
|
||||||
|
|
||||||
|
- readiness: implementation_ready
|
||||||
|
- priority: P2 相当
|
||||||
|
- risk_flags: [tui-input, ux-consistency]
|
||||||
|
- open_questions: none
|
||||||
|
|
||||||
|
## Escalation conditions
|
||||||
|
|
||||||
|
- terminal / crossterm が対象環境で `Alt+Enter` を識別できない場合は、実装可能範囲と制約を implementation report に明記する。
|
||||||
|
- `Alt+Enter` を先に composer edit として処理すると、既存 completion / target switching / row action の前提と衝突する場合は Orchestrator / reviewer に相談する。
|
||||||
|
- SessionView 側にも同様の問題がある場合は、Panel 固有 bug ではなく shared composer key handling の regression として扱う。
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
- Focused test: Panel composer で `Alt+Enter` が newline を挿入し、submit/open/dispatch しない。
|
||||||
|
- Focused test: bare `Enter` の既存 Panel behavior が維持される。
|
||||||
|
- `cargo test -p tui composer_keys`
|
||||||
|
- `cargo test -p tui` または少なくとも該当 `multi_pod` / Panel focused tests
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `git diff --check`
|
||||||
|
- 必要に応じて `cargo check --workspace`
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KTNS1AA8` Improve workspace panel display and composer key handling
|
||||||
|
- `crates/tui/src/composer_keys.rs`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
|
||||||
|
## Panel handoff
|
||||||
|
|
||||||
|
- workspace: `yoi`
|
||||||
|
- workspace_orchestrator_pod: `yoi-orchestrator`
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV4ZDMV1` (`Panel composer で Alt+Enter 改行を SessionView と揃える`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
<!-- event: create author: LocalTicketBackend at: 2026-06-15T06:27:36Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T06:37:01Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:39:02Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- 既存 shared composer key handling 方針があり、主な不確実性は Panel の Enter 分岐順序/修飾キー処理の local fix と regression coverage に閉じている。
|
||||||
|
- 同時 queued の `00001KV4YAAVY` は single-Pod View selection で主対象が異なるため並行開始可能。`00001KV4ZPAD3` は Panel row rendering surface と重なるため待機に回す。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: Background、requirements、acceptance criteria、binding decisions、validation、related work を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
- Bounded code map: `crates/tui/src/composer_keys.rs`, `crates/tui/src/multi_pod.rs`, relevant Panel composer tests。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Workspace Panel composer で `Alt+Enter` を SessionView / shared composer key handling と同じ改行挿入として扱い、submit/open/dispatch を起こさないようにする。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- `Alt+Enter` は composer editing key。Panel action key ではない。
|
||||||
|
- bare `Enter` と `Alt+Enter` の意味を明確に分離する。
|
||||||
|
- Panel composer は shared `composer_keys` 方針に従う。
|
||||||
|
- Panel row selection / Ticket action semantics、Companion / Ticket Intake target semantics は変更しない。
|
||||||
|
- bare letter shortcuts は復活させない。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Panel composer に text がある状態で `Alt+Enter` が draft newline を挿入する。
|
||||||
|
- composer empty / row selected / Ticket action selected でも `Alt+Enter` は submit/open/dispatch しない。
|
||||||
|
- bare `Enter` の existing submit/open/dispatch behavior は維持される。
|
||||||
|
- SessionView 側の `Alt+Enter` newline behavior は壊さない。
|
||||||
|
- focused test で Panel `Alt+Enter` newline and no action を確認する。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- `composer_edit_action(key)` を Enter action 分岐より前に適用するか、Enter 分岐で modifiers を除外するかは実装判断。
|
||||||
|
- Existing tests への追加または新規 focused regression test のどちらでもよい。
|
||||||
|
- UI hint update は必要なら最小限。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- terminal/crossterm が対象環境で `Alt+Enter` を識別できない。
|
||||||
|
- edit-first 処理が completion / target switching / row action 前提と衝突する。
|
||||||
|
- SessionView 側にも同根の regression が見つかる。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- `cargo test -p tui composer_keys`
|
||||||
|
- Panel focused tests / `cargo test -p tui multi_pod --lib` など変更箇所に応じた subset。
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `git diff --check`
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- `Alt+Enter` が action dispatch に落ちないこと。
|
||||||
|
- bare `Enter` semantics の regression。
|
||||||
|
- shared composer key handling 方針から外れた ad-hoc 実装になっていないこと。
|
||||||
|
- Panel target / row selection action identity が変わらないこと。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:39:16Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、Panel Alt+Enter bugfix は同時に開始する single-Pod View selection work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。Panel visual hierarchy work `00001KV4ZPAD3` は conflict/capacity 理由で queued のまま待機させる。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV4ZDMV1 at: 2026-06-15T06:46:31Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV4ZDMV1`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `5c339177 fix: align panel alt-enter composer handling`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- Panel now resolves shared `composer_edit_action` modifier actions before Panel `Enter` actions.
|
||||||
|
- `Alt+Enter` is handled as `InsertNewline` and returns `MultiPodAction::None`, so it cannot open Pods, dispatch Ticket actions, launch Intake, or send Companion messages.
|
||||||
|
- Added focused Panel tests for:
|
||||||
|
- non-empty composer inserts newline without Companion send
|
||||||
|
- blank Pod row selection inserts newline without open
|
||||||
|
- blank Ticket action selection inserts newline without dispatch
|
||||||
|
- `crates/tui/src/composer_keys.rs`
|
||||||
|
- Added explicit shared-keymap coverage for `Alt+Enter -> InsertNewline`.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo test -p tui composer_keys`
|
||||||
|
- Passed: `cargo test -p tui multi_alt_enter --lib`
|
||||||
|
- Passed focused bare-Enter regression checks:
|
||||||
|
- `cargo test -p tui multi_empty_enter_uses_open_action --lib`
|
||||||
|
- `cargo test -p tui multi_non_empty_enter_reports_companion_unavailable --lib`
|
||||||
|
- `cargo test -p tui multi_ticket_intake_enter_builds_launch_request_not_direct_send --lib`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Broader suite note:
|
||||||
|
- Attempted: `cargo test -p tui multi_pod --lib`
|
||||||
|
- Failed in existing unrelated test:
|
||||||
|
- `multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace`
|
||||||
|
- assertion mismatch: expected target/orchestration path vs `/repo/yoi`
|
||||||
|
- Coder assessed this as outside the Alt+Enter change path; focused Ticket tests pass.
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after commit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV4ZDMV1 at: 2026-06-15T06:50:25Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Implementation commit `5c339177` against base `368249d6` in child worktree.
|
||||||
|
- Diff limited to:
|
||||||
|
- `crates/tui/src/composer_keys.rs`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- Shared composer policy maps `Alt+Enter` to `ComposerEditAction::InsertNewline` through `composer_edit_action`.
|
||||||
|
- Panel `handle_key` consults `composer_edit_action(key)` before bare `Enter` routing and immediately applies modifier composer actions.
|
||||||
|
- This prevents `Alt+Enter` from falling through to open / dispatch / Intake launch / Companion send.
|
||||||
|
- Existing bare `Enter` routing remains structurally unchanged.
|
||||||
|
- Bare `Enter` remains excluded from shared composer editing.
|
||||||
|
- Focused Panel tests cover text composer, blank Pod row selection, and blank Ticket action selection.
|
||||||
|
- Existing bare-Enter regression tests remain present.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check 368249d6..5c339177`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Worktree remained clean.
|
||||||
|
|
||||||
|
Validation not run by reviewer:
|
||||||
|
- Cargo tests were not rerun because review scope was read-only and tests write build artifacts. Coder-reported focused test results were reviewed as evidence.
|
||||||
|
|
||||||
|
Broader-suite failure assessment:
|
||||||
|
- The reported broader `cargo test -p tui multi_pod --lib` failure in an orchestration-root test appears unrelated based on diff scope. The implementation does not touch orchestration worktree/root logic.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker remains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T06:51:06Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV4ZDMV1-panel-alt-enter-newline`
|
||||||
|
- implementation commit: `5c339177 fix: align panel alt-enter composer handling`
|
||||||
|
- merge commit: `0335cad9 merge: panel alt-enter newline`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV4ZDMV1`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo test -p tui composer_keys`
|
||||||
|
- 4 passed
|
||||||
|
- Passed: `cargo test -p tui multi_alt_enter --lib`
|
||||||
|
- 3 passed
|
||||||
|
- Passed: `cargo test -p tui multi_empty_enter_uses_open_action --lib`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `cargo test -p tui multi_non_empty_enter_reports_companion_unavailable --lib`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `cargo test -p tui multi_ticket_intake_enter_builds_launch_request_not_direct_send --lib`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Broader `cargo test -p tui multi_pod --lib` was not used as a blocker because the known failure is an unrelated orchestration-root test outside the Alt+Enter change path.
|
||||||
|
- Orchestrator worktree is clean after validation.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:51:06Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T14:59:39Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T14:59:39Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV4ZDMV1` (`Panel composer で Alt+Enter 改行を SessionView と揃える`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{"id":"orch-plan-20260615-063902-1","ticket_id":"00001KV4ZPAD3","kind":"conflicts_with","related_ticket":"00001KV4ZDMV1","note":"Panel rendering/input surface (`crates/tui/src/multi_pod.rs` / Panel row selection/action display) が `00001KV4ZDMV1` と重なる可能性があるため、Alt+Enter Panel composer work の outcome 後に開始する。","author":"yoi-orchestrator","at":"2026-06-15T06:39:02Z"}
|
||||||
|
{"id":"orch-plan-20260615-063916-2","ticket_id":"00001KV4ZPAD3","kind":"waiting_capacity_note","note":"`00001KV4YAAVY` と `00001KV4ZDMV1` を並行開始する。`00001KV4ZPAD3` は implementation_ready だが、Panel rendering/input surface の conflict risk と review/integration capacity のため queued のまま待機する。","author":"yoi-orchestrator","at":"2026-06-15T06:39:16Z"}
|
||||||
|
{"id":"orch-plan-20260615-065209-3","ticket_id":"00001KV4ZPAD3","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel Ticket/Intake visual hierarchy improvement after Panel Alt+Enter integration. Improve primary/secondary row styling, child-row affordance, selection clarity, and bounded tests without changing lifecycle/registry/action semantics.","branch":"impl/00001KV4ZPAD3-panel-row-hierarchy","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4ZPAD3-panel-row-hierarchy","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Prior conflict with `00001KV4ZDMV1` is resolved because Alt+Enter work is merged/validated/done."},"author":"yoi-orchestrator","at":"2026-06-15T06:52:09Z"}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
---
|
||||||
|
title: 'Panel Ticket / Intake Pod row の視覚階層を改善する'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T06:32:21Z'
|
||||||
|
updated_at: '2026-06-15T14:59:39Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['panel-ux', 'tui-layout', 'accessibility', 'row-selection']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T06:37:02Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Workspace Panel では、Ticket row が2行表示になり、Ticket に関連する Intake Pod row も Ticket の隣接 row として表示されるようになっている。
|
||||||
|
|
||||||
|
しかし現状では、以下の視覚的な区別が弱く、一覧として読んだときに情報の優先順位が掴みにくい。
|
||||||
|
|
||||||
|
- Ticket 本体の primary line と detail/gate line の強弱。
|
||||||
|
- Ticket row と associated Intake Pod row の親子関係。
|
||||||
|
- canonical state/title、gate/action/reason、Intake Pod status/open 導線の重要度差。
|
||||||
|
- 選択中 row/group と非選択 row/group の境界。
|
||||||
|
|
||||||
|
今回の作業は Panel 表示の visual hierarchy / readability 改善に限定する。Ticket lifecycle、local role/session registry、claim semantics、automatic launch/spawn policy は変更しない。
|
||||||
|
|
||||||
|
## Request snapshot
|
||||||
|
|
||||||
|
> 前やった Panel の2行レイアウトと、IntakePod の関連表示の件、表示の強弱がついてなくて見辛いから、改善したい。
|
||||||
|
|
||||||
|
Panel handoff:
|
||||||
|
|
||||||
|
- workspace: `yoi`
|
||||||
|
- workspace_orchestrator_pod: `yoi-orchestrator`
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Workspace Panel の Ticket 2行 row に視覚的な強弱を付ける。
|
||||||
|
- 1行目の canonical state + title は primary 情報として読みやすくする。
|
||||||
|
- 2行目の Ticket id / Gate / Action / reason は secondary 情報として、必要な時に読めるが主情報を邪魔しない表示にする。
|
||||||
|
- Ticket-associated Intake Pod row が、その Ticket の子/関連 row であると視覚的に分かるようにする。
|
||||||
|
- indentation、prefix、dim style、role/status chip、group marker など、既存 Panel UI と整合する方法でよい。
|
||||||
|
- 選択状態では、Ticket 2行 + associated Intake row の関係が崩れない。
|
||||||
|
- どの logical row / child row が選択されているかが分かる。
|
||||||
|
- Ticket 本体と Intake Pod row の操作対象が混同されない。
|
||||||
|
- live / restorable / stale など Intake Pod status の表示は残しつつ、Ticket title/gate より過剰に目立たないようにする。
|
||||||
|
- narrow terminal / short panel area でも破綻しない。
|
||||||
|
- truncate / ellipsis / bounded rendering を維持する。
|
||||||
|
- 色だけに依存しない表示にする。
|
||||||
|
- terminal theme や monochrome 環境でも、indentation / marker / text label で最低限の関係が分かる。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- Ticket 2行 row で、primary line と secondary line の視覚的な強弱が確認できる。
|
||||||
|
- Ticket-associated Intake Pod row が、隣接する Ticket の関連/子 row として認識できる。
|
||||||
|
- Intake Pod row が Ticket 本体や別 Ticket に見えない。
|
||||||
|
- selected Ticket row / selected Intake Pod row の見え方が明確で、操作対象が混同されない。
|
||||||
|
- `ready`, `planning`, `queued/inprogress`, `done/closed`, `ready+waiting` の Ticket row で可読性が維持される。
|
||||||
|
- Intake Pod の `live` / `restorable` / `stale` status が確認できる。
|
||||||
|
- pre-Ticket Intake Pod を誤って特定 Ticket の child row のように表示しない。
|
||||||
|
- mouse click / keyboard selection の既存 semantics を壊さない。
|
||||||
|
- Focused tests で row rendering contract または ViewModel/row ordering/selection contract が確認される。
|
||||||
|
|
||||||
|
## Binding decisions / invariants
|
||||||
|
|
||||||
|
- Ticket lifecycle state / relation gate semantics は変更しない。
|
||||||
|
- persisted `waiting` state や新しい Ticket schema は追加しない。
|
||||||
|
- local Pod assignment / Pod name / socket / claim state / runtime status を git-tracked Ticket metadata/frontmatter/thread に保存しない。
|
||||||
|
- automatic polling / automatic Intake spawn は追加しない。
|
||||||
|
- Ticket と Intake Pod の関係を 1:1 と仮定しない。
|
||||||
|
- selected arbitrary Pod direct-send UX を復活させない。
|
||||||
|
- 表示改善のために lifecycle action の authority boundary を緩めない。
|
||||||
|
|
||||||
|
## Implementation latitude
|
||||||
|
|
||||||
|
- exact な UI 表現は実装側判断でよい。
|
||||||
|
- dim / bold / color / prefix / indentation / separator / role chip / status chip など。
|
||||||
|
- 既存 `PanelRowKind::Ticket` / `PanelRowKind::TicketIntakePod` の rendering を調整してもよい。
|
||||||
|
- 必要なら shared row style helper を整理してよい。
|
||||||
|
- 色を使う場合でも、marker / label / indentation など非色要素で関係性が分かるようにする。
|
||||||
|
- Very small terminal で情報を減らす場合、primary state/title と action safety を優先する。
|
||||||
|
|
||||||
|
## Readiness
|
||||||
|
|
||||||
|
- readiness: implementation_ready
|
||||||
|
- risk_flags: [panel-ux, tui-layout, accessibility, row-selection]
|
||||||
|
- blocking open questions: none
|
||||||
|
|
||||||
|
## Escalation conditions
|
||||||
|
|
||||||
|
- Panel の selection model / keyboard semantics を大きく変える必要が出た場合。
|
||||||
|
- Ticket row と Intake Pod row の action identity が曖昧になり、誤操作リスクが出る場合。
|
||||||
|
- 色/装飾だけでは accessibility / terminal theme 上の問題を避けられない場合。
|
||||||
|
- Row rendering のために local role/session registry や Ticket schema の変更が必要になりそうな場合。
|
||||||
|
- bounded row rendering を維持できず、大量 Ticket/Pod で一覧が読みにくくなる場合。
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
- `cargo test -p tui workspace_panel --lib`
|
||||||
|
- 関連箇所を触る場合:
|
||||||
|
- `cargo test -p tui multi_pod --lib`
|
||||||
|
- `cargo test -p tui row_hit_testing --lib`
|
||||||
|
- `cargo test -p tui mouse_click --lib`
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `git diff --check`
|
||||||
|
- 可能なら実際の `yoi panel` / PTY で目視確認、または既存 Panel E2E の更新。
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KV12W2RT` — Panel Ticket rows を2行表示にして gate 情報を分離する
|
||||||
|
- `00001KV09WYC6` — Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows
|
||||||
|
- `00001KV3A5CNH` — Panel: invalid Ticket があっても Ticket 機能全体を無効化しない
|
||||||
|
|
||||||
|
Code areas:
|
||||||
|
|
||||||
|
- `crates/tui/src/workspace_panel.rs`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- `crates/tui/src/role_session_registry.rs`
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV4ZPAD3` (`Panel Ticket / Intake Pod row の視覚階層を改善する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,302 @@
|
|||||||
|
<!-- event: create author: ticket-intake at: 2026-06-15T06:32:21Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: intake_summary author: ticket-intake at: 2026-06-15T06:32:36Z -->
|
||||||
|
|
||||||
|
## Intake summary
|
||||||
|
|
||||||
|
ユーザー承認に基づき、Panel Ticket 2行 row と Ticket-associated Intake Pod row の視覚階層改善を concrete Ticket として作成した。既存 Ticket `00001KV12W2RT` / `00001KV09WYC6` の follow-up であり、目的は visual hierarchy / readability 改善に限定される。Ticket lifecycle、relation gate semantics、local role/session registry、claim semantics、automatic launch/spawn policy は変更しない。readiness: implementation_ready。risk_flags: [panel-ux, tui-layout, accessibility, row-selection]。blocking open questions はない。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: ticket-intake at: 2026-06-15T06:32:36Z from: planning to: ready reason: planning_ready field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Intake で要件・受け入れ条件・binding decisions / invariants・implementation latitude・escalation conditions・validation が整理され、ユーザー承認済み。Orchestrator が routing 可能な ready 状態にする。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T06:37:02Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:39:02Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready_but_waiting_conflict_capacity
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。要件・受け入れ条件・invariants は実装可能な粒度で揃っており、planning に戻す concrete missing information はない。
|
||||||
|
- ただし同時に `00001KV4ZDMV1` を Panel composer key handling work として accept する。両者は `crates/tui/src/multi_pod.rs` / Panel rendering・input surface に触れる可能性があり、並行すると row rendering / selected row / action identity regression の確認が曖昧になる。
|
||||||
|
- `00001KV4YAAVY` は single-Pod View selection で並行開始するため、現時点では Panel visual hierarchy work を追加 spawn せず、先行 Panel composer work の outcome を待つ。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: visual hierarchy/readability requirements、accessibility、row-selection invariants、validation を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。これから `00001KV4YAAVY` と `00001KV4ZDMV1` を acceptance 予定。
|
||||||
|
|
||||||
|
Next action:
|
||||||
|
- `00001KV4ZDMV1` の implementation/review/integration 後、Panel rendering surface を再確認し、unblocked なら `queued -> inprogress` acceptance へ進む。
|
||||||
|
- planning return ではなく queued のまま waiting とする。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:52:09Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Prior waiting reason は `00001KV4ZDMV1` と Panel rendering/input surface が重なる conflict/capacity だった。
|
||||||
|
- `00001KV4ZDMV1` は reviewer approve、orchestration branch merge、focused validation、Ticket `done` まで完了したため、prior conflict は解消した。
|
||||||
|
- Ticket body / thread / relations / orchestration plan / current Orchestrator workspace を再確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- 現在 active な `00001KV4YAAVY` は single-Pod View Item text selection/copy であり、Panel Ticket/Intake visual hierarchy と主対象が異なるため並行開始可能。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: Ticket 2行 row、associated Intake Pod row、selection/group visibility、accessibility、bounded rendering、validation を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: prior `conflicts_with 00001KV4ZDMV1` と waiting_capacity_note を確認。`00001KV4ZDMV1` 完了により blocker は解消。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`1d21aae3` 上。
|
||||||
|
- Visible Pods: `yoi-coder-00001KV4YAAVY` running。source/logical surface は single-Pod View selection であり、本 Ticket と直接競合しない。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Workspace Panel の Ticket 2行 row と Ticket-associated Intake Pod row の visual hierarchy / readability を改善し、親子関係・primary/secondary 情報・選択対象が読み取りやすい表示にする。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Ticket lifecycle state / relation gate semantics は変更しない。
|
||||||
|
- persisted `waiting` state や新しい Ticket schema は追加しない。
|
||||||
|
- local Pod assignment / Pod name / socket / claim state / runtime status を git-tracked Ticket metadata/frontmatter/thread に保存しない。
|
||||||
|
- automatic polling / automatic Intake spawn は追加しない。
|
||||||
|
- Ticket と Intake Pod の関係を 1:1 と仮定しない。
|
||||||
|
- selected arbitrary Pod direct-send UX を復活させない。
|
||||||
|
- 表示改善のために lifecycle action authority boundary を緩めない。
|
||||||
|
- 色だけに依存せず、indentation / marker / label 等で minimum relationship を示す。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Ticket 2行 row で primary line と secondary line の強弱が確認できる。
|
||||||
|
- Ticket-associated Intake Pod row が隣接 Ticket の child/related row として認識できる。
|
||||||
|
- Intake Pod row が Ticket 本体や別 Ticket に見えない。
|
||||||
|
- selected Ticket row / selected Intake Pod row の見え方が明確で、操作対象が混同されない。
|
||||||
|
- `ready`, `planning`, `queued/inprogress`, `done/closed`, `ready+waiting` の Ticket row で readability が維持される。
|
||||||
|
- Intake Pod `live` / `restorable` / `stale` status が確認できる。
|
||||||
|
- pre-Ticket Intake Pod を特定 Ticket child row のように誤表示しない。
|
||||||
|
- mouse click / keyboard selection semantics を壊さない。
|
||||||
|
- Focused tests で row rendering contract または ViewModel/row ordering/selection contract を確認する。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- dim / bold / color / prefix / indentation / separator / role chip / status chip 等は実装判断。
|
||||||
|
- `PanelRowKind::Ticket` / `PanelRowKind::TicketIntakePod` rendering 調整可。
|
||||||
|
- 必要なら shared row style helper を整理可。
|
||||||
|
- Very small terminal では primary state/title と action safety を優先して bounded rendering する。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- Panel selection model / keyboard semantics の大幅変更が必要。
|
||||||
|
- Ticket row と Intake Pod row の action identity が曖昧になり誤操作リスクが出る。
|
||||||
|
- 色/装飾だけでは accessibility / terminal theme 上の問題を避けられない。
|
||||||
|
- Row rendering のために local role/session registry や Ticket schema 変更が必要。
|
||||||
|
- bounded row rendering を維持できず大量 Ticket/Pod で一覧が読みにくくなる。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- `cargo test -p tui workspace_panel --lib`
|
||||||
|
- 関連箇所に応じて `cargo test -p tui multi_pod --lib` / `cargo test -p tui row_hit_testing --lib` / `cargo test -p tui mouse_click --lib`
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `git diff --check`
|
||||||
|
- 可能なら `yoi panel` / PTY 目視または既存 Panel E2E 更新。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- visual hierarchy improves readability without changing action identity。
|
||||||
|
- Ticket vs Intake child row distinction remains non-color-dependent。
|
||||||
|
- selection highlight and child grouping remain understandable。
|
||||||
|
- lifecycle authority and local role/session registry boundaries unchanged。
|
||||||
|
- bounded rendering/narrow terminal behavior。
|
||||||
|
- recently merged Alt+Enter and invalid Ticket placeholder behavior not regressed。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:52:19Z from: queued to: inprogress reason: orchestrator_acceptance_after_conflict_resolution field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。先行 `00001KV4ZDMV1` は merge/validation/done 済みで prior conflict/waiting reason は解消。blocking relation / unresolved orchestration-plan blocker はないため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV4ZPAD3 at: 2026-06-15T07:04:06Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV4ZPAD3`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `f3b435e7 fix: clarify panel ticket row hierarchy`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- `crates/tui/src/workspace_panel.rs`
|
||||||
|
|
||||||
|
Visual hierarchy decisions:
|
||||||
|
- Ticket rows now use a clearer two-line structure:
|
||||||
|
- primary line uses selected `▶ ` marker and carries state + title
|
||||||
|
- secondary line uses `meta` label and selected `│ ` marker, making id/gate/action information clearly secondary
|
||||||
|
- Ticket-associated Intake Pod rows now render as adjacent child rows:
|
||||||
|
- non-selected child marker: ` └ `
|
||||||
|
- selected child marker: ` ▶ `
|
||||||
|
- `live` / `restorable` / `stale` remains visible in status column
|
||||||
|
- title is `Intake Pod: <name>` without embedding tree glyphs in the ViewModel title
|
||||||
|
- Selected Intake Pod status line now says `selected Intake Pod ...` instead of generic selected Pod wording.
|
||||||
|
- No Ticket lifecycle, relation gate, action authority, persisted schema, polling, or spawn semantics were changed.
|
||||||
|
|
||||||
|
Focused tests added/updated:
|
||||||
|
- Ticket row rendering asserts primary vs secondary line structure.
|
||||||
|
- Intake child row rendering asserts single-line child indentation/marker/status/title placement.
|
||||||
|
- Selected Intake Pod target status asserts it is visually described as Intake-related, not generic Ticket or Pod.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||||
|
- Passed: `cargo test -p tui panel_ticket --lib`
|
||||||
|
- Passed: `cargo test -p tui selected_ticket_intake_child_status --lib`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Ran: `cargo test -p tui multi_pod --lib`
|
||||||
|
- Failed in pre-existing/unrelated workspace context tests:
|
||||||
|
- `tests::workspace_panel_spawns_orchestrator_with_workspace_context`
|
||||||
|
- `tests::workspace_panel_spawns_panel_orchestrator_with_workspace_context`
|
||||||
|
- Assertion mismatch concerns expected `/workspace` vs temp test workspace paths, not row rendering/selection changes.
|
||||||
|
|
||||||
|
Residual risks:
|
||||||
|
- No interactive `yoi panel` PTY session was run; visual evidence is covered by focused render/string tests.
|
||||||
|
- Full `multi_pod` suite remains blocked by unrelated existing failures noted above.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV4ZPAD3 at: 2026-06-15T07:08:12Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Reviewed diff `79dda10d..f3b435e7`.
|
||||||
|
- Changed files limited to:
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- `crates/tui/src/workspace_panel.rs`
|
||||||
|
- Worktree was clean and on expected branch/commit:
|
||||||
|
- `impl/00001KV4ZPAD3-panel-row-hierarchy`
|
||||||
|
- `f3b435e7 fix: clarify panel ticket row hierarchy`
|
||||||
|
|
||||||
|
Acceptance review:
|
||||||
|
- Ticket two-line rows now have clearer hierarchy:
|
||||||
|
- primary line uses selected marker `▶ ` plus state/title;
|
||||||
|
- detail line uses `│ meta ` when selected and `meta` label for secondary metadata.
|
||||||
|
- Ticket-associated Intake Pod rows now render as child rows with indentation plus `└` / indented `▶` and `Intake Pod: <pod>` labeling.
|
||||||
|
- Relationship is not color-only; indentation/marker/label communicate hierarchy.
|
||||||
|
- Selected Ticket vs selected Intake Pod are distinguishable through marker placement, label, color/style, and status text.
|
||||||
|
- `live`, `restorable`, and `stale` Intake status remains visible.
|
||||||
|
- Pre-Ticket Intake Pod behavior appears preserved; existing tests still assert pre-ticket sessions are not emitted as `TicketIntakePod` child rows.
|
||||||
|
- Mouse/keyboard action semantics appear unchanged; changes are limited to row rendering/status text.
|
||||||
|
- Ticket lifecycle transitions, relation gates, registry persistence, polling/spawn behavior, and Ticket schema were not changed.
|
||||||
|
- Invalid Ticket placeholder behavior remains non-actionable.
|
||||||
|
- Alt+Enter handling was not touched.
|
||||||
|
|
||||||
|
Focused coverage observed:
|
||||||
|
- Ticket primary/secondary row rendering contract updated.
|
||||||
|
- Non-selected alignment/truncation tests updated for `meta`.
|
||||||
|
- Waiting gate readability remains covered.
|
||||||
|
- New child-row rendering test covers indentation, single-line behavior, status column, title label, and selected child marker.
|
||||||
|
- New selected Intake child status test confirms it is not presented as a generic Ticket or generic Pod.
|
||||||
|
- Existing adjacency/pre-ticket exclusion test remains present.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check 79dda10d..f3b435e7`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
|
||||||
|
Validation not run by reviewer:
|
||||||
|
- Cargo tests were not rerun because review scope was read-only and tests write build artifacts. Coder-reported focused test results were inspected as evidence.
|
||||||
|
|
||||||
|
Broader failure assessment:
|
||||||
|
- The reported broader `cargo test -p tui multi_pod --lib` failure appears unrelated based on diff scope; changes are confined to Panel row rendering/status presentation and tests around that contract, with no workspace-context/runtime setup logic changes.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker remains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T07:09:01Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV4ZPAD3-panel-row-hierarchy`
|
||||||
|
- implementation commit: `f3b435e7 fix: clarify panel ticket row hierarchy`
|
||||||
|
- merge commit: `8c00a6e9 merge: panel row hierarchy`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV4ZPAD3`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||||
|
- 16 passed
|
||||||
|
- Passed: `cargo test -p tui panel_ticket --lib`
|
||||||
|
- 4 passed
|
||||||
|
- Passed: `cargo test -p tui selected_ticket_intake_child_status --lib`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Broader `cargo test -p tui multi_pod --lib` remains affected by unrelated workspace-context tests and was not used as a blocker.
|
||||||
|
- Ticket/Intake visual hierarchy improved without lifecycle/action/schema/polling/spawn semantic changes.
|
||||||
|
- Orchestrator worktree is clean after validation.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T07:09:01Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T14:59:39Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T14:59:39Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV4ZPAD3` (`Panel Ticket / Intake Pod row の視覚階層を改善する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-124038-1","ticket_id":"00001KV5D7MG5","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel orchestration Ticket state overlay work. Implement read-only, source-qualified overlay from configured orchestration worktree with path/branch/repository safety checks and duplicate action gating.","branch":"impl/00001KV5D7MG5-panel-orchestration-overlay","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5D7MG5-panel-orchestration-overlay","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Work is isolated to Panel/Ticket config/worktree overlay code and current workspace has no active child implementation Pods."},"author":"yoi-orchestrator","at":"2026-06-15T12:40:38Z"}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
---
|
||||||
|
title: 'Panel に orchestration worktree の Ticket state overlay を表示する'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T10:29:00Z'
|
||||||
|
updated_at: '2026-06-15T14:59:40Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['panel', 'ticket-state', 'orchestration', 'worktree', 'git-branch', 'read-only-overlay']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T12:39:21Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Workspace Panel は現在、開いている workspace / branch の `.yoi/tickets` を Ticket state の authority として表示している。これは branch-local Ticket 正本として正しいが、Orchestrator が dedicated orchestration worktree / branch 上で Ticket を `inprogress -> done` に進めた場合、current workspace branch 側には merge されるまで反映されない。
|
||||||
|
|
||||||
|
その結果、Panel では `queued` のままに見える一方、orchestration branch では `inprogress` や `done` まで進んでいる、という乖離が起きる。
|
||||||
|
|
||||||
|
この Ticket では current branch の Ticket state を上書きせず、configured orchestration worktree の Ticket state を read-only overlay として読み、Panel に source-qualified progress として表示する。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Panel の primary Ticket state は current workspace branch の `.yoi/tickets` のままにする。
|
||||||
|
- Configured orchestration worktree / branch を read-only overlay source として読む。
|
||||||
|
- `.yoi/ticket.config.toml` の `[orchestration]` 設定を使う。
|
||||||
|
- `branch`
|
||||||
|
- `worktree_dir`
|
||||||
|
- `worktree_name`
|
||||||
|
- Expected orchestration worktree path を current workspace root から解決する。
|
||||||
|
- default は `<workspace>/.worktree/orchestration`
|
||||||
|
- branch default は `orchestration`
|
||||||
|
- Overlay worktree を読む前に safety checks を行う。
|
||||||
|
- path が存在する
|
||||||
|
- git worktree である
|
||||||
|
- current repository と同じ git common dir / same repository である
|
||||||
|
- expected branch 上にいる
|
||||||
|
- canonical top-level が expected path と一致する
|
||||||
|
- Overlay は read-only とする。
|
||||||
|
- Panel が overlay Ticket file を変更しない。
|
||||||
|
- overlay state を current branch の Ticket file に自動反映しない。
|
||||||
|
- current branch の `state` を orchestration branch の `state` で上書きしない。
|
||||||
|
- Ticket identity は canonical Ticket id で join する。
|
||||||
|
- current branch に存在する Ticket に対して、同じ id の overlay Ticket があれば overlay state を表示する。
|
||||||
|
- overlay にしか存在しない Ticket の表示は実装時に方針を決めてよいが、current workspace Ticket list を勝手に増やす場合は source 表示を明確にする。
|
||||||
|
- Overlay 表示は source-qualified にする。
|
||||||
|
- 例: `orchestration: inprogress`
|
||||||
|
- 例: `orchestration: done · merge pending`
|
||||||
|
- 例: `local: queued · orchestration: done`
|
||||||
|
- Overlay state が current state より進んでいる場合、Panel action/gate は safety 側に倒す。
|
||||||
|
- current branch が `queued` でも overlay が `inprogress` / `done` なら、Queue/Start を再提示しない。
|
||||||
|
- overlay `done` なら merge/review/close pending として扱う導線を表示する。
|
||||||
|
- exact action wording は実装側で調整してよい。
|
||||||
|
- Overlay が読めない場合は、current branch state 表示にフォールバックする。
|
||||||
|
- branch mismatch / invalid worktree / missing worktree は bounded diagnostic として表示してよい。
|
||||||
|
- 誤った worktree の Ticket state を表示しない。
|
||||||
|
|
||||||
|
## Display guidance
|
||||||
|
|
||||||
|
Panel Ticket row は current branch の canonical state と overlay progress を分けて表示する。
|
||||||
|
|
||||||
|
例:
|
||||||
|
|
||||||
|
```text
|
||||||
|
queued E2E: close remaining critical-path gaps after panel harness
|
||||||
|
00001KV10SN02 | local: queued · orchestration: done · merge pending
|
||||||
|
```
|
||||||
|
|
||||||
|
または:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ready Extend pod::feature API...
|
||||||
|
00001KTR81P9X | orchestration: inprogress · yoi-orchestrator
|
||||||
|
```
|
||||||
|
|
||||||
|
重要なのは、line 1 の canonical state を current branch state として残し、line 2 / gate / detail に orchestration overlay を表示すること。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- Workspace Panel ViewModel が configured orchestration worktree の `.yoi/tickets` を read-only overlay として読み込める。
|
||||||
|
- Overlay source は expected path / branch / same repository safety checks を通過した場合のみ使われる。
|
||||||
|
- Current branch の Ticket state は overlay state で上書きされない。
|
||||||
|
- current branch `queued` + overlay `inprogress` の Ticket が、Panel で overlay progress として表示される。
|
||||||
|
- current branch `queued` + overlay `done` の Ticket が、Panel で `orchestration: done` / merge pending 相当として表示され、Queue/Start action を再提示しない。
|
||||||
|
- overlay unavailable / branch mismatch / missing worktree の場合、Panel は panic せず current branch 表示にフォールバックする。
|
||||||
|
- Tests cover:
|
||||||
|
- overlay join by Ticket id
|
||||||
|
- queued local + inprogress overlay display
|
||||||
|
- queued local + done overlay display/action gating
|
||||||
|
- overlay branch mismatch ignored
|
||||||
|
- missing overlay worktree fallback
|
||||||
|
- no mutation to current branch Ticket files
|
||||||
|
- Validation: focused `tui` / workspace panel tests, `cargo fmt --check` or `cargo fmt -p tui`, `cargo check -p tui --all-targets`, and `git diff --check`.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Automatically merging orchestration branch state into current branch.
|
||||||
|
- Closing current branch Tickets based on overlay state.
|
||||||
|
- Starting/stopping Orchestrator Pods.
|
||||||
|
- Changing Ticket lifecycle state schema.
|
||||||
|
- Replacing git merge/review evidence with runtime overlay state.
|
||||||
|
- Showing arbitrary unrelated worktree Ticket state.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- Orchestration worktree branch/path configuration: `00001KV0X254D`
|
||||||
|
- Panel two-line Ticket rows and gate display: `00001KV12W2RT`
|
||||||
|
- Panel visual hierarchy follow-up: `00001KV4ZPAD3`
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV5D7MG5` (`Panel に orchestration worktree の Ticket state overlay を表示する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,271 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T10:29:00Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T12:39:21Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T12:40:38Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relation / OrchestrationPlan / Orchestrator workspace state / related closed Ticket context を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- `00001KV0X254D` で `.yoi/ticket.config.toml` の orchestration branch 設定が実装済みであり、`00001KV12W2RT` / `00001KV4ZPAD3` で Panel Ticket row / hierarchy 表示の前提が整っている。
|
||||||
|
- Risk は panel / ticket-state / orchestration / worktree / git-branch / read-only-overlay だが、Ticket 本文に safety checks・read-only invariant・fallback・action gating が明記されているため、残る不確実性は implementation tactic に閉じている。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: overlay source、safety checks、display guidance、action gating、fallback、acceptance criteria、non-goals を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Related context: `00001KV0X254D` closed(orchestration branch config)、`00001KV12W2RT` closed(two-line Ticket row/gate display)。
|
||||||
|
- Current config: `.yoi/ticket.config.toml` を確認。現 checkout には `[orchestration]` section がないため、default `<workspace>/.worktree/orchestration` / branch `orchestration` fallback を扱う必要がある。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`318aa191` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Workspace Panel の canonical current-branch Ticket state を上書きせず、configured orchestration worktree / branch の Ticket state を read-only overlay として読み、source-qualified progress と action gating を表示する。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Primary Ticket state authority は current workspace branch の `.yoi/tickets` のまま。
|
||||||
|
- Overlay は read-only。overlay Ticket files を変更せず、current branch Ticket files に自動反映しない。
|
||||||
|
- current branch `state` を overlay state で上書きしない。
|
||||||
|
- Overlay source は expected path / branch / same repository / canonical top-level safety checks 通過時のみ使う。
|
||||||
|
- 誤った worktree / unrelated repository / branch mismatch の Ticket state を表示しない。
|
||||||
|
- Ticket identity join は canonical Ticket id。
|
||||||
|
- Overlay progress is source-qualified(例: `orchestration: inprogress`, `local: queued · orchestration: done`)。
|
||||||
|
- Overlay が current state より進んでいる場合、Queue/Start 等の duplicate action は safety 側で抑止する。
|
||||||
|
- Runtime overlay は merge/review/close authority の代替ではない。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Panel ViewModel が configured orchestration worktree `.yoi/tickets` を read-only overlay として読み込める。
|
||||||
|
- `[orchestration]` config の `branch` / `worktree_dir` / `worktree_name` と defaults を使って expected path/branch を解決する。
|
||||||
|
- current branch state は overlay state で変更されない。
|
||||||
|
- local `queued` + overlay `inprogress` を Panel に overlay progress として表示する。
|
||||||
|
- local `queued` + overlay `done` を `orchestration: done` / merge pending 相当として表示し、Queue/Start を再提示しない。
|
||||||
|
- overlay unavailable / branch mismatch / missing worktree は panic せず current branch 表示へ fallback し、必要なら bounded diagnostic を出す。
|
||||||
|
- Tests cover overlay id join、queued+inprogress、queued+done action gating、branch mismatch ignore、missing worktree fallback、current branch Ticket files non-mutation。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- Overlay-only Ticket の表示有無は実装判断。ただし表示する場合は source を明確にする。
|
||||||
|
- Exact wording / gate/action label は既存 Panel row hierarchy に合わせて調整してよい。
|
||||||
|
- Safety check helper の配置は existing Ticket config / Panel orchestration worktree code に合わせる。
|
||||||
|
- Heavy full doctor を毎 render 必須にしない。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- Ticket config model に `worktree_dir` / `worktree_name` が存在せず、新 schema の exact authority が必要になる。
|
||||||
|
- same-repository / git-common-dir validation が current abstractions で安全に書けない。
|
||||||
|
- overlay state を読むために current workspace以外の arbitrary path authority が必要になる。
|
||||||
|
- action gating が lifecycle authority と衝突する。
|
||||||
|
- overlay-only Tickets の表示方針が product decision を要する。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- `cargo test -p tui workspace_panel --lib` or focused overlay tests。
|
||||||
|
- Relevant ticket config / orchestration worktree tests if config parsing changes。
|
||||||
|
- `cargo check -p tui --all-targets`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- read-only overlay invariant。
|
||||||
|
- same-repository / branch / canonical path safety checks。
|
||||||
|
- source-qualified display; no state overwrite。
|
||||||
|
- duplicate Queue/Start action suppression when overlay has progressed。
|
||||||
|
- fallback diagnostics boundedness。
|
||||||
|
- no accidental merge/close authority substitution。
|
||||||
|
- row hierarchy and invalid Ticket tolerance regressions。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T12:40:45Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、Orchestrator workspace は clean。implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5D7MG5 at: 2026-06-15T12:57:12Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV5D7MG5`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `e0ddbed1 feat: show orchestration ticket overlay in panel`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/tui/src/workspace_panel.rs`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
|
||||||
|
Implemented behavior:
|
||||||
|
- Panel ViewModel attempts to read a read-only orchestration worktree Ticket state overlay from configured/default `[orchestration]` settings.
|
||||||
|
- Overlay loading validates:
|
||||||
|
- expected worktree path
|
||||||
|
- expected branch
|
||||||
|
- same Git common-dir/repository
|
||||||
|
- canonical Git top-level equals expected worktree path
|
||||||
|
- Overlay state is joined by canonical Ticket id only.
|
||||||
|
- Local/current branch `.yoi/tickets` remains primary authority and is not mutated or overwritten.
|
||||||
|
- Rows with progressed overlay state show source-qualified state such as:
|
||||||
|
- `local: queued · orchestration: inprogress`
|
||||||
|
- `local: queued · orchestration: done`
|
||||||
|
- Progressed overlay state suppresses duplicate queue/start-like actions:
|
||||||
|
- overlay `inprogress` is treated as active work / read-only progress
|
||||||
|
- overlay `done` is treated as merge/review pending and does not expose queue/start again
|
||||||
|
- Orchestrator work-set derivation accounts for overlay in-progress/done guards to avoid duplicate start routing.
|
||||||
|
|
||||||
|
Tests added/covered:
|
||||||
|
- overlay joins by Ticket id
|
||||||
|
- local `queued` + overlay `inprogress` display/action behavior
|
||||||
|
- local `queued` + overlay `done` merge-pending/action gating
|
||||||
|
- branch mismatch ignored
|
||||||
|
- missing worktree fallback
|
||||||
|
- local Ticket file not mutated by overlay reading
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||||
|
- Passed: `cargo check -p tui --all-targets`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after commit.
|
||||||
|
|
||||||
|
Residual blockers:
|
||||||
|
- None reported.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5D7MG5 at: 2026-06-15T13:04:06Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Inspected implementation diff `95abdc8d..e0ddbed1`.
|
||||||
|
- Changed files reviewed:
|
||||||
|
- `crates/tui/src/workspace_panel.rs`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- Worktree remained clean after read-only checks.
|
||||||
|
|
||||||
|
Acceptance review:
|
||||||
|
- Current branch remains primary authority:
|
||||||
|
- local Ticket summaries are loaded from the current workspace backend first;
|
||||||
|
- overlay data is joined by canonical Ticket id and stored separately in `PanelTicketInfo.orchestration_overlay`;
|
||||||
|
- `workflow_state` remains local/current-branch state and is not overwritten by overlay.
|
||||||
|
- Overlay is read-only:
|
||||||
|
- overlay loading uses `LocalTicketBackend::list_partial()` against the orchestration worktree ticket root;
|
||||||
|
- no overlay writes or current-branch Ticket mutation path was found;
|
||||||
|
- test coverage includes local Ticket files not being mutated by overlay read.
|
||||||
|
- Safety checks are appropriately conservative:
|
||||||
|
- expected configured/default orchestration path;
|
||||||
|
- path existence/directory check;
|
||||||
|
- canonical top-level comparison;
|
||||||
|
- expected branch check;
|
||||||
|
- same git common-dir check against current workspace.
|
||||||
|
- Branch mismatch and missing worktree fall back safely.
|
||||||
|
- Default orchestration config behavior is covered when no `[orchestration]` section is present.
|
||||||
|
- Canonical Ticket id join is covered; unrelated overlay Tickets do not affect local rows.
|
||||||
|
- Source-qualified display is present, e.g. `local: queued · orchestration: inprogress/done`.
|
||||||
|
- Duplicate Queue/Start suppression is implemented for local `queued` with overlay `inprogress` or `done`.
|
||||||
|
- `multi_pod` queued-work attention also suppresses already-progressed overlay work.
|
||||||
|
- Overlay `done` / `closed` remains merge/review-pending information and does not grant close/merge/lifecycle authority.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check 95abdc8d..e0ddbed1`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git status --short` clean
|
||||||
|
|
||||||
|
Validation not run by reviewer:
|
||||||
|
- `cargo test -p tui workspace_panel --lib`
|
||||||
|
- `cargo check -p tui --all-targets`
|
||||||
|
|
||||||
|
Reason: review scope was read-only and Cargo writes build artifacts. Coder-reported passing results for those commands were inspected as evidence.
|
||||||
|
|
||||||
|
Risk assessment:
|
||||||
|
- Low residual risk. The main behavior is ViewModel-tested and safety checks are conservative.
|
||||||
|
- Minor UI risk: compact status column may truncate long source-qualified overlay text, but the full model value and disabled/detail text carry overlay progress context.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T13:05:20Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV5D7MG5-panel-orchestration-overlay`
|
||||||
|
- implementation commit: `e0ddbed1 feat: show orchestration ticket overlay in panel`
|
||||||
|
- merge commit: `eeb6986f merge: panel orchestration overlay`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV5D7MG5`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||||
|
- 21 passed
|
||||||
|
- Passed: `cargo check -p tui --all-targets`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Overlay is read-only and source-qualified.
|
||||||
|
- Current branch Ticket state remains primary authority and is not overwritten.
|
||||||
|
- Missing worktree / branch mismatch / unrelated repo safety paths are covered by focused tests.
|
||||||
|
- Queue/Start-like duplicate actions are suppressed when overlay shows `inprogress` or `done`.
|
||||||
|
- Orchestrator worktree is clean after validation.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T13:05:20Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-15T14:59:40Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-15T14:59:40Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV5D7MG5` (`Panel に orchestration worktree の Ticket state overlay を表示する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-140109-1","ticket_id":"00001KV5MRH6D","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel startup latency E2E measurement/improvement work. Measure first visible render via real yoi PTY E2E, separate background/full-ready waits, improve startup path where safe, and record before/after evidence.","branch":"impl/00001KV5MRH6D-panel-startup-latency","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5MRH6D-panel-startup-latency","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Can run in parallel with Plugin resolver work because source surfaces are disjoint."},"author":"yoi-orchestrator","at":"2026-06-15T14:01:09Z"}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
---
|
||||||
|
title: 'Panel 起動遅延の待ち要因を E2E 計測で特定し改善する'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T12:40:33Z'
|
||||||
|
updated_at: '2026-06-19T05:44:09Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['panel', 'tui', 'e2e', 'latency', 'runtime-observation']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T13:59:47Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
`yoi panel` 起動時に最大 7 秒程度かかることがある。TUI が表示されている裏で具体的に何を待っていて遅いのかを特定し、改善したい。さらに E2E で起動時間を測定し、E2E テストとして起動時間の基準を設けたい。
|
||||||
|
|
||||||
|
過去に `00001KTFMMZP0` で Panel transition / first draw の非同期化を実施済みだが、現在も startup latency が観測されている。`00001KV3BQ7Q3` では Panel/TUI の user-visible behavior を現行 E2E で確認済みだが、今回の startup latency の分解・改善・基準化は別の concrete work item として扱う。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- `yoi panel` 起動時の startup path を計測し、どの処理をどの順序で待っているかを特定する。
|
||||||
|
- 例: snapshot load、Ticket backend scan、Pod metadata/socket observation、Orchestrator/Companion observation、background reload barrier、terminal setup、first draw、E2E observer setup など。
|
||||||
|
- TUI が表示されている裏で待っている処理と、初回表示前に同期的に待っている処理を区別する。
|
||||||
|
- 実ユーザーに影響する起動 latency を改善する。
|
||||||
|
- E2E で `yoi panel` 起動時間を測定できる scenario / helper / observer を追加または更新する。
|
||||||
|
- E2E テストに、少なくとも以下のような基準を設ける。
|
||||||
|
- first visible frame / initial panel render が bounded に出ること。
|
||||||
|
- 必要なら full ready / background reload complete も別 metric として測る。
|
||||||
|
- 「最大 7 秒程度」の現象が E2E fixture で再現しない場合も、何を保証できたか、何が live/manual gap として残るかを明示する。
|
||||||
|
- 改善後の実装報告に、計測結果 before / after、待ち要因、変更点、残る gap を記録する。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- `yoi panel` startup E2E が実 `yoi` binary + PTY 経路で起動時間を測定している。
|
||||||
|
- E2E は単に process が起動することだけでなく、少なくとも **初回 visible panel/render 到達までの時間** を assertion している。
|
||||||
|
- 起動時間 budget が E2E test に明示されている。
|
||||||
|
- 提案値: fixture PTY 上の first visible panel/render は `1500 ms` 以内。
|
||||||
|
- full ready / background reload complete を測る場合は、別 budget として設定し、first visible budget と混同しない。
|
||||||
|
- 既存環境差・CI/fixture のばらつきに対して、過度に flaky でない threshold / retry / observer 設計になっている。
|
||||||
|
- 実装報告に以下が記録されている。
|
||||||
|
- 計測対象 command / test name。
|
||||||
|
- before / after の測定結果。
|
||||||
|
- startup path の主要 wait point。
|
||||||
|
- どの wait を削減・非同期化・遅延実行したか。
|
||||||
|
- E2E が保証する範囲と、保証しない live/manual gap。
|
||||||
|
- 既存 Panel/TUI E2E と fixture-local HOME / XDG / runtime / workspace isolation を壊さない。
|
||||||
|
- no-provider / no-network 前提を維持する。
|
||||||
|
- 既存の Ticket workflow / Pod restore/spawn authority / Orchestrator queue semantics を変更しない。
|
||||||
|
|
||||||
|
## Binding decisions / invariants
|
||||||
|
|
||||||
|
- focused/unit test やコードレビューだけで startup latency 改善を確認済み扱いにしない。
|
||||||
|
- E2E pass と manual/live terminal confirmation を混同しない。
|
||||||
|
- `first visible render` と `all background work complete` を同じ metric として扱わない。
|
||||||
|
- 起動を速く見せるために、Ticket state / Pod state / Orchestrator state の authority を偽って表示しない。
|
||||||
|
- background reload / observation は完了後に正しい state / diagnostics を反映する。
|
||||||
|
- 起動時間計測のために provider/network/secret 依存を導入しない。
|
||||||
|
- broad TUI runtime rewrite や scheduler/lease 導入は今回の前提にしない。必要になった場合は escalation する。
|
||||||
|
|
||||||
|
## Implementation latitude
|
||||||
|
|
||||||
|
- 計測 instrumentation の入れ方は実装者判断でよい。
|
||||||
|
- E2E-only observer / event。
|
||||||
|
- `e2e-test` feature gate 配下の timing marker。
|
||||||
|
- PTY output marker。
|
||||||
|
- structured diagnostic event。
|
||||||
|
- exact wait point の分解方法は実装者判断でよいが、実装報告で説明可能にする。
|
||||||
|
- threshold はまず `first visible render <= 1500 ms` を提案値とする。
|
||||||
|
- 実測上、fixture 環境で妥当でない場合は、実装報告で理由を示して調整してよい。
|
||||||
|
- ただし 7 秒級の regression を許す threshold にはしない。
|
||||||
|
- startup latency 改善は、既存の `PendingReload` / background observation / loading state を活かしてよい。
|
||||||
|
- full ready までの時間が本質的に長い場合は、first visible と full ready を分けた上で、full ready の wait reason を表示・記録する改善でもよい。
|
||||||
|
|
||||||
|
## Readiness
|
||||||
|
|
||||||
|
- readiness: implementation_ready
|
||||||
|
- risk_flags: [panel, tui, e2e, latency, runtime-observation]
|
||||||
|
|
||||||
|
## Escalation conditions
|
||||||
|
|
||||||
|
- 7 秒 latency が E2E fixture では再現せず、live terminal / 実 workspace 固有の manual validation が必要な場合。
|
||||||
|
- 起動遅延の主因が Ticket storage corruption、大量 Pod metadata、外部 provider、filesystem stalls など fixture 外条件に依存する場合。
|
||||||
|
- startup path の改善に Pod authority / Ticket workflow semantics / Orchestrator lifecycle semantics の変更が必要になる場合。
|
||||||
|
- stable な timing test を作るには現行 E2E harness の設計変更が必要な場合。
|
||||||
|
- threshold を設けると flaky になり、別の observer / benchmark style が必要と判断される場合。
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
- `cargo test -p yoi-e2e --features e2e`
|
||||||
|
- 必要に応じて対象 E2E scenario の narrow run
|
||||||
|
- E2E 追加・更新時:
|
||||||
|
- `cargo test -p yoi-e2e --features e2e --no-run`
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `git diff --check`
|
||||||
|
- 変更範囲に応じて:
|
||||||
|
- `cargo check -p yoi-e2e -p yoi -p tui`
|
||||||
|
- `cargo test -p tui` または focused panel/tui tests
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KTFMMZP0` — `Make workspace panel transitions non-blocking`
|
||||||
|
- `00001KV3BQ7Q3` — `対象 TUI/Panel merge commit の挙動を現行 E2E で確認する`
|
||||||
|
- Panel handoff context:
|
||||||
|
- workspace: `yoi`
|
||||||
|
- workspace_orchestrator_pod: `yoi-orchestrator`
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Closed as completed by the subsequent Panel startup E2E and latency-improvement sequence.
|
||||||
|
|
||||||
|
The initial work separated first visible frame readiness from background reload, but later review showed that user-visible startup latency must be measured at dashboard content-ready, not first frame or single-row readiness. The later Tickets added dashboard snapshot readiness, shell-enter launch-path coverage, live workspace measurements, and the actual startup fix for duplicate Pod probes/session-log scans.
|
||||||
|
|
||||||
|
Relevant follow-ups:
|
||||||
|
- 00001KV62PF32: corrected readiness away from first frame / weak row count;
|
||||||
|
- 00001KVDETSN6: dashboard content-ready snapshot metric;
|
||||||
|
- 00001KVDQH839: shell-enter launch-path measurement;
|
||||||
|
- 00001KVF0ZJM5: fixed live startup by reusing initial Pod list presence and avoiding session-log reads before first rows.
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
<!-- event: create author: yoi-intake at: 2026-06-15T12:40:33Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T13:59:47Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T14:01:09Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- Work item は Panel startup latency の measurement / E2E budget / concrete wait-point improvement に限定され、Ticket workflow / Pod authority / Orchestrator queue semantics を変更しない invariant が明確。
|
||||||
|
- 同時 queued の Plugin resolver work とは source surface が大きく異なるため並行開始可能。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: startup wait points、first visible vs full ready distinction、E2E acceptance criteria、binding decisions、escalation conditions、validation を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`425a6c66` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
- Related context: `00001KTFMMZP0` prior non-blocking transition work、`00001KV3BQ7Q3` Panel/TUI E2E behavior evidence work は closed/done context として参照。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- `yoi panel` startup path を E2E/fixture PTY で計測し、first visible render と background/full-ready wait を分けて可視化し、実ユーザーに効く startup latency を改善・基準化する。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- focused/unit/code review だけで startup latency 改善済み扱いにしない。
|
||||||
|
- E2E pass と manual/live terminal confirmation を混同しない。
|
||||||
|
- `first visible render` と `all background work complete` を同一 metric にしない。
|
||||||
|
- 起動を速く見せるために Ticket / Pod / Orchestrator state authority を偽らない。
|
||||||
|
- Background reload / observation 完了後は正しい state / diagnostics を反映する。
|
||||||
|
- Provider/network/secret dependency を導入しない。
|
||||||
|
- Broad TUI runtime rewrite / scheduler / lease 導入は non-goal。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Real `yoi` binary + PTY path の E2E で startup time を測る。
|
||||||
|
- 少なくとも initial visible panel/render 到達時間を assert する。
|
||||||
|
- First visible budget を明示する(提案: <= 1500ms; 実測で妥当でない場合は理由付き調整)。
|
||||||
|
- Full ready/background reload complete を測るなら別 metric/budget として扱う。
|
||||||
|
- Before/after 測定結果、major wait point、削減/非同期化/遅延実行した wait、E2E が保証する範囲、live/manual gap を実装報告に記録する。
|
||||||
|
- Existing E2E fixture-local HOME/XDG/runtime/workspace isolation and no-provider/no-network を維持する。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- E2E-only observer / timing marker / PTY output marker / structured diagnostic event の選択は実装判断。
|
||||||
|
- Wait point breakdown の粒度は実装判断だが報告で説明可能にする。
|
||||||
|
- If fixture does not reproduce 7s latency, record what is guaranteed and what remains live/manual gap。
|
||||||
|
- Startup improvement can use existing PendingReload / background observation / loading state。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- 7s latency is live/workspace-specific and not fixture reproducible。
|
||||||
|
- Stable timing test requires broader harness redesign。
|
||||||
|
- Wait cause is storage corruption / huge metadata / provider / filesystem stalls outside fixture。
|
||||||
|
- Fix requires Pod authority / Ticket workflow / Orchestrator lifecycle semantic changes。
|
||||||
|
- Meaningful latency threshold cannot be made non-flaky。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- `cargo test -p yoi-e2e --features e2e` or narrow scenario plus full if feasible。
|
||||||
|
- `cargo test -p yoi-e2e --features e2e --no-run`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- Depending changes: `cargo check -p yoi-e2e -p yoi -p tui` and focused tui tests。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- E2E actually measures first visible render, not just process start。
|
||||||
|
- first visible vs full ready distinction。
|
||||||
|
- threshold not overly flaky and not permissive of 7s regression。
|
||||||
|
- no authority/state falsification for speed。
|
||||||
|
- fixture isolation / no-provider / no-network。
|
||||||
|
- before/after evidence and residual live gap clarity。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T14:01:19Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation/evidence plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、Panel startup latency work は同時に開始する Plugin resolver work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: hare at: 2026-06-15T14:20:26Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
### E2E measurements (real `target/debug/yoi` + PTY)
|
||||||
|
|
||||||
|
| Scenario | Before | After | Budget | Notes |
|
||||||
|
| --- | ---: | ---: | ---: | --- |
|
||||||
|
| Fixture first visible panel render (`panel_full_ready_has_separate_startup_budget`) | 20.342 ms | 20.384 ms | 1500 ms | Warm fixture did not reproduce 7 s latency; after path keeps first draw separate from reload work. |
|
||||||
|
| Fixture full-ready rows (`panel_full_ready_has_separate_startup_budget`) | 120.576 ms | 120.552 ms | 5000 ms | Separate metric; fixture full-ready remains well below budget after the first-frame deferral. |
|
||||||
|
| Held-reload ordering (`panel_first_visible_render_arrives_before_background_reload`) | `background_task_started` before `panel_ready` | `panel_ready` before held `background_task_started`; first visible 20.396 ms | 1500 ms | Guarantees initial visible frame is not blocked by reload/observation. |
|
||||||
|
| Pre-change ad-hoc Panel run from existing fixture artifact | `background_task_started@76 ms`, `panel_ready@80 ms`, full rows `@182 ms` | latest held/full tests above | n/a | Used to identify wait ordering; fixture still did not reproduce live 7 s. |
|
||||||
|
|
||||||
|
### Wait points identified
|
||||||
|
|
||||||
|
- Synchronous before first draw: CLI/process startup, `run_panel` workspace/cwd setup, `load_app` construction of an empty/loading `WorkspacePanelViewModel`, raw-mode/bracketed-paste/alternate-screen/mouse setup, and the first `terminal.draw`.
|
||||||
|
- Previously scheduled before first draw: initial Panel reload/observation task (`PendingReload::start(Ensure { ... })`), which can scan Tickets/Pods/orchestrator state and perform socket/status probing before fixture rows are fully ready.
|
||||||
|
- Background/full-ready after first draw: `load_multi_pod_snapshot`, Ticket list/detail loading, Pod metadata/status checks, orchestrator lifecycle observation, row selection/re-render, and background diagnostics.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Added PTY E2E startup coverage for `yoi panel`:
|
||||||
|
- `panel_first_visible_render_arrives_before_background_reload` asserts `panel_ready` arrives within 1500 ms and before the held reload task starts.
|
||||||
|
- `panel_full_ready_has_separate_startup_budget` asserts first visible render within 1500 ms and full fixture rows within 5 s as a separate metric.
|
||||||
|
- Deferred the initial Panel reload start until after the first loading frame is drawn, preserving later background reload correctness.
|
||||||
|
- Kept Panel/terminal mouse capture to SGR + normal tracking (`?1006h` + `?1000h`) and avoided drag-capture (`?1002h`/`?1003h`) so existing PTY tests can confirm no drag-capture regression.
|
||||||
|
|
||||||
|
### Guaranteed scope / residual gaps
|
||||||
|
|
||||||
|
- Guaranteed by E2E fixture: real binary, PTY, first visible frame budget, held-reload ordering, separate full-ready row budget, no provider/network/secret dependency.
|
||||||
|
- Residual live/manual gap: the reported ~7 s live Panel startup did not reproduce in this fixture. This change prevents initial reload/observation from blocking or contending with the first visible frame, but live-terminal confirmation is still needed if the remaining cause is workspace-specific (for example a large real Ticket/Pod set or slow live socket/status probe).
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5MRH6D at: 2026-06-15T14:31:11Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Reviewed child worktree diff `4772c4d6..9bad2745`.
|
||||||
|
- Reviewed changed files:
|
||||||
|
- `.yoi/tickets/00001KV5MRH6D/item.md`
|
||||||
|
- `.yoi/tickets/00001KV5MRH6D/thread.md`
|
||||||
|
- `crates/tui/src/multi_pod.rs`
|
||||||
|
- `crates/tui/src/single_pod.rs`
|
||||||
|
- `tests/e2e/tests/panel.rs`
|
||||||
|
- Worktree was clean and at expected branch/commit.
|
||||||
|
|
||||||
|
Acceptance review:
|
||||||
|
- E2E uses real `yoi panel` process under PTY fixture, not unit-only coverage.
|
||||||
|
- First visible render is explicitly measured and asserted via `panel_first_visible_render_arrives_before_background_reload` with a 1500ms budget.
|
||||||
|
- Full-ready/background work is separately measured via `panel_full_ready_has_separate_startup_budget` with its own budget and ready-row assertion.
|
||||||
|
- The implementation defers the initial background reload until after the first loading frame is queued/drawn; it does not fake Ticket/Pod/Orchestrator state.
|
||||||
|
- The tests use a held reload barrier to prove first visible rendering happens before background reload unblocks.
|
||||||
|
- Background reload correctness is preserved by waiting for rows/actions after the barrier.
|
||||||
|
- The reported before/after evidence and thread update correctly explain that fixture E2E did not reproduce the live ~7s delay and that live/manual confirmation remains a residual gap.
|
||||||
|
- Existing no-provider/no-network style E2E isolation is preserved; no provider/secret/network dependency was introduced.
|
||||||
|
- The mouse capture adjustment avoids drag/full-motion capture modes while preserving SGR normal mouse tracking, matching recent Panel mouse invariants.
|
||||||
|
- No Ticket workflow, Pod restore/spawn authority, Orchestrator queue, scheduler, or lease semantics were changed.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check 4772c4d6..9bad2745`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Worktree stayed clean.
|
||||||
|
|
||||||
|
Validation not run by reviewer:
|
||||||
|
- E2E/cargo test commands were not rerun because review scope was read-only and they write build artifacts. Coder-reported validation was inspected as evidence.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker remains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T14:31:28Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation/evidence branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV5MRH6D-panel-startup-latency`
|
||||||
|
- implementation commit: `9bad2745 fix: measure and defer panel startup reload`
|
||||||
|
- merge commit: `6f99ebed merge: panel startup latency e2e`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV5MRH6D`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo test -p yoi-e2e --features e2e --no-run`
|
||||||
|
- Passed: `cargo test -p yoi-e2e --features e2e`
|
||||||
|
- yoi-e2e lib: 1 passed
|
||||||
|
- panel E2E: 5 passed
|
||||||
|
- rewind E2E: 1 passed
|
||||||
|
- Passed: `cargo check -p yoi-e2e -p yoi -p tui`
|
||||||
|
- Passed: `cargo test -p tui single_pod_mouse_capture_avoids_drag_and_all_motion_modes`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Evidence outcome:
|
||||||
|
- First visible render is asserted within 1500ms through real `yoi panel` PTY fixture.
|
||||||
|
- Full-ready/background row availability is asserted separately within 5s.
|
||||||
|
- Initial reload/observation is deferred until after first loading frame; state/diagnostics are not faked or skipped.
|
||||||
|
- Fixture did not reproduce the live ~7s startup delay, so live/manual confirmation remains a documented gap.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T14:31:28Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation/evidence branch merged into the orchestration branch, and E2E-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-19T05:44:09Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-19T05:44:09Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Closed as completed by the subsequent Panel startup E2E and latency-improvement sequence.
|
||||||
|
|
||||||
|
The initial work separated first visible frame readiness from background reload, but later review showed that user-visible startup latency must be measured at dashboard content-ready, not first frame or single-row readiness. The later Tickets added dashboard snapshot readiness, shell-enter launch-path coverage, live workspace measurements, and the actual startup fix for duplicate Pod probes/session-log scans.
|
||||||
|
|
||||||
|
Relevant follow-ups:
|
||||||
|
- 00001KV62PF32: corrected readiness away from first frame / weak row count;
|
||||||
|
- 00001KVDETSN6: dashboard content-ready snapshot metric;
|
||||||
|
- 00001KVDQH839: shell-enter launch-path measurement;
|
||||||
|
- 00001KVF0ZJM5: fixed live startup by reusing initial Pod list presence and avoiding session-log reads before first rows.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-140041-1","ticket_id":"00001KV5R5V2S","kind":"accepted_plan","accepted_plan":{"summary":"Accept Plugin package discovery and explicit enablement resolver implementation. Build typed discovery/manifest/resolver data without runtime execution or contribution registration, with fail-closed diagnostics and focused tests.","branch":"impl/00001KV5R5V2S-plugin-enable-resolver","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5R5V2S-plugin-enable-resolver","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Can run in parallel with Panel startup E2E work because source surfaces are disjoint."},"author":"yoi-orchestrator","at":"2026-06-15T14:00:41Z"}
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
title: 'Plugin: package discovery and explicit enablement resolver'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T13:40:15Z'
|
||||||
|
updated_at: '2026-06-18T12:22:04Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['plugin', 'package-loading', 'discovery', 'enablement', 'capability-boundary', 'startup-restore']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T13:59:47Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Plugin を利用可能にする最初の実装として、Plugin package を安全に発見・検査し、明示設定に基づいて enablement target として resolve できるようにする。
|
||||||
|
|
||||||
|
この Ticket では Plugin code の実行、Tool / Hook / Service / Ingress の登録、WASM runtime、`https` / `fs` host API 実装は行わない。package discovery と explicit enablement resolver を先に固め、後続の Plugin runtime / surface 実装が同じ解決結果を使えるようにする。
|
||||||
|
|
||||||
|
既存設計では以下を分離する。
|
||||||
|
|
||||||
|
```text
|
||||||
|
package discovery != enablement != runtime initialization != contribution registration
|
||||||
|
```
|
||||||
|
|
||||||
|
package が存在するだけで実行・登録されてはならない。Yoi は package を read-only に発見し、profile / config 側の明示 enablement entry と照合できるところまでをこの Ticket の範囲とする。
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
- Plugin package discovery
|
||||||
|
- Plugin package archive / directory safety validation
|
||||||
|
- `plugin.toml` manifest parsing
|
||||||
|
- Plugin package identity resolution
|
||||||
|
- Explicit enablement entry resolution
|
||||||
|
- Resolved Plugin metadata / diagnostics surface
|
||||||
|
- Startup / snapshot restore で再現可能な resolved input の保持または再構築方針
|
||||||
|
|
||||||
|
## Package locations
|
||||||
|
|
||||||
|
最初の discovery source は以下を対象にする。
|
||||||
|
|
||||||
|
- User plugin store:
|
||||||
|
- `${XDG_DATA_HOME:-~/.local/share}/yoi/plugins/*.yoi-plugin`
|
||||||
|
- Workspace plugin store:
|
||||||
|
- `<workspace>/.yoi/plugins/*.yoi-plugin`
|
||||||
|
|
||||||
|
実装上、`.yoi-plugin` を archive として扱うか directory として扱うかは、既存設計 `00001KT0Z4BK8` を確認して合わせる。未実装部分がある場合は、最小実装を明示し、後続 Ticket で拡張できる構造にする。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Plugin package discovery は read-only とする。
|
||||||
|
- 発見した package を実行しない。
|
||||||
|
- Tool / Hook / Service / Ingress を登録しない。
|
||||||
|
- package の存在だけで Plugin が有効化されない。
|
||||||
|
- `plugin.toml` を package root から読み込む。
|
||||||
|
- 必須 metadata を parse する。
|
||||||
|
- unsupported / incompatible api version は fail closed にする。
|
||||||
|
- Package safety checks を行う。
|
||||||
|
- path traversal を reject する。
|
||||||
|
- package root 外への symlink / escape を reject する。
|
||||||
|
- bounded file count / total size / manifest size を設ける。
|
||||||
|
- deterministic digest を計算する。
|
||||||
|
- malformed package は diagnostic に残すが、Pod startup 全体を不要に壊さない。
|
||||||
|
- Plugin identity を source-qualified に扱う。
|
||||||
|
- `user:<id>`
|
||||||
|
- `project:<id>`
|
||||||
|
- `builtin:<id>`
|
||||||
|
- Unqualified id が複数 source に一致する場合は ambiguous として fail closed にする。
|
||||||
|
- Profile / config 側の explicit enablement entry を読む。
|
||||||
|
- exact config location / shape は既存 Profile / plugin design に合わせ、必要なら最小の typed structure を追加する。
|
||||||
|
- enablement entry は package ref、version / version constraint、digest pin、enabled surfaces、grant request / grant reference を表現できるようにする。
|
||||||
|
- Enablement resolver は discovered package と enablement entry を照合する。
|
||||||
|
- missing package
|
||||||
|
- duplicate package id
|
||||||
|
- ambiguous ref
|
||||||
|
- version mismatch
|
||||||
|
- digest mismatch
|
||||||
|
- incompatible api version
|
||||||
|
- requested surface unsupported
|
||||||
|
- grant missing / unsupported
|
||||||
|
を diagnostic として区別できるようにする。
|
||||||
|
- Resolved Plugin は後続の runtime initialization / contribution registration に渡せる typed data として表す。
|
||||||
|
- package identity
|
||||||
|
- source
|
||||||
|
- package path
|
||||||
|
- digest
|
||||||
|
- manifest metadata
|
||||||
|
- enabled surfaces
|
||||||
|
- effective grants / unresolved grants
|
||||||
|
- diagnostics
|
||||||
|
- Startup / snapshot restore で同じ resolved Plugin set を再現できること。
|
||||||
|
- runtime-only mutable state に依存しない。
|
||||||
|
- 必要な場合は Pod metadata / snapshot に resolved digest 等を含めるか、startup 時に deterministic に再解決する。
|
||||||
|
- Diagnostics は model-visible context に勝手に差し込まない。
|
||||||
|
- user-visible / logs / snapshot など既存の診断面に合わせる。
|
||||||
|
- secret-like path / auth / file content を出さない。
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Plugin code execution。
|
||||||
|
- WASM runtime 実装。
|
||||||
|
- Tool / Hook / Service / Ingress の実登録。
|
||||||
|
- `https` host API 実装。
|
||||||
|
- `fs` host API 実装。
|
||||||
|
- external network / filesystem side effect の実行。
|
||||||
|
- plugin package manager / install / update / registry 実装。
|
||||||
|
- package signature / trust chain 実装。
|
||||||
|
- MCP bridge との統合。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- User / workspace plugin store から `.yoi-plugin` package を発見できる。
|
||||||
|
- Valid package の `plugin.toml` を parse し、typed manifest と deterministic digest を得られる。
|
||||||
|
- Invalid package は fail closed し、bounded diagnostic として報告される。
|
||||||
|
- Package が存在するだけでは Tool / Hook / Service / Ingress は登録されない。
|
||||||
|
- Profile / config の explicit enablement entry なしでは Plugin は有効化されない。
|
||||||
|
- Enablement entry と discovered package を照合し、resolved Plugin metadata を生成できる。
|
||||||
|
- `user:<id>` / `project:<id>` / `builtin:<id>` の source-qualified identity を扱える。
|
||||||
|
- ambiguous unqualified id は fail closed する。
|
||||||
|
- version mismatch / digest mismatch / incompatible api version / missing package が区別可能な diagnostic になる。
|
||||||
|
- Startup / restore 時に resolved Plugin set が deterministic に再現できる。
|
||||||
|
- Tests cover:
|
||||||
|
- valid user package discovery
|
||||||
|
- valid workspace package discovery
|
||||||
|
- package without enablement is not active
|
||||||
|
- explicit enablement resolves package
|
||||||
|
- duplicate / ambiguous id fail closed
|
||||||
|
- digest mismatch fail closed
|
||||||
|
- path traversal / root escape rejected
|
||||||
|
- unsupported api version rejected
|
||||||
|
- malformed manifest diagnostic
|
||||||
|
- no contribution registration from discovery-only path
|
||||||
|
- Validation: focused tests for plugin discovery/resolver, `cargo fmt --check`, relevant `cargo check` / `cargo test`, `git diff --check`, and `nix build .#yoi` if runtime resources / packaging / dependency graph change.
|
||||||
|
|
||||||
|
## Implementation notes
|
||||||
|
|
||||||
|
- Prefer adding a small typed Plugin package/resolver module rather than embedding resolver logic inside runtime launch code.
|
||||||
|
- Keep terminology aligned with the design record:
|
||||||
|
- Plugin runtime
|
||||||
|
- Plugin surface
|
||||||
|
- Plugin host API
|
||||||
|
- Do not reintroduce `contribution category` as user-facing terminology.
|
||||||
|
- Host APIs remain intentionally narrow. If this Ticket needs to mention APIs, use `https` and `fs`, not `web`.
|
||||||
|
- Discovery and enablement should integrate with the existing Profile / feature contribution direction without giving plugins ambient workspace filesystem authority.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KSXRQ4G8` — Plugin runtime / surface / minimal host API model design.
|
||||||
|
- `00001KT0Z4BK8` — Plugin package / discovery format design.
|
||||||
|
- `00001KTR81P9X` — `pod::feature` API / plugin host substrate follow-up.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV5R5V2S` (`Plugin: package discovery and explicit enablement resolver`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,547 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T13:40:15Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T13:59:47Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T14:00:41Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||||
|
- Prior Plugin package design `00001KT0Z4BK8` は done 済みで、本 Ticket はその設計を踏まえた discovery + explicit enablement resolver の最初の実装として具体化されている。
|
||||||
|
- Risk flags は plugin / package-loading / discovery / enablement / capability-boundary / startup-restore だが、non-goals と fail-closed / read-only / no-registration invariants が明確で、残る不確実性は typed module/config/resolver design の実装戦術に閉じている。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: scope、requirements、non-goals、acceptance criteria、implementation notes、related work を確認。
|
||||||
|
- Ticket relations: blocker なし。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`425a6c66` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
- Related design context: `00001KT0Z4BK8` done(Plugin package/discovery design)。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Plugin package discovery と explicit enablement resolver を typed module として実装し、package presence / discovery / enablement / runtime initialization / contribution registration を明確に分離する。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Discovery は read-only。package の存在だけで execution / Tool / Hook / Service / Ingress registration を行わない。
|
||||||
|
- Explicit enablement entry がなければ Plugin は active にならない。
|
||||||
|
- Source-qualified identity (`user:<id>`, `project:<id>`, `builtin:<id>`) を扱い、ambiguous unqualified id は fail closed。
|
||||||
|
- Package safety checks は path traversal / root escape / bounded count/size / manifest size / deterministic digest を含む。
|
||||||
|
- unsupported/incompatible API version、digest mismatch、version mismatch、missing package、duplicate/ambiguous id、unsupported surface/grant は区別可能な diagnostic にする。
|
||||||
|
- Diagnostics を model-visible context に勝手に差し込まない。
|
||||||
|
- Plugin code execution / WASM runtime / actual Tool/Hook/Service/Ingress registration / MCP bridge は non-goal。
|
||||||
|
- No ambient workspace filesystem authority を plugin package discovery から発生させない。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- User store `${XDG_DATA_HOME:-~/.local/share}/yoi/plugins/*.yoi-plugin` と workspace store `<workspace>/.yoi/plugins/*.yoi-plugin` から package を発見できる。
|
||||||
|
- Valid package root の `plugin.toml` を parse し typed manifest と deterministic digest を得る。
|
||||||
|
- Invalid package は startup 全体を不要に壊さず bounded diagnostic で fail closed。
|
||||||
|
- Package without enablement is not active。
|
||||||
|
- Explicit enablement resolves package to typed resolved Plugin metadata。
|
||||||
|
- Tests cover valid user/workspace discovery、discovery-only inactive、explicit enablement、duplicate/ambiguous fail-closed、digest mismatch、path traversal/root escape、unsupported api、malformed manifest、no contribution registration。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- Small typed module/crate-local module を追加してよい。runtime launch code に resolver logic を埋め込まない。
|
||||||
|
- `.yoi-plugin` archive vs directory minimal implementation は prior design に合わせる。必要なら最小サポート範囲を明示し後続拡張可能にする。
|
||||||
|
- Exact config/profile shape は既存 Profile / manifest design に合わせて最小 typed structure を追加してよい。
|
||||||
|
- Startup/restore reproducibility は deterministic re-resolution か resolved digest metadata 保持のどちらかを実装判断。ただし runtime-only mutable state 依存は不可。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- Profile/manifest authority semantics、Pod restore semantics、secret handling、MCP enablement model を変える必要がある。
|
||||||
|
- Package archive implementation needs signature/trust/install/update/registry semantics。
|
||||||
|
- Arbitrary external filesystem/network authority が必要になる。
|
||||||
|
- Runtime registration/WASM execution なしでは acceptance を満たせないことが判明する。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- focused tests for plugin discovery/resolver。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- relevant `cargo check` / `cargo test`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- `nix build .#yoi` if dependencies, runtime resources, packaging, or Cargo.lock changes matter。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- discovery vs enablement vs runtime/registration separation。
|
||||||
|
- fail-closed package safety / diagnostics。
|
||||||
|
- source-qualified identity and ambiguous refs。
|
||||||
|
- no contribution registration / no side effects from discovery。
|
||||||
|
- startup/restore determinism。
|
||||||
|
- secret-like diagnostic redaction。
|
||||||
|
- Plugin permission/grant requests not confused with actual grants。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T14:01:19Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、Plugin resolver work は同時に開始する Panel startup latency work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5R5V2S at: 2026-06-15T14:27:54Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV5R5V2S`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `a03a9da6 feat: add plugin package resolver`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- New typed plugin discovery/resolution module.
|
||||||
|
- `crates/manifest/src/lib.rs`
|
||||||
|
- Added `plugins` config to `PodManifest`.
|
||||||
|
- Added parsing test for `[[plugins.enabled]]`.
|
||||||
|
- `crates/manifest/src/config.rs`
|
||||||
|
- Added `plugins` to `PodManifestConfig` and merge/materialization path.
|
||||||
|
- `crates/manifest/src/profile.rs`
|
||||||
|
- Added profile/Lua config support for plugin enablement config.
|
||||||
|
- `crates/pod/src/spawn/tool.rs`
|
||||||
|
- Preserves plugin config when deriving child manifest config.
|
||||||
|
- `crates/manifest/Cargo.toml`
|
||||||
|
- Added `sha2` dependency for deterministic package digests.
|
||||||
|
- `Cargo.lock`
|
||||||
|
- Updated manifest crate dependency metadata.
|
||||||
|
- `package.nix`
|
||||||
|
- Updated `cargoHash`.
|
||||||
|
|
||||||
|
Resolver/config shape:
|
||||||
|
- Config supports explicit enablement through `[[plugins.enabled]]`:
|
||||||
|
- `id = "project:<id>" | "user:<id>" | "builtin:<id>"`
|
||||||
|
- optional `digest = "sha256:<hex>"`
|
||||||
|
- optional `surfaces = ["hook", ...]`
|
||||||
|
- optional `[plugins.enabled.config]`
|
||||||
|
- optional grants, currently fail closed when authority-bearing/non-empty.
|
||||||
|
- Discovery stores:
|
||||||
|
- User: `${XDG_DATA_HOME:-~/.local/share}/yoi/plugins/*.yoi-plugin`
|
||||||
|
- Workspace: `<workspace>/.yoi/plugins/*.yoi-plugin`
|
||||||
|
|
||||||
|
Implemented behavior:
|
||||||
|
- Discovery is read-only and returns typed `DiscoveredPluginPackage` metadata only.
|
||||||
|
- Resolution only activates packages explicitly listed in config and returns typed `ResolvedPlugin` metadata.
|
||||||
|
- No runtime initialization, code execution, WASM runtime, hook/tool/service/ingress registration, network, package-manager, or MCP behavior was added.
|
||||||
|
- Source-qualified ids are required; unqualified ids fail closed as ambiguous.
|
||||||
|
- Unsupported plugin API versions fail closed.
|
||||||
|
- Digest pins are checked against deterministic package content digests.
|
||||||
|
- Traversal/root escape/symlink escape checks are enforced.
|
||||||
|
- Package count, package size, manifest size, entry count, per-file size, and expanded size are bounded.
|
||||||
|
- Non-empty authority-bearing grants fail closed, so plugins do not receive ambient workspace filesystem authority.
|
||||||
|
|
||||||
|
Diagnostics:
|
||||||
|
- Added typed diagnostic kinds for missing, duplicate, ambiguous, version, digest, API, surface, grant, malformed, traversal, bounds, and I/O.
|
||||||
|
- Diagnostics avoid full package path/content disclosure and use bounded/sanitized messages.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo test -p manifest plugin`
|
||||||
|
- Passed: `cargo test -p manifest`
|
||||||
|
- Passed: `cargo check`
|
||||||
|
- Passed: `cargo test -p pod spawn_pod`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi`
|
||||||
|
|
||||||
|
Residual risks / notes:
|
||||||
|
- Current archive reader intentionally supports a constrained stored-ZIP profile and fails closed on unsupported compression methods. Broader `.zip` compression support can be added later if package tooling requires it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5R5V2S at: 2026-06-15T14:37:12Z status: request_changes -->
|
||||||
|
|
||||||
|
## Review: request changes
|
||||||
|
|
||||||
|
Review result: request_changes
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Child worktree only:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5R5V2S-plugin-enable-resolver`
|
||||||
|
- branch/head `impl/00001KV5R5V2S-plugin-enable-resolver` at `a03a9da6`
|
||||||
|
- Diff files:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/manifest/src/config.rs`
|
||||||
|
- `crates/manifest/src/lib.rs`
|
||||||
|
- `crates/manifest/src/profile.rs`
|
||||||
|
- `crates/pod/src/spawn/tool.rs`
|
||||||
|
- `crates/manifest/Cargo.toml`
|
||||||
|
- `Cargo.lock`
|
||||||
|
- `package.nix`
|
||||||
|
- `docs/design/plugin-packages.md`
|
||||||
|
- Ticket record:
|
||||||
|
- `.yoi/tickets/00001KV5R5V2S/item.md`
|
||||||
|
- `.yoi/tickets/00001KV5R5V2S/thread.md`
|
||||||
|
|
||||||
|
Read-only validation performed:
|
||||||
|
- Passed: `git diff --check 4772c4d6..a03a9da6`
|
||||||
|
|
||||||
|
Positive findings:
|
||||||
|
- Discovery/resolution code is isolated in `crates/manifest/src/plugin.rs`.
|
||||||
|
- No runtime registration, WASM execution, Tool/Hook/Service/Ingress contribution path was found.
|
||||||
|
- User/workspace stores are represented.
|
||||||
|
- Discovery checks include store containment, symlink escape rejection, path normalization, count/size/manifest bounds, duplicate normalized path rejection, and deterministic digest.
|
||||||
|
- Package presence alone does not activate anything; resolution requires `plugins.enabled`.
|
||||||
|
- Manifest/profile/child-spawn config plumbing preserves `plugins` config.
|
||||||
|
|
||||||
|
Required changes:
|
||||||
|
|
||||||
|
1. Version mismatch support is missing.
|
||||||
|
|
||||||
|
- Ticket requires enablement entries to express package version/version constraint and requires version mismatch to be a distinct diagnostic.
|
||||||
|
- `PluginEnablementConfig` currently has `id`, `digest`, `surfaces`, `grants`, `config`, but no version/version constraint field.
|
||||||
|
- `resolve_enabled_plugins` never compares enablement against `package.manifest.version`.
|
||||||
|
- `PluginPackageManifest` has `version`, but it is only validated non-empty.
|
||||||
|
- `PluginDiagnosticKind::Version` currently appears to be used for unsupported API version, so package-version mismatch and API incompatibility are not clearly separated.
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Add a typed version/version requirement field to enablement config, or explicitly documented minimal exact-version field if constraints are deferred.
|
||||||
|
- Compare it to `manifest.version` during resolution.
|
||||||
|
- Emit a distinct version-mismatch diagnostic separate from incompatible API version.
|
||||||
|
- Add tests for version mismatch fail-closed behavior.
|
||||||
|
|
||||||
|
2. Startup/restore determinism is not satisfied.
|
||||||
|
|
||||||
|
- Ticket requires deterministic startup/restore behavior for the resolved plugin set.
|
||||||
|
- Implementation preserves authoring config, but no resolved plugin metadata/digest recording or deterministic restore re-resolution path was found.
|
||||||
|
- Unpinned enablement can resolve to a different package if mutable user/workspace store changes before restore.
|
||||||
|
- The design doc also states restore should use a resolved plan, not fresh discovery choosing newer packages.
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Either persist resolved plugin identity/digest metadata into resolved manifest/session metadata used for restore, or define and implement deterministic re-resolution semantics that cannot silently change a restored plugin set.
|
||||||
|
- Add focused test or validation evidence for the chosen restore/reproducibility path.
|
||||||
|
- If intentionally deferred, Ticket acceptance/report must be updated before approval because current acceptance still requires it.
|
||||||
|
|
||||||
|
3. Bounded diagnostic truncation can panic on valid UTF-8.
|
||||||
|
|
||||||
|
- `bounded_message` slices a Rust `String` at byte offset 240.
|
||||||
|
- It is used for TOML parse errors from untrusted plugin manifests.
|
||||||
|
- If byte 240 falls inside a multibyte UTF-8 character, slicing panics instead of producing a bounded diagnostic.
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Truncate on character boundary using safe helper logic.
|
||||||
|
- Add malformed manifest test with long multibyte content proving diagnostics remain bounded and non-panicking.
|
||||||
|
- Consider reducing raw TOML-error content leakage because diagnostics should avoid secret-like path/content leakage.
|
||||||
|
|
||||||
|
Additional concern:
|
||||||
|
- Design doc examples use `schema_version`, but implemented parser requires `api_version`.
|
||||||
|
- Align schema naming before merge to avoid contradictory package-author guidance.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Changes requested. Do not integrate until these blockers are fixed and covered.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5R5V2S at: 2026-06-15T14:53:21Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Follow-up implementation report after reviewer request_changes:
|
||||||
|
|
||||||
|
New commit:
|
||||||
|
- `ede7acfd fix: pin plugin resolution metadata`
|
||||||
|
|
||||||
|
Resolved blockers:
|
||||||
|
|
||||||
|
1. Version mismatch support
|
||||||
|
- Added typed exact-version requirement:
|
||||||
|
- `PluginExactVersion`
|
||||||
|
- `PluginEnablementConfig.version: Option<PluginExactVersion>`
|
||||||
|
- Resolution now compares `plugins.enabled.version` against `package.manifest.version`.
|
||||||
|
- Version mismatch fails closed with `PluginDiagnosticKind::Version`.
|
||||||
|
- Unsupported plugin schema/API version now emits `PluginDiagnosticKind::Api`, distinct from package version mismatch.
|
||||||
|
- Added focused test:
|
||||||
|
- `exact_version_mismatch_fails_closed_with_distinct_diagnostic`
|
||||||
|
|
||||||
|
2. Startup/restore determinism
|
||||||
|
- Added runtime resolved-plan metadata to `PluginConfig`:
|
||||||
|
- `resolved: Vec<ResolvedPluginRecord>`
|
||||||
|
- `diagnostics: Vec<PluginDiagnostic>`
|
||||||
|
- Added `resolve_plugin_config_for_startup`.
|
||||||
|
- Fresh startup resolves enabled plugins and records identity/path/label/digest/version/manifest/enabled surfaces/grants/config into manifest plugin config.
|
||||||
|
- Restore/snapshot configs with an existing resolved plan are reused as-is and do not silently select newer mutable store contents.
|
||||||
|
- Wired startup resolution into pod manifest resolution in `crates/pod/src/entrypoint.rs`.
|
||||||
|
- Preserved resolved plugin plan through config merge.
|
||||||
|
- Added focused test:
|
||||||
|
- `resolved_plan_pins_unpinned_enablement_for_restore`
|
||||||
|
|
||||||
|
3. Safe bounded diagnostics
|
||||||
|
- Replaced byte slicing in `bounded_message` with char-boundary truncation.
|
||||||
|
- TOML parse diagnostics no longer embed raw untrusted manifest content; diagnostic reports bounded parse message with optional byte span.
|
||||||
|
- Added focused multibyte malformed manifest test:
|
||||||
|
- `malformed_manifest_multibyte_diagnostic_is_bounded_and_redacted`
|
||||||
|
|
||||||
|
4. Schema naming alignment
|
||||||
|
- Plugin package manifest parser now uses `schema_version`, matching `docs/design/plugin-packages.md`.
|
||||||
|
- Updated tests/helpers accordingly.
|
||||||
|
- Updated design doc enablement example to include implemented exact `version` field and describe deferred richer constraints.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo test -p manifest plugin`
|
||||||
|
- Passed: `cargo test -p manifest`
|
||||||
|
- Passed: `cargo check`
|
||||||
|
- Passed: `cargo test -p pod spawn_pod`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi`
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after follow-up commit.
|
||||||
|
|
||||||
|
Residual note:
|
||||||
|
- Version constraints are intentionally minimal exact-version matching for this Ticket. Richer semantic/range constraints remain deferred and documented as follow-up scope.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5R5V2S-r2 at: 2026-06-15T15:05:55Z status: request_changes -->
|
||||||
|
|
||||||
|
## Review: request changes
|
||||||
|
|
||||||
|
Review result: request_changes
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Child worktree only:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5R5V2S-plugin-enable-resolver`
|
||||||
|
- HEAD `ede7acfd fix: pin plugin resolution metadata`
|
||||||
|
- base `4772c4d6`
|
||||||
|
- Relevant files:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/src/entrypoint.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
- `docs/design/plugin-packages.md`
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check 4772c4d6..HEAD`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- `git status --short` clean
|
||||||
|
|
||||||
|
Validation not run:
|
||||||
|
- `cargo test`, `cargo check`, and `nix build` were not rerun because reviewer scope was read-only and those commands write build artifacts. Coder-reported results were treated as evidence only.
|
||||||
|
|
||||||
|
Remaining blockers:
|
||||||
|
|
||||||
|
1. Startup/restore determinism is incomplete for non-profile / spawn-config launches.
|
||||||
|
|
||||||
|
Positive pieces exist:
|
||||||
|
- `apply_plugin_resolution_plan()` resolves plugins during manifest resolution.
|
||||||
|
- `resolve_plugin_config_for_startup()` skips fresh discovery when `plugins.resolved` or `plugins.diagnostics` already exists.
|
||||||
|
- focused helper test confirms a restored resolved plan does not pick newer mutable store contents.
|
||||||
|
|
||||||
|
Blocker:
|
||||||
|
- resolved manifest snapshot is only persisted to Pod metadata when `self.manifest.profile.is_some()`.
|
||||||
|
- Restore uses saved snapshot if present, otherwise falls back to freshly resolved current manifest.
|
||||||
|
- A named Pod started from `--manifest` or spawn config can resolve plugin metadata at startup but fail to persist that resolved plan, then later restore can silently re-resolve against newer mutable store contents unless authoring config had digest pin.
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Persist the resolved manifest snapshot for plugin-resolved manifests regardless of `manifest.profile`, or otherwise make non-profile restore deterministically use the original resolved plan.
|
||||||
|
- Add focused test/validation for the runtime persistence path, not only the helper behavior.
|
||||||
|
|
||||||
|
2. Documentation examples still appear broader than the implemented strict parser.
|
||||||
|
|
||||||
|
Resolved part:
|
||||||
|
- `schema_version` naming is now consistent in implementation/tests/minimal docs.
|
||||||
|
|
||||||
|
Remaining mismatch:
|
||||||
|
- docs illustrative `plugin.toml` still includes fields/sections rejected by current `#[serde(deny_unknown_fields)]` parser, such as `[package]` and `[permissions]`.
|
||||||
|
- docs describe `runtime.kind = "declarative"` as an initial value while implementation rejects runtime kinds other than `"wasm"`.
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Either mark those fields/sections as future/aspirational and provide a minimal currently-valid manifest example, or extend the parser to accept the documented first-pass fields safely.
|
||||||
|
|
||||||
|
Prior blockers resolved:
|
||||||
|
- Version mismatch support is resolved with exact-version field and distinct `Version` vs `Api` diagnostics.
|
||||||
|
- Safe bounded diagnostics are mostly resolved with UTF-8-boundary truncation and redacted TOML parse diagnostics.
|
||||||
|
- Discovery/enablement/no-registration boundaries look good.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Changes requested. Do not integrate until the non-profile/spawn restore determinism path and docs/parser mismatch are fixed and covered.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5R5V2S at: 2026-06-15T15:16:14Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Second follow-up implementation report after reviewer request_changes:
|
||||||
|
|
||||||
|
New commit:
|
||||||
|
- `07978d2d fix: persist plugin snapshots for restore`
|
||||||
|
|
||||||
|
Resolved remaining blockers:
|
||||||
|
|
||||||
|
1. Non-profile / spawn-config restore determinism
|
||||||
|
- Changed Pod metadata snapshot persistence so resolved manifests are snapshotted when either:
|
||||||
|
- `manifest.profile.is_some()` (existing profile behavior), or
|
||||||
|
- `manifest.plugins.has_resolved_plan()` (new plugin-resolved manifest behavior).
|
||||||
|
- Added helper path:
|
||||||
|
- `pod_metadata_for_manifest`
|
||||||
|
- `should_persist_resolved_manifest_snapshot`
|
||||||
|
- A named Pod whose plugin enablement is resolved at startup now persists resolved plugin metadata/digest plan in `resolved_manifest_snapshot` even without a profile.
|
||||||
|
- Restore therefore uses the original resolved plan instead of silently rediscovering mutable stores.
|
||||||
|
|
||||||
|
Focused runtime persistence test added:
|
||||||
|
- `plugin_resolved_manifest_snapshot_is_persisted_without_profile`
|
||||||
|
- verifies a non-profile manifest does not snapshot by default;
|
||||||
|
- adds resolved plugin metadata;
|
||||||
|
- verifies runtime metadata snapshot is persisted;
|
||||||
|
- verifies restored snapshot contains the original plugin digest/version.
|
||||||
|
|
||||||
|
2. Docs/parser alignment
|
||||||
|
- Updated `docs/design/plugin-packages.md` with a minimal currently-valid strict `plugin.toml` example:
|
||||||
|
- top-level `schema_version`, `id`, `name`, `version`, `description`, `surfaces`;
|
||||||
|
- `[[hooks]]` with `id` and `file`.
|
||||||
|
- Clarified referenced files must exist in the package archive.
|
||||||
|
- Clarified optional `[runtime]` currently accepts only:
|
||||||
|
- `kind = "wasm"`
|
||||||
|
- `entry = "..."`
|
||||||
|
- `abi = "yoi-plugin-wasm-1"`
|
||||||
|
- Marked `[package]`, `[permissions]`, richer `contributions`, and `runtime.kind = "declarative"` as future/aspirational and intentionally rejected by strict parser for now.
|
||||||
|
- Added parser-alignment test:
|
||||||
|
- `currently_documented_manifest_shape_is_accepted`
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo test -p manifest plugin`
|
||||||
|
- Passed: `cargo test -p manifest`
|
||||||
|
- Passed: `cargo test -p pod plugin_resolved_manifest_snapshot_is_persisted_without_profile`
|
||||||
|
- Passed: `cargo test -p pod spawn_pod`
|
||||||
|
- Passed: `cargo check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi`
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after follow-up commit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5R5V2S-r3 at: 2026-06-15T15:27:07Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Third-pass target worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5R5V2S-plugin-enable-resolver`
|
||||||
|
- HEAD includes `07978d2d fix: persist plugin snapshots for restore`
|
||||||
|
- Non-profile / spawn-config restore determinism:
|
||||||
|
- `pod_metadata_for_manifest` persists `resolved_manifest_snapshot` when either profile is present or `manifest.plugins.has_resolved_plan()` is true.
|
||||||
|
- Pending and active metadata writes use the helper.
|
||||||
|
- Restore path prefers `metadata.resolved_manifest_snapshot` when present and falls back only when absent.
|
||||||
|
- Existing profile behavior is preserved.
|
||||||
|
- Focused test `plugin_resolved_manifest_snapshot_is_persisted_without_profile` exercises profile-none metadata construction with resolved plugin records and verifies identity/version/digest are retained.
|
||||||
|
- Docs/parser alignment:
|
||||||
|
- `docs/design/plugin-packages.md` now includes a minimal strict currently-valid `plugin.toml` example using `schema_version = 1`, `[runtime] kind = "wasm"`, and currently accepted hook metadata.
|
||||||
|
- Future/unsupported `[package]`, `[permissions]`, richer contributions, and `runtime.kind = "declarative"` are explicitly marked future/unsupported rather than current parser surface.
|
||||||
|
- Parser/tests align with current schema/runtime shape.
|
||||||
|
- Prior acceptance spot-check:
|
||||||
|
- Discovery remains inactive without explicit enablement.
|
||||||
|
- Version mismatch and API incompatibility diagnostics are distinct.
|
||||||
|
- Diagnostics are bounded/sanitized.
|
||||||
|
- Authority grants fail closed.
|
||||||
|
- No Tool/Hook/Service/Ingress registration plumbing was added.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check 4772c4d6..HEAD`
|
||||||
|
|
||||||
|
Validation not rerun by reviewer:
|
||||||
|
- `cargo test`, `cargo check`, and `nix build .#yoi` were not rerun due read-only review scope. Coder-reported successful heavier validation was used as supporting evidence.
|
||||||
|
|
||||||
|
Risk assessment:
|
||||||
|
- Residual risk is low. Snapshot persistence is in the central Pod metadata helper and restore already prefers persisted snapshots.
|
||||||
|
- Remaining coverage is unit/integration-level rather than full E2E process restore, matching current project E2E boundary and not a blocker for this Ticket.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No remaining blocker found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T15:30:00Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV5R5V2S-plugin-enable-resolver`
|
||||||
|
- implementation commits:
|
||||||
|
- `a03a9da6 feat: add plugin package resolver`
|
||||||
|
- `ede7acfd fix: pin plugin resolution metadata`
|
||||||
|
- `07978d2d fix: persist plugin snapshots for restore`
|
||||||
|
- merge commit: `f678383a merge: plugin package resolver`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- Initial review requested changes for version mismatch support, restore determinism, UTF-8-safe diagnostics, and docs/parser mismatch.
|
||||||
|
- Second review requested changes for non-profile/spawn restore determinism and docs/parser mismatch.
|
||||||
|
- Third-pass review `approve` recorded from `yoi-reviewer-00001KV5R5V2S-r3`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo test -p manifest plugin`
|
||||||
|
- 19 passed
|
||||||
|
- Passed: `cargo test -p manifest`
|
||||||
|
- 54 passed
|
||||||
|
- Passed: `cargo test -p pod plugin_resolved_manifest_snapshot_is_persisted_without_profile`
|
||||||
|
- 1 passed
|
||||||
|
- Passed: `cargo test -p pod spawn_pod`
|
||||||
|
- 7 passed
|
||||||
|
- Passed: `cargo check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi --no-link`
|
||||||
|
|
||||||
|
Outcome:
|
||||||
|
- Plugin package discovery and explicit enablement resolver are implemented as typed manifest-layer functionality.
|
||||||
|
- Discovery remains inactive/read-only without explicit enablement.
|
||||||
|
- Resolved plugin metadata/digests can be snapshotted for restore determinism, including non-profile/plugin-resolved manifests.
|
||||||
|
- No runtime Tool/Hook/Service/Ingress registration or plugin execution path was added.
|
||||||
|
- Package safety, source-qualified identity, exact version pins, digest pins, bounded diagnostics, and strict docs/parser alignment are covered by focused tests.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T15:30:00Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused plus packaging validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-18T12:22:04Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-18T12:22:04Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV5R5V2S` (`Plugin: package discovery and explicit enablement resolver`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260615-155415-1","ticket_id":"00001KV5W3PHA","kind":"accepted_plan","accepted_plan":{"summary":"Accept Plugin Tool surface registration boundary work. Register enabled Plugin Tool schemas into ToolRegistry with origin metadata, duplicate/schema diagnostics, feature/profile hiding, and runtime-missing safe errors without implementing WASM execution.","branch":"impl/00001KV5W3PHA-plugin-tool-surface","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5W3PHA-plugin-tool-surface","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Dependency `00001KV5R5V2S` is done and current workspace is clean."},"author":"yoi-orchestrator","at":"2026-06-15T15:54:15Z"}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PHA",
|
||||||
|
"kind": "depends_on",
|
||||||
|
"target": "00001KV5R5V2S",
|
||||||
|
"note": "Tool surface registration consumes resolved Plugin package metadata.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PHA",
|
||||||
|
"kind": "related",
|
||||||
|
"target": "00001KSXRQ4G8",
|
||||||
|
"note": "Plugin runtime/surface/host API design record.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
---
|
||||||
|
title: 'Plugin: register enabled Tool surface from packages'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T14:48:59Z'
|
||||||
|
updated_at: '2026-06-17T05:44:04Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['plugin', 'tool-registry', 'model-visible-schema', 'capability-boundary', 'profile-config']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-15T15:53:32Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Plugin package discovery / explicit enablement resolver の次に、enabled Plugin package から Tool surface を読み取り、通常の `ToolRegistry` に登録できるようにする。
|
||||||
|
|
||||||
|
この Ticket の目的は、Plugin package 由来の Tool 定義が Yoi の既存 Tool 経路に安全に乗る境界を作ること。Plugin code execution / WASM runtime はまだ行わない。Tool が model-visible schema として見えるか、enablement なしでは出ないか、invalid / duplicate な Tool 定義が fail closed になるかを先に固める。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- `00001KV5R5V2S` の resolved Plugin metadata を入力として扱う。
|
||||||
|
- Enabled Plugin package の manifest から Tool surface 定義を読み取る。
|
||||||
|
- tool name
|
||||||
|
- description
|
||||||
|
- input schema
|
||||||
|
- effect / side-effect metadata
|
||||||
|
- plugin origin metadata
|
||||||
|
- Plugin Tool definition を既存 `ToolRegistry` 登録経路に載せる。
|
||||||
|
- model-visible schema は通常 Tool と同じ原則に従う。
|
||||||
|
- feature/profile config で disabled なら schema surface から消える。
|
||||||
|
- Tool metadata に Plugin origin を保持する。
|
||||||
|
- plugin id / ref
|
||||||
|
- package source: user / project / builtin
|
||||||
|
- package digest
|
||||||
|
- package version / api version
|
||||||
|
- surface: tool
|
||||||
|
- Duplicate Tool name は fail closed にする。
|
||||||
|
- builtin Tool / other Plugin Tool との衝突を検出する。
|
||||||
|
- どちらが勝つかを曖昧にしない。
|
||||||
|
- Invalid input schema / unsupported schema shape は fail closed にする。
|
||||||
|
- Package が discovered されただけでは Tool を登録しない。
|
||||||
|
- explicit enablement が必要。
|
||||||
|
- Tool call / result は後続 runtime Ticket で実装する。
|
||||||
|
- この Ticket では未実行 Tool として registration boundary を作る。
|
||||||
|
- 実行できない状態を user-visible diagnostic として安全に扱う。
|
||||||
|
- Diagnostics は bounded にする。
|
||||||
|
- registered
|
||||||
|
- skipped: not enabled
|
||||||
|
- rejected: duplicate name
|
||||||
|
- rejected: invalid schema
|
||||||
|
- rejected: unsupported surface/api
|
||||||
|
- rejected: missing runtime executor
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- Enabled Plugin package の Tool definition が `ToolRegistry` に登録され、model-visible tools に現れる。
|
||||||
|
- Enablement がない Plugin package の Tool は model-visible tools に現れない。
|
||||||
|
- Duplicate Tool name は登録されず、diagnostic で理由が分かる。
|
||||||
|
- Invalid input schema は登録されず、diagnostic で理由が分かる。
|
||||||
|
- Registered Plugin Tool の metadata から plugin origin / digest / source が追跡できる。
|
||||||
|
- Feature/profile flag により Plugin Tool surface を非表示にできる。
|
||||||
|
- Tool call がまだ実行できない場合も panic せず、安全な unavailable/runtime-missing error になる。
|
||||||
|
- Tests cover:
|
||||||
|
- enabled package Tool registration
|
||||||
|
- package without enablement does not register
|
||||||
|
- duplicate Plugin Tool name rejected
|
||||||
|
- builtin Tool name collision rejected
|
||||||
|
- invalid schema rejected
|
||||||
|
- plugin origin metadata retained
|
||||||
|
- disabled feature/profile removes schema surface
|
||||||
|
- Validation: focused plugin/tool-registry tests, `cargo fmt --check`, relevant `cargo check` / `cargo test`, `git diff --check`.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Plugin code execution.
|
||||||
|
- WASM runtime.
|
||||||
|
- `https` / `fs` host API.
|
||||||
|
- Service / Ingress surface.
|
||||||
|
- External side effects.
|
||||||
|
- Permission grant enforcement beyond registration-time shape checks.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KV5R5V2S` — Plugin package discovery and explicit enablement resolver.
|
||||||
|
- `00001KV5W3PHW` — Plugin Tool execution with minimal WASM runtime.
|
||||||
|
- `00001KV5W3PJ3` — Plugin permission grant enforcement.
|
||||||
|
- `00001KSXRQ4G8` — Plugin runtime / surface / host API model design.
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
Merged orchestration implementation into develop and validated.
|
||||||
|
|
||||||
|
Implementation delivered Plugin Tool surface registration from enabled Plugin packages:
|
||||||
|
- feature-gated Plugin Tool registration through the existing ToolRegistry/model-visible schema path
|
||||||
|
- Plugin origin metadata on Tool metadata
|
||||||
|
- discovery-only packages remain inactive without explicit enablement
|
||||||
|
- duplicate/colliding Tool names and invalid schemas fail closed
|
||||||
|
- recursive schema validation rejects nested invalid schema nodes before registration
|
||||||
|
- runtime execution remains an unavailable/runtime-missing stub; WASM runtime and grant enforcement remain follow-up Tickets
|
||||||
|
|
||||||
|
Validation on develop after merge:
|
||||||
|
- cargo test -p pod plugin::tests --no-default-features
|
||||||
|
- cargo test -p manifest plugin --no-default-features
|
||||||
|
- cargo check -p pod -p manifest -p llm-worker
|
||||||
|
- cargo build -p yoi
|
||||||
|
- target/debug/yoi ticket doctor
|
||||||
|
- nix build .#yoi --no-link
|
||||||
@@ -0,0 +1,436 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T14:48:59Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-15T15:53:32Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T15:54:15Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。
|
||||||
|
- Outgoing dependency `00001KV5R5V2S` は `done` で、typed relation blocker は解消済み。
|
||||||
|
- 本 Ticket は resolved Plugin metadata を入力にした Tool surface registration boundary の実装であり、Plugin code execution / WASM runtime / permission grant enforcement は non-goal として明確。
|
||||||
|
- capability-boundary / model-visible-schema / tool-registry risk は高いが、acceptance criteria と fail-closed invariants が具体的で、残る不確実性は typed metadata / registry integration tactic に閉じている。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: requirements、acceptance criteria、non-goals、related work を確認。
|
||||||
|
- Ticket relations: depends_on `00001KV5R5V2S` は done。incoming dependency from runtime Ticket `00001KV5W3PHW` は本 Ticket の blocker ではない。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`1fdb4cd6` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Enabled Plugin package の manifest Tool surface を読み取り、既存 `ToolRegistry` の model-visible schema 経路に安全に登録できる registration boundary を作る。ただし Tool call execution / WASM runtime はまだ実装しない。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Discovery-only package は Tool schema surface に出さない。explicit enablement が必要。
|
||||||
|
- Tool registration は existing `ToolRegistry` 原則に従い、feature/profile config disabled なら model-visible schema から消える。
|
||||||
|
- Plugin Tool metadata に origin(plugin id/ref、source、digest、version/api、surface)を保持する。
|
||||||
|
- Duplicate Tool name は fail closed。builtin Tool / other Plugin Tool との衝突を曖昧に勝たせない。
|
||||||
|
- Invalid/unsupported input schema は fail closed。
|
||||||
|
- Runtime executor missing の Tool call は panic せず安全な unavailable/runtime-missing error を返す。
|
||||||
|
- Plugin code execution / WASM runtime / host API / permission grant enforcement / Service/Ingress/MCP bridge は non-goal。
|
||||||
|
- Permission declarations/grants を実効権限として扱わない。registration-time shape checks だけ。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Enabled Plugin package の Tool definition が `ToolRegistry` に登録され、model-visible tools に現れる。
|
||||||
|
- Enablement がない Plugin package の Tool は model-visible tools に現れない。
|
||||||
|
- Duplicate Tool name / builtin collision は登録されず diagnostic で理由が分かる。
|
||||||
|
- Invalid input schema は登録されず diagnostic で理由が分かる。
|
||||||
|
- Registered Plugin Tool metadata から plugin origin / digest / source を追跡できる。
|
||||||
|
- Feature/profile flag により Plugin Tool surface を非表示にできる。
|
||||||
|
- Tool call が未実行状態でも panic せず unavailable/runtime-missing error。
|
||||||
|
- Tests cover enabled registration、no enablement inactive、duplicate Plugin Tool name、builtin collision、invalid schema、origin metadata、disabled feature/profile surface hiding。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- Plugin manifest Tool definition schema の最小 shape は既存 design / resolver の strict parser に合わせてよい。
|
||||||
|
- Existing ToolRegistry contribution path に合わせた adapter / feature contribution module を追加してよい。
|
||||||
|
- Runtime-missing handler は minimal stub でよいが、model-visible registration と call failure behavior は明確にテストする。
|
||||||
|
- Diagnostics の storage/reporting surface は existing resolver diagnostics と整合させる。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- ToolRegistry API が origin metadata を保持できず public API redesign が必要。
|
||||||
|
- Feature/profile config で Plugin Tool surface を安全に hide できない。
|
||||||
|
- JSON schema validation requires broader schema engine choice。
|
||||||
|
- Runtime-missing Tool stub が model/provider protocol に悪影響を与える。
|
||||||
|
- Permission grants / WASM executor / host API を実装しないと registration boundary が成立しない。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- focused plugin/tool-registry tests。
|
||||||
|
- relevant `cargo test` / `cargo check`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- `nix build .#yoi` if dependencies, Cargo.lock, package resources, or packaging correctness change。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- model-visible schema gating。
|
||||||
|
- duplicate/builtin collision fail closed。
|
||||||
|
- no enablement → no schema。
|
||||||
|
- origin metadata traceability。
|
||||||
|
- no execution/registration side effects beyond schema contribution。
|
||||||
|
- unavailable runtime call safety。
|
||||||
|
- permission declaration vs effective grant separation。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T15:54:24Z from: queued to: inprogress reason: orchestrator_acceptance_dependency_done field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。dependency `00001KV5R5V2S` は done で relation blocker は解消済み。Orchestrator workspace は clean。implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5W3PHA at: 2026-06-15T16:20:05Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV5W3PHA`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `05a9c522 feat: register plugin tool surfaces`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/manifest/src/lib.rs`
|
||||||
|
- `crates/manifest/src/config.rs`
|
||||||
|
- `crates/llm-worker/src/tool.rs`
|
||||||
|
- `crates/pod/src/feature.rs`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/controller.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
|
||||||
|
Implemented behavior:
|
||||||
|
- Added minimal Plugin package `tools` manifest surface parsing:
|
||||||
|
- `name`
|
||||||
|
- `description`
|
||||||
|
- `input_schema`
|
||||||
|
- Added `feature.plugins` profile/manifest gate, default disabled.
|
||||||
|
- Added Plugin Tool feature adapter:
|
||||||
|
- only enabled resolved Plugin packages with enabled Tool surface register schemas;
|
||||||
|
- package discovery alone does not register Tools;
|
||||||
|
- disabled profile feature suppresses Plugin Tool schema surface.
|
||||||
|
- Registered Plugin Tool definitions into existing ToolRegistry/model-visible schema path.
|
||||||
|
- Added host-side `ToolOrigin` metadata on `ToolMeta`:
|
||||||
|
- plugin id/ref
|
||||||
|
- source
|
||||||
|
- digest
|
||||||
|
- package version/API
|
||||||
|
- `surface = "tool"`
|
||||||
|
- Added runtime-missing stub executor:
|
||||||
|
- Tool schema is visible when registered;
|
||||||
|
- actual calls return safe unavailable/runtime-missing error;
|
||||||
|
- no Plugin code execution or WASM runtime added.
|
||||||
|
- Added registration-time fail-closed checks:
|
||||||
|
- duplicate Plugin Tool names;
|
||||||
|
- collision with already registered builtin Tool names;
|
||||||
|
- invalid/unsupported input schemas.
|
||||||
|
- Adjusted feature install ordering so builtin/pending tools are flushed before Plugin feature registration, allowing Plugin collisions against already registered Tool names to be diagnosed instead of reaching later duplicate panic.
|
||||||
|
|
||||||
|
Diagnostics behavior:
|
||||||
|
- Duplicate Tool contributions produce feature install diagnostics and skip duplicate registration.
|
||||||
|
- Invalid Plugin input schema produces feature install diagnostics and registers no stub for that invalid Tool.
|
||||||
|
- Runtime calls before executor support return safe unavailable/runtime-missing `ToolError`.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo test -p manifest plugin --no-default-features`
|
||||||
|
- Passed: `cargo test -p pod plugin::tests --no-default-features`
|
||||||
|
- Passed: `cargo check -p pod -p manifest -p llm-worker`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Attempted broader validation: `cargo test -p pod --no-default-features`
|
||||||
|
- Failed in existing prompt text assertions unrelated to Plugin Tool surface implementation:
|
||||||
|
- `prompt::tests::default_subagent_prompt_matches_resource`
|
||||||
|
- `prompt::tests::subagent_prompt_treats_paths_as_data`
|
||||||
|
|
||||||
|
Not run:
|
||||||
|
- `nix build .#yoi` — no dependency, `Cargo.lock`, resource, or packaging changes.
|
||||||
|
|
||||||
|
Residual risks / blockers:
|
||||||
|
- Plugin executor is intentionally runtime-missing stub; actual WASM/runtime execution remains for later Ticket.
|
||||||
|
- Input schema validation is intentionally a narrow model-visible shape check, not a full JSON Schema engine. Unsupported composition/reference keywords are rejected fail-closed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5W3PHA at: 2026-06-15T16:26:34Z status: request_changes -->
|
||||||
|
|
||||||
|
## Review: request changes
|
||||||
|
|
||||||
|
Review result: request_changes
|
||||||
|
|
||||||
|
Blocker:
|
||||||
|
- Invalid nested Plugin Tool schemas can still become model-visible.
|
||||||
|
|
||||||
|
Evidence:
|
||||||
|
- `crates/pod/src/feature/plugin.rs` validates root-level schema shape and recursively rejects only selected unsupported keywords.
|
||||||
|
- It does not validate that nested schema nodes are valid JSON Schema objects.
|
||||||
|
- Example invalid schema that appears to pass current validation:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
input_schema = {
|
||||||
|
type = "object",
|
||||||
|
properties = { query = "not-a-schema" },
|
||||||
|
required = ["query"],
|
||||||
|
additionalProperties = false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Why this is a blocker:
|
||||||
|
- `properties.query = "not-a-schema"` is not a valid schema node.
|
||||||
|
- Current checks can allow it into ToolRegistry / model-visible tool schema path.
|
||||||
|
- This violates the acceptance criteria that invalid input schema is rejected with diagnostic and the critical focus on model-visible schema gating.
|
||||||
|
|
||||||
|
Required changes:
|
||||||
|
- Strengthen Plugin Tool schema validation before registration so invalid nested schemas fail closed with diagnostics.
|
||||||
|
- Add regression tests showing nested invalid schema nodes do not register a Plugin Tool.
|
||||||
|
- Prefer defining/enforcing an explicit supported subset recursively, for example:
|
||||||
|
- validate property schemas;
|
||||||
|
- validate allowed `type` values;
|
||||||
|
- validate `required` string/unique array;
|
||||||
|
- validate or reject `items` / `additionalProperties` recursively;
|
||||||
|
- reject unknown/problematic keywords unless explicitly supported.
|
||||||
|
|
||||||
|
Positive evidence checked:
|
||||||
|
- Plugin tool registration is feature-gated by `feature_config.plugins.enabled`.
|
||||||
|
- Discovery-only packages do not register tools because registration uses resolved enabled Plugin records/surfaces.
|
||||||
|
- Registered Plugin Tools preserve `ToolOrigin::Plugin` metadata.
|
||||||
|
- Builtin collisions and duplicate Plugin Tool names are diagnosed/rejected.
|
||||||
|
- Runtime execution is a safe unavailable/runtime-missing stub.
|
||||||
|
- No Plugin code execution, WASM runtime, host API, Service/Ingress/MCP bridge, or permission grant enforcement was added.
|
||||||
|
- `ToolOrigin` is not exposed directly to model-visible schema.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check fcae8860..05a9c522`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Worktree remained clean.
|
||||||
|
|
||||||
|
Validation not run:
|
||||||
|
- `cargo test` / `cargo check` were not rerun because reviewer scope was read-only.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Changes requested. Do not integrate until nested schema validation is fail-closed and covered.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5W3PHA at: 2026-06-15T16:30:49Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Follow-up implementation report after reviewer request_changes:
|
||||||
|
|
||||||
|
New commit:
|
||||||
|
- `3413bae7 fix: reject nested plugin tool schema errors`
|
||||||
|
|
||||||
|
Changed file:
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
|
||||||
|
Schema validation behavior updated:
|
||||||
|
- Replaced shallow root-only validation with recursive validation of an explicit supported subset.
|
||||||
|
- Every schema node must be a JSON object with supported string `type`.
|
||||||
|
- Supported `type` values:
|
||||||
|
- `object`
|
||||||
|
- `array`
|
||||||
|
- `string`
|
||||||
|
- `number`
|
||||||
|
- `integer`
|
||||||
|
- `boolean`
|
||||||
|
- `null`
|
||||||
|
- Supported keywords:
|
||||||
|
- `type`
|
||||||
|
- `title`
|
||||||
|
- `description`
|
||||||
|
- `properties`
|
||||||
|
- `required`
|
||||||
|
- `additionalProperties`
|
||||||
|
- `items`
|
||||||
|
- `enum`
|
||||||
|
|
||||||
|
Recursive/fail-closed behavior:
|
||||||
|
- `properties.*` values are recursively validated as schema objects.
|
||||||
|
- `items` is only allowed on array schemas and recursively validates a schema object.
|
||||||
|
- `additionalProperties` is only allowed on object schemas and must be boolean or recursively valid schema object.
|
||||||
|
- Non-object nested schema nodes reject registration.
|
||||||
|
- Unknown/problematic keywords reject registration.
|
||||||
|
- Unsupported `type` values reject registration.
|
||||||
|
- `required` must be an array of unique strings.
|
||||||
|
- `required` entries must be declared in `properties` when `properties` exists.
|
||||||
|
- `enum` must be non-empty array with unique entries.
|
||||||
|
|
||||||
|
Regression tests added:
|
||||||
|
- Direct validation rejects:
|
||||||
|
- `properties.query = "not-a-schema"`
|
||||||
|
- invalid recursive `items`
|
||||||
|
- invalid recursive `additionalProperties`
|
||||||
|
- duplicate `required` entries
|
||||||
|
- Registration test confirms nested invalid schema does not register a Plugin Tool and emits an `invalid input_schema` diagnostic with nested path.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo test -p pod plugin::tests --no-default-features`
|
||||||
|
- Passed: `cargo test -p manifest plugin --no-default-features`
|
||||||
|
- Passed: `cargo check -p pod -p manifest -p llm-worker`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Repository status:
|
||||||
|
- Child implementation worktree clean after follow-up commit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5W3PHA-r2 at: 2026-06-15T16:38:37Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Second-pass blocker verification: resolved.
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Child worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHA-plugin-tool-surface`
|
||||||
|
- branch `impl/00001KV5W3PHA-plugin-tool-surface`
|
||||||
|
- HEAD `3413bae7 fix: reject nested plugin tool schema errors`
|
||||||
|
- Fix diff `05a9c522..3413bae7`.
|
||||||
|
- Relevant implementation:
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/feature.rs`
|
||||||
|
- `crates/pod/src/controller.rs`
|
||||||
|
- `crates/llm-worker/src/tool.rs`
|
||||||
|
- `crates/llm-worker/src/tool_server.rs`
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
|
||||||
|
Blocker-specific findings:
|
||||||
|
- Nested invalid schemas are now rejected recursively.
|
||||||
|
- `validate_schema_node` requires every schema node to be a JSON object with supported string `type`.
|
||||||
|
- `properties` child schemas are recursively validated.
|
||||||
|
- `items` is only accepted on array schemas and recursively validated.
|
||||||
|
- `additionalProperties` is only accepted on object schemas and must be boolean or recursively valid schema object.
|
||||||
|
- `required` must be a unique string array and, when `properties` exists, entries must be declared.
|
||||||
|
- `enum` must be non-empty and unique.
|
||||||
|
- Unknown keywords are rejected before registration.
|
||||||
|
- The prior concrete failure case `properties.query = "not-a-schema"` now fails with path-bearing diagnostic such as `$.properties.query`.
|
||||||
|
- Regression test `nested_invalid_input_schema_does_not_register_plugin_tool` asserts pending tool registration remains empty and diagnostics include `invalid input_schema`.
|
||||||
|
- Invalid schemas return `FeatureInstallError::InvalidToolManifest`, recorded as install diagnostic by feature registry.
|
||||||
|
- No evidence found that invalid nested schemas become model-visible after the fix.
|
||||||
|
|
||||||
|
Overall acceptance spot-check:
|
||||||
|
- Enabled Plugin Tool definitions are wired through normal `FeatureRegistryBuilder` / `ToolRegistry` path.
|
||||||
|
- Discovery-only or non-tool packages remain inactive through manifest surface filtering.
|
||||||
|
- Duplicate/builtin collisions are handled by feature registry duplicate checks against registered/pending tool names.
|
||||||
|
- `ToolOrigin` metadata is preserved on `ToolMeta`.
|
||||||
|
- Feature/profile disabled plugin support hides Plugin Tool modules through `plugin_tool_features_if_enabled`.
|
||||||
|
- Runtime-missing calls use `PluginRuntimeMissingTool` and return safe unavailable error.
|
||||||
|
- No Plugin code execution, WASM runtime, host API, Service/Ingress/MCP bridge, or permission grant enforcement was added.
|
||||||
|
|
||||||
|
Validation performed by reviewer:
|
||||||
|
- Passed: `git diff --check fcae8860..HEAD`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
|
||||||
|
Validation not rerun by reviewer:
|
||||||
|
- `cargo test` / `cargo check` were not rerun because reviewer scope was read-only. Coder-reported passing results were inspected as evidence.
|
||||||
|
|
||||||
|
Risk assessment:
|
||||||
|
- Residual risk is mainly integration-level because reviewer did not run cargo tests.
|
||||||
|
- The fix is focused and directly covers the prior blocker with recursive validation and regression coverage.
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No remaining blocker found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T16:39:57Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV5W3PHA-plugin-tool-surface`
|
||||||
|
- implementation commits:
|
||||||
|
- `05a9c522 feat: register plugin tool surfaces`
|
||||||
|
- `3413bae7 fix: reject nested plugin tool schema errors`
|
||||||
|
- merge commit: `204d0d02 merge: plugin tool surface registration`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- Initial review requested changes for nested invalid Plugin Tool schema validation.
|
||||||
|
- Second-pass review `approve` recorded from `yoi-reviewer-00001KV5W3PHA-r2`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo test -p pod plugin::tests --no-default-features`
|
||||||
|
- Passed: `cargo test -p manifest plugin --no-default-features`
|
||||||
|
- 15 passed
|
||||||
|
- Passed: `cargo check -p pod -p manifest -p llm-worker`
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Broader `cargo test -p pod --no-default-features` was not rerun because coder had already reported existing unrelated prompt text assertion failures outside this change path.
|
||||||
|
- Plugin Tool registration is feature-gated and enablement-gated.
|
||||||
|
- Runtime execution remains an unavailable/runtime-missing stub; no Plugin code execution or WASM runtime was added.
|
||||||
|
- Recursive schema validation now rejects nested invalid schema nodes before model-visible registration.
|
||||||
|
- Orchestrator worktree is clean after validation.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T16:39:58Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved after requested schema validation fix, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-17T05:44:04Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-17T05:44:04Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Merged orchestration implementation into develop and validated.
|
||||||
|
|
||||||
|
Implementation delivered Plugin Tool surface registration from enabled Plugin packages:
|
||||||
|
- feature-gated Plugin Tool registration through the existing ToolRegistry/model-visible schema path
|
||||||
|
- Plugin origin metadata on Tool metadata
|
||||||
|
- discovery-only packages remain inactive without explicit enablement
|
||||||
|
- duplicate/colliding Tool names and invalid schemas fail closed
|
||||||
|
- recursive schema validation rejects nested invalid schema nodes before registration
|
||||||
|
- runtime execution remains an unavailable/runtime-missing stub; WASM runtime and grant enforcement remain follow-up Tickets
|
||||||
|
|
||||||
|
Validation on develop after merge:
|
||||||
|
- cargo test -p pod plugin::tests --no-default-features
|
||||||
|
- cargo test -p manifest plugin --no-default-features
|
||||||
|
- cargo check -p pod -p manifest -p llm-worker
|
||||||
|
- cargo build -p yoi
|
||||||
|
- target/debug/yoi ticket doctor
|
||||||
|
- nix build .#yoi --no-link
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260617-094831-1","ticket_id":"00001KV5W3PHW","kind":"accepted_plan","accepted_plan":{"summary":"Accept minimal WASM Plugin Tool runtime. Implement no-ambient-authority module execution for enabled Plugin Tools with bounded input/output/errors, timeout/cancellation, deterministic module selection, and focused tests.","branch":"impl/00001KV5W3PHW-plugin-wasm-tool-runtime","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Can run in parallel with Panel E2E readiness fix because source surfaces are distinct."},"author":"yoi-orchestrator","at":"2026-06-17T09:48:31Z"}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PHW",
|
||||||
|
"kind": "depends_on",
|
||||||
|
"target": "00001KV5W3PHA",
|
||||||
|
"note": "WASM Tool runtime requires Plugin Tool surface registration.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PHW",
|
||||||
|
"kind": "related",
|
||||||
|
"target": "00001KSXRQ4G8",
|
||||||
|
"note": "Plugin runtime/surface/host API design record.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
title: 'Plugin: execute Plugin Tool with minimal WASM runtime'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T14:48:59Z'
|
||||||
|
updated_at: '2026-06-18T13:55:12Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['plugin', 'wasm', 'tool-runtime', 'sandbox', 'capability-boundary', 'cancellation']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-17T09:46:10Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Plugin Tool surface registration の後続として、enabled Plugin Tool を最小 WASM runtime で実行できるようにする。
|
||||||
|
|
||||||
|
この Ticket のゴールは、Plugin package を enable し、manifest 由来の Tool を model-visible に登録し、その Tool call を sandboxed WASM module に渡して bounded な Tool result として返す最小体験を作ること。`https` / `fs` host API、Service / Ingress、長時間 background process は扱わない。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Registered Plugin Tool の invocation を Plugin runtime に route する。
|
||||||
|
- Minimal WASM runtime を追加する。
|
||||||
|
- module load
|
||||||
|
- tool input JSON の受け渡し
|
||||||
|
- tool output JSON の受け取り
|
||||||
|
- structured error handling
|
||||||
|
- Runtime は ambient authority を持たない。
|
||||||
|
- ambient filesystem なし
|
||||||
|
- ambient network なし
|
||||||
|
- ambient environment variables なし
|
||||||
|
- host API imports は明示的に許可されたものだけ
|
||||||
|
- この Ticket では host API import は最小にする。
|
||||||
|
- tool input / output のための必要最小限のみ。
|
||||||
|
- `https` / `fs` は実装しない。
|
||||||
|
- Bounded execution を実装する。
|
||||||
|
- timeout
|
||||||
|
- cancellation
|
||||||
|
- input size bound
|
||||||
|
- output size bound
|
||||||
|
- error/diagnostic size bound
|
||||||
|
- Invalid Plugin output は fail closed にする。
|
||||||
|
- malformed JSON
|
||||||
|
- schema mismatch
|
||||||
|
- oversize output
|
||||||
|
- non-terminating execution
|
||||||
|
- Tool call / result は通常 Tool history 経路に乗る。
|
||||||
|
- hidden context injection をしない。
|
||||||
|
- Plugin stdout/stderr 相当を無制限に history に入れない。
|
||||||
|
- Runtime error は safe structured Tool error として返す。
|
||||||
|
- panic しない。
|
||||||
|
- secret-like host path / env / raw memory dump を出さない。
|
||||||
|
- Runtime lifecycle は Pod startup / restore と整合させる。
|
||||||
|
- package digest / runtime config に基づいて deterministic に module を選ぶ。
|
||||||
|
- runtime-only mutable state に依存して Tool availability を決めない。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- Sample Plugin package の Tool を WASM runtime 経由で実行できる。
|
||||||
|
- Tool input JSON が WASM module に渡り、Tool output JSON が通常 Tool result として返る。
|
||||||
|
- Tool result は通常の history / permission / trace 経路に残る。
|
||||||
|
- Plugin Tool が ambient filesystem / network / env にアクセスできない。
|
||||||
|
- Timeout する Plugin execution は中断され、安全な Tool error になる。
|
||||||
|
- Oversize output / malformed output / schema mismatch は fail closed する。
|
||||||
|
- Cancellation が Worker / Tool execution の cancellation と整合する。
|
||||||
|
- Runtime diagnostics は bounded で、selected secret/path/env を漏らさない。
|
||||||
|
- Tests cover:
|
||||||
|
- successful WASM Plugin Tool execution
|
||||||
|
- malformed output rejected
|
||||||
|
- oversize output rejected
|
||||||
|
- timeout / cancellation
|
||||||
|
- missing runtime module diagnostic
|
||||||
|
- no ambient fs/network/env by default
|
||||||
|
- tool result history path remains ordinary tool result
|
||||||
|
- Validation: focused plugin runtime tests, `cargo fmt --check`, relevant `cargo check` / `cargo test`, `git diff --check`, and `nix build .#yoi` if dependencies / packaging change.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- `https` host API.
|
||||||
|
- `fs` host API.
|
||||||
|
- Service surface.
|
||||||
|
- Ingress surface.
|
||||||
|
- Long-running Plugin daemon/process lifecycle.
|
||||||
|
- Plugin package manager / registry.
|
||||||
|
- Signature/trust-chain verification.
|
||||||
|
- Broad WASI surface beyond the explicitly needed imports.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KV5R5V2S` — Plugin package discovery and explicit enablement resolver.
|
||||||
|
- `00001KV5W3PHA` — Plugin Tool surface registration.
|
||||||
|
- `00001KV5W3PJ3` — Plugin permission grant enforcement.
|
||||||
|
- `00001KSXRQ4G8` — Plugin runtime / surface / host API model design.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Ticket `00001KV5W3PHW` (`Plugin: execute Plugin Tool with minimal WASM runtime`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
@@ -0,0 +1,332 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T14:48:59Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-17T09:46:10Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-17T09:48:31Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。
|
||||||
|
- `depends_on 00001KV5W3PHA` は `closed/done` 済みで、typed relation blocker は解消済み。
|
||||||
|
- Incoming dependent `00001KV5W3PJ3` は本 Ticket の blocker ではなく、runtime path の grant enforcement 後続として扱う。
|
||||||
|
- 本 Ticket は minimal WASM runtime による Plugin Tool execution の最初の実装であり、host API / fs / https / Service / Ingress / MCP / long-running process を明確に non-goal としている。
|
||||||
|
- sandbox / tool-runtime / capability-boundary / cancellation risk は高いが、timeout、bounds、ambient authorityなし、structured error、deterministic module selection が Ticket に明記されているため、implementation_ready と判断する。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: requirements、acceptance criteria、non-goals、validation、risk flags を確認。
|
||||||
|
- Ticket relations: outgoing `depends_on 00001KV5W3PHA` は done/closed。related design `00001KSXRQ4G8` は blocker ではない。incoming `00001KV5W3PJ3` は dependent。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`bcb8068e` 上。
|
||||||
|
- Visible Pods: implementation child Pod なし。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Registered/enabled Plugin Tool call を minimal sandboxed WASM runtime に route し、bounded input/output/error と通常 Tool history 経路で安全に結果を返す。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Runtime は ambient filesystem / network / environment authority を持たない。
|
||||||
|
- Host API imports は tool input/output に必要な最小限のみ。`fs` / `https` は実装しない。
|
||||||
|
- Plugin stdout/stderr相当や raw memory dump を無制限に history/model-visible context に入れない。
|
||||||
|
- Tool call/result は通常 Tool history 経路を使い、hidden context injection をしない。
|
||||||
|
- Timeout / cancellation / input size / output size / diagnostic size bounds を実装する。
|
||||||
|
- Malformed JSON / schema mismatch / oversize output / non-terminating execution は fail closed。
|
||||||
|
- Runtime module selection は package digest/runtime config に基づき deterministic。runtime-only mutable state に依存しない。
|
||||||
|
- Permission grants / host API authority / fs/network は後続 Ticket。ここでは minimal no-authority runtime execution のみ。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Enabled Plugin Tool invocation が Plugin runtime に route される。
|
||||||
|
- Minimal WASM module load、tool input JSON delivery、tool output JSON receipt、structured error handling が実装される。
|
||||||
|
- Ambient authority なしで実行される。
|
||||||
|
- Bounds と timeout/cancellation が効く。
|
||||||
|
- Invalid output は safe Tool error。
|
||||||
|
- Successful Plugin Tool result は通常 Tool result として返る。
|
||||||
|
- Runtime missing/malformed module/load failure は safe structured Tool error。
|
||||||
|
- Tests cover success、malformed output、oversize output、timeout/cancellation、input bound、missing module、no ambient fs/network/env、normal Tool history path。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- WASM runtime crate/engine selectionは既存 deps/packaging constraintsに合わせる。新 dependency が必要なら `Cargo.lock` / `package.nix` / `nix build .#yoi` を更新・検証する。
|
||||||
|
- Guest ABI は minimal JSON input/output ABI でよい。将来拡張可能に docs/code comment で境界を明示する。
|
||||||
|
- Real package archive fixture or synthetic resolved plugin fixture は実装判断。ただし deterministic digest/module selection は test で固定する。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- WASM engine dependency / sandbox model が project-wide design decision を要する。
|
||||||
|
- Cancellation/timeout cannot be made reliable without broader runtime changes。
|
||||||
|
- Host API import semantics must be added beyond input/output。
|
||||||
|
- ToolRegistry / Worker protocol needs broad API change。
|
||||||
|
- Security boundary cannot be enforced within existing process model。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- focused plugin WASM runtime tests。
|
||||||
|
- existing Plugin Tool registration tests。
|
||||||
|
- `cargo check` / relevant `cargo test`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- `nix build .#yoi` if dependencies/Cargo.lock/package changes occur。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- actual sandbox/ambient authority isolation。
|
||||||
|
- timeout/cancellation reliability。
|
||||||
|
- bounded outputs/errors/history。
|
||||||
|
- deterministic module selection from resolved plugin metadata。
|
||||||
|
- no hidden context injection。
|
||||||
|
- runtime missing/load/invalid-output safe errors。
|
||||||
|
- dependency/packaging correctness。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-17T09:49:19Z from: queued to: inprogress reason: orchestrator_acceptance_dependency_done field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。dependency `00001KV5W3PHA` は done/closed で relation blocker は解消済み。Plugin WASM runtime work は同時開始する Panel E2E readiness work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-17T09:50:53Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation start failure / recovery note:
|
||||||
|
|
||||||
|
`queued -> inprogress` acceptance と worktree 作成は完了したが、Coder Pod spawn に失敗した。
|
||||||
|
|
||||||
|
Created worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
- branch: `impl/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
|
||||||
|
Failure:
|
||||||
|
- `SpawnPod` failed before child Pod creation.
|
||||||
|
- Error: `failed to spawn /home/hare/Projects/yoi/target/debug/yoi (deleted) pod: No such file or directory (os error 2)`
|
||||||
|
|
||||||
|
Interpretation:
|
||||||
|
- Runtime binary path for this long-lived Orchestrator process points at a deleted executable. This is an operational/runtime issue, not a Ticket requirement issue.
|
||||||
|
- No Coder Pod was started and no implementation commit exists in the child worktree yet.
|
||||||
|
|
||||||
|
Recovery needed:
|
||||||
|
- Refresh/restart the Orchestrator runtime or provide a valid Pod runtime command so `SpawnPod` can launch children again.
|
||||||
|
- After recovery, reuse the existing child worktree/branch if clean and resume Coder spawn for this in-progress Ticket.
|
||||||
|
|
||||||
|
State handling:
|
||||||
|
- Ticket remains `inprogress` because acceptance and worktree side effects already happened; it is not silently returned to `queued`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:05:59Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation resumed:
|
||||||
|
|
||||||
|
Previous `SpawnPod` failure was recovered after Orchestrator runtime refresh. Reused existing clean child worktree and successfully spawned Coder Pod.
|
||||||
|
|
||||||
|
Worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
- branch: `impl/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
|
||||||
|
Coder Pod:
|
||||||
|
- `yoi-coder-00001KV5W3PHW`
|
||||||
|
|
||||||
|
No duplicate `queued -> inprogress` transition was performed; this resumes the already accepted in-progress work.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-coder-00001KV5W3PHW at: 2026-06-18T12:31:01Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation report from Coder Pod `yoi-coder-00001KV5W3PHW`:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `10d12148 feat: run plugin tools through wasm runtime`
|
||||||
|
|
||||||
|
Changed files:
|
||||||
|
- `Cargo.lock`
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/Cargo.toml`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `package.nix`
|
||||||
|
|
||||||
|
Implemented behavior:
|
||||||
|
- Added minimal sandboxed Plugin Tool WASM runtime using `wasmi`.
|
||||||
|
- Enabled registered Plugin Tool calls now execute through normal `Tool::execute` / `ToolOutput` / `ToolResult` paths.
|
||||||
|
- Added manifest-side helper to load resolved runtime module from pinned package:
|
||||||
|
- validates runtime kind/ABI;
|
||||||
|
- re-reads package from resolved path;
|
||||||
|
- verifies deterministic package digest before selecting runtime entry;
|
||||||
|
- bounds package/module size and reports safe diagnostics.
|
||||||
|
- Added `yoi-plugin-wasm-1` host ABI:
|
||||||
|
- required export: `yoi_tool_call()`;
|
||||||
|
- required guest export: `memory`;
|
||||||
|
- host imports under `yoi:tool` only:
|
||||||
|
- `tool_name_len() -> i32`
|
||||||
|
- `tool_name_read(ptr, len) -> i32`
|
||||||
|
- `input_len() -> i32`
|
||||||
|
- `input_read(ptr, len) -> i32`
|
||||||
|
- `output_write(ptr, len) -> i32`
|
||||||
|
- No WASI, filesystem, network, environment, or arbitrary host imports are provided; unsupported imports fail closed.
|
||||||
|
|
||||||
|
Bounds / failure behavior:
|
||||||
|
- Input JSON bound: `64 KiB`.
|
||||||
|
- Output JSON bound: `64 KiB`.
|
||||||
|
- Output summary bound: `1 KiB`.
|
||||||
|
- Linear memory bound: `2 MiB`.
|
||||||
|
- Table bound: `256`.
|
||||||
|
- Fuel bound: `5_000_000`.
|
||||||
|
- Wall timeout: `1s`.
|
||||||
|
- Diagnostics/errors are bounded and sanitized before surfacing as ordinary Tool errors.
|
||||||
|
- Malformed input JSON, malformed output JSON, output schema mismatch, oversized output, missing runtime/package/module, unsupported imports, load failure, and non-terminating execution fail closed.
|
||||||
|
|
||||||
|
Tests added/updated cover:
|
||||||
|
- Sample Plugin package Tool executes through WASM runtime.
|
||||||
|
- Tool input JSON reaches the module.
|
||||||
|
- Output JSON returns through ordinary Tool result path.
|
||||||
|
- Malformed input JSON.
|
||||||
|
- Malformed output JSON.
|
||||||
|
- Output schema mismatch.
|
||||||
|
- Oversize output.
|
||||||
|
- Non-terminating/high-fuel execution fail closed.
|
||||||
|
- Missing runtime/package/module diagnostic is safe and bounded.
|
||||||
|
- No ambient WASI/fs/network/env import access.
|
||||||
|
- Existing Plugin Tool registration behavior.
|
||||||
|
|
||||||
|
Validation reported by coder:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo check -p pod`
|
||||||
|
- Passed: `cargo test -p manifest plugin::`
|
||||||
|
- Passed: `cargo test -p pod feature::plugin`
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi`
|
||||||
|
- Passed: `nix build .#yoi --no-link`
|
||||||
|
|
||||||
|
Residual risks / notes:
|
||||||
|
- ABI is intentionally minimal and not a general Plugin capability model.
|
||||||
|
- Permission grants, richer host APIs, WASI-like APIs, per-plugin runtime configuration knobs, and schema-driven rich output contracts remain follow-up work.
|
||||||
|
- Cancellation has no explicit `ToolExecutionContext` cancellation token today; this implementation provides safe timeout/fuel-bounded execution and maps timeout/join failure into ordinary Tool errors.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5W3PHW at: 2026-06-18T12:37:14Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Child worktree のみ確認。
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
- implementation commit: `10d12148`
|
||||||
|
- base: `d32fb3bc`
|
||||||
|
- 変更箇所を確認。
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/Cargo.toml`
|
||||||
|
- `Cargo.lock`
|
||||||
|
- `package.nix`
|
||||||
|
- Read-only validation:
|
||||||
|
- Passed: `git diff --check d32fb3bc..10d12148`
|
||||||
|
|
||||||
|
Acceptance review:
|
||||||
|
- WASM runtime は `wasmi` を使い、WASI setup はなく、host import surface は `yoi_plugin_tool_v1` の最小 input/output 関数だけに限定されている。
|
||||||
|
- `wasi_snapshot_preview1.fd_write` や `env.getenv` など ambient-style imports は拒否される。
|
||||||
|
- Plugin Tools は ordinary `Feature` tool contribution / `ToolExecutor` path で `ToolOutput` / `ToolError` を返し、hidden context injection path は見当たらない。
|
||||||
|
- module/input/output/summary/error/memory/table/stack/fuel などの bounds が実装されている。
|
||||||
|
- malformed output、invalid UTF-8、schema mismatch、oversize output は `ToolError` として fail closed する。
|
||||||
|
- runtime module selection は resolved plugin record、resolved package path、recorded digest、runtime kind/ABI、entry path に基づき、archive digest を再検証してから module bytes を使用している。
|
||||||
|
- non-termination は fuel exhaustion と runtime timeout wrapper で fail closed する。現行 `ToolExecutionContext` に cancellation token がないため、明示的 cancellation-token integration がない点は、この Ticket の範囲では blocker ではないと判断した。
|
||||||
|
- `wasmi` は `default-features = false` で `std` / `extra-checks` のみ、`wat` は dev-only。WASI/network/process capability library の追加は見当たらない。
|
||||||
|
|
||||||
|
Validation not run by reviewer:
|
||||||
|
- `cargo test` / `cargo check` / `nix build` は read-only review scope では build artifacts を書くため未実行。Coder reported validation を evidence とした。
|
||||||
|
|
||||||
|
Risk assessment:
|
||||||
|
- residual risk は低〜中程度。
|
||||||
|
- sandbox boundary は Ticket scope に対して妥当。No WASI / no fs / no network / no env imports、bounded IO、bounded diagnostics、deterministic digest check がある。
|
||||||
|
- `tokio::time::timeout` は `spawn_blocking` の実行中 task を強制 abort しないが、fuel により guest execution は有限化される。より強い cooperative cancellation semantics は Tool execution API/runtime cancellation model の follow-up として扱うべき。
|
||||||
|
- Permission grants / richer host API authority は正しく未実装の follow-up に残っている。
|
||||||
|
|
||||||
|
Conclusion:
|
||||||
|
- Approved. No blocker remains.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:39:30Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Integration report:
|
||||||
|
|
||||||
|
Merged implementation branch into orchestration branch:
|
||||||
|
- branch: `impl/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||||
|
- implementation commit: `10d12148 feat: run plugin tools through wasm runtime`
|
||||||
|
- merge commit: `05cd788c merge: plugin wasm tool runtime`
|
||||||
|
|
||||||
|
Reviewer result:
|
||||||
|
- `approve` recorded from `yoi-reviewer-00001KV5W3PHW`.
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||||
|
- Passed: `cargo fmt --check`
|
||||||
|
- Passed: `cargo check -p pod`
|
||||||
|
- Passed: `cargo test -p manifest plugin::`
|
||||||
|
- Passed: `cargo test -p pod feature::plugin`
|
||||||
|
- 21 passed
|
||||||
|
- Passed: `git diff --check`
|
||||||
|
- Passed: `nix build .#yoi --no-link`
|
||||||
|
|
||||||
|
Outcome:
|
||||||
|
- Enabled Plugin Tool calls now execute through minimal `wasmi` runtime with no WASI/fs/network/env host imports.
|
||||||
|
- Runtime module selection is deterministic from resolved package path/digest/runtime config and rechecks package digest.
|
||||||
|
- Tool input/output/errors are bounded and returned through ordinary Tool result/error path.
|
||||||
|
- Missing/malformed/oversize/schema-mismatch/non-terminating execution fails closed with safe Tool errors.
|
||||||
|
- Permission grants, richer host APIs, WASI-like APIs, and stronger cancellation-token integration remain follow-up scope.
|
||||||
|
|
||||||
|
Cleanup planned:
|
||||||
|
- Stop related coder/reviewer Pods.
|
||||||
|
- Remove only child implementation worktree/branch for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-18T12:39:30Z from: inprogress to: done reason: merged_validated field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Reviewer approved, implementation branch merged into the orchestration branch, and focused plus packaging validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-18T13:55:12Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-18T13:55:12Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV5W3PHW` (`Plugin: execute Plugin Tool with minimal WASM runtime`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
|
||||||
|
|
||||||
|
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"id":"orch-plan-20260618-131145-1","ticket_id":"00001KV5W3PJ3","kind":"accepted_plan","accepted_plan":{"summary":"Accept Plugin permission grant enforcement work. Implement typed requested/granted permission matching for Plugin Tool registration/execution and future host API denial diagnostics, fail-closed without implementing fs/https APIs.","branch":"impl/00001KV5W3PJ3-plugin-permission-grants","worktree":"/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Dependency `00001KV5W3PHW` is done and workspace is clean."},"author":"yoi-orchestrator","at":"2026-06-18T13:11:45Z"}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"relations": [
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PJ3",
|
||||||
|
"kind": "depends_on",
|
||||||
|
"target": "00001KV5W3PHW",
|
||||||
|
"note": "Grant enforcement must cover runtime execution path.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ticket_id": "00001KV5W3PJ3",
|
||||||
|
"kind": "related",
|
||||||
|
"target": "00001KSXRQ4G8",
|
||||||
|
"note": "Plugin runtime/surface/host API design record.",
|
||||||
|
"author": "yoi ticket",
|
||||||
|
"at": "2026-06-15T14:50:28Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
---
|
||||||
|
title: 'Plugin: enforce Plugin permission grants'
|
||||||
|
state: 'closed'
|
||||||
|
created_at: '2026-06-15T14:48:59Z'
|
||||||
|
updated_at: '2026-06-18T14:24:42Z'
|
||||||
|
assignee: null
|
||||||
|
readiness: 'implementation_ready'
|
||||||
|
risk_flags: ['plugin', 'permission', 'grant-enforcement', 'capability-boundary', 'tool-execution']
|
||||||
|
queued_by: 'workspace-panel'
|
||||||
|
queued_at: '2026-06-18T13:11:00Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Plugin package discovery / Tool registration / Tool runtime が揃った後、Plugin manifest の requested permissions と Profile/config 側の granted permissions を照合し、登録・実行・host API 利用の境界で fail closed にする。
|
||||||
|
|
||||||
|
この Ticket では `https` / `fs` host API の実装自体は行わない。ただし後続の host API 実装が同じ grant model を使えるよう、grant の型と enforcement point を明確にする。
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Plugin manifest の requested permissions を typed data として読む。
|
||||||
|
- enabled surfaces
|
||||||
|
- tool names / namespaces
|
||||||
|
- Tool effect / external_write metadata
|
||||||
|
- future host APIs: `https`, `fs`
|
||||||
|
- Profile/config 側の granted permissions を typed data として読む。
|
||||||
|
- package ref / digest / version と結びつける。
|
||||||
|
- source-qualified identity に対応する。
|
||||||
|
- Requested permissions と granted permissions を照合する。
|
||||||
|
- requested but not granted は fail closed。
|
||||||
|
- unsupported grant / unknown permission kind は fail closed。
|
||||||
|
- overly broad ambiguous grant は fail closed または明示 diagnostic。
|
||||||
|
- Enforcement points を実装する。
|
||||||
|
- Plugin package enablement resolution
|
||||||
|
- Tool surface registration
|
||||||
|
- Plugin Tool execution
|
||||||
|
- future host API call dispatch
|
||||||
|
- Tool metadata の effect を existing permission / PreToolCall path と整合させる。
|
||||||
|
- external side effect がある Tool は metadata と permission gate に反映する。
|
||||||
|
- external write は `Outbound` surface ではなく Tool metadata として扱う。
|
||||||
|
- Denied reason を diagnostic / trace で確認できるようにする。
|
||||||
|
- grant missing
|
||||||
|
- grant digest mismatch
|
||||||
|
- requested surface not granted
|
||||||
|
- requested tool not granted
|
||||||
|
- host API not granted
|
||||||
|
- external_write not granted
|
||||||
|
- Grant enforcement は model-visible context に隠し情報を差し込まない。
|
||||||
|
- Package が存在するだけ、または Tool registration だけで execution authority を得ない。
|
||||||
|
|
||||||
|
## Initial grant model guidance
|
||||||
|
|
||||||
|
最初の grant model は狭く始める。
|
||||||
|
|
||||||
|
```text
|
||||||
|
surfaces.tool
|
||||||
|
tool names / namespaces
|
||||||
|
external_write flag
|
||||||
|
host_api.https
|
||||||
|
host_api.fs
|
||||||
|
```
|
||||||
|
|
||||||
|
この Ticket では `https` / `fs` の API 実行は non-goal。ただし requested/granted の型と denied diagnostic は先に扱えるようにする。
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
- Grant なしの Plugin Tool は実行されず、safe diagnostic になる。
|
||||||
|
- Granted Tool だけが登録または実行可能になる。
|
||||||
|
- Requested surface が grant に含まれない場合は fail closed する。
|
||||||
|
- Requested external_write が grant に含まれない場合は fail closed する。
|
||||||
|
- Digest/version/source mismatch の grant は使われない。
|
||||||
|
- Unknown permission kind / unsupported grant は fail closed する。
|
||||||
|
- Denied reason が diagnostic / trace で確認できる。
|
||||||
|
- Existing PreToolCall / Tool permission path と矛盾しない。
|
||||||
|
- Tests cover:
|
||||||
|
- no grant denies Plugin Tool execution
|
||||||
|
- grant allows specific Plugin Tool
|
||||||
|
- unrelated package grant does not apply
|
||||||
|
- digest mismatch denies
|
||||||
|
- requested surface missing denies
|
||||||
|
- external_write missing denies
|
||||||
|
- unknown permission kind fails closed
|
||||||
|
- denial reason is bounded and safe
|
||||||
|
- Validation: focused plugin permission tests, `cargo fmt --check`, relevant `cargo check` / `cargo test`, `git diff --check`.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Implementing `https` host API.
|
||||||
|
- Implementing `fs` host API.
|
||||||
|
- Service / Ingress surface.
|
||||||
|
- Plugin package manager / install/update.
|
||||||
|
- Signature/trust-chain enforcement.
|
||||||
|
- Broad policy UI.
|
||||||
|
|
||||||
|
## Related work
|
||||||
|
|
||||||
|
- `00001KV5R5V2S` — Plugin package discovery and explicit enablement resolver.
|
||||||
|
- `00001KV5W3PHA` — Plugin Tool surface registration.
|
||||||
|
- `00001KV5W3PHW` — Plugin Tool execution with minimal WASM runtime.
|
||||||
|
- `00001KSXRQ4G8` — Plugin runtime / surface / host API model design.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
Ticket `00001KV5W3PJ3` is complete.
|
||||||
|
|
||||||
|
Completed implementation:
|
||||||
|
- Added typed Plugin permission declarations/grants for tool surfaces, tool names/namespaces, `external_write`, and future `host_api.https` / `host_api.fs` boundaries.
|
||||||
|
- Bound grants to source-qualified package identity, deterministic digest, and exact package version.
|
||||||
|
- Added fail-closed registration gating in `PluginToolFeature::install`.
|
||||||
|
- Added independent runtime execution gating in `run_plugin_wasm_tool` before WASM load/execute.
|
||||||
|
- Added future host API permission boundary checks without implementing actual `https` / `fs` host APIs.
|
||||||
|
- Added bounded/sanitized denial diagnostics.
|
||||||
|
- Preserved the existing PreToolCall / Tool permission path; plugin grants are an additional fail-closed gate, not an ambient authority grant.
|
||||||
|
|
||||||
|
Reviewed / merged:
|
||||||
|
- Implementation commit: `b1ba1599` (`plugin: enforce permission grants`)
|
||||||
|
- Reviewer result: approve, no blockers.
|
||||||
|
- Orchestrator merge commit: `94aa3c1d` (`merge: plugin permission grants`)
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree:
|
||||||
|
- `cargo fmt --check` — passed
|
||||||
|
- `cargo check -p manifest -p pod` — passed
|
||||||
|
- `cargo test -p pod plugin -- --nocapture` — passed; 27 passed, 0 failed
|
||||||
|
- `cargo test -p manifest plugin -- --nocapture` — passed; 17 passed, 0 failed
|
||||||
|
- `git diff --check` — passed
|
||||||
|
|
||||||
|
Cleanup:
|
||||||
|
- Stopped Coder Pod `yoi-coder-00001KV5W3PJ3`.
|
||||||
|
- Stopped Reviewer Pod `yoi-reviewer-00001KV5W3PJ3`.
|
||||||
|
- Removed child worktree `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants`.
|
||||||
|
- Deleted merged branch `impl/00001KV5W3PJ3-plugin-permission-grants`.
|
||||||
|
|
||||||
|
Root/original workspace promotion was not performed in this step; the completed work is integrated on the Orchestrator branch.
|
||||||
@@ -0,0 +1,389 @@
|
|||||||
|
<!-- event: create author: "yoi ticket" at: 2026-06-15T14:48:59Z -->
|
||||||
|
|
||||||
|
## 作成
|
||||||
|
|
||||||
|
LocalTicketBackend によって作成されました。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: workspace-panel at: 2026-06-18T13:11:00Z from: ready to: queued reason: queued field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を `workspace-panel` が queued にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: decision author: yoi-orchestrator at: 2026-06-18T13:11:45Z -->
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Routing decision: implementation_ready
|
||||||
|
|
||||||
|
Reason:
|
||||||
|
- Panel Queue により routing が明示的に許可され、Ticket は `queued`。
|
||||||
|
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。
|
||||||
|
- `depends_on 00001KV5W3PHW` は done/closed 済みで、Plugin Tool execution path が存在するため typed relation blocker は解消済み。
|
||||||
|
- 本 Ticket は Plugin manifest の requested permissions と Profile/config grants を照合し、enablement / Tool registration / Tool execution / future host API dispatch の enforcement points を明確にする実装であり、`https` / `fs` host API 実装や broad policy UI は non-goal として明確。
|
||||||
|
- permission / grant-enforcement / capability-boundary / tool-execution risk は高いが、fail-closed conditions、diagnostics、PreToolCall alignment、external_write handling が Ticket に具体化されているため implementation-ready と判断する。
|
||||||
|
|
||||||
|
Evidence checked:
|
||||||
|
- Ticket body/thread: requirements、initial grant model、acceptance criteria、non-goals、related work を確認。
|
||||||
|
- Ticket relations: outgoing `depends_on 00001KV5W3PHW` は done/closed。related design `00001KSXRQ4G8` は blocker ではない。
|
||||||
|
- OrchestrationPlan: 既存 record なし。
|
||||||
|
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`b6685af3` 上。
|
||||||
|
- Visible Pods/worktrees: active implementation child なし。
|
||||||
|
|
||||||
|
IntentPacket:
|
||||||
|
|
||||||
|
Intent:
|
||||||
|
- Plugin requested permissions と explicit grants を typed model で照合し、Plugin Tool registration/execution と future host API dispatch が grant なしでは fail closed になる boundary を実装する。
|
||||||
|
|
||||||
|
Binding decisions / invariants:
|
||||||
|
- Package presence / discovery / Tool registration だけで execution authority を得ない。
|
||||||
|
- Requested but not granted は fail closed。
|
||||||
|
- Unknown permission kind / unsupported grant / overly broad ambiguous grant は fail closed または explicit diagnostic。
|
||||||
|
- Grant は package ref / source-qualified identity / digest / version と結びつけ、mismatch grant は使わない。
|
||||||
|
- Permission declarations/grants を ambient workspace FS/network authority として扱わない。
|
||||||
|
- `https` / `fs` host API の実行実装は non-goal。ただし requested/granted 型と denial diagnostics は扱う。
|
||||||
|
- Tool effect / external_write metadata は existing permission / PreToolCall path と矛盾させない。
|
||||||
|
- Denial diagnostics は bounded/safe で、hidden model context injection しない。
|
||||||
|
|
||||||
|
Requirements / acceptance criteria:
|
||||||
|
- Grant なしの Plugin Tool は登録または実行されず safe diagnostic になる。
|
||||||
|
- Granted Tool だけが登録または実行可能になる。
|
||||||
|
- Requested surface missing、requested tool missing、external_write missing、host API missing、digest/version/source mismatch、unknown permission kind は fail closed。
|
||||||
|
- Denied reason が diagnostic / trace で確認できる。
|
||||||
|
- Existing PreToolCall / Tool permission path と矛盾しない。
|
||||||
|
- Tests cover no grant denies Plugin Tool execution, grant allows specific Plugin Tool, unrelated package grant does not apply, digest mismatch denies, requested surface missing denies, external_write missing denies, unknown permission kind fails closed, bounded safe denial reason。
|
||||||
|
|
||||||
|
Implementation latitude:
|
||||||
|
- Initial grant model は `surfaces.tool`, tool names/namespaces, external_write flag, `host_api.https`, `host_api.fs` を狭く始める。
|
||||||
|
- Enforcement point のうち Tool registration と Tool execution のどちらで落とすかは実装判断。ただし model-visible schema gating と runtime execution gating の境界を実装報告に明記する。
|
||||||
|
- Existing Plugin resolver / Tool surface / WASM runtime code に合わせて typed structs / diagnostics を配置してよい。
|
||||||
|
|
||||||
|
Escalate if:
|
||||||
|
- PreToolCall / Tool metadata public API の broad redesign が必要。
|
||||||
|
- Grants を安全に package digest/version/source と結合できない。
|
||||||
|
- Future host API dispatch boundary を追加するには runtime executor redesign が必要。
|
||||||
|
- Permission UI/policy semantics を product decision として固定する必要が出る。
|
||||||
|
|
||||||
|
Validation:
|
||||||
|
- focused plugin permission/grant tests。
|
||||||
|
- relevant `cargo test` / `cargo check`。
|
||||||
|
- `cargo fmt --check`。
|
||||||
|
- `git diff --check`。
|
||||||
|
- `nix build .#yoi` if dependencies/Cargo.lock/package changes occur。
|
||||||
|
|
||||||
|
Critical risks / reviewer focus:
|
||||||
|
- fail-closed grant enforcement at registration and execution。
|
||||||
|
- source/digest/version binding。
|
||||||
|
- no ambient authority accidentally granted。
|
||||||
|
- external_write/effect metadata and PreToolCall consistency。
|
||||||
|
- bounded safe diagnostics。
|
||||||
|
- Plugin Tool execution path from `00001KV5W3PHW` is gated by grants。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-18T13:11:51Z from: queued to: inprogress reason: orchestrator_acceptance_dependency_done field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Routing decision と accepted implementation plan を記録済み。dependency `00001KV5W3PHW` は done/closed で relation blocker は解消済み。Orchestrator workspace は clean。implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T13:12:47Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation start failure / recovery note:
|
||||||
|
|
||||||
|
`queued -> inprogress` acceptance と worktree 作成は完了したが、Coder Pod spawn に失敗した。
|
||||||
|
|
||||||
|
Created worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
- branch: `impl/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
|
||||||
|
Failure:
|
||||||
|
- `SpawnPod` failed before child Pod creation.
|
||||||
|
- Error: `failed to spawn /home/hare/Projects/yoi/target/debug/yoi (deleted) pod: No such file or directory (os error 2)`
|
||||||
|
|
||||||
|
Interpretation:
|
||||||
|
- Runtime binary path for this long-lived Orchestrator process again points at a deleted executable. This is an operational/runtime issue, not a Ticket requirement issue.
|
||||||
|
- No Coder Pod was started and no implementation commit exists in the child worktree yet.
|
||||||
|
|
||||||
|
Recovery needed:
|
||||||
|
- Refresh/restart the Orchestrator runtime or provide a valid Pod runtime command so `SpawnPod` can launch children again.
|
||||||
|
- After recovery, reuse the existing clean child worktree/branch and resume Coder spawn for this in-progress Ticket.
|
||||||
|
|
||||||
|
State handling:
|
||||||
|
- Ticket remains `inprogress` because acceptance and worktree side effects already happened; it is not silently returned to `queued`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T13:56:44Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Implementation resume note:
|
||||||
|
|
||||||
|
Coder Pod の再開を試み、最初の `SpawnPod` は child scope に runtime workspace root `/home/hare/Projects/yoi` の read scope が含まれていなかったため失敗した。
|
||||||
|
|
||||||
|
Recovery:
|
||||||
|
- 既存 implementation worktree `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants` を再利用。
|
||||||
|
- child scope を workspace root read + implementation worktree write に狭く設定して再試行。
|
||||||
|
- Coder Pod `yoi-coder-00001KV5W3PJ3` の起動に成功。
|
||||||
|
|
||||||
|
Current status:
|
||||||
|
- Ticket は `inprogress` のまま。
|
||||||
|
- Coder は Plugin permission grants 実装、focused validation、commit、実装報告を行う予定。
|
||||||
|
- root/original workspace は触らず、implementation worktree 上で作業するよう指示済み。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T14:15:12Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Coder implementation report received:
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
- `b1ba1599` — `plugin: enforce permission grants`
|
||||||
|
|
||||||
|
Summary:
|
||||||
|
- typed plugin permission declarations/grants を追加。
|
||||||
|
- `surfaces.tool`
|
||||||
|
- specific tool names
|
||||||
|
- tool namespaces
|
||||||
|
- `external_write`
|
||||||
|
- future `host_api.https` / `host_api.fs`
|
||||||
|
- grant binding を source-qualified package id / deterministic digest / exact package version に結合。
|
||||||
|
- registration gating を `PluginToolFeature::install` に実装。
|
||||||
|
- ungranted / unrequested plugin tools は登録されない。
|
||||||
|
- partial grant では authorized tools のみ登録し、skipped tools は bounded diagnostics。
|
||||||
|
- runtime execution gating を `run_plugin_wasm_tool` に実装。
|
||||||
|
- WASM 読み込み/実行前に binding と requested/granted tool authority を再確認。
|
||||||
|
- future host API boundary として `validate_wasm_imports` が `yoi:https` / `yoi:fs` imports を認識し、non-implemented boundary error の前に permission check。
|
||||||
|
- actual `https` / `fs` host API は実装していない。
|
||||||
|
- `external_write` を plugin tool manifest metadata に追加し、requested+granted の場合のみ許可。
|
||||||
|
- Existing PreToolCall/tool permission path は変更せず、plugin grant checks を追加の fail-closed gate とした。
|
||||||
|
|
||||||
|
Files changed:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
|
||||||
|
Validation reported by Coder:
|
||||||
|
- `cargo fmt --check`
|
||||||
|
- `cargo check -p manifest -p pod`
|
||||||
|
- `cargo test -p pod plugin -- --nocapture` — 27 passed
|
||||||
|
- `cargo test -p manifest plugin -- --nocapture` — 17 passed
|
||||||
|
- `git diff --check`
|
||||||
|
|
||||||
|
Orchestrator evidence checked:
|
||||||
|
- Pod output を確認。
|
||||||
|
- implementation worktree は clean。
|
||||||
|
- commit `b1ba1599` が branch `impl/00001KV5W3PJ3-plugin-permission-grants` の HEAD。
|
||||||
|
- diff stat: `crates/manifest/src/plugin.rs`, `crates/pod/src/feature/plugin.rs`, `crates/pod/src/pod.rs` に 575 insertions / 19 deletions。
|
||||||
|
|
||||||
|
Routing classification: review_needed
|
||||||
|
|
||||||
|
Next action:
|
||||||
|
- recorded intent / invariants / acceptance criteria に照らして、read-only Reviewer Pod で外部レビューする。
|
||||||
|
- 特に fail-closed grant enforcement、source/digest/version binding、no ambient authority、external_write/effect metadata、bounded diagnostics、existing PreToolCall path との整合性を確認する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: plan author: yoi-orchestrator at: 2026-06-18T14:16:18Z -->
|
||||||
|
|
||||||
|
## Plan
|
||||||
|
|
||||||
|
Review dispatch:
|
||||||
|
|
||||||
|
Reviewer Pod `yoi-reviewer-00001KV5W3PJ3` を read-only scope で起動した。
|
||||||
|
|
||||||
|
Review target:
|
||||||
|
- worktree: `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
- branch: `impl/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
- commit: `b1ba1599`
|
||||||
|
|
||||||
|
Reviewer focus:
|
||||||
|
- recorded intent / invariants / acceptance criteria に対する適合性。
|
||||||
|
- registration / execution の fail-closed grant enforcement。
|
||||||
|
- source-qualified identity / digest / version binding。
|
||||||
|
- unrelated grant / digest mismatch / missing surface/tool/external_write / unknown kind の拒否。
|
||||||
|
- `external_write` と Tool effect / PreToolCall path の整合性。
|
||||||
|
- future `https` / `fs` host API permission boundary が ambient authority を作っていないこと。
|
||||||
|
- bounded safe diagnostics。
|
||||||
|
|
||||||
|
Next:
|
||||||
|
- Reviewer output を確認し、approve なら Ticket review に記録して merge-ready 判断へ進む。request_changes なら Coder に修正依頼する。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KV5W3PJ3 at: 2026-06-18T14:22:32Z status: approve -->
|
||||||
|
|
||||||
|
## Review: approve
|
||||||
|
|
||||||
|
Review result: approve
|
||||||
|
|
||||||
|
対象:
|
||||||
|
- Ticket: `00001KV5W3PJ3`
|
||||||
|
- branch: `impl/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
- commit: `b1ba1599` (`plugin: enforce permission grants`)
|
||||||
|
|
||||||
|
No blockers found.
|
||||||
|
|
||||||
|
Review / validation performed:
|
||||||
|
- review target branch/head が `impl/00001KV5W3PJ3-plugin-permission-grants` at `b1ba1599` であることを確認。
|
||||||
|
- merge-base `a984f580` との差分を確認。
|
||||||
|
- changed files は以下に限定:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
- `git diff --check` against merge-base を実行し、whitespace/check failure なし。
|
||||||
|
- Review boundary が read-only/static review のため cargo validation は再実行せず、Coder reported validation を確認。
|
||||||
|
|
||||||
|
Evidence:
|
||||||
|
- typed permission/grant model が追加されている。
|
||||||
|
- `PluginGrantConfig` は non-empty grants を source-qualified id、digest、exact version に binding し、missing/mismatched binding では fail する。
|
||||||
|
- permission variants は `surfaces.*`、tool names/namespaces、`external_write`、future `host_api.https/fs` を含む。
|
||||||
|
- `PluginToolManifest.external_write` は explicit metadata として追加され、matching request+grant を要求する設計。
|
||||||
|
- grant binding は resolution 時に enforcement され、mismatch では `Grant` diagnostic と no resolved record になる。
|
||||||
|
- registration は fail-closed。
|
||||||
|
- `PluginToolFeature::install` が tool 登録前に `authorize_plugin_tool` を呼び、denied tool は bounded diagnostic として skip する。
|
||||||
|
- `authorize_plugin_tool` は requested+granted `surfaces.tool`、tool permission/name/namespace、必要時 `external_write` を要求する。
|
||||||
|
- execution も独立して fail-closed。
|
||||||
|
- `run_plugin_wasm_tool` が WASM read/load/execute 前に manifest tool を再確認し、`authorize_plugin_tool` を再実行する。
|
||||||
|
- future host API は実装せずに permission boundary を model 化。
|
||||||
|
- `authorize_plugin_host_api` は requested+granted host API permission を要求してから `host_api.* is not implemented` を返す。
|
||||||
|
- `validate_wasm_imports` は `yoi:https` / `yoi:fs` imports を authorization path に通してから unsupported module を reject する。
|
||||||
|
- denial diagnostics は bounded/sanitized。
|
||||||
|
- `bounded_message` が 512 bytes に truncation し、newline/tab 以外の control characters を除去する。
|
||||||
|
- Existing Tool / PreToolCall path と矛盾していない。
|
||||||
|
- granted plugin tools は normal `ToolRegistry` / `PreToolCall` policy path に入る。
|
||||||
|
|
||||||
|
Test coverage evidence in diff:
|
||||||
|
- no grant denies registration and runtime execution。
|
||||||
|
- specific grant registers only intended tool。
|
||||||
|
- unrelated package/digest/version grants do not authorize。
|
||||||
|
- requested surface/tool/external_write missing denies。
|
||||||
|
- future host API permissions checked before unimplemented boundary。
|
||||||
|
- exact package identity/digest/version binding and mismatch cases。
|
||||||
|
- unknown permission kind fails at manifest parse boundary。
|
||||||
|
|
||||||
|
Residual note:
|
||||||
|
- `external_write` effect metadata は broader `ToolMeta` public API effect field ではなく plugin manifest/tool metadata level で表現されている。Ticket の escalation condition が broad PreToolCall/Tool metadata redesign を要求していたため、この slice では implemented permission gate として許容可能。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T14:23:59Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Merge / validation report:
|
||||||
|
|
||||||
|
Implementation branch `impl/00001KV5W3PJ3-plugin-permission-grants` を Orchestrator worktree の `orchestration` branch に merge した。
|
||||||
|
|
||||||
|
Merge:
|
||||||
|
- merge commit: `94aa3c1d` — `merge: plugin permission grants`
|
||||||
|
- implementation commit: `b1ba1599` — `plugin: enforce permission grants`
|
||||||
|
- changed files:
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree:
|
||||||
|
- `cargo fmt --check` — passed
|
||||||
|
- `cargo check -p manifest -p pod` — passed
|
||||||
|
- `cargo test -p pod plugin -- --nocapture` — passed; 27 passed, 0 failed
|
||||||
|
- `cargo test -p manifest plugin -- --nocapture` — passed; 17 passed, 0 failed
|
||||||
|
- `git diff --check` — passed
|
||||||
|
|
||||||
|
Review:
|
||||||
|
- Reviewer `yoi-reviewer-00001KV5W3PJ3` returned `approve` with no blockers.
|
||||||
|
|
||||||
|
Outcome:
|
||||||
|
- Recorded requirements are satisfied.
|
||||||
|
- Implementation is merged into the Orchestrator branch and validated.
|
||||||
|
- Ticket is ready for done/close processing under standing merge/close completion authority. Root/original workspace promotion is not performed in this step.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T14:24:23Z -->
|
||||||
|
|
||||||
|
## Implementation report
|
||||||
|
|
||||||
|
Cleanup report:
|
||||||
|
|
||||||
|
Plugin permission grants Ticket の implementation/review Pods と child worktree を cleanup した。
|
||||||
|
|
||||||
|
Stopped Pods:
|
||||||
|
- `yoi-coder-00001KV5W3PJ3`
|
||||||
|
- `yoi-reviewer-00001KV5W3PJ3`
|
||||||
|
|
||||||
|
Removed child implementation worktree:
|
||||||
|
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants`
|
||||||
|
|
||||||
|
Deleted merged implementation branch:
|
||||||
|
- `impl/00001KV5W3PJ3-plugin-permission-grants` at `b1ba1599`
|
||||||
|
|
||||||
|
Orchestrator branch remains the integration authority for this completed work. Root/original workspace promotion was not performed in this step.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-18T14:24:29Z from: inprogress to: done reason: merged_validated_review_approved field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Implementation commit `b1ba1599` was reviewed and approved, merged into the Orchestrator branch as `94aa3c1d`, validated in the Orchestrator worktree, and child implementation resources were cleaned up. Requirements and acceptance criteria are satisfied for this Ticket.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: state_changed author: hare at: 2026-06-18T14:24:42Z from: done to: closed reason: closed field: state -->
|
||||||
|
|
||||||
|
## State changed
|
||||||
|
|
||||||
|
Ticket を closed にしました。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- event: close author: hare at: 2026-06-18T14:24:42Z status: closed -->
|
||||||
|
|
||||||
|
## 完了
|
||||||
|
|
||||||
|
Ticket `00001KV5W3PJ3` is complete.
|
||||||
|
|
||||||
|
Completed implementation:
|
||||||
|
- Added typed Plugin permission declarations/grants for tool surfaces, tool names/namespaces, `external_write`, and future `host_api.https` / `host_api.fs` boundaries.
|
||||||
|
- Bound grants to source-qualified package identity, deterministic digest, and exact package version.
|
||||||
|
- Added fail-closed registration gating in `PluginToolFeature::install`.
|
||||||
|
- Added independent runtime execution gating in `run_plugin_wasm_tool` before WASM load/execute.
|
||||||
|
- Added future host API permission boundary checks without implementing actual `https` / `fs` host APIs.
|
||||||
|
- Added bounded/sanitized denial diagnostics.
|
||||||
|
- Preserved the existing PreToolCall / Tool permission path; plugin grants are an additional fail-closed gate, not an ambient authority grant.
|
||||||
|
|
||||||
|
Reviewed / merged:
|
||||||
|
- Implementation commit: `b1ba1599` (`plugin: enforce permission grants`)
|
||||||
|
- Reviewer result: approve, no blockers.
|
||||||
|
- Orchestrator merge commit: `94aa3c1d` (`merge: plugin permission grants`)
|
||||||
|
|
||||||
|
Validation in Orchestrator worktree:
|
||||||
|
- `cargo fmt --check` — passed
|
||||||
|
- `cargo check -p manifest -p pod` — passed
|
||||||
|
- `cargo test -p pod plugin -- --nocapture` — passed; 27 passed, 0 failed
|
||||||
|
- `cargo test -p manifest plugin -- --nocapture` — passed; 17 passed, 0 failed
|
||||||
|
- `git diff --check` — passed
|
||||||
|
|
||||||
|
Cleanup:
|
||||||
|
- Stopped Coder Pod `yoi-coder-00001KV5W3PJ3`.
|
||||||
|
- Stopped Reviewer Pod `yoi-reviewer-00001KV5W3PJ3`.
|
||||||
|
- Removed child worktree `/home/hare/Projects/yoi/.worktree/00001KV5W3PJ3-plugin-permission-grants`.
|
||||||
|
- Deleted merged branch `impl/00001KV5W3PJ3-plugin-permission-grants`.
|
||||||
|
|
||||||
|
Root/original workspace promotion was not performed in this step; the completed work is integrated on the Orchestrator branch.
|
||||||
|
|
||||||
|
---
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user