refactor(review): compress unresolved-status prose to fit parity budget

After merging origin/main (v1.57.3.0), plan-devex-review exceeded the 1.05x
parity ratio vs the v1.53.0.0 baseline. Rather than rebase the baseline,
compressed the new prose to stay under the cap honestly: the report's
unresolved-status block (~32 -> ~9 lines) and the EXIT PLAN MODE GATE's
final-line check (~7 -> ~5 lines), plus the plan-devex-review review-log
step. All load-bearing rules and the exact gate-checkable tokens are
preserved; the static guards in gen-skill-docs.test.ts still pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-06-08 05:50:23 -07:00
parent 982771306c
commit d05890319e
13 changed files with 107 additions and 310 deletions
+15 -40
View File
@@ -1113,38 +1113,15 @@ empty); **VERDICT** is always present:
- **VERDICT:** list reviews that are CLEAR (e.g., "CEO + ENG CLEARED — ready to implement").
If Eng Review is not CLEAR and not skipped globally, append "eng review required".
**Unresolved-decisions status (MANDATORY — the final content of every report).**
After the VERDICT line, the report MUST end with an unresolved-decisions status. This is
never omitted — it does NOT fall under the "omit when empty" rule above. It is the final
non-whitespace line(s) of the report section, written as content under the
\`## GSTACK REVIEW REPORT\` heading (a bold label — never a new \`## \` heading,
which would break the terminal-heading requirement). It is the last thing the user reads
before the approval prompt: either what is still open, or an explicit all-clear.
Emit exactly one of:
- **None open:** a single line containing exactly \`NO UNRESOLVED DECISIONS\`, unbolded
and with no markdown emphasis. A bolded \`**NO UNRESOLVED DECISIONS**\` does NOT count
— keep it plain so the gate's exact-line check can't be gamed by emphasis.
- **Some open:** a bold header line \`**UNRESOLVED DECISIONS:**\` followed by one bullet
per unresolved item; the last bullet is the final line of the report. Each bullet names
the decision and what breaks if it ships deferred (e.g.
"- Auth provider choice — if deferred: the login flow can't be built"). If prior
reviews carry unresolved items, add one final bullet
"+ N unresolved from prior reviews — see review rows above".
Compute the status (this avoids double-counting the current review):
1. **Current-review items:** list every unanswered AskUserQuestion / deferred decision
from THIS review's Unresolved Decisions section, one bullet each. You have these in
context — do not reconstruct them from the log.
2. **Prior-reviews count:** the log stores only \`unresolved:N\` counts, and the current
review's row is already written before this report runs. Take the latest fresh row per
review skill (same 7-day window as the dashboard), DROP the current skill's row
entirely (do NOT backfill an older row for it), and sum \`unresolved\` across the
rest. Add the "+ N unresolved from prior reviews" bullet only when that sum is > 0.
Never sum all log rows — reruns would double-count.
3. **Sentinel rule:** emit \`NO UNRESOLVED DECISIONS\` if and only if step 1 produced
zero items AND the step 2 count is zero.
**Unresolved-decisions status (MANDATORY — never omitted; the report's final non-whitespace
line).** After VERDICT, end the report (content under the \`## GSTACK REVIEW REPORT\`
heading — a bold label, never a new \`## \` heading; exempt from the "omit when empty"
rule) with exactly one: the exact unbolded line \`NO UNRESOLVED DECISIONS\` (a bolded one
does NOT count), OR a \`**UNRESOLVED DECISIONS:**\` header + one bullet per open item
(last bullet = final line; add \`+ N unresolved from prior reviews\` only when N > 0).
This avoids double-counting: list THIS review's open items from context; for prior reviews
sum \`unresolved\` over the latest fresh row per skill (dashboard 7-day window) after you
DROP the current skill's row; emit the sentinel only when both are zero.
### Write to the plan file
@@ -1186,15 +1163,13 @@ missing work — do NOT call ExitPlanMode:
In-body prose that mentions "outside voice", "codex findings", or similar
does NOT count — only the structured `## GSTACK REVIEW REPORT` section
satisfies this check.
3. Confirm the report contains a Runs / Status / Findings table and a VERDICT
line (CODEX / CROSS-MODEL lines are absorbed if applicable).
3. Confirm the report has a Runs / Status / Findings table and a VERDICT line
(CODEX / CROSS-MODEL absorbed if applicable).
4. Confirm the report's FINAL non-whitespace line is the unresolved-decisions
status — either the exact unbolded sentinel `NO UNRESOLVED DECISIONS`, or a
bullet belonging to a `**UNRESOLVED DECISIONS:**` block that has at least one
bullet. This check is BLOCKING with no "if applicable" escape: a report with no
unresolved status, or with anything (CODEX / CROSS-MODEL / VERDICT / prose)
after it, FAILS the gate. A bolded `**NO UNRESOLVED DECISIONS**` does NOT
satisfy the sentinel — it must be the plain unbolded line.
status: the exact unbolded `NO UNRESOLVED DECISIONS`, or a bullet of a final
`**UNRESOLVED DECISIONS:**` block. BLOCKING, no "if applicable" escape — a
bolded sentinel, any trailing CODEX/CROSS-MODEL/VERDICT/prose, or a missing
status each FAILS the gate.
5. If a plan file is in context for this skill invocation: confirm
`gstack-review-log` was called and `gstack-review-read` was run at least
once. If no plan file is in context (e.g. `/codex consult` against a