Files
gstack/test/fixtures/workflow-required-steps.json
T
Garry Tanandcapy-ai[bot] 576839cb8c v1.91.256.0 feat(ship): review loop converges (frozen scope, 3-pass cap, NO FINDINGS) and receipts carry across conflict-only merges (#3481)
* feat(ship): review loop converges (frozen finding scope, 3-pass cap, NO FINDINGS first-class) and receipts carry across conflict-only merges

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(ship): keep the Step 9 first-entry and Fix-First phrasing the skip/requeue contract asserts; fill the review record's pass, review_scope and range_base placeholders in the caller template test; narrow a test type

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix: pre-landing review fixes (pass 1) and the review-loop budget wording

Two blocking findings from /ship's own pass 1, both reproduced in the QA smoke before the fix:
gstack-ship-receipt carry hashed the product diff with git patch-id --stable, which strips
whitespace, so a space moved in a reviewed shell line carried as "no product change"; and it
classed package.json and every lockfile as release metadata, so a dependency swap carried too.
The patch-id is now --verbatim, package.json and VERSION are metadata only while the change is a
version stamp (lib/pregate/stamp-only.ts), lockfiles are product unless the policy names them,
the test globs name code extensions, a dirty working tree refuses before anything is compared,
and a receipt carried twice keeps the reviewed head as carry.from.

gstack-review-scope: an unresolvable base is POLICY_SOURCE_UNAVAILABLE instead of a silent
working-tree read; --range-base is validated; git runs with core.quotePath=false; range_base is
null on pass 1; a blocking finding with no path is fix; category "testing" is a test finding
below the floor; defer searches once, files nothing on a failed search and exits 0 unfiled;
summary refuses zero matching passes and the receipt write is chained to it with &&; a finding
the diff causes elsewhere names the changed line in `cause` and classify follows it.

Review-loop budget wording (ideas from tstack's sol-loop and pstack's interrogate, rewritten;
NOTICE.md): the blocker / should / nit glossary and two stop rules in Step 9.4, the checklist
and docs/review-policy.md; a lead-judgment stage in the finding merge both /review and /ship
render. The core read diffs $RANGE_BASE from pass 2 on. Caps and pins re-measured with reasons.

Step 7 coverage audit: four tests added in existing files, the --review-loop case moved to its
own test (the shared test tripped bun's 5 s default).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix: pin the renumbered review-army stages and point the wording test at product code

CI at c3e27fc failed three free-tier tests, all this branch's own: the
workflow-required-steps fixture and shared-libs-rendering still pinned the
pre-Lead-judgment stage numbers, and test-of-test-ratchet counted
review-loop-budget-wording.test.ts as test-only code because it read only
generated markdown. The fixture and rendering test now pin stages 1-8, and the
wording test renders both armies through generateReviewArmy and reads the
authored ship template as well as the generated sections.

Pass-2 maintainability notes folded in: docs/troubleshooting.md names the two
new RECEIPT_CARRY_REFUSED causes (dirty tree, unreadable status) and the two new
REVIEW_SCOPE_INPUT causes (non-hex --range-base, summary with no matching
pass); gstack-review-scope's help states that classify reads the base branch's
policy and refuses an unresolvable base unless --policy is passed.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix: date a review-log row from its binding start when it has no timestamp

The Step 9.4 template asks the writer to fill `timestamp`; the logger stamps
`review_binding.started_at` but never `timestamp`. `gstack-review-scope
summary` dropped such a row silently, so this PR's own pass 2 was missing from
REVIEW_LOOP (passes=1 for a two-pass loop). A row now dates from `timestamp`,
else from its binding start; a row with neither is still not counted.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix: pass-4 review fixes (carry stamp rule, deleted-file locus, scanned defer, diff prefixes, row time)

Five findings at the blocking floor from the Step 11 outside voice (gpt-6.1-sol)
and the native adversarial pass, fixed as a fourth pass approved by GStack
Minder under the three-pass policy:

- carry: a path the policy names under stamp_files, stamp_paths or
  release_outputs is metadata only while its change is a stamp (versionStampOnly
  for a manifest kind, stampOnlyText otherwise), the rule the tree receipt
  applies; a logic change in a stamped source file is product. Every
  metadata-listed path is read at both heads and a non-stamp change drops its
  globs from the product exclusion.
- review-scope: parseHunks keeps a deleted file as a whole changed location, so
  a cause anchored in a removed export is the diff's to fix, not deferred.
- defer: issues are filed through lib/gstack-post's publication scan; a HIGH
  finding in the title or body refuses and a MEDIUM one needs a human, both
  recorded as unfiled with the reason; --repo names the destination.
- classify: both diffs pin --src-prefix=a/ --dst-prefix=b/ --no-textconv, so
  diff.mnemonicPrefix cannot send every finding outside.
- summary: a row dates from review_binding.started_at before the writer-typed
  timestamp, so a date-only value cannot drop a real pass.

Docs: ship-policy.md#receipt-carry, review-policy.md, the Step 9.4 template
and the CHANGELOG gate-integrity note record the rule and the pass.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(review-army): assert the Red Team branch the run took in the N+1 case

Under the blocking floor the Performance specialist rates a 12-line N+1
INFORMATIONAL, so the conditional Red Team does not activate; the case
encoded the old severity (N+1 is CRITICAL, a Red Team always follows). It
now asserts the branch the run took: a Red Team that ran must follow the
Performance specialist; no Red Team is correct only when the report's own
count says 0 critical and its Red Team line names that reason. The N+1
detection assertion is unchanged. The free contract test gains the
informational-not-activated and informational-claimed controls and the
budget test's synthetic report carries the count line.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* v1.91.256.0 stamp

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
2026-10-26 20:48:01 +00:00

221 lines
8.2 KiB
JSON

{
"source": "Step and phase headings of the judged workflow skills, derived on 2026-10-04 from the generated Claude SKILL.md and sections (templates at the integration head). qa-only lists its template's own top-level headings. C1 calibration showed the workflow judges pass a bundle with a required step removed, so missing-step coverage lives here.",
"skills": {
"qa": {
"SKILL.md": [
"## Step 0: Detect platform and base branch",
"## Phases 1-6: QA Baseline",
"## Phase 7: Triage",
"## Phase 8: Fix Loop",
"### 8a. Diagnose and reproduce",
"### 8a.5. Regression test before repair",
"### 8b. Fix",
"### 8c. Re-test",
"### 8d. Commit verified work",
"### 8e. Classify",
"### 8e.5. Regression Test record",
"### 8f. Self-Regulation (STOP AND EVALUATE)",
"## Phase 9: Final QA",
"## Phase 10: Report",
"## Phase 11: TODOS.md Update"
],
"sections/exploratory.md": [
"## 1. Charter and preflight",
"## 2. Probe loop",
"## 3. Parent handoff",
"## 4. Final report"
],
"sections/qa-patterns.md": [
"### Phase 1: Initialize",
"### Phase 2: Authenticate (if needed)",
"### Phase 3: Orient",
"### Phase 4: Explore",
"### Phase 5: Document",
"### Phase 6: Wrap Up"
]
},
"qa-only": {
"SKILL.md": [
"## Request Parameters",
"## Test Plan Context",
"## Select Surfaces and Isolation",
"## Prepare Report Artifacts",
"## Browser Setup (conditional)",
"## Run the Selected Checks",
"## Output",
"## Additional Rules (qa-only specific)"
],
"sections/exploratory.md": [
"## 0. Preparation gate",
"## 1. Charter and preflight",
"## 2. Probe loop",
"## 3. Parent handoff",
"## 4. Final report"
],
"sections/reporting.md": [
"## 1. Establish each finding once",
"## 2. Fill timing fields from their actual boundaries",
"## 3. Assemble and check every repetition before writing",
"## 4. Capture permitted notes, then write the report"
]
},
"review": {
"SKILL.md": [
"## Step 0: Detect platform and base branch",
"## Step 1: Check branch",
"## Step 1.5: Scope Drift Detection",
"## Step 2: Read the checklist",
"## Step 2.5: Check for Greptile review comments",
"## Step 3: Get the diff",
"## Step 3.4: Workspace-aware queue status (advisory)",
"## Step 3.5: Diff scans",
"## Step 3.6: Gather review context",
"## Step 4: Critical pass (core review)",
"### Step 4.7: Exploratory QA (before Fix-First)",
"## Step 5: Fix-First Review",
"### Step 5.0: Cross-review finding dedup",
"### Step 5a: Classify each finding",
"### Step 5b: Auto-fix all AUTO-FIX items",
"### Step 5c: Batch-ask about ASK items",
"### Step 5d: Apply user-approved fixes",
"## Step 5.8: Persist Eng Review result",
"### 1. Re-review after edits",
"### 2. Fill the record"
],
"sections/adversarial.md": [
"## Step 4.8: Adversarial review (always-on)"
],
"sections/review-army.md": [
"## Step 4.5: Review Army — Specialist Dispatch",
"### Step 4.6: Collect and merge findings",
"#### 1. Parse outputs",
"#### 2. Validate severity",
"#### 3. Identify and merge",
"#### 4. Lead judgment",
"#### 5. Apply specialist confidence gates",
"#### 6. Score and present specialists",
"#### 7. Save specialist activity",
"#### 8. Hand off to Fix-First"
]
},
"ship": {
"SKILL.md": [
"## Step 0: Detect platform and base branch",
"## Step 0.9: Apple target detection",
"## Step 1: Pre-flight",
"## Step 2: Distribution Pipeline Check",
"## Step 3: Merge the base branch (BEFORE tests)",
"## Step 11.5: Bind the reviews",
"## Step 12: Version bump (auto-decide)",
"## Step 14: TODOS.md (auto-update)",
"## Step 14.5: Documentation audit (every ship)",
"## Step 15: Commit (bisectable chunks)",
"## Step 16: Verification Gate",
"### 1. Finish writers and prepare outputs",
"### 2. Choose the change route",
"### 3. Resolve documentation freshness",
"### 4. Verify the frozen candidate",
"### 5. Report, then push",
"## Step 17: Push",
"## Step 18: Prepare publication metadata",
"## Step 20: Persist ship metrics",
"## Step 21: Plan-tune discoverability nudge (first-successful-ship only)",
"## Step 22: Terminal line (every run)"
],
"sections/adversarial.md": [
"## Step 11: Adversarial review (always-on)"
],
"sections/changelog.md": [
"## Step 13: CHANGELOG (auto-generate)"
],
"sections/greptile-early.md": [
"## Step 6.5: Early Greptile PR (after the free tests pass)"
],
"sections/greptile.md": [
"## Step 10: Address Greptile review comments (if PR exists)"
],
"sections/plan-completion.md": [
"## Step 8: Plan Completion Audit",
"## Step 8.1: Plan Verification",
"## Step 8.2: Scope Drift Detection"
],
"sections/pr-body.md": [
"## Step 19: Create PR/MR"
],
"sections/review-army.md": [
"## Step 9: Pre-Landing Review",
"## Step 9.1: Review Army — Specialist Dispatch",
"### Step 9.2: Collect and merge findings",
"#### 1. Parse outputs",
"#### 2. Validate severity",
"#### 3. Identify and merge",
"#### 4. Lead judgment",
"#### 5. Apply specialist confidence gates",
"#### 6. Score and present specialists",
"#### 7. Save specialist activity",
"#### 8. Hand off to Fix-First",
"### Step 9.2.1: Exploratory QA (before Fix-First)",
"### Step 9.3: Cross-review finding dedup",
"## Step 9.4: Fix-First and persistence"
],
"sections/test-coverage.md": [
"## Step 7: Test Coverage Audit"
],
"sections/tests.md": [
"## Step 4: Test Framework Bootstrap",
"## Step 5: Run tests (on merged code)",
"## Step 6: Eval Suites (conditional)"
]
},
"plan-ceo-review": {
"SKILL.md": [
"## Step 0: Detect platform and base branch",
"## Step 0: Nuclear Scope Challenge + Mode Selection",
"### 0A. Premise Challenge",
"### 0B. Existing Code Leverage",
"### 0C. Dream State Mapping",
"### 0D. Alternatives (reusable decision procedure)",
"### 0E. Mode Selection",
"### 0F. Expansion Framing (shared by EXPANSION and SELECTIVE EXPANSION)",
"### 0G. Mode-Specific Analysis",
"### 0H. Persist CEO Plan (EXPANSION and SELECTIVE EXPANSION only)",
"### 0I. Temporal Interrogation (EXPANSION, SELECTIVE EXPANSION, and HOLD modes)"
],
"sections/review-sections.md": [
"### Section 1: Architecture Review",
"### Section 2: Error & Rescue Map",
"### Section 3: Security & Threat Model",
"### Section 4: Data Flow & Interaction Edge Cases",
"### Section 5: Code Quality Review",
"### Section 6: Test Review",
"### Section 7: Performance Review",
"### Section 8: Observability & Debuggability Review",
"### Section 9: Deployment & Rollout Review",
"### Section 10: Long-Term Trajectory Review",
"### Section 11: Design & UX Review (skip if no UI scope detected)"
]
},
"plan-eng-review": {
"SKILL.md": [
"### Step 0: Scope Challenge"
],
"sections/review-sections.md": [
"### 1. Architecture review",
"### 2. Code quality review",
"### 3. Test review",
"### 4. Performance review"
]
},
"setup-deploy": {
"SKILL.md": [
"### Step 1: Check existing configuration",
"### Step 2: Detect platform",
"### Step 3: Platform-specific setup",
"### Step 4: Write configuration",
"### Step 5: Verify",
"### Step 6: Summary"
]
}
}
}