vibe-coding-master 0.3.22 → 0.3.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +2 -2
  2. package/dist/backend/adapters/git-adapter.js +53 -0
  3. package/dist/backend/api/artifact-routes.js +1 -28
  4. package/dist/backend/api/codex-translation-routes.js +24 -0
  5. package/dist/backend/api/harness-routes.js +10 -0
  6. package/dist/backend/api/task-routes.js +2 -6
  7. package/dist/backend/gateway/gateway-service.js +3 -16
  8. package/dist/backend/server.js +5 -2
  9. package/dist/backend/services/artifact-service.js +1 -30
  10. package/dist/backend/services/codex-hook-service.js +30 -9
  11. package/dist/backend/services/codex-translation-service.js +17 -40
  12. package/dist/backend/services/harness-service.js +106 -0
  13. package/dist/backend/services/session-service.js +189 -15
  14. package/dist/backend/services/status-service.js +1 -6
  15. package/dist/backend/services/task-service.js +42 -110
  16. package/dist/backend/services/translation-service.js +15 -4
  17. package/dist/backend/templates/handoff.js +3 -3
  18. package/dist/backend/templates/harness/architect-agent.js +3 -2
  19. package/dist/backend/templates/harness/coder-agent.js +6 -1
  20. package/dist/backend/templates/harness/project-manager-agent.js +10 -1
  21. package/dist/backend/templates/harness/vcm-route-message-skill.js +8 -2
  22. package/dist/shared/types/app-settings.js +3 -2
  23. package/dist-frontend/assets/index-CKWy15WL.js +94 -0
  24. package/dist-frontend/assets/index-Cfum1Prr.css +32 -0
  25. package/dist-frontend/index.html +2 -2
  26. package/docs/cc-best-practices.md +1 -1
  27. package/docs/codex-translation-plan.md +41 -37
  28. package/docs/full-harness-baseline.md +0 -1
  29. package/docs/gateway-design.md +9 -13
  30. package/docs/product-design.md +23 -44
  31. package/docs/v0.4-custom-workflow-plan.md +785 -0
  32. package/docs/vcm-cc-best-practices.md +15 -13
  33. package/package.json +1 -1
  34. package/dist-frontend/assets/index-CEB6Bssn.js +0 -95
  35. package/dist-frontend/assets/index-Dmefx9m7.css +0 -32
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f2ea;color:#1c2024;line-height:1.5}html,body,#root{height:100%}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f2ea}button,input,select,textarea{font:inherit}button{border:1px solid #9ba6ad;background:#f8f7f2;color:#1d252b;border-radius:6px;min-height:34px;padding:6px 10px;cursor:pointer}button:hover:not(:disabled){background:#eef4f2;border-color:#607d74}button:disabled{cursor:not-allowed;opacity:.55}.danger-button{border-color:#b84a45;background:#fff1ee;color:#8d211d;font-weight:750}.danger-button:hover:not(:disabled){border-color:#8d211d;background:#ffe2dc}input,select,textarea:not(.xterm-helper-textarea){width:100%;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:8px 10px}textarea:not(.xterm-helper-textarea){min-height:240px;resize:vertical;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}h1,h2,p{margin-top:0}h1{margin-bottom:4px;font-size:26px;line-height:1.15}h2{margin-bottom:10px;font-size:14px;letter-spacing:0}.app-shell{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);height:100vh;min-height:0;overflow:hidden}.app-shell.is-sidebar-collapsed{grid-template-columns:46px minmax(0,1fr)}.app-sidebar{position:relative;display:flex;flex-direction:column;min-width:0;border-right:1px solid #d3c9b8;background:#fbfaf6;padding:14px;overflow:auto}.app-shell.is-sidebar-collapsed .app-sidebar{overflow:hidden;padding:8px}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:2;display:grid;place-items:center;width:28px;min-height:28px;padding:0;background:#fffdf8}.sidebar-toggle:before{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;content:"";transform:translate(2px) rotate(135deg)}.app-shell.is-sidebar-collapsed .sidebar-toggle{left:9px;right:auto}.app-shell.is-sidebar-collapsed .sidebar-toggle:before{transform:translate(-2px) rotate(-45deg)}.sidebar-content{display:flex;flex:1;min-width:0;min-height:0}.project-dashboard{display:flex;flex:1;flex-direction:column;width:100%;min-height:100%}.app-shell.is-sidebar-collapsed .sidebar-content{width:0;opacity:0;pointer-events:none}.app-main{min-width:0;height:100%;padding:14px 16px;overflow:auto}.brand-header{display:flex;gap:12px;align-items:baseline;margin-bottom:10px;padding-right:34px}.brand-header strong{font-size:18px}.brand-header span,.muted{color:#667071;font-size:13px}.sidebar-section{margin-bottom:8px;border:1px solid #e0d6c7;border-radius:8px;background:#fffdfa;overflow:hidden}.sidebar-section-toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-height:34px;border:0;border-radius:0;background:transparent;color:#1c2024;font-size:13px;font-weight:750;text-align:left}.sidebar-section-toggle:hover{background:#f5f1e8}.sidebar-section-toggle[aria-expanded=true]{border-bottom:1px solid #ece5d9}.sidebar-section-chevron{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;transform:rotate(45deg)}.sidebar-section-toggle[aria-expanded=true] .sidebar-section-chevron{transform:rotate(-135deg)}.sidebar-section-content{padding:8px}.repo-connect,.project-summary,.gateway-panel,.harness-panel,.task-create{margin:0}.inline-form{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.inline-form.has-recent-paths{grid-template-columns:minmax(0,1fr) auto}.inline-form>input{grid-column:1 / -1}.inline-form>button{justify-self:end}.inline-form.has-recent-paths>button{justify-self:auto}.repo-recent-select{min-width:0;max-width:none}.project-summary dl{display:grid;gap:8px;margin:0}.project-summary div{min-width:0}.project-summary dt{color:#6c6255;font-size:12px}.project-summary dd{margin:0;overflow-wrap:anywhere;font-size:13px}.connected-repo-actions{display:flex;align-items:center;gap:8px;margin-top:10px}.connected-repo-actions button{min-height:30px}.gateway-actions{display:grid;gap:8px;margin-top:10px}.gateway-actions button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.gateway-actions .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.gateway-qr{display:grid;gap:6px;margin-top:10px}.gateway-qr img{width:100%;max-width:180px;border:1px solid #d3c9b8;border-radius:6px;background:#fff;padding:6px}.gateway-qr code{overflow-wrap:anywhere;font-size:11px}.warnings,.error-banner{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.flow-pause-alert-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:#1f242b85;padding:20px}.flow-pause-alert{display:grid;gap:12px;width:min(460px,100%);border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 28px 72px #1f242b47;padding:22px}.flow-pause-alert-kicker{margin:0;color:#2f6f73;font-size:12px;font-weight:700;text-transform:uppercase}.flow-pause-alert h2{margin:0;font-size:24px;line-height:1.15}.flow-pause-alert p{margin:0;font-size:14px;line-height:1.5}.flow-pause-alert-hint{color:#49666a}.flow-pause-alert button{justify-self:end;min-width:110px;border:1px solid #2f6f73;background:#2f6f73;color:#fffdf8}.flow-pause-alert button:hover{background:#245c60}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:10px}.harness-stage{display:grid;gap:8px}.harness-panel-header{display:flex;justify-content:space-between;gap:8px;align-items:center}.harness-panel-header h2,.harness-panel-header p,.harness-result p{margin-bottom:0}.harness-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-file-list-title{margin:0;font-size:12px}.harness-file-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-file-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;border:1px solid #ece5d9;border-radius:6px;padding:6px 8px;background:#fffdfa}.harness-file-list span{overflow:hidden;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.harness-changes,.harness-result{border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-changes h3{margin:0 0 4px;font-size:12px}.harness-changes ul,.harness-result ul{margin:0;padding-left:18px}.harness-bootstrap-session{display:grid;gap:8px;border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-bootstrap-session>div:first-child{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.harness-bootstrap-session span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);background:#1f242b94;padding:14px}.harness-bootstrap-modal-surface{min-width:0;min-height:0;display:grid;grid-template-rows:auto minmax(0,1fr);gap:10px;border:1px solid #b9b0a1;border-radius:8px;background:#fffdf8;box-shadow:0 22px 64px #1f242b47;padding:10px}.harness-bootstrap-modal-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-bootstrap-modal-header p{max-width:min(720px,70vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.harness-bootstrap-terminal{min-width:0;min-height:0;display:grid}.task-create form{display:grid;gap:8px}.task-create-preview{display:grid;gap:2px;border:1px solid #e0d6c7;border-radius:6px;background:#f8f7f2;padding:6px 8px}.task-create-option{display:flex;align-items:center;gap:8px;color:#1f242b;font-size:13px;font-weight:700}.task-create-option input{width:16px;height:16px;margin:0}.task-create-preview span{color:#255f3d;font-size:12px;font-weight:700}.task-create-preview small{overflow:hidden;color:#687273;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.task-nav{display:grid;gap:8px}.task-nav-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left}.task-nav-item.is-active,.role-tab.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings{display:grid;gap:8px}.sidebar-settings button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.sidebar-settings .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings .theme-mode-toggle span:last-child{font-weight:750}.settings-select-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;font-size:13px;color:#5f6a6c}.settings-select-row select{min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326}.settings-status-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;border:1px solid #d4cec3;border-radius:6px;background:#fffdf8;padding:6px 10px;color:#5f6a6c;font-size:13px}.settings-status-row strong{color:#202326;font-size:12px}.task-status-dock{display:grid;gap:10px;margin-top:auto;border-top:1px solid #d3c9b8;padding-top:10px}.task-status-dock-title,.current-round-title{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.task-status-dock-title strong{overflow:hidden;font-size:13px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.task-status-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0}.task-status-stats div,.current-round-status{min-width:0;border:1px solid #e0d6c7;border-radius:6px;background:#fffdfa}.task-status-stats div{padding:6px 7px}.task-status-stats dt{color:#6c6255;font-size:10px;font-weight:700;text-transform:uppercase}.task-status-stats dd{margin:0;overflow:hidden;color:#1f242b;font-size:12px;font-weight:750;text-overflow:ellipsis;white-space:nowrap}.current-round-status{display:grid;gap:8px;padding:8px}.current-round-title span:first-child{color:#3a4647;font-size:12px;font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(120px,max-content) minmax(420px,1fr) auto;gap:10px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.workspace-header-actions{display:flex;gap:8px;align-items:center;justify-content:flex-end;min-width:max-content}.role-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:6px;margin-bottom:8px;min-width:0}.workspace-header .role-tabs{margin-bottom:0}.role-tab{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:30px;padding:4px 8px;text-align:left}.workspace-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1;gap:10px;align-items:stretch;min-height:0}.workspace-main{min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px}.role-console-stack{min-width:0;min-height:0;flex:1;display:flex;flex-direction:column}.role-console-panel{min-width:0;min-height:0;flex:1;display:none}.role-console-panel.is-active{display:flex;flex-direction:column}.session-console,.message-panel,.event-log,.empty-workspace{border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:10px}.task-workspace{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0}.session-console{display:flex;flex-direction:column;flex:1;height:100%;min-height:0}.session-controls{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;justify-content:flex-start;min-width:0;margin:0;overflow:hidden}.session-option-field{display:grid;grid-template-columns:auto minmax(120px,1fr);flex:0 1 210px;gap:5px;align-items:center;min-width:0}.permission-mode-field{flex-basis:250px}.model-field{flex-basis:220px}.effort-field{grid-template-columns:auto minmax(92px,1fr);flex-basis:150px}.session-option-field span{color:#5f6a6c;font-size:11px;font-weight:650;line-height:1;white-space:nowrap}.session-option-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.session-option-field select{width:100%;min-width:0;min-height:26px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:2px 7px;font-size:12px}.session-toolbar{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:5px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:26px;padding:2px 8px;font-size:12px}.orchestration-toggle{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:30px;border:1px solid #b5bec4;border-radius:6px;background:#fffefa;color:#4f5558;font-size:12px;font-weight:650;padding:3px 10px;white-space:nowrap}.orchestration-toggle strong{font-size:11px;text-transform:uppercase}.orchestration-toggle.is-active{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);flex:1;min-width:0;min-height:0;height:100%}.session-console-body.has-translation{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:stretch}.terminal-pane,.translation-pane{display:grid;min-width:0;min-height:0;height:100%}.terminal-pane{grid-template-rows:auto minmax(0,1fr);gap:8px}.translation-pane{grid-template-rows:minmax(0,1fr)}.terminal-frame,.terminal-empty{width:100%;height:100%;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.terminal-empty{display:grid;place-items:center;align-content:center;gap:8px;color:#d6d0c6;border:1px solid #292d31}.translation-panel{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0;border:1px solid #292d31;border-radius:6px;background:#0d1117;color:#d6deeb;padding:8px;min-width:0;width:100%;overflow:hidden;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-backdrop{background:#010409b8}.translation-file-browser-backdrop{z-index:24}.file-translation-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:95vw;height:95vh;min-height:0;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 28px 80px #0000008f;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-header{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;min-width:0}.file-translation-header h2,.file-translation-header p{margin-bottom:0}.file-translation-header h2{font-size:18px}.file-translation-header p{color:#8b949e;font-size:12px}.file-translation-toolbar{display:flex;flex-wrap:wrap;gap:6px}.file-translation-toolbar button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.file-translation-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.file-translation-list,.file-translation-preview{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:8px}.file-translation-list{display:grid;align-content:start;gap:6px}.file-translation-item{display:grid;gap:3px;width:100%;min-width:0;border:1px solid #292d31;border-radius:6px;background:#111820;color:#d6deeb;padding:6px;text-align:left}.file-translation-item strong,.file-translation-item span{overflow-wrap:anywhere}.file-translation-item span{color:#8b949e;font-size:11px}.file-translation-item.is-active{border-color:#58a6ff;background:#142033}.file-translation-preview header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-bottom:8px;color:#8b949e;font-size:12px}.file-translation-preview{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;padding:10px}.file-translation-preview .translation-markdown{min-height:0;overflow:auto;padding-right:4px;font-size:13px;line-height:1.62}.file-translation-preview>.muted{align-self:center;justify-self:center;text-align:center}.translation-file-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:min(880px,calc(100vw - 32px));max-height:min(760px,calc(100vh - 48px));min-height:520px;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 24px 70px #0000007a;font-family:Menlo,Monaco,Consolas,monospace}.translation-file-browser-modal header,.translation-file-browser-controls,.translation-file-browser-nav,.translation-file-browser-search{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.translation-file-browser-modal header{justify-content:space-between}.translation-file-browser-modal h2,.translation-file-browser-modal h3,.translation-file-browser-modal p{margin-bottom:0}.translation-file-browser-modal h2{font-size:17px}.translation-file-browser-modal h3{color:#8b949e;font-size:12px;font-weight:600}.translation-file-browser-modal p{color:#8b949e;font-size:12px;overflow-wrap:anywhere}.translation-file-browser-controls{justify-content:space-between}.translation-file-browser-search{flex:1 1 320px;justify-content:flex-end}.translation-file-browser-search input{flex:1 1 180px;min-width:0}.translation-file-browser-modal button,.translation-file-browser-modal input{border:1px solid #3a4149;border-radius:6px;background:#111820;color:#d6deeb;min-height:30px;padding:4px 8px;font:inherit;font-size:12px}.translation-file-browser-modal button:hover:not(:disabled){border-color:#58a6ff;background:#162235}.translation-file-browser-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.42fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.translation-file-browser-list,.translation-file-browser-selection{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:10px}.translation-file-browser-group{display:grid;align-content:start;gap:6px;margin-bottom:12px}.translation-file-browser-entry{display:grid;grid-template-columns:38px minmax(0,1fr);gap:3px 8px;width:100%;min-width:0;text-align:left}.translation-file-browser-entry span{grid-row:span 2;align-self:center;color:#8b949e;font-size:11px}.translation-file-browser-entry strong,.translation-file-browser-entry small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.translation-file-browser-entry small{color:#8b949e}.translation-file-browser-entry.is-selected{border-color:#58a6ff;background:#142033}.translation-file-browser-selection{display:grid;align-content:start;gap:12px}.translation-file-browser-selection label{display:grid;gap:5px}.translation-file-browser-selection span{color:#8b949e;font-size:12px}.translation-file-browser-selection input{width:100%;min-width:0}.translation-panel-header{display:grid;flex:0 0 auto;gap:3px}.translation-panel-titlebar,.translation-panel-actions,.translation-status-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:space-between}.translation-panel-header h2,.translation-panel-header p{margin-bottom:0}.translation-panel-titlebar h2{font-size:16px}.translation-panel-header p,.translation-composer span{color:#8b949e;font-size:12px}.translation-panel-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.translation-panel-actions button:hover:not(:disabled),.translation-composer-actions button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}.translation-panel-actions{justify-content:flex-end}.translation-status-row{flex-wrap:nowrap}.translation-status-row p:last-child{flex:0 0 auto;text-align:right}.translation-entry-list{display:grid;flex:1 1 auto;align-content:start;gap:8px;min-height:0;min-width:0;overflow-x:hidden;overflow-y:auto;scrollbar-color:#4b5563 #0d1117}.translation-entry{border:0;border-radius:0;background:transparent;min-width:0;max-width:100%;padding:0}.translation-conversation-boundary{display:grid;grid-template-columns:minmax(18px,1fr) auto auto auto minmax(18px,1fr);gap:8px;align-items:center;color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.4;white-space:nowrap}.translation-boundary-dash{min-width:0;border-top:1px dashed #3a4149}.translation-entry.is-user-input{border-top:4px solid #3a4149;margin-top:14px;padding-top:14px}.translation-entry.is-user-input:first-child{margin-top:0}.translation-entry pre{box-sizing:border-box;margin:0;max-height:none;max-width:100%;min-width:0;overflow:visible;white-space:pre-wrap;overflow-wrap:anywhere;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.45;color:#d6deeb}.translation-markdown{max-width:100%;min-width:0;color:#d6deeb;font-size:12px;line-height:1.55;overflow-wrap:anywhere}.translation-markdown>:first-child{margin-top:0}.translation-markdown>:last-child{margin-bottom:0}.translation-markdown p,.translation-markdown ul,.translation-markdown ol,.translation-markdown blockquote,.translation-markdown pre,.translation-markdown table{margin:0 0 8px}.translation-markdown h1,.translation-markdown h2,.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{margin:10px 0 6px;color:#f0f6fc;font-weight:700;line-height:1.25}.translation-markdown h1{font-size:17px}.translation-markdown h2{font-size:15px}.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{font-size:13px}.translation-markdown ul,.translation-markdown ol{padding-left:22px}.translation-markdown li{margin:2px 0}.translation-markdown .task-list-item{list-style:none}.translation-markdown input[type=checkbox]{width:13px;height:13px;margin:0 6px 0 0;accent-color:#56d364}.translation-markdown blockquote{border-left:3px solid #3a4149;color:#b7c0ca;padding-left:10px}.translation-markdown a{color:#79c0ff}.translation-markdown code{border-radius:4px;background:#161b22;color:#f0f6fc;padding:1px 4px;font-family:Menlo,Monaco,Consolas,monospace;font-size:.95em}.translation-markdown pre{overflow-x:auto;border:1px solid #292d31;border-radius:6px;background:#111316;padding:8px;white-space:pre}.translation-markdown pre code{background:transparent;padding:0}.translation-markdown table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse}.translation-markdown img{max-width:100%;border-radius:4px}.translation-markdown th,.translation-markdown td{border:1px solid #30363d;padding:4px 6px;text-align:left;vertical-align:top}.translation-markdown hr{border:0;border-top:1px solid #292d31;margin:10px 0}.translation-entry.is-tool-output pre{display:block;overflow:hidden;color:#7d8590;text-overflow:ellipsis;white-space:nowrap;width:100%}.translation-entry-note{margin:2px 0 0;color:#6e7681;font-size:10px;line-height:1.35}.translation-entry-note.is-error{color:#a3715f}.translation-composer{display:grid;flex:0 0 auto;gap:6px;border-top:1px solid #292d31;padding-top:8px}.translation-composer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.translation-composer textarea{width:100%;min-height:38px;max-height:88px;border-color:#3a4149;background:#0d1117;color:#d6deeb;font-family:inherit;font-size:12px;line-height:1.35;resize:vertical}.translation-composer textarea::placeholder{color:#7d8590}.translation-composer textarea::selection{background:#8b949e59;color:#fff}.translation-composer textarea:focus,.translation-composer textarea:focus-visible{border-color:#4b5563;outline:none;box-shadow:none}.translation-composer-actions{display:grid;align-content:start;gap:6px;min-width:104px}.translation-composer-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;width:100%;min-height:38px;padding:4px 9px;font-size:12px}.translation-panel .muted{color:#8b949e}.translation-panel .error-banner{flex:0 0 auto;border-color:#da7b72;background:#2d1518;color:#ffdcd7}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#181c1f61;padding:18px}.translator-session-backdrop{background:#010409b8}.translator-session-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;width:95vw;height:92vh;min-width:0;min-height:0;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:10px}.translator-session-header{display:flex;gap:10px;align-items:center;justify-content:space-between;min-width:0}.translator-session-header h2,.translator-session-header p{margin-bottom:0}.translator-session-header p{color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translator-session-terminal{min-width:0;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.gateway-qr-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:14px;width:min(520px,100%);max-height:min(720px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:16px}.message-modal,.event-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:hidden;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.gateway-qr-modal header,.message-modal header,.event-modal header,.gateway-qr-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.gateway-qr-modal h2,.gateway-qr-modal p{margin-bottom:0}.gateway-qr-modal-body{display:grid;gap:14px;justify-items:center}.gateway-qr-code-frame{display:grid;place-items:center;width:min(360px,100%);aspect-ratio:1;border:1px solid #d6d0c6;border-radius:8px;background:#fff;padding:18px}.gateway-qr-code-frame img{display:block;width:100%;height:auto}.gateway-qr-placeholder{color:#667071;text-align:center}.gateway-qr-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;width:100%;margin:0}.gateway-qr-meta div{min-width:0;border:1px solid #ece5d9;border-radius:6px;padding:8px}.gateway-qr-meta dt{color:#6c6255;font-size:11px;font-weight:700;text-transform:uppercase}.gateway-qr-meta dd{margin:0;overflow-wrap:anywhere;font-size:13px}.message-modal h2,.message-modal p,.event-modal h2,.event-modal p{margin-bottom:0}.translation-test-result{border-radius:6px;padding:8px;font-size:13px}.translation-test-result.is-ok{border:1px solid #6ea77e;background:#e6f3e9;color:#245334}.translation-test-result.is-error{border:1px solid #c46e5f;background:#fae9e6;color:#6f2b21}.message-panel{display:grid;gap:8px}.message-modal .message-panel,.event-modal .event-log{min-height:0;overflow:auto;border:0;background:transparent;padding:0}.message-panel-header{display:flex;justify-content:space-between;gap:12px;align-items:center}.message-panel-header h2,.message-panel-header p{margin-bottom:0}.message-controls,.message-mode-toggle,.modal-actions,.message-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.message-mode-toggle{color:#4f5558;font-size:13px;font-weight:650}.message-mode-toggle input{width:auto}.message-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.message-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid #ece5d9;border-radius:6px;padding:8px;background:#fffdfa}.message-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:4px}.message-meta time,.message-meta span:not(.status-badge),.message-reason,.message-path{color:#667071;font-size:12px}.message-sequence{min-width:32px;color:#1f242b;font-weight:800}.message-actions button{min-height:30px;padding:4px 10px}.message-item p{display:-webkit-box;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.message-reason,.message-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log ol{margin:0;padding-left:22px;font-size:13px}.event-log{max-height:92px;overflow:auto}.event-log h2{margin-bottom:4px;font-size:13px}.event-log p{margin-bottom:0}.event-log li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:66px;min-height:20px;border-radius:999px;padding:2px 8px;border:1px solid #c7c1b8;background:#f2eee7;color:#4f5558;font-size:11px;white-space:nowrap}.status-active,.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-created,.status-idle,.status-disabled{border-color:#9aa3a8;background:#edf0f1;color:#465056}.status-blocked,.status-crashed,.status-missing,.status-empty{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-waiting,.status-starting,.status-incomplete{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-exited,.status-done,.status-stopped,.status-resumable,.status-skipped,.status-overridden,.status-not_required{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.status-queued,.status-translating,.status-ready,.status-create,.status-insert,.status-update{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-rejected,.status-failed,.status-delivery_failed,.status-response_ready_missing_result,.status-cancelled,.status-blocked{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-pending{border-color:#c7c1b8;background:#f2eee7;color:#4f5558}.status-translated,.status-preserved{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.empty-workspace{max-width:680px}@media(max-width:980px){.app-shell,.workspace-grid{grid-template-columns:1fr}.app-sidebar{border-right:0;border-bottom:1px solid #d3c9b8}.role-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}.session-console-body.has-translation,.translation-file-browser-layout{grid-template-columns:1fr}.session-controls,.session-toolbar{flex-wrap:wrap;overflow:visible}.file-translation-modal{width:95vw;height:95vh;padding:10px}.file-translation-layout{grid-template-columns:minmax(180px,240px) minmax(0,1fr)}.translation-file-browser-modal{min-height:0}}@media(max-width:700px){.file-translation-layout{grid-template-columns:1fr;grid-template-rows:minmax(140px,28vh) minmax(0,1fr)}.file-translation-header{align-items:stretch}.file-translation-toolbar{width:100%}.file-translation-toolbar button{flex:1 1 auto}}@media(max-width:560px){.app-main,.app-sidebar{padding:12px}.workspace-header,.inline-form,.inline-form.has-recent-paths{grid-template-columns:1fr;display:grid}.role-tabs{grid-template-columns:1fr}.terminal-frame,.terminal-empty{min-height:300px;height:54vh}.session-option-field{grid-template-columns:1fr;width:100%}.translation-file-browser-modal{width:calc(100vw - 20px);max-height:calc(100vh - 20px);padding:10px}.file-translation-modal{width:calc(100vw - 12px);height:calc(100vh - 12px)}.translation-file-browser-controls,.translation-file-browser-search{display:grid;grid-template-columns:1fr}}.harness-bootstrap-terminal .terminal-frame{height:100%;min-height:0}:root[data-theme=dark]{color-scheme:dark;background:#0d1117;color:#e6edf3}:root[data-theme=dark] body,:root[data-theme=dark] .app-main{background:#0d1117;color:#e6edf3}:root[data-theme=dark] button{border-color:#3d4652;background:#161b22;color:#e6edf3}:root[data-theme=dark] button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}:root[data-theme=dark] input,:root[data-theme=dark] select,:root[data-theme=dark] textarea:not(.xterm-helper-textarea){border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] input::placeholder,:root[data-theme=dark] textarea::placeholder{color:#7d8590}:root[data-theme=dark] .danger-button{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .danger-button:hover:not(:disabled){border-color:#ffa198;background:#3d1f23}:root[data-theme=dark] .app-sidebar{border-color:#30363d;background:#0f141b}:root[data-theme=dark] .sidebar-toggle{background:#161b22}:root[data-theme=dark] .brand-header span,:root[data-theme=dark] .muted,:root[data-theme=dark] .message-meta time,:root[data-theme=dark] .message-meta span:not(.status-badge),:root[data-theme=dark] .message-reason,:root[data-theme=dark] .message-path{color:#8b949e}:root[data-theme=dark] .sidebar-section,:root[data-theme=dark] .session-console,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .gateway-qr-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .gateway-qr-code-frame,:root[data-theme=dark] .gateway-qr-meta div{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .gateway-qr-code-frame{background:#f6f8fa}:root[data-theme=dark] .gateway-qr-meta dt,:root[data-theme=dark] .gateway-qr-placeholder{color:#8b949e}:root[data-theme=dark] .sidebar-section-toggle{color:#e6edf3}:root[data-theme=dark] .sidebar-section-toggle:hover{background:#161b22}:root[data-theme=dark] .sidebar-section-toggle[aria-expanded=true]{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .session-option-field small,:root[data-theme=dark] .task-create-preview small{color:#8b949e}:root[data-theme=dark] .warnings,:root[data-theme=dark] .error-banner{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .flow-pause-alert-backdrop{background:#010409b8}:root[data-theme=dark] .flow-pause-alert{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 28px 72px #0104099e}:root[data-theme=dark] .flow-pause-alert-kicker,:root[data-theme=dark] .flow-pause-alert-hint{color:#9debf2}:root[data-theme=dark] .flow-pause-alert button{border-color:#56d4dd;background:#56d4dd;color:#061114}:root[data-theme=dark] .flow-pause-alert button:hover{background:#84f3fa}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .harness-bootstrap-session,:root[data-theme=dark] .gateway-qr img,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .task-status-stats div,:root[data-theme=dark] .current-round-status,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .harness-bootstrap-modal{background:#010409b8}:root[data-theme=dark] .harness-bootstrap-modal-surface{border-color:#30363d;background:#0d1117;box-shadow:0 22px 64px #0104099e}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-status-dock{border-color:#30363d}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .task-status-stats dt{color:#8b949e}:root[data-theme=dark] .task-status-stats dd,:root[data-theme=dark] .current-round-title span:first-child{color:#e6edf3}:root[data-theme=dark] .message-sequence{color:#f0f6fc}:root[data-theme=dark] .task-nav-item.is-active,:root[data-theme=dark] .role-tab.is-active,:root[data-theme=dark] .sidebar-settings .settings-toggle.is-active,:root[data-theme=dark] .gateway-actions .settings-toggle.is-active,:root[data-theme=dark] .orchestration-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .orchestration-toggle{border-color:#3d4652;background:#161b22;color:#b7c0ca}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .settings-select-row{color:#b7c0ca}:root[data-theme=dark] .terminal-empty{border-color:#30363d}:root[data-theme=dark] .modal-backdrop{background:#010409b8}:root[data-theme=dark] .message-modal .message-panel,:root[data-theme=dark] .event-modal .event-log{background:transparent}:root[data-theme=dark] .status-badge{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-ok,:root[data-theme=dark] .status-active,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-created,:root[data-theme=dark] .status-idle,:root[data-theme=dark] .status-disabled{border-color:#69717d;background:#20262f;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-error,:root[data-theme=dark] .status-blocked,:root[data-theme=dark] .status-crashed,:root[data-theme=dark] .status-missing,:root[data-theme=dark] .status-empty,:root[data-theme=dark] .status-rejected,:root[data-theme=dark] .status-failed,:root[data-theme=dark] .status-delivery_failed,:root[data-theme=dark] .status-response_ready_missing_result,:root[data-theme=dark] .status-cancelled{border-color:#f85149;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .status-waiting,:root[data-theme=dark] .status-starting,:root[data-theme=dark] .status-incomplete,:root[data-theme=dark] .status-queued,:root[data-theme=dark] .status-translating,:root[data-theme=dark] .status-ready,:root[data-theme=dark] .status-create,:root[data-theme=dark] .status-insert,:root[data-theme=dark] .status-update{border-color:#d29922;background:#2d2208;color:#f8e3a1}:root[data-theme=dark] .status-exited,:root[data-theme=dark] .status-done,:root[data-theme=dark] .status-stopped,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-skipped,:root[data-theme=dark] .status-overridden,:root[data-theme=dark] .status-not_required,:root[data-theme=dark] .status-translated,:root[data-theme=dark] .status-preserved{border-color:#388bfd;background:#10223a;color:#c9e2ff}:root[data-theme=dark] .status-pending{border-color:#3d4652;background:#161b22;color:#d6deeb}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>VibeCodingMaster</title>
7
- <script type="module" crossorigin src="/assets/index-CEB6Bssn.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-Dmefx9m7.css">
7
+ <script type="module" crossorigin src="/assets/index-CKWy15WL.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-Cfum1Prr.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -1669,7 +1669,7 @@ Branch rules:
1669
1669
  Task close rules:
1670
1670
 
1671
1671
  - after task completion, close the task only when the user is ready to delete task-local state
1672
- - for worktree-backed tasks, task close may delete the task worktree, optionally delete the task branch, and remove task/session/message/orchestration/handoff metadata
1672
+ - task close deletes the task worktree, deletes the task branch, and removes task/session/message/orchestration/handoff metadata
1673
1673
  - task close may stop harness-managed running role sessions, but it must not silently discard uncommitted changes; finish, commit, or preserve anything important before using it
1674
1674
 
1675
1675
  Small commits:
@@ -16,7 +16,7 @@ and interactive conversation conventions.
16
16
 
17
17
  The existing translation panel should remain the main UI. Conversation
18
18
  translation keeps the current panel behavior, and file translation is added as
19
- an expandable mode inside the same panel. The backend source of translated text
19
+ an opened file-translation modal from the Translation sidebar. The backend source of translated text
20
20
  changes from an API provider to Codex Translator.
21
21
 
22
22
  ## 2. Core Direction
@@ -27,8 +27,8 @@ Add a new Codex role:
27
27
  codex-translator
28
28
  ```
29
29
 
30
- The role is responsible for both project-level file translation and task-level
31
- conversation translation. It should:
30
+ The role is responsible for both project-level file translation and temporary
31
+ conversation translation jobs. It should:
32
32
 
33
33
  - read the target source file and relevant project context
34
34
  - maintain durable translation memory files
@@ -52,8 +52,8 @@ legacy test/diagnostic fallback when Codex Translator is not wired into the
52
52
  server.
53
53
 
54
54
  Codex Translator is not part of the Claude Code PM/architect/coder/reviewer
55
- workflow. It is a project utility role, like Codex Reviewer in terminal shape,
56
- but with different permissions, output paths, and task semantics.
55
+ workflow. It is a project utility role with its own long-lived terminal
56
+ session, permissions, output paths, and task semantics.
57
57
 
58
58
  ## 3. Why Codex Session Translation
59
59
 
@@ -94,13 +94,15 @@ model. Their lifecycles are still different:
94
94
  | --- | --- | --- | --- | --- |
95
95
  | Translation bootstrap | First-run project understanding and memory initialization | `<baseRepoRoot>/.ai/vcm/translations/bootstrap/` plus temporary runtime files | Long-term index and memory, temporary run files | Runtime files are deleted on VCM startup and after completion |
96
96
  | File translation | Project documents, whitepapers, specs, long-form artifacts | `<baseRepoRoot>/.ai/vcm/translations/files/completed/` | Long-term project-local state | Completed outputs survive; request/progress/report/chunk files are deleted on VCM startup and after completion |
97
- | Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/<taskSlug>/...` | Task-scoped runtime cache | Deleted on VCM startup or after the translated result is consumed |
97
+ | Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...` | Project-level runtime cache | Deleted on VCM startup or after the translated result is consumed |
98
98
  | Translation memory | Shared terminology and style rules | `<baseRepoRoot>/.ai/vcm/translations/memory/` | Long-term project-local state | Survives task cleanup and worktree deletion |
99
+ | Translator session | Long-lived Codex Translator terminal/session metadata | `<baseRepoRoot>/.ai/vcm/translations/session.json` | Project-level durable state | Survives VCM startup cleanup so VCM can resume the prior Codex session |
99
100
 
100
101
  Recommended layout:
101
102
 
102
103
  ```text
103
104
  <baseRepoRoot>/.ai/vcm/translations/
105
+ session.json
104
106
  memory/
105
107
  glossary.md
106
108
  style-guide.md
@@ -114,7 +116,6 @@ Recommended layout:
114
116
  <translated-file-id>.md
115
117
  runtime/
116
118
  queue.json
117
- session.json
118
119
  bootstrap/
119
120
  runs/
120
121
  <bootstrap-id>/
@@ -129,13 +130,11 @@ Recommended layout:
129
130
  output.md
130
131
  report.md
131
132
  conversations/
132
- <taskSlug>/
133
- <role>/
134
- jobs/
135
- <translation-id>/
136
- request.json
137
- result.txt
138
- report.md
133
+ jobs/
134
+ <translation-id>/
135
+ request.json
136
+ result.txt
137
+ report.md
139
138
  ```
140
139
 
141
140
  Files under `runtime/` are temporary working state. VCM deletes the entire
@@ -160,8 +159,8 @@ should provide an explicit export or copy step.
160
159
 
161
160
  Implementation rule: every translation service must resolve
162
161
  `<baseRepoRoot>/.ai/vcm/translations/` from the connected project base root.
163
- `taskSlug` may namespace conversation cache entries, but storage paths must not
164
- be computed from `getTaskRuntimeRepoRoot()` or any task worktree root.
162
+ Conversation translation runtime paths must not be namespaced by task, source
163
+ role, or task worktree root.
165
164
 
166
165
  ## 5. Translation Memory
167
166
 
@@ -336,7 +335,6 @@ Suggested schema shape:
336
335
  "id": "whitepaper-v0-8-zh-20260614-001",
337
336
  "sourcePath": "docs/whitepaper-v0.8.md",
338
337
  "baseRepoRoot": "/absolute/base/repo/root",
339
- "taskSlug": null,
340
338
  "sourceHash": "sha256:...",
341
339
  "sourceBytes": 449958,
342
340
  "sourceMtimeMs": 1790000000000,
@@ -405,24 +403,22 @@ management pattern:
405
403
  - runtime Codex session id for the current VCM process
406
404
  - long-lived terminal session for follow-up discussion until VCM is restarted
407
405
 
408
- VCM stores the active translator session runtime record at:
406
+ VCM stores the active translator session record at:
409
407
 
410
408
  ```text
411
- <baseRepoRoot>/.ai/vcm/translations/runtime/session.json
409
+ <baseRepoRoot>/.ai/vcm/translations/session.json
412
410
  ```
413
411
 
414
- This record is project-level runtime state, not task-level durable state. It
412
+ This record is project-level durable session metadata, not task-level state. It
415
413
  stores the Codex session id, selected model, selected effort, terminal cwd, and
416
- hook activity state for the current VCM process. VCM deletes
417
- `translations/runtime/` on startup, so this record must not be used for restart
418
- recovery. The embedded terminal `Restart` control must stop the current runtime
419
- process, create a fresh Codex session id, overwrite this record, and keep old
420
- translation outputs intact.
414
+ hook activity state. VCM deletes `translations/runtime/` on startup, but must
415
+ keep this session record so reconnecting to a project can resume the previous
416
+ Codex Translator session when translation is enabled.
421
417
 
422
418
  When a Codex hook has captured the real Codex `session_id`, `Resume` may run
423
- `codex resume <session_id>` during the same VCM runtime. After VCM restarts,
424
- the user should start a fresh translator session and rely on durable memory
425
- files plus completed translations.
419
+ `codex resume <session_id>`. `Restart` stops the current runtime process,
420
+ creates a fresh Codex session id, overwrites this record, and keeps old
421
+ translation outputs intact.
426
422
 
427
423
  Session identity is fixed by base repository. If VCM later supports multiple
428
424
  parallel target-language translator sessions, split this file into a
@@ -569,7 +565,7 @@ Output contract:
569
565
  prompt because conversation snippets are normally short.
570
566
  - VCM still creates a temporary result file path before sending the prompt, for
571
567
  example
572
- `translations/runtime/conversations/<taskSlug>/<role>/jobs/<translation-id>/result.txt`.
568
+ `translations/runtime/conversations/jobs/<translation-id>/result.txt`.
573
569
  - Codex Translator writes the translated text to that assigned result file.
574
570
  - `Stop` marks the turn as finished; after `Stop`, VCM reads and validates the
575
571
  assigned result file.
@@ -808,7 +804,7 @@ Result handling:
808
804
  result channel for that batch.
809
805
  - VCM creates temporary runtime metadata and the result file contract under the
810
806
  unified project translation root:
811
- `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/<taskSlug>/...`.
807
+ `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...`.
812
808
  - The terminal response should only report completion, status, or diagnostics;
813
809
  it must not print the full translated text.
814
810
  - Conversation batch result files are plain text with exact numbered
@@ -1146,7 +1142,7 @@ Conversation translation and file translation may share translation settings UI
1146
1142
  concepts such as target language and style. They share
1147
1143
  `<baseRepoRoot>/.ai/vcm/translations/` and `translations/memory/`, but runtime
1148
1144
  state stays under `translations/runtime/`: conversation results are temporary
1149
- under `runtime/conversations/<taskSlug>/`, while completed file results are
1145
+ under `runtime/conversations/`, while completed file results are
1150
1146
  durable under `translations/files/completed/`.
1151
1147
 
1152
1148
  ## 20. Implementation Phases
@@ -1190,10 +1186,13 @@ durable under `translations/files/completed/`.
1190
1186
 
1191
1187
  ### Phase 3: Codex Session Integration
1192
1188
 
1193
- - Add `codex-translator` role/session support.
1194
- - Keep session identity as current-process runtime state by `<baseRepoRoot> +
1195
- targetLanguage`; do not split sessions by translation profile.
1196
- - Reuse Codex embedded terminal startup with model/effort selectors.
1189
+ - Add project-scoped `codex-translator` session support.
1190
+ - Keep session identity by `<baseRepoRoot> + targetLanguage`; do not split
1191
+ sessions by task, worktree, source role, or translation profile.
1192
+ - Persist the translator session record at `.ai/vcm/translations/session.json`
1193
+ so VCM can resume it after reconnecting to the project.
1194
+ - Reuse Codex embedded terminal startup with model/effort selectors in the
1195
+ translator session modal.
1197
1196
  - Add hook endpoints and running/idle tracking.
1198
1197
  - Send translation job prompts into the long-lived Codex session.
1199
1198
  - Ensure hook completion advances only the active queue item.
@@ -1214,7 +1213,10 @@ durable under `translations/files/completed/`.
1214
1213
  - Show selected job status; show runtime report details only while a job is not
1215
1214
  completed.
1216
1215
  - Add shared queue status for file and conversation translation tasks.
1217
- - Add Codex Translator terminal surface.
1216
+ - Do not show Codex Translator in the task role tab bar.
1217
+ - Add Translation sidebar controls for `Session status` and `Open Session`.
1218
+ - Show Codex Translator terminal controls, including model/effort/restart, only
1219
+ in the opened translator session modal.
1218
1220
  - Replace older completed file translations after a new translation for the
1219
1221
  same file/language/profile completes successfully.
1220
1222
  - Add cancel, skip, manual resolve, and promote actions.
@@ -1275,7 +1277,9 @@ durable under `translations/files/completed/`.
1275
1277
  - Store completed file outputs under `.ai/vcm/translations/files/completed/`;
1276
1278
  store temporary file jobs under `.ai/vcm/translations/runtime/files/jobs/`.
1277
1279
  - Store conversation translation runtime metadata/result temporary files under
1278
- `.ai/vcm/translations/runtime/conversations/<taskSlug>/`.
1280
+ `.ai/vcm/translations/runtime/conversations/`.
1281
+ - Store the durable translator session record at
1282
+ `.ai/vcm/translations/session.json`.
1279
1283
  - Store shared glossary and style memory under `.ai/vcm/translations/memory/`.
1280
1284
  - Resolve the translation root from `<baseRepoRoot>`, never from a task
1281
1285
  worktree.
@@ -148,7 +148,6 @@ durable docs, PR text, or commit history.
148
148
  | Worktrees | `.claude/worktrees/<task-slug>/` | Runtime cleanup | One task worktree shared by all roles. |
149
149
  | Handoff root | `.ai/vcm/handoffs/` | Runtime cleanup | Role artifacts and route files for the active task. |
150
150
  | Route messages | `.ai/vcm/handoffs/messages/<from-role>-<to-role>.md` | Runtime cleanup | Pending route files written by `vcm-route-message`. |
151
- | Handoff logs | `.ai/vcm/handoffs/logs/` | Runtime cleanup | Debug/recovery logs, not durable project truth. |
152
151
  | Architecture plan | `.ai/vcm/handoffs/architecture-plan.md` | Task-temporary | Architect handoff for one executable task. |
153
152
  | Review report | `.ai/vcm/handoffs/review-report.md` | Task-temporary | Reviewer handoff for one executable task. |
154
153
  | Docs sync report | `.ai/vcm/handoffs/docs-sync-report.md` | Task-temporary | Architect docs-sync handoff for one executable task. |
@@ -157,9 +157,8 @@ Task lifecycle commands:
157
157
  - `/pull-current` calls `POST /api/projects/current/pull` for the selected
158
158
  desktop VCM project. It runs the same connected-repository fast-forward-only
159
159
  pull as the desktop button. It must fail if the base repo has uncommitted
160
- changes, if the branch has no upstream, or if the current active task is an
161
- inline task using the base repo directly.
162
- - `/create-task <task-slug> [title]` creates a normal worktree-backed task,
160
+ changes or if the branch has no upstream.
161
+ - `/create-task <task-slug> [title]` creates a task worktree,
163
162
  selects it as the mobile current task, applies the saved launch template, and
164
163
  starts the four role sessions (`project-manager`, `architect`, `coder`,
165
164
  `reviewer`) through the same one-click-start path as the desktop UI. The saved
@@ -245,7 +244,7 @@ Rules:
245
244
  ```text
246
245
  /create-task <task-slug> [title]
247
246
  -> require current project
248
- -> create a normal worktree-backed task through existing task service/API
247
+ -> create a task branch and worktree through existing task service/API
249
248
  -> select it as gateway current task
250
249
  -> load saved launch template from app preferences
251
250
  -> set orchestration from template
@@ -258,8 +257,6 @@ Rules:
258
257
  Rules:
259
258
 
260
259
  - Use the same task creation validation as desktop VCM.
261
- - Default to `createWorktree: true`. Gateway should not create inline tasks in
262
- the MVP, because inline tasks make mobile pull/cleanup semantics harder.
263
260
  - Use the same one-click-start semantics as desktop VCM: only start from a newly
264
261
  created task with no existing role sessions.
265
262
  - If one role session fails to start, reply with the role that failed and leave
@@ -341,9 +338,8 @@ If no task is selected:
341
338
  No task is selected. Use /tasks and /use-task first.
342
339
  ```
343
340
 
344
- If `/pull-current` cannot run because the base repo is dirty, has no upstream,
345
- or is blocked by an inline task, reply with the same VCM reason shown in the
346
- desktop Connected Repository section.
341
+ If `/pull-current` cannot run because the base repo is dirty or has no upstream,
342
+ reply with the same VCM reason shown in the desktop Connected Repository section.
347
343
 
348
344
  If `/create-task` fails task validation, reply with the VCM error and hint.
349
345
  Common examples are invalid task slug, dirty base repo, existing task branch, or
@@ -674,7 +670,7 @@ Validation:
674
670
 
675
671
  - Implement `/pull-current` by calling the connected repository pull path:
676
672
  `POST /api/projects/current/pull` or the equivalent project service method.
677
- - Implement `/create-task <task-slug> [title]` by creating a worktree-backed
673
+ - Implement `/create-task <task-slug> [title]` by creating a task worktree
678
674
  task, selecting it as mobile current task, applying the saved launch template,
679
675
  setting orchestration mode, setting translation state, and starting the four
680
676
  role sessions.
@@ -688,7 +684,7 @@ Validation:
688
684
  - Parser tests for `/pull-current`, `/create-task`, `/close-task`, and
689
685
  confirmation mismatch.
690
686
  - Service tests for pull success and pull-blocked reasons.
691
- - Service tests that task creation uses `createWorktree: true` and launch
687
+ - Service tests that task creation creates a task worktree and uses launch
692
688
  template role settings.
693
689
  - Service tests for partial role-session start failure reporting.
694
690
  - Service tests that Close Task calls the existing cleanup path only after exact
@@ -781,8 +777,8 @@ Gateway MVP is complete when:
781
777
  - Bound phone can list and select current project/task context.
782
778
  - Bound phone can run `/pull-current` to update the connected base repository
783
779
  through VCM's fast-forward-only pull path.
784
- - Bound phone can run `/create-task <task-slug> [title]` to create a
785
- worktree-backed task, select it, apply the saved launch template, and start
780
+ - Bound phone can run `/create-task <task-slug> [title]` to create a task
781
+ worktree, select it, apply the saved launch template, and start
786
782
  the four role sessions.
787
783
  - Bound phone can send Chinese plain text to current task PM.
788
784
  - PM receives only the translated English prompt, without original Chinese.
@@ -47,7 +47,7 @@ VCM V1 must make multi-session Claude Code work visible and recoverable:
47
47
  - Create a named task with its own branch and task-level worktree by default.
48
48
  - Start, stop, restart, and resume one Claude Code session per role.
49
49
  - Keep role terminals embedded in one GUI.
50
- - Preserve task state, session state, handoff files, message history, and raw terminal logs.
50
+ - Preserve task state, session state, handoff files, and message history.
51
51
  - Let roles communicate through a PM-mediated message bus.
52
52
  - Let users choose between manual message approval and auto orchestration.
53
53
  - Install or update VCM role rules into `CLAUDE.md` and `.claude/agents/*.md`.
@@ -122,7 +122,7 @@ The detailed design lives in `docs/codex-review-gates.md`.
122
122
 
123
123
  ### 4.2 Task Worktree Model
124
124
 
125
- Task-level worktree management is the recommended default model for multi-task parallelism:
125
+ Task-level worktree management is the required model for all tasks:
126
126
 
127
127
  ```text
128
128
  one task
@@ -134,9 +134,7 @@ one task
134
134
 
135
135
  VCM must not create worktrees per role. `project-manager`, `architect`, `coder`, and `reviewer` for the same task all run in the same task worktree and hand off sequentially.
136
136
 
137
- When the user creates a task, `Create worktree and branch` is selected by default. With that option selected, VCM creates the branch and worktree immediately. If the user clears the option, VCM creates the task in the currently connected repository path and records the current branch.
138
-
139
- There is no separate later button named `Create task worktree`, and a task cannot be switched between worktree and non-worktree mode after creation.
137
+ When the user creates a task, VCM always creates the branch and worktree immediately. Tasks never run directly in the connected base repository, and there is no separate later button named `Create task worktree`.
140
138
 
141
139
  Branch naming:
142
140
 
@@ -168,17 +166,13 @@ New Task submit
168
166
  -> validate task name
169
167
  -> verify .ai/vcm/ is ignored
170
168
  -> verify .claude/worktrees/ is ignored
171
- -> if Create worktree and branch is selected:
172
- -> derive branch feature/<task-name>
173
- -> derive worktree path .claude/worktrees/<task-name>
174
- -> verify the base repo is clean
175
- -> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
176
- -> otherwise:
177
- -> use the connected repo path and current branch
178
- -> reject if another inline task is already active
169
+ -> derive branch feature/<task-name>
170
+ -> derive worktree path .claude/worktrees/<task-name>
171
+ -> verify the base repo is clean
172
+ -> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
179
173
  -> create task metadata
180
- -> create handoff structure inside the task runtime repo
181
- -> open the task workspace with role session cwd = task runtime repo
174
+ -> create handoff structure inside the task worktree
175
+ -> open the task workspace with role session cwd = task worktree
182
176
  ```
183
177
 
184
178
  Task close flow:
@@ -189,14 +183,12 @@ user clicks red Close Task
189
183
  -> stop VCM-managed running role sessions for the task
190
184
  -> explain that VCM deletes the task worktree and task branch
191
185
  -> explain that VCM does not check running sessions or uncommitted changes
192
- -> remove git worktree when the task owns one
193
- -> delete the task branch by default when the task owns one
186
+ -> remove git worktree
187
+ -> delete the task branch
194
188
  -> remove VCM task metadata from the base repo
195
- -> remove task runtime metadata from the task runtime repo
189
+ -> remove task runtime metadata from the task worktree
196
190
  ```
197
191
 
198
- Tasks created without a worktree do not own a separate branch/worktree, so Close Task stops VCM-managed running role sessions and removes only VCM metadata for those tasks.
199
-
200
192
  ## 5. Roles
201
193
 
202
194
  ### Project Manager
@@ -219,11 +211,11 @@ The project manager must not become the architect, coder, reviewer, or debugger
219
211
  The architect owns:
220
212
 
221
213
  - architecture plan
222
- - Scaffold Manifest for task-specific file context and coder guidance
214
+ - Scaffold Manifest with stable row IDs for task-specific file context and coder guidance
223
215
  - module boundaries
224
216
  - file responsibilities
225
217
  - cross-file callable surfaces and contract comments
226
- - code scaffolding with `VCM:CODE` placeholders
218
+ - code scaffolding with `VCM:CODE <ID>` placeholders
227
219
  - public contracts
228
220
  - verifiable behavior and behavior/contract proof points
229
221
  - Replan triggers
@@ -240,7 +232,7 @@ Outputs:
240
232
  The coder owns:
241
233
 
242
234
  - implementation within the approved plan
243
- - completion of architect-defined `VCM:CODE` placeholders
235
+ - completion of architect-defined `VCM:CODE` placeholders and Scaffold Completion handoff by ID
244
236
  - baseline unit/contract/regression tests
245
237
  - general coding standards and code documentation consistency
246
238
 
@@ -289,7 +281,7 @@ Sections:
289
281
  - `New Task`
290
282
  - `Tasks`
291
283
 
292
- The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime. When the current Round is running, it also shows the Current Round start time, total elapsed time, role active runtime, and Turn count.
284
+ The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime. It also shows the Current Round while a Round is running, or the Last Round after a flow pause, including start time, total elapsed time, role active runtime, Turn count, and Round status.
293
285
 
294
286
  `Repository Path` layout:
295
287
 
@@ -316,8 +308,7 @@ Opening this section refreshes the connected repository status through
316
308
 
317
309
  The `Pull` button runs `git pull --ff-only` only against the connected base
318
310
  repository. It is disabled when the base repository has uncommitted changes,
319
- when the branch has no upstream, or when the active task is an inline task using
320
- the base repository directly. VCM does not stash, merge, or mutate task
311
+ or when the branch has no upstream. VCM does not stash, merge, or mutate task
321
312
  worktrees from this button.
322
313
 
323
314
  The old `Dirty: yes/no` label is not used. The UI uses `Working tree: clean` or
@@ -344,15 +335,11 @@ There is no separate `Pause orchestration` or `Resume orchestration` control in
344
335
  `New Task` contains:
345
336
 
346
337
  - `task name`
347
- - a `Create worktree and branch` checkbox, selected by default
348
- - generated branch preview when selected: `feature/<task-name>`
349
- - generated worktree preview when selected: `.claude/worktrees/<task-name>`
350
- - current repository/current branch note when cleared
338
+ - generated branch preview: `feature/<task-name>`
339
+ - generated worktree preview: `.claude/worktrees/<task-name>`
351
340
 
352
341
  There is no optional title input in the current UI.
353
342
 
354
- The worktree/branch path is the recommended VCM task model, but the user may clear the checkbox for an inline task. VCM should not require a separate worktree creation action later.
355
-
356
343
  ### Task Workspace
357
344
 
358
345
  The task workspace header is one compact row:
@@ -420,7 +407,7 @@ Task-level Round state:
420
407
  - The stop transition is timer-driven from the `Stop` event. Round-state reads do not end a Round.
421
408
  - Before stopping, VCM checks `.ai/vcm/handoffs/messages`; if a pending route message exists and can be delivered, VCM retries delivery and extends the stop window instead of alerting.
422
409
  - The same Round state stores total Round count, Turn count, completed Turn count, and role active runtime. Active runtime is measured only between `UserPromptSubmit` and `Stop`, not during the stop window.
423
- - The Current Round dock shows both wall-clock Round duration and role active runtime. `Total` is `now - Round.startedAt`; `Role runtime` is the accumulated active runtime across Turns in that Round; `Turn count` is the number of accepted prompts in the Round.
410
+ - The Round dock shows both wall-clock Round duration and role active runtime. For a running Round, `Total` is `now - Round.startedAt`; for a stopped Round, it is `stoppedAt - Round.startedAt`. `Role runtime` is the accumulated active runtime across Turns in that Round; `Turn count` is the number of accepted prompts in the Round.
424
411
 
425
412
  The frontend polls this task-level Round state and deduplicates each stopped Round so the same stopped state does not alert on every poll. Flow duration is measured from the first `UserPromptSubmit` to `stoppedAt`, falling back to the last `Stop` when needed. Runs under 2 minutes trigger the weak 3-chime reminder at 1.4 second intervals. Runs at or above 2 minutes trigger the strong alert dialog and repeating sound until confirmation.
426
413
 
@@ -491,7 +478,7 @@ For `.gitignore`, VCM uses hash comments:
491
478
 
492
479
  VCM must preserve all user-authored content outside the managed block.
493
480
 
494
- After applying harness changes, the UI tells the user what changed and recommends reviewing and committing those files.
481
+ After applying harness changes in the base repo, the UI shows the changed files. When a task is active, the result area also shows `Commit & rebase task`: VCM stages only the changed harness files, creates a `chore: update VCM harness` commit in the base repo, and rebases the active task branch onto that commit. If the task worktree is dirty or the base repo already has staged changes, VCM stops and asks the user to clean up first.
495
482
 
496
483
  Role sessions get VCM behavior from `CLAUDE.md` and `.claude/agents/*.md`, not from a pasted startup context.
497
484
 
@@ -505,11 +492,6 @@ Each task creates:
505
492
  architect.md
506
493
  coder.md
507
494
  reviewer.md
508
- logs/
509
- project-manager.log
510
- architect.log
511
- coder.log
512
- reviewer.log
513
495
  architecture-plan.md
514
496
  known-issues.md
515
497
  review-report.md
@@ -814,8 +796,6 @@ Task worktree local files:
814
796
  .claude/worktrees/<task>/.ai/vcm/handoffs/messages/<from-role>-<to-role>.md
815
797
  ```
816
798
 
817
- For tasks created without a worktree, the task runtime repo is the connected base repo, so the runtime state resolves under the base repo's `.ai/vcm/`. Because `.ai/vcm/handoffs/` has no task-name segment, VCM allows only one active inline task in a connected repo.
818
-
819
799
  External Claude transcripts:
820
800
 
821
801
  ```text
@@ -846,9 +826,8 @@ This protects against publishing raw TypeScript bin files or missing frontend as
846
826
  VCM V1 is successful when:
847
827
 
848
828
  - A user can connect a repo without global Git safe-directory setup.
849
- - A user can create a default task, which creates `feature/<task>` and `.claude/worktrees/<task>`.
850
- - A user can clear `Create worktree and branch` and create a task in the connected repo/current branch.
851
- - A user can start all four role sessions in the task runtime repo.
829
+ - A user can create a task, which creates `feature/<task>` and `.claude/worktrees/<task>`.
830
+ - A user can start all four role sessions in the task worktree.
852
831
  - Switching roles never loses the embedded terminal.
853
832
  - Restart creates a fresh Claude session; Resume reconnects to the persisted one.
854
833
  - Permission modes are reflected in the Claude command.