747 Commits
Author SHA1 Message Date
Hare 159704dc6f fix: clear encrypted-only thinking snapshots 2026-06-25 20:28:51 +09:00
Hare 6492f10f42 test: update pod prompt expectations 2026-06-25 18:43:57 +09:00
Hare a525ba4d01 merge: plugin runtime implementation chain 2026-06-25 18:18:14 +09:00
Hare c261aea021 ticket: mark plugin pdk service events done 2026-06-25 16:57:31 +09:00
Hare 8d4fee231b merge: 00001KVXK0WEA plugin pdk service events 2026-06-25 16:55:35 +09:00
Hare 307d38453f ticket: approve plugin pdk service events 2026-06-25 16:55:35 +09:00
Hare d2a8a79ac6 ticket: record plugin pdk template fix 2026-06-25 16:53:19 +09:00
Hare 6c8998878d fix: declare plugin service websocket authority 2026-06-25 16:52:20 +09:00
Hare 41283c8dd9 ticket: request plugin pdk template fix 2026-06-25 16:44:57 +09:00
Hare fa29cc2c95 ticket: record plugin pdk implementation report 2026-06-25 16:38:53 +09:00
Hare 7a4fd97526 feat: update plugin service authoring templates 2026-06-25 16:37:37 +09:00
Hare 103077dfae ticket: record plugin pdk coder start 2026-06-25 16:09:47 +09:00
Hare cd2006305e ticket: accept plugin pdk service events task 2026-06-25 16:08:53 +09:00
Hare a453c6e2da ticket: route plugin pdk service events task 2026-06-25 16:08:34 +09:00
Hare 16247ce7c5 ticket: mark plugin websocket driver done 2026-06-25 16:06:42 +09:00
Hare b9e786e106 merge: 00001KVXK0WE4 plugin websocket driver 2026-06-25 16:03:57 +09:00
Hare ccd4d83d43 ticket: approve plugin websocket driver 2026-06-25 16:03:57 +09:00
Hare 3a9ac1b1b7 ticket: record plugin websocket implementation report 2026-06-25 15:56:44 +09:00
Hare f2c51ffe39 feat: add plugin websocket service driver 2026-06-25 15:54:36 +09:00
Hare ef17955369 ticket: record plugin websocket coder start 2026-06-25 15:24:27 +09:00
Hare 62e467c035 ticket: accept plugin websocket driver task 2026-06-25 15:23:25 +09:00
Hare 4950749c5d ticket: route plugin websocket driver task 2026-06-25 15:22:55 +09:00
Hare dc2f8b409d ticket: mark plugin output commands done 2026-06-25 15:20:33 +09:00
Hare d2aa92a729 merge: 00001KVXK0WDX plugin output commands 2026-06-25 15:18:43 +09:00
Hare 86017a5abc ticket: approve plugin output commands 2026-06-25 15:18:43 +09:00
Hare 799998639a ticket: record plugin output implementation report 2026-06-25 15:13:08 +09:00
Hare 755d460f0d feat: add plugin service output commands 2026-06-25 15:11:30 +09:00
Hare 07f9793bc6 ticket: record plugin output coder start 2026-06-25 14:47:52 +09:00
Hare 89a40db79e ticket: accept plugin output command task 2026-06-25 14:46:54 +09:00
Hare 84a8423611 ticket: route plugin output command task 2026-06-25 14:46:20 +09:00
Hare 8e79c1dc96 ticket: mark plugin service lifecycle done 2026-06-25 06:51:18 +09:00
Hare 000afbbe19 merge: 00001KVXK0WDQ plugin service lifecycle 2026-06-25 06:49:43 +09:00
Hare db1a2f567b ticket: approve plugin service lifecycle 2026-06-25 06:49:43 +09:00
Hare bdd05dce4d ticket: record plugin service implementation report 2026-06-25 06:44:06 +09:00
Hare 4e138b7e36 feat: add plugin service ingress queue 2026-06-25 06:42:56 +09:00
Hare 1839acb3d0 ticket: record plugin service coder start 2026-06-25 06:24:15 +09:00
Hare f26c7e0d09 ticket: accept plugin service lifecycle task 2026-06-25 06:23:22 +09:00
Hare 437ef5b56b ticket: route plugin service lifecycle task 2026-06-25 06:23:06 +09:00
Hare 7d64b443f2 ticket: mark plugin manifest rejection done 2026-06-25 06:20:51 +09:00
Hare 449745ee24 merge: 00001KVXK0WDH plugin manifest rejection 2026-06-25 06:19:01 +09:00
Hare e66efc746f ticket: approve plugin manifest rejection 2026-06-25 06:19:01 +09:00
Hare 436bcc812d ticket: record plugin manifest rejection report 2026-06-25 06:12:05 +09:00
Hare 6086099fe4 feat: reject legacy plugin runtime manifests 2026-06-25 06:11:03 +09:00
Hare 390f468471 ticket: record plugin manifest coder start 2026-06-25 05:54:51 +09:00
Hare ef1d8d9af2 ticket: accept plugin manifest rejection task 2026-06-25 05:53:53 +09:00
Hare ceb7b95096 ticket: route plugin manifest rejection 2026-06-25 05:53:14 +09:00
Hare 237c985f2c ticket: correct legacy wasm merge record 2026-06-25 05:51:08 +09:00
Hare 66c5be16f8 ticket: mark legacy wasm removal done 2026-06-25 05:50:51 +09:00
Hare bedbb670e4 merge: 00001KVXK0WD3 legacy wasm removal 2026-06-25 05:49:01 +09:00
Hare 0591fd528c ticket: approve legacy wasm removal 2026-06-25 05:49:01 +09:00
Hare 19ff3724ed ticket: record legacy wasm removal report 2026-06-25 05:43:58 +09:00
Hare 741d71327a refactor: remove legacy wasm plugin runtime 2026-06-25 05:42:52 +09:00
Hare 27117f3246 ticket: record legacy wasm coder start 2026-06-25 05:15:02 +09:00
Hare 1b5a39dbc9 ticket: accept legacy wasm removal task 2026-06-25 05:14:13 +09:00
Hare f65f0e3b8f ticket: route plugin runtime cleanup chain 2026-06-25 05:13:59 +09:00
Hare e2df9f9493 ticket: queue 00001KVXK0WEA 2026-06-25 05:12:05 +09:00
Hare 959b497135 ticket: queue 00001KVXK0WE4 2026-06-25 05:12:03 +09:00
Hare ef08b873ce ticket: queue 00001KVXK0WDX 2026-06-25 05:12:02 +09:00
Hare 2f975808bb ticket: queue 00001KVXK0WDQ 2026-06-25 05:12:00 +09:00
Hare 273f10e954 ticket: queue 00001KVXK0WDH 2026-06-25 05:11:58 +09:00
Hare f349738257 ticket: queue 00001KVXK0WD3 2026-06-25 05:11:56 +09:00
Hare 577bf75051 ticket: split plugin runtime redesign 2026-06-25 04:56:03 +09:00
Hare 79df31ccf6 ticket: return plugin runtime redesign to planning 2026-06-25 04:40:59 +09:00
Hare 72812878c0 ticket: queue 00001KVXHVCR5 2026-06-25 04:39:36 +09:00
Hare cea115ecd9 merge: sync orchestration before queue 00001KVXHVCR5 2026-06-25 04:39:36 +09:00
Hare 4c3b15d8d6 ticket: plan plugin wasm runtime redesign 2026-06-25 04:39:33 +09:00
Hare 45d21ac032 ticket: mark backend orchestrator design done 2026-06-25 04:15:48 +09:00
Hare 4e713fce19 merge: 00001KVWSQM22 backend orchestrator design 2026-06-25 04:15:14 +09:00
Hare 428b7d0fef ticket: approve backend orchestrator design 2026-06-25 04:15:14 +09:00
Hare 5ddc8dceac ticket: record backend orchestrator design report 2026-06-25 04:12:38 +09:00
Hare f901b9bee3 docs: design backend internal orchestrator runtime 2026-06-25 04:11:47 +09:00
Hare 2f9604a12f ticket: record backend orchestrator coder start 2026-06-25 04:08:16 +09:00
Hare 893122781d ticket: accept backend orchestrator runtime plan 2026-06-25 04:07:16 +09:00
Hare f367d73231 ticket: queue 00001KVWSQM22 2026-06-25 04:04:55 +09:00
Hare 5fa480904d merge: sync orchestration before queue 00001KVWSQM22 2026-06-25 04:04:55 +09:00
Hare 0618de21eb ticket: plan backend internal orchestrator 2026-06-25 03:49:58 +09:00
Hare d5012d3e16 ticket: mark cleanup cli done 2026-06-24 21:36:19 +09:00
Hare 28d53aadf2 nix: update yoi cleanup cargo hash 2026-06-24 21:35:28 +09:00
Hare 4fb75ec324 merge: 00001KVWPVHFJ storage cleanup cli
# Conflicts:
#	.yoi/tickets/00001KVWPVHFJ/item.md
#	.yoi/tickets/00001KVWPVHFJ/thread.md
2026-06-24 21:30:57 +09:00
Hare 091ee764a4 ticket: approve cleanup cli implementation 2026-06-24 21:30:49 +09:00
Hare 439f967cb8 chore: record cleanup cli implementation report 2026-06-24 21:22:58 +09:00
Hare 80d6861aba feat: add pod and session cleanup CLI 2026-06-24 21:22:19 +09:00
Hare d2ec533585 ticket: mark thinking grouping done 2026-06-24 21:20:15 +09:00
Hare b52b7c963c merge: 00001KVWPW3KX thinking grouping
# Conflicts:
#	.yoi/tickets/00001KVWPW3KX/item.md
#	.yoi/tickets/00001KVWPW3KX/thread.md
2026-06-24 21:19:16 +09:00
Hare 89910a1a29 ticket: approve thinking grouping implementation 2026-06-24 21:18:56 +09:00
Hare 7ee2b78bbb ticket: report thinking grouping implementation 2026-06-24 21:14:43 +09:00
Hare 0b2ce6ca1f tui: group consecutive thinking blocks 2026-06-24 21:14:06 +09:00
Hare bca8ba6ed9 ticket: record ui and cleanup coder starts 2026-06-24 21:05:18 +09:00
Hare 5c9331e848 ticket: accept queued ui and cleanup tasks 2026-06-24 21:04:13 +09:00
Hare bb6bc9f6a1 ticket: queue 00001KVWPVHFJ 2026-06-24 21:01:42 +09:00
Hare 845817d3bf ticket: queue 00001KVWPW3KX 2026-06-24 21:01:41 +09:00
Hare 1d98921a45 merge: sync orchestration before queue 00001KVWPW3KX 2026-06-24 21:01:41 +09:00
Hare 7ede927d5a ticket: add pod cleanup and thinking aggregation plans 2026-06-24 20:57:23 +09:00
Hare 6081448a7e fix: trace codex requests and clear reasoning snapshots 2026-06-24 20:37:42 +09:00
Hare 70162d5001 ticket: mark worker registry done 2026-06-24 20:15:18 +09:00
Hare b975812c18 nix: update yoi cargo hash 2026-06-24 20:14:41 +09:00
Hare 1251c0ca70 merge: 00001KVWECEQG worker runtime registry 2026-06-24 20:11:00 +09:00
Hare dd40c41f45 ticket: approve worker registry implementation 2026-06-24 20:11:00 +09:00
Hare 428d255b27 ticket: record worker registry fixes 2026-06-24 20:09:08 +09:00
Hare 38d25582b2 fix: make worker runtime ids resolvable 2026-06-24 20:08:23 +09:00
Hare cdc0a5da33 ticket: request worker registry changes 2026-06-24 20:01:52 +09:00
Hare c96cc49d0a ticket: record worker registry implementation report 2026-06-24 19:57:10 +09:00
Hare 9bd1550715 feat: add worker runtime registry overview 2026-06-24 19:56:08 +09:00
Hare 81fa035a1c ticket: record worker registry orchestration start 2026-06-24 19:38:55 +09:00
Hare 371fd7c6e5 ticket: accept worker runtime registry task 2026-06-24 19:37:58 +09:00
Hare d231f41300 ticket: mark worker runtime spawn done 2026-06-24 19:35:06 +09:00
Hare 97555bb5a1 merge: 00001KVTNAY20 worker runtime spawn 2026-06-24 19:33:35 +09:00
Hare d62ab6e1de docs: record worker runtime implementation report 2026-06-24 19:26:14 +09:00
Hare 217a4828d7 feat: abstract worker runtime spawn boundary 2026-06-24 19:24:18 +09:00
Hare bc2b8513f7 ticket: defer worker runtime registry routing 2026-06-24 18:24:57 +09:00
Hare 73122c10fd ticket: queue 00001KVWECEQG 2026-06-24 18:22:55 +09:00
Hare b84db7fac7 merge: orchestration branch 2026-06-24 18:21:37 +09:00
Hare 911df3df77 ticket: mark worker runtime registry ready 2026-06-24 18:21:37 +09:00
Hare acf1f5fb53 ticket: plan worker runtime registry 2026-06-24 18:12:39 +09:00
Hare 1044b39c3f ticket: plan ticket management api ui 2026-06-24 04:42:37 +09:00
Hare a729d68600 ticket: record coder startup blocker 2026-06-24 04:33:52 +09:00
Hare b83886554f ticket: record worker runtime orchestration start 2026-06-24 04:32:02 +09:00
Hare 5a8bcebdf4 ticket: accept worker runtime spawn task 2026-06-24 04:27:45 +09:00
Hare a479d3e32d ticket: queue 00001KVTNAY20 2026-06-24 04:25:09 +09:00
Hare f399d7383c ticket: mark worker spawn abstraction ready 2026-06-24 04:25:09 +09:00
Hare e8e019eb76 fix: keep initialized ticket directory 2026-06-24 03:26:22 +09:00
Hare 3c2fd5d760 ticket: separate pod launch from orchestration 2026-06-24 03:15:07 +09:00
Hare 1ca5663298 fix: harden StopPod registry cleanup 2026-06-24 00:23:10 +09:00
Hare b28d64c3c6 ticket: close 00001KVSMJJNV 2026-06-23 22:56:21 +09:00
Hare 76c800542c merge: 00001KVSMJJNV paused ctrl-x cancel 2026-06-23 22:54:38 +09:00
Hare cca073f8aa ticket: approve 00001KVSMJJNV implementation 2026-06-23 22:53:20 +09:00
Hare c0f4c184ca ticket: report 00001KVSMJJNV review fix 2026-06-23 22:49:40 +09:00
Hare 8c8fb01426 fix: log paused cancel lifecycle explicitly 2026-06-23 22:48:21 +09:00
Hare 052408392d ticket: update 00001KVSMJJNV review metadata 2026-06-23 22:43:05 +09:00
Hare cfb215ab0c ticket: review 00001KVSMJJNV changes 2026-06-23 22:42:52 +09:00
Hare 3501e0dffe ticket: update 00001KVSMJJNV metadata 2026-06-23 22:38:06 +09:00
Hare af683af2d2 ticket: report 00001KVSMJJNV implementation 2026-06-23 22:38:01 +09:00
Hare 90b1a1fccb tui: cancel paused turns with ctrl-x 2026-06-23 22:37:40 +09:00
Hare 5954021cc5 ticket: accept 00001KVSMJJNV 2026-06-23 22:21:56 +09:00
Hare 108088d811 ticket: queue 00001KVSMJJNV 2026-06-23 17:41:00 +09:00
Hare ca2ad18ded merge: sync orchestration before queue 00001KVSMJJNV 2026-06-23 17:41:00 +09:00
Hare d2e6a2a1a7 ui: simplify workspace sidebar identity 2026-06-23 16:56:00 +09:00
Hare e275a80f4c ticket: close workspace identity 2026-06-23 16:39:16 +09:00
Hare 2745f3d516 merge: workspace identity persistence 2026-06-23 16:35:17 +09:00
Hare 8f7b87a29e ticket: record workspace identity approval 2026-06-23 16:35:13 +09:00
Hare 2a7b659be4 ticket: restart workspace identity review 2026-06-23 16:31:38 +09:00
Hare 3dd680683c ticket: record workspace identity fix 2026-06-23 16:30:50 +09:00
Hare 49c9e19074 fix: return persisted workspace identity 2026-06-23 16:29:48 +09:00
Hare ddd2f86e26 ticket: reroute workspace identity fixes 2026-06-23 16:25:39 +09:00
Hare fac79dc962 ticket: request workspace identity changes 2026-06-23 16:25:03 +09:00
Hare 71a39002fb ticket: close dashboard selection 2026-06-23 16:24:24 +09:00
Hare 58904c441a merge: dashboard no auto selection 2026-06-23 16:23:16 +09:00
Hare 1e812b793b ticket: record dashboard selection review 2026-06-23 16:23:11 +09:00
Hare ff8aa6bcbf ticket: start dashboard selection review 2026-06-23 16:16:42 +09:00
Hare 2b213a8add ticket: record dashboard selection implementation 2026-06-23 16:15:59 +09:00
Hare 021aca8d5e ticket: start workspace identity review 2026-06-23 16:14:48 +09:00
Hare 21b14ba440 ticket: record workspace identity implementation 2026-06-23 16:13:56 +09:00
Hare 5c242d9620 fix: keep dashboard row selection explicit 2026-06-23 16:13:37 +09:00
Hare 31565c9b9e feat: persist workspace identity 2026-06-23 16:12:39 +09:00
Hare 99f31e0055 ticket: start workspace identity and selection work 2026-06-23 15:51:53 +09:00
Hare 4cda83b748 ticket: accept workspace identity and selection work 2026-06-23 15:50:36 +09:00
Hare 13e76d3544 ticket: queue 00001KVSKGDYS 2026-06-23 15:47:18 +09:00
Hare 85b6d9f027 ticket: queue 00001KVSKJ0EA 2026-06-23 15:47:17 +09:00
Hare 8daf9eacb7 merge: sync orchestration before queue 00001KVSKJ0EA 2026-06-23 15:47:17 +09:00
Hare 48672e4317 fix: canonicalize workspace server root 2026-06-23 15:47:11 +09:00
Hare eb998f0ad4 ticket: add workspace identity initialization 2026-06-23 15:44:29 +09:00
Hare 9cbb5b9b71 ticket: record dashboard hint cleanup cleanup 2026-06-23 15:33:30 +09:00
Hare 108666664a ticket: complete dashboard hint cleanup 2026-06-23 15:32:57 +09:00
Hare 5abf16f9e6 merge: dashboard hint cleanup 2026-06-23 15:31:31 +09:00
Hare 78c98a34d1 ticket: approve dashboard hint cleanup 2026-06-23 15:31:31 +09:00
Hare 68f1ddbd5a ticket: start dashboard hint cleanup review 2026-06-23 15:29:26 +09:00
Hare 71284cdc92 ticket: record dashboard hint cleanup implementation 2026-06-23 15:28:24 +09:00
Hare 03ad525fcc tui: trim dashboard redundant hints 2026-06-23 15:27:04 +09:00
Hare af9e940873 ticket: record protocol ts cleanup 2026-06-23 15:22:07 +09:00
Hare b547203fde ticket: complete protocol ts generation 2026-06-23 15:21:30 +09:00
Hare 9728b533b4 merge: protocol typescript generation 2026-06-23 15:17:09 +09:00
Hare 9c4d1559fd ticket: approve protocol ts generation 2026-06-23 15:17:09 +09:00
Hare e0ec8ce78a ticket: record kanban lazy rows cleanup 2026-06-23 15:16:19 +09:00
Hare 9de04f7266 ticket: complete kanban lazy rows 2026-06-23 15:15:33 +09:00
Hare eea26f9174 merge: kanban lazy rows 2026-06-23 15:13:43 +09:00
Hare 0b1e9fdc5b ticket: approve kanban lazy rows 2026-06-23 15:13:43 +09:00
Hare 277af3dec3 ticket: start dashboard hint cleanup 2026-06-23 15:13:01 +09:00
Hare 3bfd1ca07d ticket: accept dashboard hint cleanup 2026-06-23 15:11:48 +09:00
Hare 0e635ba6b4 ticket: start protocol ts review 2026-06-23 15:10:38 +09:00
Hare 017ac70876 ticket: record protocol ts generation 2026-06-23 15:09:50 +09:00
Hare 5428837605 ticket: queue 00001KVSFXY88 2026-06-23 15:08:42 +09:00
Hare 87482df956 merge: sync orchestration before queue 00001KVSFXY88 2026-06-23 15:08:42 +09:00
Hare a13fb6933b protocol: generate workspace TypeScript types 2026-06-23 15:08:22 +09:00
Hare d775e09688 ticket: update workspace web tickets 2026-06-23 15:07:46 +09:00
Hare f1ab40bf01 ticket: start kanban lazy rows review 2026-06-23 15:06:57 +09:00
Hare c92bc447cc ticket: record kanban lazy rows implementation 2026-06-23 15:06:11 +09:00
Hare 6f68bb8d95 web: group repository ticket kanban rows 2026-06-23 15:04:03 +09:00
Hare f39127b752 ticket: start kanban lazy rows 2026-06-23 14:55:34 +09:00
Hare a6f9019edd ticket: accept kanban lazy rows 2026-06-23 14:54:43 +09:00
Hare 2865abb65a ticket: queue 00001KVSGFM65 2026-06-23 14:53:22 +09:00
Hare f6eb11e567 merge: sync orchestration before queue 00001KVSGFM65 2026-06-23 14:53:22 +09:00
Hare ee750363d2 ticket: add workspace kanban improvement 2026-06-23 14:51:34 +09:00
Hare d8f467e30f ticket: start protocol ts generation 2026-06-23 14:42:24 +09:00
Hare 746c51c701 ticket: accept protocol ts generation 2026-06-23 14:41:34 +09:00
Hare f9ca777afe ticket: queue 00001KVSEBF56 2026-06-23 14:40:01 +09:00
Hare 4189b80004 ticket: add protocol type generation work 2026-06-23 14:14:17 +09:00
Hare 6013048f68 merge: orchestration 2026-06-22 20:15:48 +09:00
Hare 1d626cdea6 ui: refine workspace web layout 2026-06-22 20:03:54 +09:00
Hare 615c02501a ticket: record workspace schema cleanup 2026-06-22 18:27:16 +09:00
Hare 7a7891d467 ticket: complete workspace db schema v0 2026-06-22 18:26:32 +09:00
Hare 38bd122dd0 merge: workspace db schema v0 2026-06-22 18:24:14 +09:00
Hare 9c0c7badcf ticket: approve workspace db schema v0 2026-06-22 18:24:14 +09:00
Hare c3798559d2 ticket: record workspace schema migration fix 2026-06-22 18:18:37 +09:00
Hare d89ace5b9c workspace: canonicalize legacy workspaces 2026-06-22 18:17:21 +09:00
Hare 1994d2d668 ticket: request changes on workspace schema migration 2026-06-22 18:13:17 +09:00
Hare 1c3ec71361 ticket: start workspace db schema review 2026-06-22 18:03:59 +09:00
Hare e7333f2e4d ticket: record workspace db schema implementation 2026-06-22 18:03:09 +09:00
Hare 5149ab703f workspace: implement db schema v0 bootstrap 2026-06-22 18:01:38 +09:00
Hare 1e0f2158ba ticket: start workspace db schema v0 2026-06-22 17:51:17 +09:00
Hare f17a458a04 ticket: accept workspace db schema v0 2026-06-22 17:50:22 +09:00
Hare 5f06af81cb ticket: queue 00001KVNKD56W 2026-06-22 17:48:39 +09:00
Hare 8407ce22b4 merge: sync orchestration before queue 00001KVNKD56W 2026-06-22 17:48:39 +09:00
Hare c6ddff159f docs: design workspace db schema v0 2026-06-22 17:48:37 +09:00
Hare b7c890d3f6 ticket: record repository objective cleanup 2026-06-22 02:31:56 +09:00
Hare 4b1f1e593d ticket: complete repository objective pages 2026-06-22 02:31:21 +09:00
Hare 7ee702b162 merge: repository objective pages 2026-06-22 02:30:17 +09:00
Hare 680b2a4160 ticket: approve repository objective pages 2026-06-22 02:30:17 +09:00
Hare 076c504640 ticket: start repository objective review 2026-06-22 02:24:06 +09:00
Hare 2c76675110 ticket: record repository objective implementation 2026-06-22 02:23:23 +09:00
Hare ceb1ee3b56 feat: add repository objective pages 2026-06-22 02:21:51 +09:00
Hare de43209643 ticket: start repository objective pages 2026-06-22 02:03:46 +09:00
Hare 0f7e78c164 ticket: accept repository objective pages 2026-06-22 02:03:04 +09:00
Hare eb2e5907ea ticket: record workspace sidebar cleanup 2026-06-22 02:01:56 +09:00
Hare c29eba0c70 ticket: complete workspace sidebar 2026-06-22 02:01:22 +09:00
Hare 613f412659 merge: workspace sidebar navigation 2026-06-22 02:00:22 +09:00
Hare 5d55e47e9b ticket: approve workspace sidebar 2026-06-22 02:00:22 +09:00
Hare 8066f71b51 ticket: start sidebar review 2026-06-22 01:54:57 +09:00
Hare 5ad588f059 ticket: record sidebar conflict resolution 2026-06-22 01:54:16 +09:00
Hare 4ab696b434 Merge branch 'orchestration' into impl/00001KVNG9B9Z-workspace-sidebar
# Conflicts:
#	web/workspace/src/routes/+page.svelte
2026-06-22 01:52:53 +09:00
Hare d3b8bdfddc feat: add workspace sidebar skeleton 2026-06-22 01:45:46 +09:00
Hare a607a1f20d ticket: defer repository pages behind sidebar 2026-06-22 01:41:16 +09:00
Hare 520209f38c ticket: queue 00001KVNGJPRG 2026-06-22 01:40:36 +09:00
Hare ae2d80ba5a merge: sync orchestration before queue 00001KVNGJPRG 2026-06-22 01:40:35 +09:00
Hare 8652041855 ticket: add repository objective pages 2026-06-22 01:40:33 +09:00
Hare 04f15623f2 ticket: record workspace host worker cleanup 2026-06-22 01:39:51 +09:00
Hare a4ed5fb082 ticket: complete workspace host workers 2026-06-22 01:39:21 +09:00
Hare c884d51702 merge: workspace host workers 2026-06-22 01:38:12 +09:00
Hare ea47e54399 ticket: approve workspace host workers 2026-06-22 01:38:12 +09:00
Hare d953049d7d ticket: start workspace sidebar work 2026-06-22 01:37:40 +09:00
Hare 2c7ef24a29 ticket: accept workspace sidebar ui 2026-06-22 01:36:58 +09:00
Hare 48c09fd709 ticket: queue 00001KVNG9B9Z 2026-06-22 01:35:06 +09:00
Hare 6ebe4f7752 merge: sync orchestration before queue 00001KVNG9B9Z 2026-06-22 01:35:06 +09:00
Hare d4de8e26ce ticket: start workspace host worker review 2026-06-22 01:32:27 +09:00
Hare 42c9e9144c ticket: record workspace host worker implementation 2026-06-22 01:31:54 +09:00
Hare 06a9f2f5fd ticket: add workspace sidebar UI 2026-06-22 01:30:58 +09:00
Hare 58143ead83 feat: expose workspace hosts and workers 2026-06-22 01:30:48 +09:00
Hare b193e3e088 ticket: start workspace host workers 2026-06-22 01:11:53 +09:00
Hare e1f02ffca3 ticket: accept workspace host workers 2026-06-22 01:10:56 +09:00
Hare bd5f2b75c3 ticket: queue 00001KVNEKH9Q 2026-06-22 01:09:10 +09:00
Hare 2bad74046e merge: integrate orchestration branch 2026-06-22 01:06:48 +09:00
Hare dfbfd6ed82 dev: add workspace web hot reload setup 2026-06-22 01:06:37 +09:00
Hare de1a20c007 ticket: add local host worker API 2026-06-22 01:01:43 +09:00
Hare 7abc3c7751 ticket: record plugin websocket cleanup 2026-06-21 22:27:34 +09:00
Hare e8103477a4 ticket: complete plugin websocket host api 2026-06-21 22:26:32 +09:00
Hare 354f1e1081 merge: plugin websocket host api 2026-06-21 22:21:07 +09:00
Hare 8a5b341e5e ticket: approve plugin websocket api 2026-06-21 22:20:58 +09:00
Hare 2232149be0 ticket: record plugin websocket bounds fix 2026-06-21 22:16:11 +09:00
Hare a766048f29 fix: bound plugin websocket open 2026-06-21 22:14:58 +09:00
Hare 168951b668 fix: declare deno workspace frontend deps 2026-06-21 22:08:37 +09:00
Hare 519730e7d3 ticket: request changes on websocket bounds 2026-06-21 21:43:11 +09:00
Hare 27f6b3366c ticket: start plugin websocket review 2026-06-21 21:33:07 +09:00
Hare 07782704d4 ticket: record plugin websocket branch hygiene 2026-06-21 21:32:27 +09:00
Hare e58355e7e3 ticket: record plugin websocket implementation 2026-06-21 21:21:02 +09:00
Hare ce62d23502 chore: keep plugin websocket branch code-only 2026-06-21 21:20:55 +09:00
Hare 4c1b8c3d0a feat: add plugin websocket host api 2026-06-21 21:19:28 +09:00
Hare 8578bc1c29 ticket: record inflight snapshot cleanup 2026-06-21 21:00:38 +09:00
Hare 77b5276fd3 ticket: complete inflight snapshot fix 2026-06-21 21:00:10 +09:00
Hare b21638f56c merge: inflight reconnect snapshot 2026-06-21 20:56:55 +09:00
Hare 08edc767b5 ticket: approve inflight snapshot fix 2026-06-21 20:56:49 +09:00
Hare 4cd4ae9cb5 ticket: record inflight snapshot race fix 2026-06-21 20:53:05 +09:00
Hare 061136d798 fix: close in-flight snapshot commit race 2026-06-21 20:51:48 +09:00
Hare ecdc52fce9 ticket: request changes on inflight snapshot 2026-06-21 20:37:40 +09:00
Hare 406c057025 ticket: start plugin websocket implementation 2026-06-21 20:37:08 +09:00
Hare 3eac7f8eae ticket: accept plugin websocket host api 2026-06-21 20:36:06 +09:00
Hare 79a0e45dbc ticket: queue 00001KVMGAEJN 2026-06-21 20:34:07 +09:00
Hare 2e2fdae8ef merge: sync orchestration before queue 00001KVMGAEJN 2026-06-21 20:34:07 +09:00
Hare d802778104 ticket: start inflight snapshot review 2026-06-21 20:32:03 +09:00
Hare de5f3ba49e ticket: record inflight snapshot implementation 2026-06-21 20:31:18 +09:00
Hare 74aca6f6c5 fix: snapshot in-flight stream state 2026-06-21 20:30:01 +09:00
Hare 2a23b8d770 ticket: record deno tooling cleanup 2026-06-21 20:14:32 +09:00
Hare 54d325aeb4 ticket: complete deno tooling migration 2026-06-21 20:14:07 +09:00
Hare 6dc78e3f2a merge: workspace spa deno tooling 2026-06-21 20:13:04 +09:00
Hare 108b6dc787 ticket: approve deno tooling migration 2026-06-21 20:12:57 +09:00
Hare 395de19639 ticket: start deno tooling review 2026-06-21 20:06:08 +09:00
Hare cc25201c4f ticket: record deno tooling implementation 2026-06-21 20:05:32 +09:00
Hare 66f04e0424 feat: migrate workspace spa tooling to deno 2026-06-21 20:04:08 +09:00
Hare 5f9797fdd6 ticket: ready websocket host api 2026-06-21 20:01:28 +09:00
Hare b4d2b3a442 ticket: start deno and inflight snapshot work 2026-06-21 20:00:13 +09:00
Hare 155e039e66 ticket: route deno and inflight snapshot work 2026-06-21 19:58:49 +09:00
Hare b4786b407a ticket: queue 00001KVMT2J25 2026-06-21 19:56:32 +09:00
Hare a59d935bd3 ticket: queue 00001KVMV03QY 2026-06-21 19:56:31 +09:00
Hare 6e95e497f7 ticket: add workspace follow-up items 2026-06-21 19:56:10 +09:00
Hare ef12c6b185 ticket: close workspace server launcher 2026-06-21 19:56:04 +09:00
Hare e6f68496b4 feat: add workspace server launcher 2026-06-21 19:55:55 +09:00
Hare be517417ff ticket: start workspace server launcher 2026-06-21 19:55:46 +09:00
Hare 3fc0dd0bde merge: integrate orchestration branch 2026-06-21 18:01:45 +09:00
Hare 89eb59505b ticket: record plugin request cleanup 2026-06-21 17:12:42 +09:00
Hare 2601bfa9f0 ticket: complete plugin request host api 2026-06-21 17:12:13 +09:00
Hare 8a15cca567 merge: plugin request host api 2026-06-21 17:08:13 +09:00
Hare ece35c391c ticket: approve plugin request api 2026-06-21 17:08:09 +09:00
Hare 6c3ac08c54 ticket: record plugin request grant fix 2026-06-21 17:04:55 +09:00
Hare 0e14e7c14e plugin: align request grant inspection coverage 2026-06-21 17:04:03 +09:00
Hare 2704b8c4bd ticket: request changes on plugin request grants 2026-06-21 16:58:12 +09:00
Hare d5338f9244 ticket: start plugin request review 2026-06-21 16:48:59 +09:00
Hare e447f177e0 ticket: record plugin request implementation 2026-06-21 16:48:13 +09:00
Hare 962b769989 plugin: replace https host api with request grants 2026-06-21 16:47:06 +09:00
Hare 52a786c780 ticket: record workspace web cleanup 2026-06-21 16:46:59 +09:00
Hare f33415c7e2 ticket: complete workspace web bootstrap 2026-06-21 16:46:25 +09:00
Hare 3e03e53627 merge: workspace web control plane 2026-06-21 16:44:59 +09:00
Hare 794e43a534 ticket: approve workspace web bootstrap 2026-06-21 16:44:54 +09:00
Hare 9f721ba437 ticket: start workspace web review 2026-06-21 16:38:19 +09:00
Hare 4a5e28067e ticket: record workspace web implementation 2026-06-21 16:37:39 +09:00
Hare ab7658c1f2 feat: bootstrap workspace web control plane 2026-06-21 16:34:36 +09:00
Hare 6cc0065d15 ticket: start plugin request implementation 2026-06-21 16:19:01 +09:00
Hare 4cd4a06e98 ticket: route plugin request capabilities 2026-06-21 16:17:57 +09:00
Hare f164483e62 ticket: queue 00001KVMGAEJN 2026-06-21 16:15:42 +09:00
Hare faf9bb0a82 ticket: queue 00001KVMG8FTW 2026-06-21 16:15:41 +09:00
Hare df150647c4 merge: sync orchestration before queue 00001KVMG8FTW 2026-06-21 16:15:41 +09:00
Hare 6434df13aa ticket: plugin request/ws support 2026-06-21 16:15:36 +09:00
Hare 9f664c751a ticket: start workspace web implementation 2026-06-21 16:15:08 +09:00
Hare 1d27f6c90a ticket: accept workspace web control plane 2026-06-21 16:13:54 +09:00
Hare 98c85a1d9e ticket: queue 00001KVMFFYVX 2026-06-21 16:11:58 +09:00
Hare 1f198ccb43 merge: sync orchestration before queue 00001KVMFFYVX 2026-06-21 16:11:58 +09:00
Hare 5fb8c393c5 ticket: bootstrap workspace web control plane 2026-06-21 15:58:18 +09:00
Hare 7c424e7d38 objective: defer memory redesign 2026-06-21 15:31:45 +09:00
Hare 5fa0846dcf ticket: record resume cli cleanup 2026-06-21 02:00:53 +09:00
Hare 19c3ec45eb ticket: complete resume cli command 2026-06-21 02:00:29 +09:00
Hare bdc11c771d merge: explicit resume command 2026-06-21 01:58:41 +09:00
Hare 35fba2b6fb ticket: approve resume cli changes 2026-06-21 01:58:34 +09:00
Hare bf4bf4da09 ticket: record resume guidance fix 2026-06-21 01:54:29 +09:00
Hare d25ca6ff3c fix: update resume guidance 2026-06-21 01:53:32 +09:00
Hare 79ee5c4388 ticket: request changes on resume cli guidance 2026-06-21 01:50:52 +09:00
Hare 2081fd5bda ticket: start resume cli review 2026-06-21 01:46:56 +09:00
Hare 8fcfa6e016 ticket: record resume cli implementation 2026-06-21 01:46:27 +09:00
Hare c14083a45a ticket: close completed audit items 2026-06-21 01:46:02 +09:00
Hare 861c351a96 feat: add explicit resume command 2026-06-21 01:45:28 +09:00
Hare 50b261e7e2 ticket: start resume cli implementation 2026-06-21 01:31:58 +09:00
Hare 54245e3292 ticket: close obsolete planning items 2026-06-21 01:31:34 +09:00
Hare a63b40f460 ticket: accept resume cli routing 2026-06-21 01:31:04 +09:00
Hare 8684344e92 ticket: queue 00001KVJX7VZT 2026-06-21 01:29:26 +09:00
Hare 5f52c72b45 records: add pending objective and ticket 2026-06-21 01:28:36 +09:00
Hare 839783b2e6 merge: integrate orchestration branch 2026-06-21 01:24:03 +09:00
Hare 717ff8db01 ticket: close stale notification guidance item 2026-06-21 01:23:54 +09:00
Hare 249b55ec3f objective: define team workspace roadmap 2026-06-21 01:16:36 +09:00
Hare 5885850726 ticket: record plugin lifecycle cleanup 2026-06-21 00:23:39 +09:00
Hare bc484338df ticket: complete plugin instance lifecycle 2026-06-21 00:23:17 +09:00
Hare 43c9216ef8 merge: plugin instance lifecycle surface 2026-06-21 00:18:43 +09:00
Hare ec3a1c621d ticket: approve plugin instance lifecycle 2026-06-21 00:18:40 +09:00
Hare 2edffafc2b ticket: record plugin static surface fix 2026-06-21 00:14:03 +09:00
Hare 627c8f36ff plugin: filter static enabled surfaces 2026-06-21 00:12:55 +09:00
Hare 01ba4c157a ticket: request changes on plugin surface inspection 2026-06-21 00:04:15 +09:00
Hare 6f790faed9 ticket: record plugin surface selection fix 2026-06-20 23:59:33 +09:00
Hare 79ca0f7f81 plugin: enforce enabled lifecycle surfaces 2026-06-20 23:58:16 +09:00
Hare 8fd75228e4 ticket: request changes on plugin surface selection 2026-06-20 23:50:29 +09:00
Hare dcbd04aacd ticket: record plugin instance lifecycle fixes 2026-06-20 23:43:52 +09:00
Hare 870bcc76a5 plugin: fix instance lifecycle blockers 2026-06-20 23:42:44 +09:00
Hare c383178f7f ticket: request changes on plugin instance lifecycle 2026-06-20 23:24:48 +09:00
Hare 97df2c8a28 ticket: dispatch plugin instance lifecycle review 2026-06-20 23:17:39 +09:00
Hare 6eda265bf2 ticket: record plugin instance lifecycle report 2026-06-20 23:16:51 +09:00
Hare 147a600577 plugin: add instance lifecycle surface 2026-06-20 23:15:47 +09:00
Hare 0dd5be8e7a ticket: close mcp cli inspection 2026-06-20 22:56:47 +09:00
Hare 8c42729e5b ticket: complete mcp cli inspection 2026-06-20 22:56:23 +09:00
Hare 5e0b023a7b merge: mcp cli inspection 2026-06-20 22:54:13 +09:00
Hare 09f0ec5ebf ticket: approve mcp cli inspection 2026-06-20 22:54:13 +09:00
Hare c326c45d70 ticket: dispatch mcp cli inspection review 2026-06-20 22:49:37 +09:00
Hare ebf6beaaf1 ticket: record mcp cli inspection implementation report 2026-06-20 22:48:46 +09:00
Hare c91f5fc9b8 mcp: add cli inspection 2026-06-20 22:47:41 +09:00
Hare 673c739909 chore: remove daemon crate 2026-06-20 22:41:24 +09:00
Hare 3bc0de1762 ticket: remove obsolete daemon crate 2026-06-20 22:36:51 +09:00
Hare 9af2ad7cd9 ticket: start mcp cli inspection worktree 2026-06-20 22:33:12 +09:00
Hare 12d7e69f07 ticket: accept mcp cli inspection 2026-06-20 22:32:24 +09:00
Hare 142fdffb00 ticket: queue 00001KVJKHAFE 2026-06-20 22:31:00 +09:00
Hare c4687b6816 merge: sync orchestration before queue 00001KVJKHAFE 2026-06-20 22:31:00 +09:00
Hare 9b161d251e ticket: start plugin instance lifecycle worktree 2026-06-20 22:30:49 +09:00
Hare a8f058c792 ticket: add mcp cli inspection 2026-06-20 22:30:19 +09:00
Hare 5ec8bae983 ticket: accept plugin instance lifecycle 2026-06-20 22:29:34 +09:00
Hare 7f06e6567a ticket: queue 00001KVJHYP4Q 2026-06-20 22:28:19 +09:00
Hare 3257cf799a ticket: redesign plugin instance runtime 2026-06-20 22:26:49 +09:00
Hare 70b8ed628d ticket: make plugin lifecycle instance-oriented 2026-06-20 22:18:53 +09:00
Hare aadc0329d2 ticket: clarify service-backed tool state 2026-06-20 22:15:09 +09:00
Hare 120044af80 ticket: plan plugin service ingress surface 2026-06-20 22:02:44 +09:00
Hare dfc5263eec merge: integrate orchestration branch 2026-06-20 21:42:13 +09:00
Hare 2646dfae7e ticket: close queue conflict ticket 2026-06-20 21:42:08 +09:00
Hare 7d087afbf6 ticket: close webfetch pdf text 2026-06-20 21:31:42 +09:00
Hare 59c59a6a70 ticket: complete webfetch pdf text 2026-06-20 21:31:15 +09:00
Hare 97edfe8ae7 merge: webfetch pdf text 2026-06-20 21:28:27 +09:00
Hare daf3ae68c3 ticket: approve webfetch pdf text 2026-06-20 21:28:27 +09:00
Hare df5d65dc2d ticket: dispatch webfetch pdf review 2026-06-20 21:24:51 +09:00
Hare 4887aa33d9 ticket: record webfetch pdf implementation report 2026-06-20 21:24:09 +09:00
Hare b1af95ad20 web: fetch pdf text by pages 2026-06-20 21:22:55 +09:00
Hare 865a11c628 ticket: close intake investigation gate 2026-06-20 21:20:21 +09:00
Hare 7c2c5319f4 ticket: complete intake investigation gate 2026-06-20 21:20:03 +09:00
Hare f62ed4db8a merge: intake investigation gate 2026-06-20 21:19:24 +09:00
Hare 556fc353a8 ticket: approve intake investigation gate 2026-06-20 21:19:24 +09:00
Hare 8fd3cb855f ticket: dispatch intake investigation gate review 2026-06-20 21:17:16 +09:00
Hare 448a24a975 merge: integrate orchestration branch 2026-06-20 21:16:54 +09:00
Hare d547198361 ticket: record intake investigation gate implementation report 2026-06-20 21:16:34 +09:00
Hare 1143ae1c5a workflow: add intake investigation gate 2026-06-20 21:15:18 +09:00
Hare 69c55a21a4 ticket: close profile override scope 2026-06-20 21:13:40 +09:00
Hare 22c631cf88 ticket: complete profile override scope 2026-06-20 21:13:19 +09:00
Hare a13868818c merge: profile override scope 2026-06-20 21:12:19 +09:00
Hare 203160db4f ticket: approve profile override scope 2026-06-20 21:12:19 +09:00
Hare 61ae37a752 ticket: start webfetch pdf and intake gate worktrees 2026-06-20 21:09:57 +09:00
Hare e752a7206a ticket: accept webfetch pdf and intake gate 2026-06-20 21:08:41 +09:00
Hare 36b9ed450f ticket: dispatch profile override scope review 2026-06-20 21:07:06 +09:00
Hare 75215bb143 ticket: queue 00001KVJDJD02 2026-06-20 21:06:37 +09:00
Hare 8e625344e6 ticket: queue 00001KVJA7V2R 2026-06-20 21:06:29 +09:00
Hare 3ecd86dbc2 merge: sync orchestration before queue 00001KVJA7V2R 2026-06-20 21:06:29 +09:00
Hare d95e044913 ticket: record profile override scope implementation report 2026-06-20 21:06:28 +09:00
Hare 0717aae341 pod: preserve profile override scope 2026-06-20 21:04:10 +09:00
Hare 054d44f737 ticket: start profile override scope worktree 2026-06-20 20:55:06 +09:00
Hare c04c8796f5 ticket: add pending work items 2026-06-20 20:53:58 +09:00
Hare 72e9f2f14e ticket: accept profile override scope launch 2026-06-20 20:53:58 +09:00
Hare 9e7c84a430 ticket: queue 00001KVJABS1A 2026-06-20 20:52:33 +09:00
Hare a04fe0a9dd merge: sync orchestration before queue 00001KVJABS1A 2026-06-20 20:52:33 +09:00
Hare 9fbe9e7aea ticket: track profile scope override bug 2026-06-20 19:49:37 +09:00
Hare 93bdad4c42 ticket: close mcp list changed handling 2026-06-20 19:33:08 +09:00
Hare 21008249ea ticket: complete mcp list changed handling 2026-06-20 19:32:43 +09:00
Hare ae5f3e425b merge: mcp list changed handling 2026-06-20 19:31:33 +09:00
Hare fccef54cd6 ticket: approve mcp list changed handling 2026-06-20 19:31:33 +09:00
Hare d67f4023e1 ticket: dispatch mcp list changed review 2026-06-20 19:27:00 +09:00
Hare 4caafe99d3 ticket: record mcp list changed implementation report 2026-06-20 19:26:21 +09:00
Hare e33dee192c mcp: handle list changed notifications 2026-06-20 19:24:59 +09:00
Hare 02cd596139 ticket: start mcp list changed worktree 2026-06-20 19:08:13 +09:00
Hare d31b89072d ticket: accept mcp list changed handling 2026-06-20 19:07:15 +09:00
Hare b11f83c8b3 ticket: close mcp resources prompts tools 2026-06-20 19:05:26 +09:00
Hare dbdae3c63f ticket: complete mcp resources prompts tools 2026-06-20 19:05:02 +09:00
Hare 4a4590f86b merge: mcp resources prompts tools 2026-06-20 19:03:32 +09:00
Hare 25e0ae7f0d ticket: approve mcp resources prompts tools 2026-06-20 19:03:32 +09:00
Hare baefa90df9 ticket: dispatch mcp resources prompts review 2026-06-20 18:58:05 +09:00
Hare c4f3c42957 ticket: record mcp resources prompts implementation report 2026-06-20 18:57:22 +09:00
Hare 3a22360a78 mcp: expose resources prompts tools 2026-06-20 18:56:14 +09:00
Hare e4be4944d8 ticket: start mcp resources prompts worktree 2026-06-20 18:38:20 +09:00
Hare b2b4764f36 ticket: accept mcp resources prompts tools 2026-06-20 18:37:30 +09:00
Hare 6ac916c785 ticket: close dashboard console tui refactor 2026-06-20 18:35:58 +09:00
Hare 831c8dc64e ticket: complete dashboard console tui refactor 2026-06-20 18:35:35 +09:00
Hare 23ec2bbd7e merge: dashboard console tui refactor 2026-06-20 18:33:22 +09:00
Hare 945a61c0ed ticket: approve dashboard console tui refactor 2026-06-20 18:33:22 +09:00
Hare 883badc1d8 ticket: record dashboard console tui state fix 2026-06-20 18:30:21 +09:00
Hare 135343a2e7 tui: preserve dashboard after console return 2026-06-20 18:29:10 +09:00
Hare ff3b779fa9 ticket: request changes on dashboard console tui 2026-06-20 18:22:32 +09:00
Hare 24c8297df1 ticket: close mcp tools call 2026-06-20 18:19:01 +09:00
Hare 656b0220c4 ticket: complete mcp tools call 2026-06-20 18:18:19 +09:00
Hare 399a9d43d3 merge: mcp tools call 2026-06-20 18:17:01 +09:00
Hare ee16a4debc ticket: approve mcp tools call 2026-06-20 18:17:01 +09:00
Hare 454d67d0a2 ticket: dispatch dashboard console tui review 2026-06-20 18:14:15 +09:00
Hare bf44d8124d ticket: record dashboard console tui implementation report 2026-06-20 18:13:29 +09:00
Hare 5415a9478d tui: introduce dashboard console boundaries 2026-06-20 18:12:18 +09:00
Hare 62dd661395 ticket: dispatch mcp tools call review 2026-06-20 18:09:57 +09:00
Hare e6b2144f74 ticket: record mcp tools call implementation report 2026-06-20 18:08:52 +09:00
Hare 9a2454037f mcp: execute stdio tool calls 2026-06-20 18:07:21 +09:00
Hare 2fc20adc23 docs: update plugin authoring guide 2026-06-20 18:00:44 +09:00
Hare ae5528b62f ticket: start mcp tools call worktree 2026-06-20 17:49:30 +09:00
Hare 92432ad750 ticket: accept mcp tools call 2026-06-20 17:48:39 +09:00
Hare 381db88e33 ticket: close mcp tool registration 2026-06-20 17:46:38 +09:00
Hare 7abe13f23d ticket: complete mcp tool registration 2026-06-20 17:46:17 +09:00
Hare a1f904b84d merge: mcp tool registration 2026-06-20 17:44:32 +09:00
Hare 3d147c9e01 ticket: approve mcp tool registration 2026-06-20 17:44:32 +09:00
Hare db23435337 ticket: start dashboard console tui worktree 2026-06-20 17:43:59 +09:00
Hare 7e35721a81 ticket: accept dashboard console tui refactor 2026-06-20 17:42:40 +09:00
Hare 8ce4fcdeba ticket: record mcp tool registration collision fix 2026-06-20 17:40:55 +09:00
Hare 0080c5b3d4 mcp: reject colliding tool names 2026-06-20 17:40:03 +09:00
Hare 865c3f01ba ticket: request changes on mcp tool registration 2026-06-20 17:35:19 +09:00
Hare 37d0105319 ticket: hold dashboard console refactor for capacity 2026-06-20 17:31:36 +09:00
Hare c5cd587780 ticket: queue 00001KVHX0WBE 2026-06-20 17:30:58 +09:00
Hare e881c47abf merge: sync orchestration before queue 00001KVHX0WBE 2026-06-20 17:30:58 +09:00
Hare 952020c8a5 ticket: dispatch mcp tool registration review 2026-06-20 17:30:28 +09:00
Hare db1f6fb6d1 ticket: record mcp tool registration implementation report 2026-06-20 17:29:31 +09:00
Hare 66fa9d55a1 mcp: register stdio server tools 2026-06-20 17:28:26 +09:00
Hare 50224326aa ticket: start mcp tool registration worktree 2026-06-20 17:01:54 +09:00
Hare a59e5c1ed3 ticket: accept mcp tool registration 2026-06-20 17:00:59 +09:00
Hare 5df7580a1e merge: integrate orchestration branch 2026-06-20 17:00:26 +09:00
Hare 96223148c0 ticket: clarify mcp runtime-discovered tools 2026-06-20 17:00:17 +09:00
Hare 68a8fc97d2 ticket: close mcp stdio lifecycle client 2026-06-20 16:59:37 +09:00
Hare ca28c927b2 ticket: complete mcp stdio lifecycle client 2026-06-20 16:59:17 +09:00
Hare 9cf5344fc5 merge: mcp stdio lifecycle client 2026-06-20 16:58:29 +09:00
Hare e5510620cc ticket: approve mcp stdio lifecycle client 2026-06-20 16:58:21 +09:00
Hare 8e6b440f9a ticket: record mcp stdio lifecycle redaction fix 2026-06-20 16:56:06 +09:00
Hare f396e1a253 mcp: redact stdio server spec debug 2026-06-20 16:54:48 +09:00
Hare 39b55fb6e8 ticket: request changes on mcp stdio lifecycle 2026-06-20 16:51:36 +09:00
Hare c91ed5600f ticket: dispatch mcp stdio lifecycle review 2026-06-20 16:46:44 +09:00
Hare 35e6533986 ticket: record mcp stdio lifecycle implementation report 2026-06-20 16:46:05 +09:00
Hare a114fa9d0a mcp: implement stdio lifecycle client 2026-06-20 16:45:05 +09:00
Hare 017c4471ed ticket: start mcp stdio lifecycle worktree 2026-06-20 16:31:10 +09:00
Hare c0e760d73e ticket: accept mcp stdio lifecycle client 2026-06-20 16:30:12 +09:00
Hare 8f5eef94e4 ticket: close mcp stdio config trust 2026-06-20 16:29:03 +09:00
Hare c4a7eb7a2e ticket: complete mcp stdio config trust 2026-06-20 16:28:39 +09:00
Hare 9b7c4e279d merge: mcp stdio config trust 2026-06-20 16:27:12 +09:00
Hare c6fa0b2d95 ticket: approve mcp stdio config trust 2026-06-20 16:27:07 +09:00
Hare a0cd3dd0e9 ticket: dispatch mcp stdio config review 2026-06-20 16:19:31 +09:00
Hare e578d888e3 ticket: record mcp stdio config implementation report 2026-06-20 16:18:46 +09:00
Hare e0680ccee0 mcp: add stdio server config 2026-06-20 16:17:38 +09:00
Hare 6cc8551a6c ticket: start mcp stdio config worktree 2026-06-20 15:57:19 +09:00
Hare b0225e48b8 ticket: accept mcp stdio config trust 2026-06-20 15:56:29 +09:00
Hare a5df9e3728 ticket: close plugin authoring cli 2026-06-20 15:55:14 +09:00
Hare ead96654be ticket: complete plugin authoring cli 2026-06-20 15:54:51 +09:00
Hare 0430ed982d merge: plugin authoring cli 2026-06-20 15:50:55 +09:00
Hare 52e40b2fdc ticket: approve plugin authoring cli 2026-06-20 15:50:48 +09:00
Hare 93265ae65c ticket: record plugin authoring cli hardening fix 2026-06-20 15:46:18 +09:00
Hare 699db538b6 plugin: harden authoring checks 2026-06-20 15:45:12 +09:00
Hare 9ac540f7cf ticket: request changes on plugin authoring cli 2026-06-20 15:36:56 +09:00
Hare 8206b5912d ticket: dispatch plugin authoring cli review 2026-06-20 15:26:33 +09:00
Hare 59d0a58e3a ticket: record plugin authoring cli implementation report 2026-06-20 15:25:47 +09:00
Hare 945ecdf64d plugin: add authoring cli 2026-06-20 15:24:35 +09:00
Hare e37a360d07 ticket: hold queued mcp chain for dependencies 2026-06-20 15:00:52 +09:00
Hare 9881a061fe ticket: queue 00001KVHR3WSW 2026-06-20 14:59:05 +09:00
Hare 76729c3377 ticket: queue 00001KVHR3WSD 2026-06-20 14:59:04 +09:00
Hare f880007639 ticket: queue 00001KVHR3WS6 2026-06-20 14:58:58 +09:00
Hare eee2ce00e2 ticket: queue 00001KVHR3WSN 2026-06-20 14:58:57 +09:00
Hare a729282cc1 ticket: queue 00001KVHR3WRY 2026-06-20 14:58:55 +09:00
Hare 061322d425 ticket: queue 00001KVHR3WRF 2026-06-20 14:58:46 +09:00
Hare 191e7999c0 merge: sync orchestration before queue 00001KVHR3WRF 2026-06-20 14:58:46 +09:00
Hare c0239684ed ticket: start plugin authoring cli worktree 2026-06-20 14:55:36 +09:00
Hare d1095f854a ticket: accept plugin authoring cli 2026-06-20 14:54:50 +09:00
Hare 902b383de7 ticket: close plugin rust pdk templates 2026-06-20 14:53:26 +09:00
Hare ab7ab69f20 ticket: complete plugin rust pdk templates 2026-06-20 14:51:47 +09:00
Hare edc53a6bc9 merge: plugin rust pdk templates 2026-06-20 14:47:33 +09:00
Hare 1f0766c1d7 ticket: approve plugin rust pdk templates 2026-06-20 14:47:25 +09:00
Hare 01f2e926b0 ticket: record plugin rust pdk template fix 2026-06-20 14:40:23 +09:00
Hare 0a9e585c1d plugin: fix rust pdk wit template probes 2026-06-20 14:39:10 +09:00
Hare 75e8103cdd ticket: split mcp stdio roadmap 2026-06-20 14:34:00 +09:00
Hare 356d06ef58 fix: allow queueing behind active blockers 2026-06-20 14:34:00 +09:00
Hare 730bc73975 ticket: hold plugin authoring cli for pdk dependency 2026-06-20 14:23:53 +09:00
Hare b4cb9fbc41 ticket: queue 00001KVHKWNQS 2026-06-20 14:23:14 +09:00
Hare 2c78428d9d merge: sync orchestration before queue 00001KVHKWNQS 2026-06-20 14:23:14 +09:00
Hare 88f4c7e104 ticket: request changes on plugin rust pdk 2026-06-20 14:21:54 +09:00
Hare 3fb3368272 ticket: dispatch plugin rust pdk review 2026-06-20 14:16:58 +09:00
Hare af435fa9bc ticket: record plugin rust pdk implementation report 2026-06-20 14:16:22 +09:00
Hare 06287aca40 plugin: add rust pdk template 2026-06-20 14:15:20 +09:00
Hare 6c04cb9a0b merge: sync orchestration before queue 00001KVHKWNQS 2026-06-20 14:12:46 +09:00
Hare b5e623e5a1 ticket: start plugin rust pdk worktree 2026-06-20 13:54:58 +09:00
Hare 5f7f81bdde ticket: accept plugin rust pdk templates 2026-06-20 13:54:09 +09:00
Hare 9ca2f85b08 ticket: queue 00001KVHKWNQA 2026-06-20 13:52:58 +09:00
Hare 8b42e319e2 ticket: add plugin authoring roadmap 2026-06-20 13:43:16 +09:00
Hare c8877b49a4 ticket: close plugin component model runtime 2026-06-20 02:23:35 +09:00
Hare 54a91f1b7e ticket: complete plugin component model runtime 2026-06-20 02:23:17 +09:00
Hare 63d7ad788d merge: plugin component model runtime 2026-06-20 02:20:03 +09:00
Hare e6619bc6c9 ticket: approve plugin component model runtime 2026-06-20 02:19:59 +09:00
Hare ac58bfdd63 ticket: record component runtime resource fix 2026-06-20 02:17:13 +09:00
Hare a705bb3bf2 plugin: bound component model runtime resources 2026-06-20 02:16:16 +09:00
Hare 30e49d806a ticket: request changes on component model runtime 2026-06-20 02:08:22 +09:00
Hare 5f00329d44 ticket: dispatch plugin component model review 2026-06-20 02:01:02 +09:00
Hare ed33a0b00f ticket: record plugin component model implementation report 2026-06-20 02:00:25 +09:00
Hare 57bbf14e1a plugin: implement component model runtime 2026-06-20 01:58:53 +09:00
Hare 02006fee2e ticket: update plugin component model work metadata 2026-06-20 01:25:34 +09:00
Hare 466e2bf927 ticket: start plugin component model runtime worktree 2026-06-20 01:25:27 +09:00
Hare 878517dcd2 ticket: accept plugin component model runtime 2026-06-20 01:22:02 +09:00
Hare b0ea9513e3 ticket: close plugin fs host api 2026-06-20 01:18:14 +09:00
Hare 817c335f30 ticket: approve plugin fs host api 2026-06-20 01:15:35 +09:00
Hare f8a1e9452e ticket: record plugin fs host api merge 2026-06-20 01:14:52 +09:00
Hare 1097f35ed8 ticket: approve plugin fs host api 2026-06-20 01:12:56 +09:00
Hare 3dac71d0a5 ticket: approve plugin fs host api 2026-06-20 01:12:06 +09:00
Hare 993e407df2 ticket: approve plugin fs host api 2026-06-20 01:11:11 +09:00
Hare c94e157b76 merge: plugin fs host api 2026-06-20 01:10:37 +09:00
Hare ca988ffc3a ticket: approve plugin fs host api 2026-06-20 01:10:37 +09:00
Hare 93bd6bdf01 ticket: dispatch plugin fs host api review 2026-06-20 01:02:48 +09:00
Hare ec600c8806 ticket: record plugin fs host api implementation 2026-06-20 01:01:52 +09:00
Hare 717c0999a5 plugin: implement fs host api 2026-06-20 00:58:44 +09:00
Hare c4d7ad8d0d ticket: record plugin fs host api coder start 2026-06-20 00:39:20 +09:00
Hare 6711bcf300 ticket: accept plugin fs host api work 2026-06-20 00:37:54 +09:00
Hare 838b273d9c ticket: close plugin https host api 2026-06-20 00:36:01 +09:00
Hare f64570ee84 ticket: record plugin https host api merge 2026-06-20 00:34:10 +09:00
Hare 94cb37075a ticket: approve plugin https host api 2026-06-20 00:32:31 +09:00
Hare 6beb8625bf merge: plugin https host api 2026-06-20 00:29:59 +09:00
Hare 998225eb4e ticket: approve plugin https host api 2026-06-20 00:29:59 +09:00
Hare 8de6b447ee ticket: record plugin https target hardening fix 2026-06-20 00:23:18 +09:00
Hare 85683f17c3 plugin: harden https target validation 2026-06-20 00:21:37 +09:00
Hare ffa8e2f25a ticket: dispatch plugin https host api fixes 2026-06-20 00:12:33 +09:00
Hare faadebc67a ticket: request plugin https host api changes 2026-06-20 00:10:49 +09:00
Hare 748074ba9f ticket: dispatch plugin https host api review 2026-06-20 00:05:11 +09:00
Hare 884accd976 ticket: record plugin https host api implementation 2026-06-20 00:04:16 +09:00
Hare 7377527f7c plugin: implement https host api 2026-06-20 00:02:24 +09:00
Hare e44827823a ticket: record plugin https host api coder start 2026-06-19 23:26:40 +09:00
Hare 1fdef32a4d ticket: accept plugin https host api work 2026-06-19 23:25:39 +09:00
Hare da2dbfb108 ticket: close plugin cli inspection 2026-06-19 23:23:00 +09:00
Hare f8230f9f59 ticket: record plugin cli inspection merge 2026-06-19 23:21:35 +09:00
Hare 71ca05c899 merge: plugin cli inspection 2026-06-19 23:18:51 +09:00
Hare 509ca60959 ticket: approve plugin cli inspection 2026-06-19 23:18:51 +09:00
Hare be91977725 ticket: dispatch plugin cli missing-diagnostic re-review 2026-06-19 23:11:31 +09:00
Hare 22be375f1b ticket: record plugin cli missing-diagnostic fix report 2026-06-19 23:10:41 +09:00
Hare 0142ef1d3f plugin: distinguish present invalid packages 2026-06-19 23:08:06 +09:00
Hare 6e4c49df61 ticket: dispatch plugin cli missing-diagnostic fixes 2026-06-19 23:03:41 +09:00
Hare 4bf6b1bf0f ticket: request plugin cli missing-diagnostic changes 2026-06-19 23:02:48 +09:00
Hare d2ee3bf379 ticket: dispatch plugin cli invalid package re-review 2026-06-19 22:55:02 +09:00
Hare f1c182072b ticket: record plugin cli invalid package fix report 2026-06-19 22:54:13 +09:00
Hare 877ec94fc9 ticket: dispatch plugin cli invalid package fixes 2026-06-19 22:53:10 +09:00
Hare a5709d8bfc ticket: request plugin cli invalid package changes 2026-06-19 22:52:00 +09:00
Hare a5f3b0b554 plugin: reject configured invalid packages 2026-06-19 22:51:02 +09:00
Hare 3a0fd1c219 ticket: dispatch plugin cli invalid package fixes 2026-06-19 22:45:54 +09:00
Hare 8e600311d0 ticket: request plugin cli invalid package changes 2026-06-19 22:45:09 +09:00
Hare ea6355a73d ticket: dispatch plugin cli schema re-review 2026-06-19 22:37:02 +09:00
Hare 3cfb3a647e ticket: record plugin cli schema fix report 2026-06-19 22:36:03 +09:00
Hare 22af7fd342 ticket: queue 00001KVG0HR96 2026-06-19 22:34:43 +09:00
Hare c0f70d1a88 merge: integrate orchestration branch 2026-06-19 22:33:30 +09:00
Hare 8b135cf47a ticket: close plugin design umbrella 2026-06-19 22:29:47 +09:00
Hare e5126321ad ticket: plan plugin component model migration 2026-06-19 22:21:31 +09:00
Hare 982a1b75ed plugin: validate inspected tool schemas 2026-06-19 20:47:11 +09:00
Hare 86c87ded89 ticket: dispatch plugin cli schema validation fixes 2026-06-19 20:42:31 +09:00
Hare 66821b30a7 ticket: request plugin cli schema validation changes 2026-06-19 20:41:32 +09:00
Hare ecd3f124be ticket: dispatch plugin cli metadata re-review 2026-06-19 20:34:35 +09:00
Hare 41db5a9bf9 ticket: record plugin cli metadata fix report 2026-06-19 20:33:55 +09:00
Hare dfa966dbfc plugin: report inspection package metadata 2026-06-19 20:31:26 +09:00
Hare 00a2459a86 ticket: dispatch plugin cli path api fixes 2026-06-19 20:24:14 +09:00
Hare d5b718b380 ticket: request plugin cli path api changes 2026-06-19 20:23:32 +09:00
Hare 9e08291579 ticket: dispatch plugin cli inspection re-review 2026-06-19 20:17:57 +09:00
Hare 075cdfc810 ticket: record plugin cli inspection fix report 2026-06-19 20:17:15 +09:00
Hare b5f10ab7dc plugin: align inspection statuses 2026-06-19 20:15:48 +09:00
Hare 71f4c11fea ticket: dispatch plugin cli inspection fixes 2026-06-19 20:08:47 +09:00
Hare 8a623394da ticket: request plugin cli inspection changes 2026-06-19 20:08:06 +09:00
Hare 349a55fa33 ticket: dispatch plugin cli inspection review 2026-06-19 20:03:57 +09:00
Hare 83699e2011 ticket: record plugin cli inspection implementation 2026-06-19 20:03:12 +09:00
Hare 462de32a5a plugin: add cli inspection 2026-06-19 19:58:10 +09:00
Hare 630548644d ticket: record plugin cli inspection coder start 2026-06-19 19:24:02 +09:00
Hare d51b610f97 ticket: record plugin host api waiting metadata 2026-06-19 19:23:07 +09:00
Hare aea2a8a45d ticket: accept plugin cli inspection work 2026-06-19 19:22:56 +09:00
Hare 3b026b2f5f ticket: queue 00001KVFDX9AF 2026-06-19 19:19:53 +09:00
Hare ecb23a1651 ticket: queue 00001KVFDX9AY 2026-06-19 19:19:52 +09:00
Hare d7f0a718c3 ticket: queue 00001KVFD3YSV 2026-06-19 19:19:28 +09:00
Hare f1876321c5 ticket: add plugin host api followups 2026-06-19 16:54:40 +09:00
Hare 8940262618 ticket: close panel startup e2e work 2026-06-19 14:44:18 +09:00
Hare 69ab9f7c22 fix: speed up panel startup pod probes 2026-06-19 13:19:49 +09:00
Hare caf18dbaab test: measure panel shell startup path 2026-06-19 13:04:45 +09:00
Hare 7593202492 test: align panel dashboard readiness fixture 2026-06-19 00:53:30 +09:00
Hare 63449a8c26 ticket: close panel workspace pod filter 2026-06-19 00:40:49 +09:00
Hare 0ef36b4e02 merge: panel workspace pod filter 2026-06-19 00:38:03 +09:00
Hare 8e8d95eba4 ticket: approve panel workspace pod filter 2026-06-19 00:38:03 +09:00
Hare 49cc0f2e80 ticket: dispatch panel workspace pod re-review 2026-06-19 00:29:55 +09:00
Hare f7179f7a99 ticket: record panel workspace pod fix report 2026-06-19 00:29:15 +09:00
Hare 160c96ad1e pod: persist metadata workspace root 2026-06-19 00:28:19 +09:00
Hare 86ce56b941 ticket: dispatch panel workspace pod fixes 2026-06-19 00:25:31 +09:00
Hare 6952b265b5 ticket: request panel workspace pod changes 2026-06-19 00:24:47 +09:00
Hare 38cc57e7fb ticket: dispatch panel workspace pod review 2026-06-19 00:16:52 +09:00
Hare 7b975aaf93 ticket: record panel workspace pod implementation 2026-06-19 00:16:04 +09:00
Hare 3b634d66ca tui: filter panel pods by workspace 2026-06-19 00:14:02 +09:00
Hare 6fe2dcdf8e ticket: record panel workspace pod coder start 2026-06-18 23:51:56 +09:00
Hare e2e76d3beb ticket: accept panel workspace pod filter 2026-06-18 23:51:03 +09:00
Hare 6cd2af7b72 ticket: close panel dashboard readiness 2026-06-18 23:48:59 +09:00
Hare 6d289a583a ticket: queue 00001KVDH2E06 2026-06-18 23:47:10 +09:00
Hare 667873bdbf merge: sync orchestration before queue 00001KVDH2E06 2026-06-18 23:47:10 +09:00
Hare 2d4d11e476 merge: panel dashboard readiness metric 2026-06-18 23:46:59 +09:00
Hare a92dff05f8 ticket: approve panel dashboard readiness 2026-06-18 23:46:59 +09:00
Hare cd07a9d846 ticket: dispatch panel dashboard re-review 2026-06-18 23:42:29 +09:00
Hare cd86cc533c fix: restore orchestrator companion notifications 2026-06-18 23:42:07 +09:00
Hare 656f3fb249 ticket: record panel dashboard fix report 2026-06-18 23:41:52 +09:00
Hare 5870251bdf tui: tighten panel dashboard readiness 2026-06-18 23:39:52 +09:00
Hare ef0c22eae9 ticket: close plugin permission grants 2026-06-18 23:24:50 +09:00
Hare 94aa3c1d3b merge: plugin permission grants 2026-06-18 23:22:49 +09:00
Hare a172d46c90 ticket: approve plugin grants implementation 2026-06-18 23:22:40 +09:00
Hare 486ee5f41e ticket: dispatch panel dashboard review fixes 2026-06-18 23:21:02 +09:00
Hare d98872af4c ticket: request panel dashboard review changes 2026-06-18 23:20:26 +09:00
Hare 20cc77573b ticket: dispatch reviewers for implementation branches 2026-06-18 23:16:32 +09:00
Hare 7ae725c95d ticket: record coder implementation reports 2026-06-18 23:15:32 +09:00
Hare b1ba15995f plugin: enforce permission grants 2026-06-18 23:13:40 +09:00
Hare fc1ee5bb55 tui: measure panel dashboard readiness 2026-06-18 23:13:06 +09:00
Hare 6c52e5dddf ticket: record panel dashboard coder start 2026-06-18 22:59:29 +09:00
Hare 3b4879446f ticket: accept panel dashboard latency work 2026-06-18 22:58:41 +09:00
Hare b5f0081566 ticket: record plugin grants coder resume 2026-06-18 22:57:43 +09:00
Hare dcbfb6314e ticket: queue 00001KVDETSN6 2026-06-18 22:55:08 +09:00
Hare d2833ffded merge: sync orchestration before queue 00001KVDETSN6 2026-06-18 22:55:08 +09:00
Hare 8cbade818f chore: record panel followups 2026-06-18 22:41:54 +09:00
Hare 9ca89250b4 ticket: record plugin grant spawn failure 2026-06-18 22:12:56 +09:00
Hare a984f5809f ticket: accept plugin permission grants 2026-06-18 22:12:03 +09:00
Hare b6685af3ae ticket: queue 00001KV5W3PJ3 2026-06-18 22:11:00 +09:00
Hare 63d864e1f0 merge: sync orchestration before queue 00001KV5W3PJ3 2026-06-18 22:11:00 +09:00
Hare 6641bf4860 ticket: complete plugin wasm runtime 2026-06-18 21:39:40 +09:00
Hare 05cd788c13 merge: plugin wasm tool runtime 2026-06-18 21:37:21 +09:00
Hare c05bfaa9c4 ticket: approve plugin wasm runtime 2026-06-18 21:37:21 +09:00
Hare f2d4194f37 ticket: record plugin wasm runtime implementation 2026-06-18 21:31:09 +09:00
Hare 10d12148dd feat: run plugin tools through wasm runtime 2026-06-18 21:29:41 +09:00
Hare ca29cd3b89 ticket: complete panel rows-ready e2e 2026-06-18 21:25:23 +09:00
Hare 226eca7a9d merge: panel rows-ready e2e 2026-06-18 21:24:10 +09:00
Hare 49db85c09a ticket: approve panel rows-ready e2e 2026-06-18 21:24:09 +09:00
Hare 4be925f56c ticket: close commit noise policy 2026-06-18 21:22:17 +09:00
Hare 7de73dbd33 ticket: record panel rows-ready implementation 2026-06-18 21:19:51 +09:00
Hare fffdfd2721 test: assert panel rows-ready fixture data 2026-06-18 21:17:51 +09:00
Hare 54cc87132e ticket: resume queued implementation pods 2026-06-18 21:06:11 +09:00
Hare 94f63b1324 merge: sync orchestration before queue 00001KV5W3PJ3 2026-06-18 20:20:44 +09:00
Hare e729e75aaa ticket: record spawn runtime failure 2026-06-17 18:51:03 +09:00
Hare d32fb3bc3c ticket: route wasm runtime and panel readiness e2e 2026-06-17 18:49:29 +09:00
Hare bcb8068ebd ticket: queue 00001KV5W3PHW 2026-06-17 18:46:10 +09:00
Hare a2583b8114 ticket: queue 00001KV62PF32 2026-06-17 18:46:03 +09:00
Hare 9d477f37e7 ticket: close plugin tool surface 2026-06-17 14:44:13 +09:00
Hare cce36419ac merge: integrate orchestration branch 2026-06-17 14:41:20 +09:00
Hare 05c6978d80 ticket: correct panel startup readiness metric 2026-06-17 14:41:15 +09:00
Hare 0da2b5db7b ticket: complete plugin tool surface 2026-06-16 01:40:07 +09:00
Hare 204d0d022f merge: plugin tool surface registration 2026-06-16 01:38:46 +09:00
Hare fb39bf38a1 ticket: approve plugin tool schema fix 2026-06-16 01:38:46 +09:00
Hare fb44159261 ticket: record plugin tool schema fix 2026-06-16 01:31:00 +09:00
Hare 3413bae7d7 fix: reject nested plugin tool schema errors 2026-06-16 01:30:00 +09:00
Hare d9b986853f ticket: request plugin tool schema changes 2026-06-16 01:26:44 +09:00
Hare f262815990 ticket: record plugin tool surface implementation 2026-06-16 01:20:13 +09:00
Hare 05a9c52217 feat: register plugin tool surfaces 2026-06-16 01:18:54 +09:00
Hare fcae886044 ticket: accept plugin tool surface work 2026-06-16 00:54:32 +09:00
Hare 1fdb4cd6f4 ticket: queue 00001KV5W3PHA 2026-06-16 00:53:32 +09:00
Hare 15e60dcbe6 merge: integrate orchestration branch 2026-06-16 00:50:08 +09:00
Hare a03b86e749 ticket: complete plugin resolver 2026-06-16 00:30:09 +09:00
Hare f678383aad merge: plugin package resolver 2026-06-16 00:27:15 +09:00
Hare 1337425504 ticket: approve plugin resolver restore fix 2026-06-16 00:27:15 +09:00
Hare 37e11e465f ticket: record plugin resolver restore fix 2026-06-16 00:16:22 +09:00
Hare 07978d2df5 fix: persist plugin snapshots for restore 2026-06-16 00:15:04 +09:00
Hare 65803c7868 ticket: close completed panel work 2026-06-16 00:09:02 +09:00
Hare a2b991adf8 ticket: request plugin resolver restore fixes 2026-06-16 00:06:02 +09:00
Hare f223bf44ce ticket: add plugin tool followups 2026-06-16 00:00:14 +09:00
Hare 60348708a1 ticket: record plugin resolver fixes 2026-06-15 23:53:30 +09:00
Hare ede7acfdf6 fix: pin plugin resolution metadata 2026-06-15 23:52:13 +09:00
Hare c29d378d4c ticket: request plugin resolver changes 2026-06-15 23:37:18 +09:00
Hare a89b7ac5de ticket: complete panel startup latency e2e 2026-06-15 23:31:36 +09:00
Hare 6f99ebedcc merge: panel startup latency e2e 2026-06-15 23:30:16 +09:00
Hare 77ace64f87 ticket: record plugin resolver implementation 2026-06-15 23:28:02 +09:00
Hare a03a9da64a feat: add plugin package resolver 2026-06-15 23:26:46 +09:00
Hare 9bad2745f7 fix: measure and defer panel startup reload 2026-06-15 23:24:16 +09:00
Hare 4772c4d6a5 ticket: route plugin and panel latency work 2026-06-15 23:01:29 +09:00
Hare 425a6c66a8 ticket: queue 00001KV5MRH6D 2026-06-15 22:59:47 +09:00
Hare d8300a0211 ticket: queue 00001KV5R5V2S 2026-06-15 22:59:47 +09:00
Hare 49abbd9519 ticket: add panel startup latency e2e 2026-06-15 22:50:38 +09:00
Hare 65fa4c06ce merge: integrate orchestration branch 2026-06-15 22:48:46 +09:00
Hare c3d1490443 ticket: add plugin package resolver 2026-06-15 22:48:26 +09:00
Hare 648422c966 ticket: complete panel orchestration overlay 2026-06-15 22:05:29 +09:00
Hare eeb6986f16 merge: panel orchestration overlay 2026-06-15 22:04:30 +09:00
Hare 3eef5fe1b5 ticket: approve panel orchestration overlay 2026-06-15 22:04:29 +09:00
Hare 01e8cd7fb0 ticket: record panel overlay implementation 2026-06-15 21:57:21 +09:00
Hare e0ddbed1eb feat: show orchestration ticket overlay in panel 2026-06-15 21:56:17 +09:00
Hare 95abdc8d94 ticket: accept panel orchestration overlay 2026-06-15 21:40:53 +09:00
Hare 318aa1912b ticket: queue 00001KV5D7MG5 2026-06-15 21:39:21 +09:00
Hare 6572791e50 merge: integrate orchestration branch 2026-06-15 19:48:59 +09:00
Hare 665c58deab ticket: add panel orchestration overlay 2026-06-15 19:48:49 +09:00
Hare c0d8badf55 ticket: complete single-pod text selection 2026-06-15 16:16:06 +09:00
Hare 3fa52f2c01 merge: single-pod text selection 2026-06-15 16:11:47 +09:00
Hare 73e26c41b5 ticket: approve single-pod selection 2026-06-15 16:11:47 +09:00
Hare 314e317a9a ticket: complete panel row hierarchy 2026-06-15 16:09:15 +09:00
Hare 8c00a6e98e merge: panel row hierarchy 2026-06-15 16:08:23 +09:00
Hare 09c7153a04 ticket: approve panel row hierarchy 2026-06-15 16:08:23 +09:00
Hare 10c29c5ae4 ticket: record panel row hierarchy implementation 2026-06-15 16:04:17 +09:00
Hare 2998f37b5a ticket: record single-pod selection implementation 2026-06-15 16:02:54 +09:00
Hare f3b435e724 fix: clarify panel ticket row hierarchy 2026-06-15 16:02:31 +09:00
Hare 09f5e9d51a feat: add single-pod text selection 2026-06-15 16:01:13 +09:00
Hare 79dda10da3 ticket: accept panel row hierarchy work 2026-06-15 15:52:29 +09:00
Hare 1d21aae32c ticket: complete panel alt-enter newline 2026-06-15 15:51:12 +09:00
Hare 0335cad9ff merge: panel alt-enter newline 2026-06-15 15:50:32 +09:00
Hare dba335f74a ticket: approve panel alt-enter fix 2026-06-15 15:50:32 +09:00
Hare 3001bc6873 ticket: record panel alt-enter implementation 2026-06-15 15:46:37 +09:00
Hare 5c33917753 fix: align panel alt-enter composer handling 2026-06-15 15:45:30 +09:00
Hare 368249d677 ticket: route queued tui panel work 2026-06-15 15:39:26 +09:00
Hare f0de841360 ticket: queue 00001KV4ZPAD3 2026-06-15 15:37:02 +09:00
Hare f205fb7540 ticket: queue 00001KV4ZDMV1 2026-06-15 15:37:01 +09:00
Hare ba5d0ee605 ticket: queue 00001KV4YAAVY 2026-06-15 15:37:00 +09:00
Hare 6d4b700181 ticket: record panel and plugin followups 2026-06-15 15:35:35 +09:00
537 changed files with 78982 additions and 5101 deletions
+1
View File
@@ -1,2 +1,3 @@
/memory/ /memory/
tickets/.ticket-backend.lock tickets/.ticket-backend.lock
/workspace.db*
+72 -33
View File
@@ -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.
+101
View File
@@ -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.
+249
View File
@@ -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 記録に留める。
+268
View File
@@ -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 の両方に照らして判断する。
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+18
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+18
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+18
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+18
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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
--- ---
+8
View File
@@ -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.
+25
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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'
--- ---
+3
View File
@@ -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 は開始されていません。
+20
View File
@@ -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 は開始されていません。
--- ---
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+18
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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
+10
View File
@@ -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.
+27
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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'
--- ---
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KTFY8V80` (`Preserve active workflows across compaction`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+20
View File
@@ -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 は開始されていません。
--- ---
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+35
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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'
--- ---
## 背景 ## 背景
+11
View File
@@ -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.
+28
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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']
+13
View File
@@ -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.
+30
View File
@@ -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.
--- ---
+2 -2
View File
@@ -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']
+3
View File
@@ -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 は開始されていません。
+20
View File
@@ -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 は開始されていません。
--- ---
+2 -2
View File
@@ -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']
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KV3A5CNH` (`Panel: invalid Ticket があっても Ticket 機能全体を無効化しない`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+20
View File
@@ -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 は開始されていません。
--- ---
+2 -2
View File
@@ -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']
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KV3BQ7Q3` (`対象 TUI/Panel merge commit の挙動を現行 E2E で確認する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+20
View File
@@ -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"
}
]
}
+110
View File
@@ -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.
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KV4YAAVY` (`single-Pod View Item text をマウスドラッグで選択・コピーできるようにする`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+286
View File
@@ -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"}
+85
View File
@@ -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`
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KV4ZDMV1` (`Panel composer で Alt+Enter 改行を SessionView と揃える`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+230
View File
@@ -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"}
+117
View File
@@ -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`
+3
View File
@@ -0,0 +1,3 @@
Ticket `00001KV4ZPAD3` (`Panel Ticket / Intake Pod row の視覚階層を改善する`) はすでに `state: done` に到達していたため、workspace Panel から close しました。
この Close action によって、実装作業、state 変更、Orchestrator/Companion launch、worker invocation は開始されていません。
+302
View File
@@ -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"}
+107
View File
@@ -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`
+3
View File
@@ -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 は開始されていません。
+271
View File
@@ -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` closedorchestration branch config)、`00001KV12W2RT` closedtwo-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"}
+105
View File
@@ -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`
+9
View File
@@ -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.
+244
View File
@@ -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"}
+149
View File
@@ -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.
+3
View File
@@ -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 は開始されていません。
+547
View File
@@ -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` donePlugin 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"
}
]
}
+87
View File
@@ -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.
+17
View File
@@ -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
+436
View File
@@ -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 に originplugin 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"
}
]
}
+92
View File
@@ -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.
+3
View File
@@ -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 は開始されていません。
+332
View File
@@ -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"
}
]
}
+100
View File
@@ -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.
+30
View File
@@ -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.
+389
View File
@@ -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