pi-gauntlet 8.4.8 → 8.4.9
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/CHANGELOG.md +10 -0
- package/README.md +12 -6
- package/extensions/telemetry-settlement-contract.test.ts +29 -1
- package/package.json +2 -2
- package/skills/gatekeep-pr/SKILL.md +39 -28
- package/skills/gatekeep-pr/reference/batch.md +10 -10
- package/skills/gatekeep-pr/reference/cleanup.md +5 -5
- package/skills/gatekeep-pr/reference/findings.md +28 -13
- package/skills/gatekeep-pr/reference/menus.md +103 -74
- package/skills/gatekeep-pr/reference/post-selection-loop.md +31 -17
- package/skills/gatekeep-pr/reference/report.md +33 -101
- package/skills/gatekeep-pr/reference/sync.md +1 -1
- package/skills/gatekeep-pr/verification-brief.md +6 -6
- package/skills/gatekeep-pr/reference/decision-menu.md +0 -53
|
@@ -1,105 +1,134 @@
|
|
|
1
|
-
# gatekeep-pr:
|
|
1
|
+
# gatekeep-pr: menus
|
|
2
2
|
|
|
3
|
-
Read
|
|
3
|
+
Read at step 6; execute picks through `post-selection-loop.md` `### Next action`. Apply SKILL.md's wording rules and [menu-layout](../../brainstorming/reference/menu-layout.md)'s numeric mapping. Derive availability from the digest's permissions; `unreadable` fails closed.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|---|---|
|
|
7
|
-
| this run's merge returned MERGED | own merge |
|
|
8
|
-
| this run's merge returned another state | merge queued |
|
|
9
|
-
| approved_head equals assessed head | approved |
|
|
10
|
-
| PR state no longer OPEN | closed PR |
|
|
11
|
-
| pending contract exception | contract exception |
|
|
12
|
-
| readiness exit, including first report ready with course unset | final |
|
|
13
|
-
| obstacle or cap exit, including course unset with undispositionable BLOCKED | obstacle |
|
|
14
|
-
| assess completed | assess terminal |
|
|
15
|
-
| first report not ready, course unset | initial |
|
|
16
|
-
| multi-PR parent round | batch summary |
|
|
17
|
-
|
|
18
|
-
Resolve BLOCKED through `post-selection-loop.md` `### Merge preconditions` before selecting an obstacle; treat only BLOCKED without eligible bypass as undispositionable.
|
|
19
|
-
|
|
20
|
-
Render every menu in full from its template: the verdict line, every available row, and the hint line. Never narrate or summarize a menu; do not substitute "the initial template applied; the human picked 2" for its rendering. Quote a numeric pick only after the rendered menu.
|
|
21
|
-
|
|
22
|
-
Append ` recommended=<n>` to each gate line using the actual rendered number of its tagged recommended row. Emit one first line per turn; when combining batch summary and child menus, emit only the parent `gatekeep-pr/batch-summary` line. Keep runtime guard text, including any quoted escalation instruction, inside the obstacle body, never as a second standalone marker.
|
|
23
|
-
|
|
24
|
-
Render flat numbers through [menu-layout](../../brainstorming/reference/menu-layout.md); preserve its bare-numeric mapping. Put exactly one `[recommended]` on an available row and `stop` last. Put `show evidence` in every hint line, never in a row. Include every omission reason from `decision-menu.md`. A menu rendered under `deliver` before an exit condition, other than the contract-exception template, is a red flag; so is a menu not rendered from these templates, two recommendations, stop not last, or no evidence hint.
|
|
5
|
+
Render every menu in full: the standing sentence, every available row as `<n>. <verb> - <consequence>`, then the hint. Never narrate or summarize a menu. Quote a numeric pick only after the rendered menu. Move the recommended action to row 1 before numbering every menu, including child and batch menus; tag only it `[recommended]`. Keep non-recommended stop last; other rows follow table order. Append ` recommended=1` to each gate line. Emit one first line per turn: the parent batch-summary marker for combined nonterminal child menus, each terminal post menu's marker in its own message. Keep runtime guard text inside the obstacle body, not a second marker.
|
|
25
6
|
|
|
26
|
-
|
|
7
|
+
Use `Pick one:` except for post combinations. Hint: `Type a number; show evidence prints the full record.` Append `check <name> flaky | real | ci-broken` for failing checks. Keep show evidence hint-only. Omit unavailable rows with a sentence from Missing rows; never suffix a disabled row. Under deliver, render no menu before an exit except contract exception.
|
|
27
8
|
|
|
28
|
-
|
|
9
|
+
## States
|
|
29
10
|
|
|
30
|
-
|
|
11
|
+
Take the first matching row. Resolve BLOCKED through `post-selection-loop.md` `### Merge preconditions` before selecting an obstacle; only BLOCKED without eligible bypass is undispositionable. The table switches rows off in addition to their availability rules.
|
|
31
12
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
gauntlet: gate=gatekeep-pr/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
Course holds until the final menu; `show evidence` prints the full record.
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## final
|
|
13
|
+
| State | Entry | Archetype | Rows switched off | Marker |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
| own-merge | This run's merge returned MERGED | post | wait | Start the message with `gauntlet: gate=gatekeep-pr/own-merge` |
|
|
16
|
+
| merge-queued | This run's merge returned another state | post | All except wait and stop | Start the message with `gauntlet: gate=gatekeep-pr/merge-queued` |
|
|
17
|
+
| approved | approved_head equals assessed head | post | Coverage, PR-named steps, wait | Start the message with `gauntlet: gate=gatekeep-pr/approved` |
|
|
18
|
+
| closed-pr | PR no longer OPEN | post | Own-merge coverage, wait; mark merge-dependent steps skipped on closed-unmerged | Start the message with `gauntlet: gate=gatekeep-pr/closed-pr` |
|
|
19
|
+
| contract-exception | Pending contract proposal | action | All except accept contract change, preserve contract and stop | Start the message with `gauntlet: gate=gatekeep-pr/contract-exception` |
|
|
20
|
+
| final | Readiness exit, including ready first report with course unset | final | deliver | Start the message with `gauntlet: gate=gatekeep-pr/final` |
|
|
21
|
+
| obstacle | Obstacle or cap exit, including course unset with undispositionable BLOCKED | action | Contract rows, deliver with nits | Start the message with `gauntlet: gate=gatekeep-pr/obstacle` |
|
|
22
|
+
| assess-terminal | Assess completed | final | merge, fix nits | Start the message with `gauntlet: gate=gatekeep-pr/assess-terminal` |
|
|
23
|
+
| initial | First report not ready, course unset: repairable blockers or pending-only CI | action | Contract rows, approve workflow run | Start the message with `gauntlet: gate=gatekeep-pr/initial`; render: `gauntlet: gate=gatekeep-pr/initial recommended=1` |
|
|
48
24
|
|
|
49
|
-
|
|
25
|
+
## Recommendation
|
|
50
26
|
|
|
51
|
-
|
|
27
|
+
Choose from the findings, including obstacle and cap exits. Apply these pins in order: contract-exception recommends `preserve contract`; when no available non-stop row can change the outcome, recommend `stop`; else use rule 3's own-PR action default. Treat bot-authored heads as someone else's. An unchanged failed prerequisite still blocks after a cap extension; a cap with a changed prerequisite does not force stop.
|
|
52
28
|
|
|
53
|
-
|
|
29
|
+
Without a pin, use the first match:
|
|
54
30
|
|
|
55
|
-
|
|
31
|
+
1. After assess, recommend stop unless a concrete change since that pick (new head, cleared blocker, author answer) warrants another row; name that change.
|
|
32
|
+
2. With a pending binding check or a failing check classified flaky as the only obstacle, recommend `deliver` when offered.
|
|
33
|
+
3. Recommend deliver for the human's own PR, assess for someone else's when an open blocker needs the author's decision. Use offered action rows. Require an author decision for behavior, contract or scope not settled by the ticket, spec or PR text: a missing requirement, an acceptance-criteria change, or a scope choice. Exclude repairs matching their promises.
|
|
34
|
+
4. When every open blocker has a drafted repair, none needs the author's decision, and the head is pushable and `deliver` is offered, recommend `deliver` regardless of authorship.
|
|
35
|
+
5. In the final state, recommend `merge` whenever available through the ordinary path or an eligible admin override, regardless of authorship; otherwise recommend `approve` when available, else `stop`.
|
|
56
36
|
|
|
57
|
-
|
|
37
|
+
Otherwise choose the available row that settles this PR with the fewest human stops. Put one sentence immediately above `Pick one:` naming the recommendation and its reason from the finding or state. A recommendation confers no authority; wait for the pick.
|
|
58
38
|
|
|
59
|
-
|
|
39
|
+
## action
|
|
60
40
|
|
|
61
|
-
|
|
41
|
+
| Row | Availability | Pick |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `deliver` | Helpers, positive maxFixRounds, head_pushable true | Run the persistent delivery course to readiness, obstacle or cap; use `fix-wave.md` accounting. |
|
|
44
|
+
| `deliver with nits` | Delivery available and nits remain | Store deliver-nits; include all current and subsequently minted nits. |
|
|
45
|
+
| `assess` | Initial or obstacle | Post open blockers with locators as one head-pinned review through `post-selection-loop.md` `### Fix wave`; with zero blockers post nothing. Render assess-terminal, without repair or sync; keep C# replies behind reply. |
|
|
46
|
+
| `approve workflow run` | Held run on assessed head; viewer_permission WRITE, MAINTAIN or ADMIN | Run `gh api --method POST repos/<base-owner>/<base-repo>/actions/runs/<id>/approve`, refresh and watch under the course. |
|
|
47
|
+
| `accept contract change` | Pending recorded proposal | Invoke its owning amendment through `### Contract decision`; replace the baseline only after completion. |
|
|
48
|
+
| `preserve contract` | Pending recorded proposal | Reject the proposal, keep the named requirement and independent blockers, resume scope-preserving authorized work without the rejected payload this re-run. |
|
|
49
|
+
| `stop` | Always | Run `### Teardown`; non-final stop delegates to `cleanup.md` `## Non-final stop`. |
|
|
62
50
|
|
|
63
|
-
|
|
51
|
+
Show the proposal. Offer `accept contract change`, `preserve contract` `[recommended]`, then `stop` before numbering. Describe delivery sync as rebase for the viewer's own PR, merge main into the branch for someone else's or a bot's.
|
|
64
52
|
|
|
65
|
-
|
|
53
|
+
Own-PR: `1. deliver - repair blockers, rebase on main, watch CI, repeat until merge is offered. [recommended]`
|
|
66
54
|
|
|
67
|
-
|
|
55
|
+
### obstacle
|
|
68
56
|
|
|
69
|
-
|
|
57
|
+
Choose the recommendation through `## Recommendation`. Show the actual failed prerequisite. For undispositionable BLOCKED with no local repair, offer no wait row, no sync promise, and no approve row; describe deliver only as retrying after that prerequisite changes. With course unset describe starting work; otherwise describe continuing it.
|
|
70
58
|
|
|
71
|
-
|
|
59
|
+
For every non-timeout deliver selection, add exactly `2 x maxFixRounds` to both caps and persist before work, preserving usage; explain the added repair and sync attempts in the row, leaving counters under show evidence. On timeout offer exactly one additional watch window instead, with neither cap extended. An unchanged prerequisite re-exits even after extension.
|
|
72
60
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
## own merge
|
|
76
|
-
|
|
77
|
-
Start the message with `gauntlet: gate=gatekeep-pr/own-merge`.
|
|
78
|
-
|
|
79
|
-
After this run's merge returns `MERGED`, offer `cleanup` `[recommended]` until attempted, `post coverage to ticket` when issue and scope rows exist, `post coverage to PR`, then `stop`. Suppress each successful post for the rest of the run; a failed post keeps its row and prints the error. A post re-renders this template, never tears down or ends the run, and runs no compare-and-swap. After cleanup removes its row recommend the first available post, else stop. Hint: `Type a number; show evidence prints the full record.`
|
|
80
|
-
|
|
81
|
-
## merge queued
|
|
82
|
-
|
|
83
|
-
Start the message with `gauntlet: gate=gatekeep-pr/merge-queued`.
|
|
84
|
-
|
|
85
|
-
After this run's merge returns a state other than `MERGED`, offer `wait` - re-run `gh pr view <N> --json state,mergeCommit` `[recommended]`, then `stop`. Render `The merge is queued, so coverage posts wait. (<state>)`. A MERGED read records pr.state and pr.merge_commit and renders own merge; OPEN or another state keeps this template. Run no CI watch. Hint: `Type a number; show evidence prints the full record.`
|
|
61
|
+
## final
|
|
86
62
|
|
|
87
|
-
|
|
63
|
+
Choose the recommendation through `## Recommendation`; print its `[recommended]` tag on row 1.
|
|
88
64
|
|
|
89
|
-
|
|
65
|
+
| Row | Availability | Pick |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `merge` | Non-draft; viewer_permission WRITE, MAINTAIN or ADMIN; all `### Merge preconditions` hold | Run `gh pr merge --match-head-commit <assessed-sha>` with the resolved policy flag; append `--admin` only on the bypass path in `post-selection-loop.md` `### Merge course`. |
|
|
68
|
+
| `approve` | viewer.is_author false, zero blockers, non-draft | Approve; persist approved_head only after success. |
|
|
69
|
+
| `fix nits` | Nits outside the course; helpers and head_pushable true; accounting permits one iteration | Run exactly one delivery iteration, course unchanged; initialize missing accounting through `fix-wave.md` `## Wave`. |
|
|
70
|
+
| `reply` | Unposted drafted reply, source review complete | Post drafted replyable C# replies; exact `reply <n>` selects one. |
|
|
71
|
+
| `deliver` | Assess-terminal; action's delivery availability | Switch to the delivery course defined in action. |
|
|
72
|
+
| `stop` | Always | Run Teardown; keep final stop distinct from non-final assess-terminal stop. |
|
|
90
73
|
|
|
91
|
-
|
|
74
|
+
For eligible BLOCKED readiness, explain that GitHub requires an admin override and required checks passed. Render `merge - <policy>-merge using your admin override.` Keep one merge row, no bypass row. Use merge policy solely as the command flag selector, never approval or sync strategy; spec approval history configures no menu. Keep the resolved source, head, check results and merge state under show evidence, not a report line or hint parenthetical.
|
|
92
75
|
|
|
93
|
-
##
|
|
76
|
+
## post
|
|
94
77
|
|
|
95
|
-
|
|
78
|
+
Render once on entry to own-merge, approved or closed-pr. Retain the numbered mapping in `post_steps` through inspection and execution. Build steps in this order:
|
|
96
79
|
|
|
97
|
-
|
|
80
|
+
| Step | Availability and pick |
|
|
81
|
+
|---|---|
|
|
82
|
+
| post the drafted replies | Unposted, source-reviewed drafts: post saved bodies to their PR threads. |
|
|
83
|
+
| post coverage to ticket | Own-merge, issue and scope rows, not previously successful: post the saved AC coverage block to the resolved ticket. |
|
|
84
|
+
| post coverage to PR | Own-merge, not previously successful: post the same block as a PR comment. |
|
|
85
|
+
| cleanup | At least one worktree, local branch or base-pull sub-step can run: execute `cleanup.md` steps 1-3. |
|
|
86
|
+
| each PR-named step | Merged PR, runnable through `findings.md` `## PR-named steps`: show its source sentence beside its command. |
|
|
87
|
+
| each cleanup override | One runnable merge-base `## cleanup` item per row, in list order: execute through `cleanup.md` step 4. |
|
|
88
|
+
| wait | Merge-queued only: re-run `gh pr view <N> --json state,mergeCommit`. MERGED records pr.state and pr.merge_commit and renders own-merge once; any other state re-renders merge-queued. Run no CI watch. |
|
|
89
|
+
| stop | Run Teardown without a step; retain its merge-queued ending for that variant. |
|
|
90
|
+
|
|
91
|
+
Only number a step with work to execute, showing its exact command or what it posts and where. List fully skipped steps below the rows with reasons, not numbers. Keep cleanup one row, naming skipped sub-steps and reasons beside runnable ones. Show substitutions, primary cwd, and the base-pull prerequisite for steps needing the merged change when cleanup is not picked.
|
|
92
|
+
|
|
93
|
+
With multiple runnable steps, make row 1 a combination naming members' labels and row numbers; give each step its own row below. Include all except the PR copy of coverage when the ticket copy is included, and apply `batch.md`'s shared-item scheduling. Omit another step only for a concrete assessment reason, stated above the prompt; always include runnable PR-named steps. With one runnable step it is row 1; with none offer only stop. Stop runs no step and delegates to Teardown.
|
|
94
|
+
|
|
95
|
+
Use `Pick one, or several separated by commas:`. Parse through `post-selection-loop.md` `### Next action`, execute through its `### Post steps`, and settle without another menu. That owner retains freshness, failed/unpicked payloads, nested skill gates and closing messages.
|
|
96
|
+
|
|
97
|
+
> I recommend every step except the PR copy of the checklist, because the ticket comment carries it.
|
|
98
|
+
>
|
|
99
|
+
> Pick one, or several separated by commas:
|
|
100
|
+
> 1. post the reply, post coverage to ticket, cleanup, publish the handbook, close the ticket - rows 2, 3, 5, 6 and 7. [recommended]
|
|
101
|
+
> 2. post the reply - answer robin's retry question in its PR thread.
|
|
102
|
+
> 3. post coverage to ticket - comment the acceptance checklist on acme/widgets#45.
|
|
103
|
+
> 4. post coverage to PR - comment the same checklist on the PR.
|
|
104
|
+
> 5. cleanup - remove .worktrees/csv-export (including untracked files), delete branch csv-export and pull main in the primary checkout.
|
|
105
|
+
> 6. publish the handbook - run `scripts/publish-handbook.sh` from the primary. The PR says: "After merge, publish the handbook."
|
|
106
|
+
> 7. close the ticket - run `gh issue close 45 --comment "Delivered in <pr url>, merged 9f1c2d3."`.
|
|
107
|
+
> 8. stop - run nothing; list unpicked steps with their commands.
|
|
108
|
+
>
|
|
109
|
+
> Type a number; show evidence prints the full record.
|
|
110
|
+
|
|
111
|
+
For merge-queued, take one number, never a combination; offer only wait and stop, recommend wait, and explain that coverage waits for the merge.
|
|
112
|
+
|
|
113
|
+
## Missing rows
|
|
114
|
+
|
|
115
|
+
Resolve every unmet prerequisite through `post-selection-loop.md` `### Exit check`; permission never turns a repairable gap into readiness. Explain each omission in one plain sentence; invent no named GitHub rule.
|
|
116
|
+
|
|
117
|
+
| Observation | Explanation |
|
|
118
|
+
|---|---|
|
|
119
|
+
| BLOCKED with no eligible bypass and no local repair | GitHub blocks this actor from merging and no local repair applies. |
|
|
120
|
+
| UNKNOWN/unreadable after one re-poll | GitHub's merge status could not be read, so merging cannot proceed. |
|
|
121
|
+
| binding pending check | Name the required check still running; watch only at delivery step 4. |
|
|
122
|
+
| draft | Mark the draft ready for review before merging or approval. |
|
|
123
|
+
| below WRITE | Merging needs write access to the repository. |
|
|
124
|
+
| own PR | You cannot approve your own PR. |
|
|
125
|
+
| missing helpers, zero cap, head not pushable | Name each reason delivery is unavailable. |
|
|
126
|
+
| other failed prerequisite | Name its actual missing input or unsafe state from Exit check. |
|
|
98
127
|
|
|
99
128
|
## batch summary
|
|
100
129
|
|
|
101
130
|
Start the message with `gauntlet: gate=gatekeep-pr/batch-summary`.
|
|
102
131
|
|
|
103
|
-
For a recovered `CONFLICTING` child, offer only safe `retry` and `stop
|
|
132
|
+
For a recovered `CONFLICTING` child, offer only safe `retry` and `stop`. Offer retry only after `batch.md`'s clean-recovery and no-rebase checks pass: re-dispatch assessment with the same record; otherwise explain its omission. Recommend retry when available, else stop. Offer no update branch or merge base rows.
|
|
104
133
|
|
|
105
|
-
Let
|
|
134
|
+
Let `batch.md` render summary rows and child archetypes, preserving its admission, queue and row consequences. Keep terminal posts and queued-merge wait parent-owned after worktree removal, retaining every outcome for the parent's closing message.
|
|
@@ -4,7 +4,7 @@ Read from SKILL.md step 7. Execute only the course or terminal pick through `###
|
|
|
4
4
|
|
|
5
5
|
### Continuation record
|
|
6
6
|
|
|
7
|
-
Before tracker initialization, mint one `mktemp "${TMPDIR:-/tmp}/gatekeep-state.XXXXXX"` record using `../verification-brief.md`. Initialize course null, usage counters zero, deadline/wave null, approved_head null and
|
|
7
|
+
Before tracker initialization, mint one `mktemp "${TMPDIR:-/tmp}/gatekeep-state.XXXXXX"` record using `../verification-brief.md`. Initialize course null, usage counters zero, deadline/wave null, approved_head null and post_steps empty only for this new invocation. Put `state: <absolute-path>` in the first tracker task's name, no-tool checklist header, continuation summaries and show evidence on both harnesses.
|
|
8
8
|
|
|
9
9
|
Persist assessed head/body, the selected scope block including original_intent, IDs and independent contributions, payload snapshots, evidence/helper paths, comment identity/body baseline and ledger. Retain consent.target solely as immutable PR/base identity, not authority. Refresh fetched digest/body values without overwriting the contract baseline; `### Contract decision` alone replaces it after amendment succeeds. Keep raw diff/logs outside the record. Once Finding artifacts creates the pair, persist its absolute locators `repair.wave.spec` and `repair.wave.ledger`; retain them and the files' row history through wave settlement, cleanup and show evidence until terminal teardown.
|
|
10
10
|
|
|
@@ -26,11 +26,13 @@ Normalize the numeric selection to its rendered row; treat other strings through
|
|
|
26
26
|
|
|
27
27
|
### Next action
|
|
28
28
|
|
|
29
|
-
Recognize
|
|
29
|
+
Recognize exact `show evidence`, `reply <n>`, and `check <name> flaky | real | ci-broken` before numeric lookup, on the states offering them. Show evidence through `report.md` `## What stays out` and re-render the same menu without settlement. Record check dispositions through findings.md; helpers never disposition a check.
|
|
30
|
+
|
|
31
|
+
On own-merge, approved and closed-pr post menus, parse a comma-separated set of row numbers against the retained rendered mapping. Expand the combination to its member steps and collapse duplicates. Exact `reply <n>` on a post menu listing drafted replies selects drafted reply n, not menu row n. A number outside 1-N, stop combined with another number, or several numbers on any other menu asks one clarifying question naming the valid range and runs nothing. On a second invalid reply, leave the same menu waiting; emit no new question or `gauntlet: question` marker and run nothing. A sole stop runs Teardown. Persist valid picked steps and enter `### Post steps` before the live-course path below. Apply bare-numeric mapping from menu-layout unchanged on other menus; every other non-numeric string is a change request, including typed `deliver` even when a delivery row exists.
|
|
30
32
|
|
|
31
33
|
At this boundary and before each external write fetch actual body and live baseRefName with head/state. Compare live `baseRefName` against `consent.target.baseRefName`; an unreadable or changed base exits without overwriting `consent.target`. A same-head body edit invalidates old readiness and selected merge; narrowly recheck changed claims, preserving original intent. Refresh proposals against actual body.
|
|
32
34
|
|
|
33
|
-
First report ready -> final with course unset. Before choosing initial for a not-ready first report, resolve obstacle states through `### Exit check`; render obstacle for undispositionable BLOCKED even with course unset. Use initial for repairable blockers or a pending-only CI withhold through `menus.md`. An assess pick runs
|
|
35
|
+
First report ready -> final with course unset. Before choosing initial for a not-ready first report, resolve obstacle states through `### Exit check`; render obstacle for undispositionable BLOCKED even with course unset. Use initial for repairable blockers or a pending-only CI withhold through `menus.md`. An assess pick runs `menus.md`'s assess row with the review payload from `findings.md` Namespaces. Under deliver or deliver-nits and no exit, continue the body below. Under deliver or deliver-nits or an outstanding terminal nit selection, run only this D3 body, with no menu except contract exception:
|
|
34
36
|
|
|
35
37
|
1. Run `### Exit check`, then repair every source-backed and CI-minted `P#` blocker through `### Fix wave` and `fix-wave.md` `## Wave`. Under deliver-nits include all current and later nits. Preserve independent P#/L# contributor IDs; close only reviewer resolved lines.
|
|
36
38
|
2. Run `### Loop sync` only for CONFLICTING, BEHIND, or local merge-tree conflict.
|
|
@@ -40,17 +42,27 @@ First report ready -> final with course unset. Before choosing initial for a not
|
|
|
40
42
|
|
|
41
43
|
A final fix nits pick authorizes exactly one complete D3 iteration (required sync, review, push, watch and re-review included) and returns final or obstacle/cap without changing course. Before invoking the entry Exit check, persist `repair.wave.action: fix-nits` with selected_ids and payload snapshots in selected_payloads. Initialize missing accounting from fix-wave.md defaults for a course-unset final nit pick; never create a standing nit course. With course unset or deliver, dispatch the recorded nit work before readiness can return final. Keep the selection through repair/sync/review/push/watch/re-review; release the one-shot hold only after selected work and reconciliation complete, then evaluate fresh readiness. Obstacles and caps retain the checkpoint without fabricating completion. After that single iteration render final or the concrete obstacle/cap; later independent nits stay outside this selection.
|
|
42
44
|
|
|
45
|
+
### Post steps
|
|
46
|
+
|
|
47
|
+
Before rendering `menus.md` `## post`, persist one `post_steps` entry per known step: label, source, exact command or payload file, picked false and result null or its guard skip reason. Preserve the mapping and completed results across inspection or a nested skill pause; never replay completed steps. Save drafted reply and coverage bodies in files before showing their rows.
|
|
48
|
+
|
|
49
|
+
Run the picked steps in `menus.md`'s step order, not reply order. Execute posts in the orchestrator after Output done-check; posts on merged or closed PRs need no compare-and-swap. For a reply on an approved, still-open PR, retain the pre-write freshness read from Compare-and-swap: head movement yields `skipped - head moved`, keeps the body file and continues the set without re-entering assessment. Execute cleanup, resolved PR-named commands and individual overrides through `cleanup.md`; its failure and base-sync guards remain binding. Persist each result immediately, print `<label>: <result>`, and continue after a failed step without retry.
|
|
50
|
+
|
|
51
|
+
Invoke a picked `/skill:` step with its gates intact at its place in the order. While it waits, report `invoked /skill:<name> - paused at <where>` and emit only that skill's marker. Retain the picked set and remaining steps; after its return record what it returned and continue, never mark a paused step done.
|
|
52
|
+
|
|
53
|
+
After all picked steps finish, end through Teardown without another gatekeep-pr menu. Keep set-mode retirement parent-owned through `batch.md`.
|
|
54
|
+
|
|
43
55
|
### Exit check
|
|
44
56
|
|
|
45
57
|
Evaluate before every iteration and after every head, digest, or record change. Immediately after record validation, evaluate the last helper result and retained no-progress checkpoint before any binding-pending CI watch. For an unchanged `open - needs <X>` prerequisite, exit `stuck - needs <X>` immediately; name the prerequisite alone, without a CI timeout qualification. Apply the same ordering at own-push Re-render entry. Take the first matching exit:
|
|
46
58
|
|
|
47
59
|
| Exit | Condition and render |
|
|
48
60
|
|---|---|
|
|
49
|
-
| readiness | Every `### Merge preconditions` holds and no outstanding terminal fix-nits selection remains; deliver-nits also requires resolved closure lines for every opted-in and subsequently minted nit. Render final, with
|
|
61
|
+
| readiness | Every `### Merge preconditions` holds and no outstanding terminal fix-nits selection remains; deliver-nits also requires resolved closure lines for every opted-in and subsequently minted nit. Render final, with omissions from `menus.md`. Permission never converts a repairable source gap into readiness. |
|
|
50
62
|
| obstacle | Resolve the table below; render obstacle with its concrete reason, except contract exception and closed PR use their own templates. |
|
|
51
63
|
| cap | rounds_used reaches rounds_cap -> `round cap reached: <used> of <cap>`; syncs_used reaches syncs_cap -> `sync cap reached: <used> of <cap>`; render obstacle, keep local commits. |
|
|
52
64
|
|
|
53
|
-
Resolve every unmet merge prerequisite; retain failed prerequisites and append checkpoint history. An unlisted withhold is a protocol defect: stop with the concrete missing input rather than iterate.
|
|
65
|
+
Resolve every unmet merge prerequisite; retain failed prerequisites and append checkpoint history. Translate the internal exit reasons below into the report's plain standing sentence; keep protocol markers and actual errors intact. An unlisted withhold is a protocol defect: stop with the concrete missing input rather than iterate.
|
|
54
66
|
|
|
55
67
|
| Observed state | Action/verdict |
|
|
56
68
|
|---|---|
|
|
@@ -61,7 +73,7 @@ Resolve every unmet merge prerequisite; retain failed prerequisites and append c
|
|
|
61
73
|
| Helper open - contract exception, or pi failed decision's second slot starts contract exception: | Render contract exception through `### Contract decision`, not obstacle. |
|
|
62
74
|
| HEAD equals pre_wave_head with all payloads open, or scoped test unchanged-red after restore | render per ### No-progress obstacle |
|
|
63
75
|
| Undispositionable BLOCKED without eligible bypass under Merge preconditions | `GitHub reports BLOCKED, no local repair applies`; invent no rule attribution. |
|
|
64
|
-
| UNKNOWN/unreadable after step 2's single re-poll, regardless of CI color or a pending binding check | Render `stuck - merge state unknown` through `menus.md`'s obstacle template; let merge state own the withhold reason
|
|
76
|
+
| UNKNOWN/unreadable after step 2's single re-poll, regardless of CI color or a pending binding check | Render `stuck - merge state unknown` through `menus.md`'s obstacle template; let merge state own the withhold reason; render the wait through `report.md`. Authorize no sync, offer no ordinary wait row, recommend stop through `menus.md`, report both usage counters unchanged, and explain that merging cannot proceed until GitHub's merge status is readable. |
|
|
65
77
|
| Nonzero gh or incomplete pagination during refresh/refetch | One retry, then `stuck - refresh failed: <actual reason>`. |
|
|
66
78
|
| Incomplete comment source review | One fresh reviewer retry, then `stuck - comment source review incomplete`. |
|
|
67
79
|
| Deadline elapsed with binding checks | `stuck - CI pending past <n> minutes`; obstacle deliver opens exactly one additional window and extends neither cap. |
|
|
@@ -140,19 +152,18 @@ gh api --method POST repos/<base-owner>/<base-repo>/pulls/<N>/reviews -f commit_
|
|
|
140
152
|
|
|
141
153
|
Set `event` to `COMMENT` for `viewer.is_author` true, `REQUEST_CHANGES` otherwise; quote each field value as one shell word. Read the response's `commit_id`: equality confirms the posted review as the assessed-head baseline; a different value prints `review posted at <sha7>, not the assessed <sha7>` without claiming that baseline. On a failed POST or missing response commit, report the error or missing provenance without claiming a baseline or blindly reposting. Keep C# thread replies behind their own pick. With zero blockers post nothing and leave the GitHub baseline unchanged; a new session reviews that older baseline's delta again, with no local carry-over of cleared spans.
|
|
142
154
|
|
|
143
|
-
After successful `gh pr review --approve`, persist approved_head as the assessed head before rendering approved; on failure print the gh error without claiming approval.
|
|
155
|
+
After successful `gh pr review --approve`, persist approved_head as the assessed head before rendering the approved post menu once; on failure print the gh error without claiming approval.
|
|
144
156
|
|
|
145
157
|
### Merge course
|
|
146
158
|
|
|
147
159
|
`merge` executes as `gh pr merge --match-head-commit <assessed-sha>` with the flag of the resolved merge policy: `squash` -> `--squash`, `merge-commit` -> `--merge`, `rebase` -> `--rebase`. Push and merge are never one pick. Append `--admin` only on the bypass path: `merge_state_status == BLOCKED` and `permissions.bypass_eligible == true`, with every merge precondition satisfied. Omit `--admin` on every other path. This flag skips the merge queue; the bypass path merges directly, not through the merge queued template. In batch mode the parent reads `permissions.bypass_eligible` from the retained child record and applies this same predicate and refusal branch, without a new handoff field or batch compare-and-swap.
|
|
148
160
|
|
|
149
|
-
On a nonzero exit, print gh's error verbatim, consume the selection without retry (no second attempt with or without `--admin`), and re-run `### Pre-menu refresh`. Render from the refreshed prerequisites: final while all merge preconditions hold; obstacle
|
|
161
|
+
On a nonzero exit, print gh's error verbatim, consume the selection without retry (no second attempt with or without `--admin`), and re-run `### Pre-menu refresh`. Render from the refreshed prerequisites: final while all merge preconditions hold; obstacle explaining that GitHub still blocks this actor from merging when `BLOCKED` remains and `bypass_eligible` is no longer `true`; otherwise use the refreshed withhold resolver. Do not treat refusal as a queued merge or `stuck` by itself.
|
|
150
162
|
|
|
151
|
-
On a zero exit, read `gh pr view <N> --json state,mergeCommit`. `state: MERGED` -> write the returned `state` into `pr.state` and `mergeCommit.oid` into `pr.merge_commit` (the same two writes when a queued merge's `wait` re-read returns `MERGED`),
|
|
163
|
+
On a zero exit, read `gh pr view <N> --json state,mergeCommit`. `state: MERGED` -> write the returned `state` into `pr.state` and `mergeCommit.oid` into `pr.merge_commit` (the same two writes when a queued merge's `wait` re-read returns `MERGED`), save the `AC coverage` block as a payload file and render the own-merge post menu once (`menus.md` `## post`); any other state (a merge queue) -> render the queued-merge wait through `report.md` and the merge queued template (wait re-runs the read; show evidence stays hint-only). The block, `<sha>` = `mergeCommit.oid`, one row per `scope.rows` entry in row order with its outcome (`covered`, `deferred per spec to <ref>`, `deviates per spec: <why>`, `elsewhere per spec: <repo>`, `venue: <env> - <observation>, checked before prod deploy`); with no rows (`source: pr`, or an empty `scope.rows`) the block has no row lines and `post coverage to ticket` is not offered. With `source: pr` the header line drops `, spec <path>`. An `in-scope` row whose observation half is `not judged here` renders `covered; observable half checked after merge`.
|
|
152
164
|
|
|
153
165
|
Read and apply [menu-layout](../../brainstorming/reference/menu-layout.md) before presenting these options and before acting on a numeric reply.
|
|
154
166
|
|
|
155
|
-
```markdown
|
|
156
167
|
## AC coverage
|
|
157
168
|
Informational - the ticket's rows are unchanged. PR <url>, merged <sha>, spec <path>
|
|
158
169
|
- [ ] <row 1 text verbatim> - covered
|
|
@@ -160,7 +171,6 @@ Informational - the ticket's rows are unchanged. PR <url>, merged <sha>, spec <p
|
|
|
160
171
|
- [ ] <row 2 text verbatim> - deviates per spec: <why>
|
|
161
172
|
- [ ] <row 4 text verbatim> - venue: <env> - <observation>, checked before prod deploy
|
|
162
173
|
- [ ] <row 5 text verbatim> - elsewhere per spec: <repo>
|
|
163
|
-
```
|
|
164
174
|
|
|
165
175
|
A post is one write of that block, verbatim; a post that succeeded cannot be picked again in this run. `/skill:check-delivery` reads a posted block as any other comment, and the block's first line states that it amends nothing.
|
|
166
176
|
|
|
@@ -199,18 +209,22 @@ On completion or timeout, refresh then run steps 2-5 of Re-render plus step 1's
|
|
|
199
209
|
|
|
200
210
|
### Output done-check
|
|
201
211
|
|
|
202
|
-
Before posting or committing any external payload
|
|
212
|
+
Before posting or committing any external payload, apply SKILL.md `### Output done-check` and `## Wording rules`, including its coverage exception, plus any `## comms style` rules. End review bodies and replies on the fix or asked action, not a recap; never invent content to fill a section.
|
|
203
213
|
|
|
204
214
|
### Settlement rows
|
|
205
215
|
|
|
206
|
-
Emit the terminal message only after
|
|
216
|
+
Emit the terminal message only after the selected post set finishes or stop declines it; a report or menu is not settlement. Below its marker print one plain `#<N>@<head sha>: <outcome>[ (<ticket ref>)]` row per PR in roster order, singleton included. Use the full assessed `headRefOid`, not the merge commit or a shortened display SHA. Use the last gathered head when assessment could not start. Append the parenthetical only when the PR title or body's first line names a ticket under the overrides `## Issue tracker` `refs:` convention; otherwise omit it. Use exactly `approved`, `merged`, `closed-pr`, `final`, `merge-queued`, or `stuck - <reason>`, retaining the actual stop/error reason. Keep rows without bullets, code fences or emphasis; put checkout paths and cleanup results after them.
|
|
207
217
|
|
|
208
|
-
For set mode, retain each row before deleting its PR record
|
|
218
|
+
For set mode, retain each row before deleting its PR record; print it only in the parent's closing message through `batch.md`'s retirement and final-settlement rules. Keep private child result lines unchanged.
|
|
209
219
|
|
|
210
220
|
### Teardown
|
|
211
221
|
|
|
212
|
-
|
|
222
|
+
Save every unrun or failed drafted reply and coverage body without a file under `${TMPDIR:-/tmp}`; reuse existing body files. Do this on `final`, `merge-queued` and `post` stops too, before printing their paths or deleting drafts.
|
|
223
|
+
|
|
224
|
+
Start the message with `gauntlet: done approved` for post completion or stop on approved. Start the message with `gauntlet: done merged` for post completion or stop on own-merge. Start the message with `gauntlet: done closed-pr` for post completion or stop on closed-pr. Start the message with `gauntlet: done final` for stop on final. Start the message with `gauntlet: done merge-queued` for stop on merge-queued. Print the row from `### Settlement rows`, then the checkout path and local branch. Render reports through `report.md`; a report above a menu is not a terminal. Start the message with `gauntlet: stuck` followed by the actual error on any hard assertion failure, including a delegated fix-wave restore/assert failure; print the PR row with `stuck - <actual error>` below it and end with the actual error, without a continuation menu. In set mode use `batch.md`'s per-PR retirement marker until every PR retires.
|
|
225
|
+
|
|
226
|
+
Delegate non-final stop (initial, assess terminal, obstacle, contract exception) to `cleanup.md` `## Non-final stop`. Keep terminal cleanup behind a selected post step; terminal stop leaves the checkout as found and reports its path and local branch. Render cleanup only on terminal templates; never run cleanup steps 2-4 for a non-final stop.
|
|
213
227
|
|
|
214
|
-
|
|
228
|
+
After the terminal marker and settlement row, print the post-step results, then one sentence per unpicked, skipped or failed step naming its label, reason and command or payload path. Include skipped cleanup sub-steps. Keep these not-run sentences distinct from `<label>: <result>` lines. On stop, include every known drafted reply, coverage post, cleanup, PR-named action and override, stating whether it could run now or awaits the merge; keep the existing final and merge-queued outcomes. Retain the body files of unrun or failed posts and name them in these sentences. In set mode retain these sentences with the PR's row for the parent's closing message.
|
|
215
229
|
|
|
216
|
-
Delete both finding artifacts at `repair.wave.spec` and `repair.wave.ledger` with the run record, temporary description body files, every helper output and its log_path on every handled terminal exit. Drop unapplied drafts. Never discover authority in a new session.
|
|
230
|
+
Delete both finding artifacts at `repair.wave.spec` and `repair.wave.ledger` with the run record, temporary description body files, every helper output and its log_path on every handled terminal exit, except retained post payload files. Drop other unapplied drafts. Never discover authority in a new session.
|
|
@@ -1,114 +1,46 @@
|
|
|
1
1
|
# gatekeep-pr: step 5 - report
|
|
2
2
|
|
|
3
|
-
Read
|
|
3
|
+
Read after `findings.md` at step 5. Render report, then `menus.md`; apply SKILL.md's wording rules.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Report
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Write whole sentences in three unlabeled parts: change and scope, standing and problems, then a recommendation. Omit empty sections; number findings when two or more problems block merging.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Preserve:
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
- Render the opening as one paragraph of exactly two sentences. Describe the change first; fold the role into either sentence. In the second, explain covered and deferred behavior, its references, deliberate deviations and their reasons, behavior handled elsewhere and its repositories, and observations checked after merge; name the behavior, never a row number. Count a covered mechanism as covered even when its observation waits; say when nothing is covered. Keep row numbers and detailed mapping under `show evidence` or in the posted `AC coverage` checklist.
|
|
12
|
+
- In that opening, state whether the viewer is the author, a requested reviewer, neither, or unreadable, using refreshed `viewer.role` and `pr.review_requests`. Keep other requested users and teams in API order: exclude the viewer by case-insensitive User login comparison, exclude nobody when that login is unreadable, render Users by login and Teams by slug, and use `unknown` for a missing login or slug. Say, for example, "You are a requested reviewer; robin and acme/reviewers are also requested." Omit the list when empty.
|
|
13
|
+
- Start the second part with the standing sentence: nothing blocks merging, a count of problems to fix, or the one thing it waits on. Supply this sentence unchanged to the set parent's summary. Explain each problem in one or two sentences with one concrete example; retain the exact supplied failing test name and its file, or the file when no test name was supplied. Retain supplied path:line locators for every problem and nit. Print a compact exact old-to-new description preview under its blocker for consent; retain a declined proposal's preview on every re-render until the claim resolves.
|
|
14
|
+
- Explain replyable PR comments and the drafted reply's meaning, a pending reviewer run, a failed refresh or incomplete source review, and any merge prerequisite that still blocks progress. Follow with any wait, sync and prior-review results, and PR-named after-merge steps. Keep nits distinct and name their count and the offered action that can take them.
|
|
15
|
+
- For a non-null `prior_review`, count addressed items from distinct resolved `R#` entries and the supplied total. For an ancestor, say how many were addressed; with nonzero items and `prior_review.commit == headRefOid`, also say there are no commits since that review. With zero items, say that review posted no items and the changes since it were reviewed. For a baseline that is not an ancestor, retain the reason from `assessment.md` `## Prior-review ancestry` and that the whole diff was reviewed. Omit the prior-review sentence when null.
|
|
16
|
+
- Only with `--rebase`, explain the sync outcome, including resolved files on success and the actual reason on a skip, decline or failure. Translate the digest's status into prose; keep its exact value in the evidence record. Do not invent a sync result on loop re-entry.
|
|
12
17
|
|
|
13
|
-
|
|
18
|
+
For eligible BLOCKED readiness, omit the blocked comment and explain the admin override through `menus.md` `## final`. For WRITE or MAINTAIN, name override eligibility, not admin rights. With unreadable eligibility and green CI, say required checks passed independently of GitHub's block. Otherwise say GitHub blocks this actor from merging; never invent a named rule. Keep `bypass_eligible` and its value in the digest's permissions only, including when answering `show evidence`. Resolve other unavailable actions through `menus.md` and explain their actual missing prerequisites in prose, not a separate omission line.
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
Delivers: <one sentence: what the PR does. With source: spec, a second sentence built from these clauses in
|
|
17
|
-
order, each present only when it applies, joined with semicolons: covered rows ("ACs 1, 2, 4";
|
|
18
|
-
"ACs 1-5" when every row is covered; "no ACs" when none; a row whose mechanism half is covered
|
|
19
|
-
counts in the covered list and its observation half adds the trailing clause); deferred rows grouped by ref, in row
|
|
20
|
-
order ("3, 5 deferred per spec to <ref>"); deviating rows ("2 deviates per spec: <why>"); elsewhere rows grouped by repo ("6 elsewhere per spec: <repo>");
|
|
21
|
-
observation halves ("4's observable half (<what>) is checked after merge, not here").>
|
|
20
|
+
## Standing
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
Put part three's recommendation sentence and reason immediately above `Pick one:`; follow `menus.md`. Name a running required check or unchanged obstacle, not readiness. Translate verdict and exit state into prose.
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
- <reviewer>'s comment on <topic> <verdict clause>, so the drafted reply <what it says>. (<locator>)
|
|
27
|
-
- The reviewer run is still in progress, so merge waits. (<run url>)
|
|
28
|
-
- GitHub reports this actor's merge as blocked, so merge waits. (merge_state_status BLOCKED; reviewDecision <value>)
|
|
29
|
-
- <other applicable line from decision-menu.md `## Withhold reason resolver`>
|
|
30
|
-
|
|
31
|
-
Nits: (after the list, one line `<N> nits open - fix nits to take them` (`1 nit open` for one); rendered only while the `fix nits` row renders.)
|
|
32
|
-
- <1-2 sentences>. (<file:line>)
|
|
33
|
-
|
|
34
|
-
Prior review: <baseline outcome> (non-null prior_review only; forms and placement below)
|
|
35
|
-
|
|
36
|
-
Blockers: (numbered; menu picks reference these numbers)
|
|
37
|
-
1. <1-2 sentences: what is wrong, why it matters>. (<file:line and exact supplied test name for a failing test; file only when no test name was supplied> | <check name> | <doc path>)
|
|
38
|
-
|
|
39
|
-
Description: <optional concise non-blocking uncertainty: author assertion versus what the gate cannot verify>
|
|
40
|
-
|
|
41
|
-
Sync: <digest's sync field value verbatim; optional explanation after it as a second clause or sentence; only when --rebase was passed>
|
|
42
|
-
|
|
43
|
-
Verdict: mergeable - <evidence clause> | fixable - <N> blockers | not ready - <withhold reason>
|
|
44
|
-
|
|
45
|
-
<menu>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Print exactly one `Role:` directly under `Delivers` on every report from the refreshed `viewer.role` and `pr.review_requests`; append `(also requested: <entries>)` for requested reviewer, `(requested: <entries>)` otherwise, omitted when `<entries>` is empty. `<entries>`: the User and Team entries other than the viewer, API order (Keep API order, exclude the viewer by case-insensitive User login comparison, exclude nobody when the login is unreadable), User as login, Team as `slug`; render missing login/slug as `unknown`. Example: `Role: requested reviewer (also requested: robin, acme/reviewers)`.
|
|
49
|
-
|
|
50
|
-
Render `Sync:` only when `--rebase` was passed. Open the `Sync:` line with the digest's `sync` field value verbatim (for example `Sync: declined - other author's branch`). Put any explanation after that value as a second clause or sentence. Never paraphrase the status value into prose. Exempt `Sync:`, `Role:`, and `Prior review:` from SKILL.md wording rule 5 (passing facts only under `show evidence`): name the resolved files even when the sync succeeded.
|
|
51
|
-
|
|
52
|
-
For a non-null `prior_review`, print exactly one `Prior review:` line directly
|
|
53
|
-
above `Blockers` when it renders; otherwise directly above the obstacle `Evidence:` line when that line renders; otherwise directly above `Verdict`:
|
|
54
|
-
|
|
55
|
-
| Ancestry result | Line |
|
|
56
|
-
|---|---|
|
|
57
|
-
| `delta: ancestor` | `Prior review: <k> of <n> items addressed`; count `k` from distinct `R#` items recorded resolved through `findings.md` **Prior-item closure**, and `n` from the supplied item count. For nonzero items, append ` - no commits since <sha7>` whenever `prior_review.commit` equals `headRefOid`, regardless of `k`. For zero items use `Prior review: no items posted at <sha7>; the delta since it was reviewed`. |
|
|
58
|
-
| `delta: not ancestor (<reason>)` | `Prior review: baseline <sha7> is not an ancestor of the head (<reason>), so the whole diff was reviewed`; carry the reason from `assessment.md` `## Prior-review ancestry` verbatim. Use `unknown` for a null review commit. |
|
|
59
|
-
|
|
60
|
-
With `prior_review: null`, print no `Prior review:` line.
|
|
61
|
-
|
|
62
|
-
For obstacle reports, print exactly one `Evidence:` line naming the resolved evidence source and the assessed head, immediately before the verdict (for example `Evidence: CI (run 7001, test_unit and build_image green on 9c1e4f2)`). Use the resolved local verification summary instead when local evidence owns the assessment; do not invent a passing result when evidence is unavailable. Carry the same source summary into the obstacle menu's evidence hint. Exempt this compact source summary and the final template's `Evidence:` line from the evidence-only rules below and SKILL.md wording rule 5; keep the full record under `show evidence`.
|
|
63
|
-
|
|
64
|
-
## Verdict
|
|
65
|
-
|
|
66
|
-
For ordinary assessments, use `mergeable`, `fixable`, or `not ready`. Carry the mergeable evidence clause from `findings.md` `## Provenance`: `CI green on the assessed head (<check name>)` or `verification command passed locally`. Name the blocker count or concrete unmet prerequisite for fixable/not-ready assessments. Delegate obstacle/cap verdicts to `post-selection-loop.md` `### Exit check` and menu verdicts to `menus.md`.
|
|
67
|
-
|
|
68
|
-
`<N> blockers` reads `1 blocker` for one.
|
|
24
|
+
Explain standing with true evidence: distinguish CI from local runs and never turn pending or missing evidence into a pass. Put raw check conclusions, run URLs, head, prior-review and sync SHAs, pending-check counts, repair/sync usage counters and raw field/value pairs under `show evidence`, not in report prose, a separate evidence line or a hint parenthetical. A pending reviewer's run URL may still locate its comment. Apply the same rule to obstacle and final reports.
|
|
69
25
|
|
|
70
26
|
## What stays out
|
|
71
27
|
|
|
72
|
-
Verbatim command output stays in its `log_path` file and never prints; `show evidence` prints its `show evidence: <log_path>` line instead.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
1 nit open - fix nits to take them
|
|
92
|
-
|
|
93
|
-
Blockers:
|
|
94
|
-
1. The export endpoint ships with no test, so nothing proves it works and nothing
|
|
95
|
-
catches it breaking. (src/api/export.ts:10-58)
|
|
96
|
-
2. The export guide still says exports run nightly; the PR makes them on-demand, so a
|
|
97
|
-
reader following the docs waits for a job that no longer exists; the doc fix is drafted.
|
|
98
|
-
(docs/exports.rst:88)
|
|
99
|
-
|
|
100
|
-
Verdict: fixable - 2 blockers
|
|
101
|
-
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
A clean own PR with ticket gh-45 and CI green:
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
Delivers: the reports page exports CSV on demand. ACs 1-5.
|
|
108
|
-
Role: author
|
|
109
|
-
|
|
110
|
-
Verdict: mergeable - CI green on the assessed head (test)
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Render the initial example and every later menu from `menus.md`; keep all evidence-only details under the hint command. Preserve bottom-up report order before the selected template.
|
|
28
|
+
Verbatim command output stays in its `log_path` file and never prints; `show evidence` prints its `show evidence: <log_path>` line instead. Keep full drafted file edits, description bodies and replies, matched claims, per-row AC outcomes, internal IDs and check classifications behind that command. An author assertion the gate cannot verify is non-blocking uncertainty, not a fabricated finding.
|
|
29
|
+
|
|
30
|
+
Under `show evidence`, print `state: <absolute-path>`, then the run record's course, immutable target, stored scope baseline, cumulative round/sync usage and caps, deadline, wave checkpoints and failed-prerequisite history. Follow with the prior-review and sync records, retaining their SHAs, and the evidence record (CI: each satisfying check's name, conclusion, SHA and run URL; local: each run's command, `result`, `exit_code` and `show evidence: <log_path>`); claim dispositions; AC outcomes and `cross-check:` from `assessment.md` `## Select the scope contract`; check dispositions; drafted payloads keyed by blocker or nit; drafted replies keyed by comment. Keep these records inspectable without copying them into the report.
|
|
31
|
+
|
|
32
|
+
## Example
|
|
33
|
+
|
|
34
|
+
> This PR adds an on-demand CSV export button. The spec defers scheduled exports to acme/widgets#46, and the speed target needs checking after merge; you and robin are requested reviewers.
|
|
35
|
+
>
|
|
36
|
+
> One problem blocks merging: the description says "Exports run nightly", but the button exports on demand. The correction is "Exports run when you click Download." One smaller point does not block merging: the export repeats a shared helper's paging code.
|
|
37
|
+
>
|
|
38
|
+
> I recommend deliver because the description's correction is ready.
|
|
39
|
+
>
|
|
40
|
+
> Pick one:
|
|
41
|
+
> 1. deliver - apply the drafted description fix, merge main into the branch if it falls behind, watch the checks, and continue until merge is offered. [recommended]
|
|
42
|
+
> 2. deliver with nits - the same, and also replace the repeated paging code.
|
|
43
|
+
> 3. assess - post the problem to the PR as a review and make no repairs.
|
|
44
|
+
> 4. stop - remove the worktree and leave the PR as it is.
|
|
45
|
+
>
|
|
46
|
+
> Type a number; show evidence prints the full record.
|
|
@@ -81,4 +81,4 @@ Triggers: an unresolved stop, `open` for any reason other than a failing scoped
|
|
|
81
81
|
|
|
82
82
|
## Sync record
|
|
83
83
|
|
|
84
|
-
The digest's `sync` field is one of: `rebased <pre_head7>..<new_head7> onto origin/<base>, <n> stop(s) resolved in <files>, <m> commit(s) dropped as already applied`, `rebased locally <pre_head7>..<new_head7> onto origin/<base>, ..., scoped tests red in <file>: <tests>` (the plain `rebased ...` form is this record with the `scoped tests red in` clauses removed), `no-op - ...` (short form `sync: no-op`), `skipped - ...` (`sync: skipped`), `declined - ...` (`sync: declined`), `failed - ...` (for example `sync: failed - reviewer: ...` or `sync: failed - push rejected: <first server line>`), `stopped - ...`. `report.md`
|
|
84
|
+
The digest's `sync` field is one of: `rebased <pre_head7>..<new_head7> onto origin/<base>, <n> stop(s) resolved in <files>, <m> commit(s) dropped as already applied`, `rebased locally <pre_head7>..<new_head7> onto origin/<base>, ..., scoped tests red in <file>: <tests>` (the plain `rebased ...` form is this record with the `scoped tests red in` clauses removed), `no-op - ...` (short form `sync: no-op`), `skipped - ...` (`sync: skipped`), `declined - ...` (`sync: declined`), `failed - ...` (for example `sync: failed - reviewer: ...` or `sync: failed - push rejected: <first server line>`), `stopped - ...`. `report.md` translates this record into a prose sync outcome before the standing sentence, preserving resolved files and failure reasons; keep the exact status in `show evidence`. `<m>` is `git rev-list --count origin/<base>..<pre_head>` minus `git rev-list --count origin/<base>..HEAD`; omit the stops clause when no stop occurred.
|