vibe-coding-master 0.2.12 → 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.
- package/README.md +9 -0
- package/dist/backend/api/codex-review-routes.js +54 -0
- package/dist/backend/cli/install-vcm-harness.js +55 -0
- package/dist/backend/server.js +15 -0
- package/dist/backend/services/codex-review-service.js +765 -0
- package/dist/backend/services/harness-service.js +63 -3
- package/dist/backend/services/task-service.js +2 -0
- package/dist/backend/templates/harness/claude-root.js +2 -0
- package/dist/backend/templates/harness/codex-review.js +574 -0
- package/dist/backend/templates/harness/project-manager-agent.js +13 -3
- package/dist/backend/templates/harness/vcm-final-acceptance-skill.js +6 -1
- package/dist/main.js +39 -0
- package/dist/shared/types/codex-review.js +5 -0
- package/dist-frontend/assets/index-C9l94uxA.js +92 -0
- package/dist-frontend/assets/index-D6jWo6Jd.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/docs/codex-review-gates.md +515 -0
- package/docs/product-design.md +31 -2
- package/package.json +1 -1
- package/scripts/verify-package.mjs +4 -0
- package/dist-frontend/assets/index-CT20u9Fk.js +0 -92
- package/dist-frontend/assets/index-DC9-SB7F.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{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}
|
package/dist-frontend/index.html
CHANGED
|
@@ -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-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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?
|
package/docs/product-design.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# VibeCodingMaster Product Design
|
|
2
2
|
|
|
3
|
-
Last updated: 2026-06-
|
|
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
|
|
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
|
|