mirror of
https://github.com/garrytan/gstack.git
synced 2026-07-09 17:38:40 +02:00
fix(plan-devex-review): restore TIMESTAMP fill instruction in review-log
Adversarial review caught that compressing the devex review-log block dropped the TIMESTAMP substitution guidance the three sibling plan-review skills carry. A literal "timestamp":"TIMESTAMP" parses as JSON but is an unparseable date, so the Review Readiness Dashboard's 7-day freshness window silently drops the plan-devex-review row (and the report's prior-review aggregation loses it). Restore the one-line instruction. Also: the plan-review-report E2E now derives its last-line check from the report slice, not the whole file, so a mis-placed report surfaces the real trailing content in the failure message. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -585,7 +585,7 @@ PLAN MODE GATE's "review log was called" check depend on it. **PLAN MODE EXCEPTI
|
|||||||
~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-devex-review","timestamp":"TIMESTAMP","status":"STATUS","initial_score":N,"overall_score":N,"product_type":"PRODUCT_TYPE","tthw_current":"TTHW_CURRENT","tthw_target":"TTHW_TARGET","mode":"MODE","persona":"PERSONA","competitive_tier":"COMPETITIVE_TIER","unresolved":N,"commit":"COMMIT"}'
|
~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-devex-review","timestamp":"TIMESTAMP","status":"STATUS","initial_score":N,"overall_score":N,"product_type":"PRODUCT_TYPE","tthw_current":"TTHW_CURRENT","tthw_target":"TTHW_TARGET","mode":"MODE","persona":"PERSONA","competitive_tier":"COMPETITIVE_TIER","unresolved":N,"commit":"COMMIT"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
STATUS = "clean" if score 8+ AND 0 unresolved, else "issues_open"; other fields from the DX Scorecard + Step 0; COMMIT = `git rev-parse --short HEAD`.
|
TIMESTAMP = current ISO 8601 datetime; STATUS = "clean" if score 8+ AND 0 unresolved, else "issues_open"; other fields from the DX Scorecard + Step 0; COMMIT = `git rev-parse --short HEAD`.
|
||||||
|
|
||||||
## Review Readiness Dashboard
|
## Review Readiness Dashboard
|
||||||
|
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ PLAN MODE GATE's "review log was called" check depend on it. **PLAN MODE EXCEPTI
|
|||||||
~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-devex-review","timestamp":"TIMESTAMP","status":"STATUS","initial_score":N,"overall_score":N,"product_type":"PRODUCT_TYPE","tthw_current":"TTHW_CURRENT","tthw_target":"TTHW_TARGET","mode":"MODE","persona":"PERSONA","competitive_tier":"COMPETITIVE_TIER","unresolved":N,"commit":"COMMIT"}'
|
~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"plan-devex-review","timestamp":"TIMESTAMP","status":"STATUS","initial_score":N,"overall_score":N,"product_type":"PRODUCT_TYPE","tthw_current":"TTHW_CURRENT","tthw_target":"TTHW_TARGET","mode":"MODE","persona":"PERSONA","competitive_tier":"COMPETITIVE_TIER","unresolved":N,"commit":"COMMIT"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
STATUS = "clean" if score 8+ AND 0 unresolved, else "issues_open"; other fields from the DX Scorecard + Step 0; COMMIT = `git rev-parse --short HEAD`.
|
TIMESTAMP = current ISO 8601 datetime; STATUS = "clean" if score 8+ AND 0 unresolved, else "issues_open"; other fields from the DX Scorecard + Step 0; COMMIT = `git rev-parse --short HEAD`.
|
||||||
|
|
||||||
{{REVIEW_DASHBOARD}}
|
{{REVIEW_DASHBOARD}}
|
||||||
|
|
||||||
|
|||||||
@@ -746,7 +746,9 @@ This review report at the bottom of the plan is the MOST IMPORTANT deliverable o
|
|||||||
// bullet of an UNRESOLVED DECISIONS block, with nothing (CODEX/CROSS-MODEL/VERDICT/
|
// bullet of an UNRESOLVED DECISIONS block, with nothing (CODEX/CROSS-MODEL/VERDICT/
|
||||||
// prose) after it.
|
// prose) after it.
|
||||||
expect(afterReport).toContain('UNRESOLVED DECISIONS');
|
expect(afterReport).toContain('UNRESOLVED DECISIONS');
|
||||||
const nonEmpty = planContent.split('\n').map(l => l.trim()).filter(l => l !== '');
|
// Compute from afterReport (the report section to EOF), not the whole file, so a
|
||||||
|
// mid-file report surfaces the real trailing content in the failure message.
|
||||||
|
const nonEmpty = afterReport.split('\n').map(l => l.trim()).filter(l => l !== '');
|
||||||
const lastLine = nonEmpty[nonEmpty.length - 1];
|
const lastLine = nonEmpty[nonEmpty.length - 1];
|
||||||
const isSentinel = lastLine === 'NO UNRESOLVED DECISIONS';
|
const isSentinel = lastLine === 'NO UNRESOLVED DECISIONS';
|
||||||
const isUnresolvedBullet =
|
const isUnresolvedBullet =
|
||||||
|
|||||||
Reference in New Issue
Block a user