vibe-coding-master 0.2.13 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,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{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}.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(4,minmax(0,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,.codex-review-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:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;flex:1;height:100%;min-height:0}.codex-review-panel{display:grid;gap:8px;padding:8px 10px}.codex-review-panel-header,.codex-review-gate-main,.codex-review-actions{display:flex;align-items:center}.codex-review-panel-header{justify-content:space-between;gap:8px}.codex-review-panel-header h2{margin:0}.codex-review-panel-header span,.codex-review-gate-meta,.codex-review-callback,.codex-review-decision{color:#667071;font-size:12px}.codex-review-gates{display:grid;gap:6px}.codex-review-gate{display:grid;grid-template-columns:minmax(220px,.8fr) minmax(240px,1fr) auto;gap:8px;align-items:center;min-width:0;border-top:1px solid #ede5d8;padding-top:6px}.codex-review-gate:first-child{border-top:0;padding-top:0}.codex-review-gate-main{gap:8px;min-width:0}.codex-review-gate-main strong,.codex-review-gate-meta span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codex-review-gate-main strong{min-width:0;font-size:13px}.codex-review-gate-meta{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px;min-width:0}.codex-review-error{grid-column:1 / -1;color:#8d211d}.codex-review-actions{gap:6px;justify-content:flex-end}.codex-review-actions button{min-height:28px;padding:4px 8px}.session-console-top{display:flex;gap:10px;align-items:center;justify-content:space-between}.session-console-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.session-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-start;margin:0 0 8px}.session-option-field{display:grid;grid-template-columns:auto minmax(180px,260px);gap:8px;align-items:center;width:fit-content;max-width:100%}.model-field{grid-template-columns:auto minmax(190px,260px)}.session-option-field span{color:#5f6a6c;font-size:13px;font-weight:650}.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-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:4px 8px}.session-toolbar{display:flex;flex-wrap:wrap;gap:6px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:30px;padding:4px 9px}.translation-toggle{display:inline-flex;align-items:center;justify-content:center;min-height:28px;border:1px solid #b5bec4;border-radius:6px;background:#fffefa;color:#4f5558;font-size:12px;font-weight:650;padding:3px 10px;white-space:nowrap}.translation-toggle.is-active{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.translation-settings-grid input[type=checkbox]{width:auto}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);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-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:grid;grid-template-rows:auto minmax(0,1fr) auto;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}.translation-panel-header{display:grid;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 .auto-send-toggle.is-active{border-color:#56d364;background:#12261a;color:#d6deeb}.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;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;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{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}.translation-settings-modal{display:grid;gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.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}.translation-settings-modal header,.gateway-qr-modal header,.message-modal header,.event-modal header,.translation-settings-modal footer,.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}.translation-prompt-settings{display:grid;gap:10px;border-top:1px solid #ece5d9;padding-top:12px}.translation-prompt-settings header{display:flex;gap:10px;align-items:end;justify-content:space-between}.translation-prompt-settings h3,.translation-prompt-settings p{margin-bottom:0}.translation-prompt-settings h3{font-size:13px}.translation-prompt-settings textarea{min-height:120px;max-height:260px;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translation-prompt-stack{display:grid;gap:10px}.translation-prompt-stack label{display:grid;gap:4px}.translation-prompt-stack span{color:#4f5558;font-size:12px;font-weight:650}.translation-settings-modal h2,.message-modal h2,.message-modal p,.event-modal h2,.event-modal p,.translation-settings-modal p{margin-bottom:0}.translation-settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.translation-settings-grid label{display:grid;gap:4px}.translation-settings-grid span{color:#4f5558;font-size:12px;font-weight:650}.translation-settings-grid select,.translation-prompt-settings select{min-height:34px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:6px 10px}.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-settings-grid,.codex-review-gate{grid-template-columns:1fr}}@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%}}.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] .codex-review-panel,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .translation-settings-modal,: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],:root[data-theme=dark] .translation-prompt-settings{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .translation-settings-grid span,:root[data-theme=dark] .translation-prompt-stack 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] .codex-review-gate{border-color:#30363d}:root[data-theme=dark] .codex-review-panel-header span,:root[data-theme=dark] .codex-review-gate-meta,:root[data-theme=dark] .codex-review-callback,:root[data-theme=dark] .codex-review-decision{color:#8b949e}:root[data-theme=dark] .codex-review-error{color:#ffa198}: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] .translation-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .translation-toggle{border-color:#3d4652;background:#161b22;color:#b7c0ca}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select,:root[data-theme=dark] .translation-settings-grid select,:root[data-theme=dark] .translation-prompt-settings 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-CT20u9Fk.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-DC9-SB7F.css">
7
+ <script type="module" crossorigin src="/assets/index-C9l94uxA.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-D6jWo6Jd.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -0,0 +1,515 @@
1
+ # Codex Review Gates
2
+
3
+ Last updated: 2026-06-13
4
+
5
+ This document defines the Codex Review Gates feature for VCM.
6
+
7
+ The goal is to add an independent cross-model review layer to complex VCM
8
+ tasks. VCM keeps the four Claude Code execution roles and adds a fifth role,
9
+ `codex-reviewer`, for external review. Claude Code remains the primary role
10
+ execution engine, while Codex reviews key artifacts at three gates where
11
+ mistakes are expensive if found late:
12
+
13
+ 1. Architecture plan review before coder implementation.
14
+ 2. Validation adequacy review after reviewer output.
15
+ 3. Final diff review before final acceptance and PR preparation.
16
+
17
+ ## 1. Product Goal
18
+
19
+ Complex tasks should not rely on a single model family or a single role chain.
20
+ VCM already separates work into project-manager, architect, coder, and reviewer
21
+ roles, but those roles can still share blind spots. Codex Review Gates add
22
+ `codex-reviewer` as a fifth role that is outside the normal Claude Code role
23
+ loop.
24
+
25
+ Codex is not the task owner. It does not implement code, rewrite plans, replace
26
+ the VCM reviewer, assign ownership, or decide whether user intervention is
27
+ required. It only reviews the specified gate evidence and reports whether that
28
+ gate can pass.
29
+
30
+ The product outcome is higher task accuracy through earlier detection of:
31
+
32
+ - misunderstood requirements
33
+ - flawed architecture plans
34
+ - unverifiable implementation plans
35
+ - inadequate tests
36
+ - missed edge cases
37
+ - hidden regressions in the final diff
38
+ - unexplained or high-risk file changes
39
+
40
+ ## 2. Non-Goals
41
+
42
+ The first version should not:
43
+
44
+ - require the fifth role to be an always-running embedded terminal
45
+ - let Codex edit repository files directly
46
+ - automatically accept, reject, route, or replan a task
47
+ - replace human approval for high-risk decisions
48
+ - require every small task to run all three gates
49
+ - halt all workflows when Codex is unavailable
50
+ - send repository secrets or unrelated local state to a hosted model
51
+
52
+ ## 3. Gate Summary
53
+
54
+ ```text
55
+ project-manager
56
+ -> architect architecture plan
57
+ -> Codex Gate 1: Architecture Plan Review
58
+ -> coder implementation
59
+ -> reviewer independent validation
60
+ -> Codex Gate 2: Validation Adequacy Review
61
+ -> architect docs sync
62
+ -> project-manager final acceptance
63
+ -> Codex Gate 3: Final Diff Review
64
+ -> PR preparation
65
+ ```
66
+
67
+ Each gate returns exactly one decision:
68
+
69
+ ```text
70
+ approve
71
+ request_changes
72
+ ```
73
+
74
+ - `approve`: the current evidence is good enough to continue.
75
+ - `request_changes`: one or more findings mean the gate should not pass yet.
76
+
77
+ PM owns routing after `request_changes`. Architecture plan findings go back to
78
+ architect. Validation adequacy findings go back to reviewer. Final diff
79
+ findings go to architect first for assessment; architect may resolve simple
80
+ debug issues directly or route complex issues through Replan.
81
+
82
+ Gate triggering is PM-driven through the `vcm-codex-review-gate` skill. PM uses
83
+ the skill at the three gate trigger points. The skill checks VCM-provided Codex
84
+ review state and asks VCM to start a review when the gate is enabled, required,
85
+ and not already approved for the current input.
86
+
87
+ VCM owns execution. When review starts, the VCM flow remains running and enters
88
+ a Codex review stage. VCM runs Codex CLI / adapter, records state, validates the
89
+ report shape, and calls PM back when review finishes. PM then reads the report
90
+ and continues or routes by gate type.
91
+ Codex execution failure is VCM/tool failure, not `request_changes`; VCM offers
92
+ retry, skip, or override and records the chosen exception state.
93
+
94
+ ```text
95
+ PM reaches gate trigger
96
+ -> PM uses vcm-codex-review-gate
97
+ -> skill checks VCM Codex gate state
98
+ -> skill requests VCM start review
99
+ -> VCM state = codex-review:running
100
+ -> Codex Reviewer writes report
101
+ -> VCM records completed / failed / skipped / overridden
102
+ -> VCM emits Codex review callback to PM
103
+ -> PM reads report and continues or routes
104
+ ```
105
+
106
+ ## 4. Gate 1: Architecture Plan Review
107
+
108
+ Run after architect produces the architecture plan and before coder begins
109
+ implementation.
110
+
111
+ Primary artifact:
112
+
113
+ ```text
114
+ .ai/vcm/handoffs/architecture-plan.md
115
+ ```
116
+
117
+ Recommended inputs:
118
+
119
+ - original user request
120
+ - project-manager route message or durable task plan when present
121
+ - architecture plan
122
+ - relevant durable architecture docs
123
+ - `docs/TESTING.md` when the plan depends on validation strategy
124
+ - changed file list when architect created scaffolding
125
+
126
+ Codex should review whether:
127
+
128
+ - the plan matches the user request
129
+ - the architecture boundaries are clear and compatible with the existing repo
130
+ - file responsibilities and public contracts are specific enough for coder
131
+ - the plan avoids unnecessary scope expansion
132
+ - risks, dependencies, migrations, permissions, data, and error paths are named
133
+ - acceptance and validation evidence can be produced
134
+ - the plan leaves no critical decisions for coder to guess
135
+
136
+ Output artifact:
137
+
138
+ ```text
139
+ .ai/vcm/codex-reviews/architecture-plan-review.md
140
+ ```
141
+
142
+ Routing:
143
+
144
+ - `approve`: project-manager may route to coder.
145
+ - `request_changes`: project-manager routes back to architect.
146
+
147
+ ## 5. Gate 2: Validation Adequacy Review
148
+
149
+ Run after reviewer produces the review report and before docs sync or final
150
+ acceptance.
151
+
152
+ Primary artifact:
153
+
154
+ ```text
155
+ .ai/vcm/handoffs/review-report.md
156
+ ```
157
+
158
+ Recommended inputs:
159
+
160
+ - original user request
161
+ - architecture plan
162
+ - changed file list
163
+ - implementation diff summary
164
+ - reviewer report
165
+ - validation commands and results
166
+ - tests added or changed
167
+ - known issues
168
+
169
+ Codex should review whether:
170
+
171
+ - the validation evidence proves the requested behavior
172
+ - tests cover important edge cases, failure paths, and regressions
173
+ - skipped checks are justified and have a clear final validation point
174
+ - reviewer findings are resolved or routed
175
+ - tests are not only testing implementation details
176
+ - high-risk areas such as permissions, state, persistence, concurrency, data
177
+ deletion, and external integrations are covered when relevant
178
+ - the reviewer report is specific enough for final acceptance
179
+
180
+ Output artifact:
181
+
182
+ ```text
183
+ .ai/vcm/codex-reviews/validation-adequacy-review.md
184
+ ```
185
+
186
+ Routing:
187
+
188
+ - `approve`: project-manager may request architect docs sync or proceed toward
189
+ final acceptance.
190
+ - `request_changes`: project-manager routes back to reviewer.
191
+
192
+ ## 6. Gate 3: Final Diff Review
193
+
194
+ Run after normal final acceptance evidence exists and before PR preparation or
195
+ task completion.
196
+
197
+ Recommended inputs:
198
+
199
+ - original user request
200
+ - architecture plan
201
+ - review report
202
+ - docs-sync report
203
+ - final acceptance draft when present
204
+ - full git diff against the task base branch
205
+ - changed file list
206
+ - validation summary
207
+ - known issues disposition
208
+
209
+ Codex should review whether:
210
+
211
+ - the final diff satisfies the user request
212
+ - the implementation contains correctness bugs or behavior regressions
213
+ - the code follows existing project conventions
214
+ - tests and implementation remain aligned
215
+ - durable docs and generated artifacts are consistent with the diff
216
+ - files outside the expected scope are explained
217
+ - high-risk changes are approved or routed
218
+ - PR text can honestly summarize the change, validation, and risks
219
+
220
+ Output artifact:
221
+
222
+ ```text
223
+ .ai/vcm/codex-reviews/final-diff-review.md
224
+ ```
225
+
226
+ Routing:
227
+
228
+ - `approve`: project-manager may complete final acceptance and prepare the PR.
229
+ - `request_changes`: project-manager routes to architect for assessment.
230
+ Architect decides whether the issue is simple enough for Debug Mode or needs
231
+ the normal Replan flow.
232
+
233
+ ## 7. Review Report Format
234
+
235
+ Each Codex review report must start with stable fields so VCM can reject stale
236
+ or malformed reports:
237
+
238
+ ```md
239
+ Gate: <architecture-plan|validation-adequacy|final-diff>
240
+ Request: <request-id>
241
+ Decision: approve|request_changes
242
+ Summary: <one or two sentences>
243
+
244
+ ## Findings
245
+
246
+ ### <severity>: <title>
247
+
248
+ - File: <path or none>
249
+ - Line: <line or none>
250
+ - Evidence: <what Codex observed>
251
+ - Expected: <gate requirement that is not satisfied>
252
+ - Gap: <what is missing, stale, contradictory, risky, or incorrect>
253
+ - Risk: <why it matters>
254
+
255
+ ## Residual Risks
256
+
257
+ - <risk or "None identified">
258
+
259
+ ## Inputs Reviewed
260
+
261
+ - <artifact or command output summary>
262
+ ```
263
+
264
+ Severity values:
265
+
266
+ ```text
267
+ critical
268
+ high
269
+ medium
270
+ low
271
+ ```
272
+
273
+ Decision rules:
274
+
275
+ - Any `critical` or unresolved `high` finding requires `request_changes`.
276
+ - `medium` findings require `request_changes` when they affect task
277
+ correctness, validation confidence, or maintainability.
278
+ - `low` findings do not prevent approval by themselves unless they reveal a
279
+ pattern that affects the gate.
280
+
281
+ ## 8. State Model
282
+
283
+ Codex reviewer runtime files live under:
284
+
285
+ ```text
286
+ .ai/codex/
287
+ ```
288
+
289
+ Codex review outputs live under:
290
+
291
+ ```text
292
+ .ai/vcm/codex-reviews/index.json
293
+ .ai/vcm/codex-reviews/architecture-plan-review.md
294
+ .ai/vcm/codex-reviews/validation-adequacy-review.md
295
+ .ai/vcm/codex-reviews/final-diff-review.md
296
+ .ai/vcm/codex-reviews/requests/<request-id>.json
297
+ ```
298
+
299
+ VCM owns `.ai/vcm/codex-reviews/index.json`. It records the enablement marker,
300
+ active gate, gate status, report path, decision, input hash, execution error,
301
+ skip / override reason, and timestamps. PM reads this state through VCM turn
302
+ context or the `vcm-codex-review-gate` skill; PM must not infer Codex state from
303
+ report files alone.
304
+
305
+ The `.ai/codex/` directory is VCM-managed runtime configuration for the fifth
306
+ role. It should contain:
307
+
308
+ ```text
309
+ .ai/codex/AGENTS.md
310
+ .ai/codex/config.toml
311
+ .ai/codex/prompts/architecture-plan-gate.md
312
+ .ai/codex/prompts/validation-adequacy-gate.md
313
+ .ai/codex/prompts/final-diff-gate.md
314
+ .ai/codex/schemas/codex-review-result.schema.json
315
+ ```
316
+
317
+ `.ai/codex/AGENTS.md` is the role definition for `codex-reviewer`. It should be
318
+ the only durable role instruction source VCM provides to Codex for review
319
+ gates. VCM should not require a root-level `AGENTS.md`, and it should not
320
+ require `.codex/agents/vcm-codex-reviewer.toml` for the first implementation.
321
+ The VCM-owned template portion must be bounded by the standard managed block:
322
+
323
+ ```md
324
+ <!-- VCM:BEGIN version=1 -->
325
+ ...
326
+ <!-- VCM:END -->
327
+ ```
328
+
329
+ The managed block should include the Codex reviewer role, evidence sources,
330
+ three gate-specific review criteria, finding format, and write constraints.
331
+ Project-local custom notes may live outside the block.
332
+
333
+ `.ai/codex/config.toml` is VCM-owned launch configuration. Codex does not
334
+ natively discover arbitrary `.ai/codex/config.toml` files the way it discovers
335
+ `$CODEX_HOME/config.toml` or layered `$CODEX_HOME/<profile>.config.toml` files,
336
+ so the VCM Codex adapter reads this file and maps supported keys to the Codex
337
+ CLI invocation.
338
+
339
+ VCM should start Codex from `.ai/codex` so that `.ai/codex/AGENTS.md` is
340
+ discovered naturally. Because the current session root is then `.ai/codex`, the
341
+ permission profile must add the task repository as a profile-defined workspace
342
+ root using a relative path:
343
+
344
+ ```toml
345
+ [permissions.vcm_codex_reviewer.workspace_roots]
346
+ "../.." = true
347
+
348
+ [permissions.vcm_codex_reviewer.filesystem]
349
+ ":minimal" = "read"
350
+
351
+ [permissions.vcm_codex_reviewer.filesystem.":workspace_roots"]
352
+ "." = "read"
353
+ ".ai/codex" = "read"
354
+ ".ai/vcm/codex-reviews" = "write"
355
+ "**/*.env" = "deny"
356
+ ```
357
+
358
+ With `--cd <taskRepoRoot>/.ai/codex`, `../..` points back to
359
+ `<taskRepoRoot>`. Codex then applies the `:workspace_roots` rules to both the
360
+ runtime root and the profile-defined task repository root, allowing read access
361
+ to the repository while granting write access only to
362
+ `.ai/vcm/codex-reviews/`.
363
+
364
+ The task repository must ignore `.ai/vcm/`, because review reports and task
365
+ runtime state are transient. It should not ignore the whole `.ai/codex/`
366
+ directory if `.ai/codex/AGENTS.md`, `.ai/codex/config.toml`, prompts, or schemas
367
+ are intended to be durable project configuration. Ignore only transient Codex
368
+ runtime files inside `.ai/codex/`, such as logs or temporary materialized
369
+ profiles.
370
+
371
+ Shared types live in `src/shared/types/codex-review.ts`. Gate status is one of
372
+ `disabled`, `not_required`, `pending`, `running`, `completed`, `failed`,
373
+ `skipped`, or `overridden`.
374
+
375
+ ## 9. Backend Shape
376
+
377
+ Implemented files:
378
+
379
+ ```text
380
+ src/shared/types/codex-review.ts
381
+ src/backend/services/codex-review-service.ts
382
+ src/backend/api/codex-review-routes.ts
383
+ ```
384
+
385
+ Implemented API:
386
+
387
+ ```text
388
+ GET /api/tasks/:taskSlug/codex-review
389
+ POST /api/tasks/:taskSlug/codex-review/:gate/request
390
+ POST /api/tasks/:taskSlug/codex-review/:gate/retry
391
+ POST /api/tasks/:taskSlug/codex-review/:gate/skip
392
+ POST /api/tasks/:taskSlug/codex-review/:gate/override
393
+ GET /api/tasks/:taskSlug/codex-review/:gate/report
394
+ ```
395
+
396
+ Provider implementations should be swappable:
397
+
398
+ - Codex CLI review command
399
+ - OpenAI API reviewer model
400
+ - OpenAI-compatible reviewer model
401
+ - manual imported review result
402
+
403
+ The service should assemble gate-specific inputs, run the provider, parse the
404
+ decision and findings, write the Markdown report, and update `index.json`.
405
+ `requestReviewGate` is the API used by the PM-facing skill / helper. It returns
406
+ one of `disabled`, `not_required`, `already_approved`, `running`, `started`, or
407
+ `failed_to_start`.
408
+
409
+ When a review starts, VCM keeps the task flow running in a Codex review stage.
410
+ When the provider finishes, VCM emits a Codex review callback to PM with gate,
411
+ status, decision, report path, and any failure or exception metadata.
412
+
413
+ The Codex CLI provider starts Codex with `.ai/codex` as the active Codex
414
+ reviewer context. Current implementation shape:
415
+
416
+ ```bash
417
+ codex exec \
418
+ --cd <taskRepoRoot>/.ai/codex \
419
+ --add-dir <taskRepoRoot>/.ai/vcm/codex-reviews \
420
+ --sandbox workspace-write \
421
+ --ask-for-approval never \
422
+ --skip-git-repo-check \
423
+ --output-last-message <taskRepoRoot>/.ai/vcm/codex-reviews/logs/<request-id>.last-message.txt \
424
+ --model <model-from-.ai/codex/config.toml> \
425
+ "<gate prompt>"
426
+ ```
427
+
428
+ Starting from `.ai/codex` causes Codex to load `.ai/codex/AGENTS.md` through
429
+ its normal `AGENTS.md` discovery path. VCM validates the report path, request
430
+ id, and decision before marking a gate completed. `--ask-for-approval never`
431
+ prevents interactive permission prompts; execution failures are recorded as
432
+ `failed` so the user can retry, skip, or override.
433
+
434
+ ## 10. UI Shape
435
+
436
+ Add a `Review Gates` panel to the task workspace or sidebar task details.
437
+
438
+ Display one row per gate:
439
+
440
+ ```text
441
+ Architecture Plan pending | running | approve | request_changes
442
+ Validation Adequacy pending | running | approve | request_changes
443
+ Final Diff pending | running | approve | request_changes
444
+ ```
445
+
446
+ Each row should expose:
447
+
448
+ - `Run`
449
+ - `Run Again`
450
+ - `Retry` on failed gates
451
+ - `Skip` on failed gates
452
+ - `Override` on failed gates
453
+
454
+ The task header or sidebar dock can show a compact summary:
455
+
456
+ ```text
457
+ Codex Gates: 2/3 approved, 1 changes requested
458
+ ```
459
+
460
+ ## 11. Project-Manager Rules
461
+
462
+ Project-manager must treat Codex Review Gates as external evidence.
463
+
464
+ Rules:
465
+
466
+ - Use `vcm-codex-review-gate` at each Codex gate trigger and on each VCM Codex
467
+ review callback.
468
+ - Do not route coder implementation before the architecture plan gate is
469
+ approved, unless the user explicitly skips the gate.
470
+ - Do not start final acceptance before the validation adequacy gate is approved,
471
+ unless an explicit exception is recorded.
472
+ - Do not prepare a PR before the final diff gate is approved, unless an
473
+ explicit exception is recorded.
474
+ - Route `request_changes` by gate type, not by any Codex-provided routing field:
475
+ architecture-plan to architect, validation-adequacy to reviewer, and
476
+ final-diff to architect for assessment.
477
+ - Do not call Codex CLI directly from PM; PM requests VCM to start review and
478
+ stops when VCM reports `started`.
479
+ - Do not let Codex findings disappear into chat history. Record the report path
480
+ and disposition in final acceptance.
481
+ - Manual overrides must include who accepted the risk and why.
482
+
483
+ ## 12. Implemented MVP Scope
484
+
485
+ The first implementation is intentionally small:
486
+
487
+ 1. Add `.ai/codex/AGENTS.md` and `.ai/codex/config.toml` as VCM-managed Codex
488
+ reviewer runtime files.
489
+ 2. Add `vcm-codex-review-gate` as the PM-facing skill / protocol entry.
490
+ 3. Add backend APIs to request, run, retry, skip, override, list, and read gate
491
+ reports.
492
+ 4. Add manual UI controls for retry, skip, and override on failed gates.
493
+ 5. Add project-manager and final-acceptance harness rules that require checking
494
+ Codex gate reports for complex tasks.
495
+ 6. Keep gate triggering PM-driven at first.
496
+ 7. Do not automatically route roles from Codex findings in the first version.
497
+
498
+ Later versions can add automatic PM routing, provider selection, stricter
499
+ provider-level read/write policies where supported by Codex CLI, and risk-based
500
+ gate selection.
501
+
502
+ ## 13. Open Questions
503
+
504
+ - Should the first implementation support only Codex CLI, or should the
505
+ provider remain pluggable from the start?
506
+ - Should VCM enforce the gates in backend state, or should project-manager rules
507
+ enforce them first?
508
+ - What task complexity signal should decide whether all three gates are
509
+ required?
510
+ - Should final diff review run against the task branch base, connected base
511
+ repository `HEAD`, or an explicit PR base?
512
+ - How should large diffs be chunked without losing cross-file reasoning?
513
+ - What information must be redacted before sending inputs to a hosted model?
514
+ - Which `.ai/codex/config.toml` keys should VCM support in MVP, and which
515
+ should be rejected to avoid surprising Codex CLI behavior?
@@ -1,6 +1,6 @@
1
1
  # VibeCodingMaster Product Design
2
2
 
3
- Last updated: 2026-06-10
3
+ Last updated: 2026-06-13
4
4
 
5
5
  This document describes the current product direction and implemented V1 behavior for VCM.
6
6
 
@@ -82,7 +82,36 @@ project-manager
82
82
  -> project-manager final acceptance, commit, and PR
83
83
  ```
84
84
 
85
- ### 4.1 Task Worktree Model
85
+ ### 4.1 Codex Review Gates
86
+
87
+ For complex tasks, VCM supports optional Codex Review Gates as an independent
88
+ cross-model review layer. Claude Code remains the role execution engine, but
89
+ Codex reviews three high-value handoff points:
90
+
91
+ ```text
92
+ architect architecture plan
93
+ -> Codex reviews plan quality before coder starts
94
+
95
+ reviewer review-report
96
+ -> Codex reviews validation adequacy before final acceptance
97
+
98
+ final task diff
99
+ -> Codex reviews code and PR readiness before PR preparation
100
+ ```
101
+
102
+ Each gate returns `approve` or `request_changes`. PM triggers gates through the
103
+ `vcm-codex-review-gate` skill at the three workflow points; VCM owns the Codex
104
+ Review switch, gate state, Codex CLI / adapter execution, and PM callback after
105
+ review completes. Codex writes reports under `.ai/vcm/codex-reviews/`.
106
+ Architecture-plan findings return to architect, validation-adequacy findings
107
+ return to reviewer, and final-diff findings go to architect first for
108
+ assessment. Codex reviewer role configuration lives under `.ai/codex/`,
109
+ including `.ai/codex/AGENTS.md` and `.ai/codex/config.toml`, so VCM does not
110
+ require a root-level `AGENTS.md`.
111
+
112
+ The detailed design lives in `docs/codex-review-gates.md`.
113
+
114
+ ### 4.2 Task Worktree Model
86
115
 
87
116
  Task-level worktree management is the recommended default model for multi-task parallelism:
88
117