pi-gauntlet 7.0.0 → 7.0.1

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## v7.0.1 - 2026-10-02
4
+
5
+ ### Fixed
6
+
7
+ - **gatekeep-pr: cross-repo split is explicit.** `reference/findings.md` "Whole or part": a PR in another repository, named in the ticket body or a human ticket comment, waives exactly the rows whose mechanism lives there; a PR named only in this PR's body stays a lead. The `gap` table row carries the same exception. Before, a two-repo ticket produced an unfixable blocker per row owned by the other repo.
8
+ - **gatekeep-pr: one defect, one blocker.** A missing mechanism that surfaces as reviewer finding, AC `gap`, doc drift, and `contradicted` claim at once renders as one blocker with every locator (`reference/findings.md` "Namespaces").
9
+ - **gatekeep-pr: `Delivers` composes.** The coverage, split, and observation clauses are optional and joined with semicolons, so "covers none of the ACs" and "whole + observation half" both render (`reference/report.md`). The compose hint lists only compositions whose verbs are rendered rows (`reference/decision-menu.md`). `## PR gate` `verification command` accepts one command per subproject, resolved by the diff's paths (`reference/assessment.md`).
10
+
3
11
  ## v7.0.0 - 2026-10-01
4
12
 
5
13
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "7.0.0",
3
+ "version": "7.0.1",
4
4
  "description": "Opinionated, gated workflow skills, subagent personas, and runtime extensions for the pi coding agent.",
5
5
  "author": "Jacek Juraszek",
6
6
  "type": "module",
@@ -25,7 +25,7 @@ Resolve per concern, first match wins, evaluated unconditionally - never delegat
25
25
 
26
26
  ```markdown
27
27
  ## PR gate
28
- - verification command: <command> # required unless documented elsewhere
28
+ - verification command: <command> # required unless documented elsewhere; one command per subproject ("<dir>: <command>") resolves by the diff's paths, every touched subproject runs
29
29
  - timeout minutes: 15 # optional; default 15
30
30
  - requires credentials: false # optional; true => the gate reports "not run" as missing evidence
31
31
  - local verification: always # optional; default (absent) = CI-first; "always" forces the local run even when exact-head CI is green
@@ -21,7 +21,7 @@ Rows are `<n>. <verb> - <consequence>`; every row, `stop` and `(not available: .
21
21
  - `wait` - poll the reviewer run, the pending required checks, and the comment set, then re-render
22
22
  - `stop` - leave the PR as-is
23
23
 
24
- Compose hint: `Type a number, or compose: "fix 2", "fix nits", "fix + nits", "fix 1 + reply".` A composed line never bundles a push-producing verb (`fix`, `push`) with `merge`. When a failing check withholds `merge`, the hint line also offers `check <name> flaky | real | ci-broken`, which records the disposition on that check (`findings.md` `## Dispositions`): `flaky` lifts the blocker, `real` keeps it until green, `ci-broken` triggers the fallback local run (`ci-broken` records `ci-infrastructure-broken`).
24
+ Compose hint: `Type a number, or compose: "fix 2", "fix nits", "fix + nits", "fix 1 + reply".` The hint lists only compositions whose every verb is a rendered row: no `Nits` section, no `fix nits`; no `reply` row, no `fix 1 + reply`; no composable row, `Type a number.` alone. A composed line never bundles a push-producing verb (`fix`, `push`) with `merge`. When a failing check withholds `merge`, the hint line also offers `check <name> flaky | real | ci-broken`, which records the disposition on that check (`findings.md` `## Dispositions`): `flaky` lifts the blocker, `real` keeps it until green, `ci-broken` triggers the fallback local run (`ci-broken` records `ci-infrastructure-broken`).
25
25
 
26
26
  A composed line naming a `(not available: ...)` row is refused by name and the menu re-renders; the two `merge anyway` forms are the only overrides.
27
27
 
@@ -15,7 +15,7 @@ Split each AC row once into a **mechanism half** (code + test + doc that make th
15
15
  | Outcome | Condition | Renders as | Blocks |
16
16
  |---|---|---|---|
17
17
  | `covered` | evidence matches what the AC promises: executable behavior needs the code path plus a real test that exercises it; a documentation-only AC is judged against the promised doc text and demands no test; in both cases docs that describe the behavior agree with it | counted in `Delivers` | no |
18
- | `gap` | any part of the mechanism absent in this PR | one `Blockers` item | yes - a mechanism `gap` is a blocker |
18
+ | `gap` | any part of the mechanism absent in this PR and the row not explicitly split (see Whole or part) | one `Blockers` item | yes - a mechanism `gap` is a blocker |
19
19
  | `not judged here` | the observation half; the mechanism half of the same row is still judged `covered`/`gap` | one `Delivers` clause ("<row>'s observable half is checked after merge, not here"); nothing is written, listed, or handed to check-delivery | no |
20
20
  | `impossible` | a `gap` whose fix is on the ticket - all four conditions below hold | one `Ticket changes` item with a drafted replacement AC text, in state `drafted` or `proposed` | withholds `merge` until the ticket body changes or the human picks `merge anyway - accept AC<n> as impossible` |
21
21
 
@@ -25,7 +25,7 @@ Split each AC row once into a **mechanism half** (code + test + doc that make th
25
25
 
26
26
  **No ticket** (none linked, or fetch failed): no AC rows; `Delivers` states the PR's intent as read from its title and body; `not judged here`, `impossible`, `Ticket changes`, and scope creep do not apply.
27
27
 
28
- **Whole or part.** With a ticket linked, `Delivers` names coverage: *whole* when every row is `covered` or is `not judged here` with its mechanism half `covered`; *part, acceptable* when every uncovered row is either an observation half or **explicitly split** - the ticket body or a human-authored ticket comment names another tracker ref for that row, read from the tracker this run. Only the tracker waives an obligation: a spec `deferred: <where>`, a linked later PR, or a `proposed` (not yet `resolved`) ticket change is a lead to check the tracker, never a waiver. Any other uncovered row is `gap`: "a later PR will add X" in the PR body, an unchecked box with no tracker split, a `deferred:` the ticket does not confirm.
28
+ **Whole or part.** With a ticket linked, `Delivers` names coverage: *whole* when every row is `covered` or is `not judged here` with its mechanism half `covered`; *part, acceptable* when every uncovered row is either an observation half or **explicitly split** - the ticket body or a human-authored ticket comment, read from the tracker this run, names another tracker ref or a PR in another repository for that row; a cross-repo PR named there waives exactly the rows whose mechanism lives in that repository. Only the tracker waives an obligation: a spec `deferred: <where>`, a later PR in the same repository, a PR named only in this PR's body, or a `proposed` (not yet `resolved`) ticket change is a lead to check the tracker, never a waiver. Any other uncovered row is `gap`: "a later PR will add X" in the PR body, an unchecked box with no tracker split, a `deferred:` the ticket does not confirm.
29
29
 
30
30
  **Claims.** The Verifier's three dispositions stand. `contradicted` is a blocker. `unverifiable-pre-merge` is not evidence and renders nothing: a PR whose only proof of a new path is "verified on stg" is blocked by the untested-path rubric row, not by a claim rule.
31
31
 
@@ -40,6 +40,8 @@ Every finding is one of two:
40
40
 
41
41
  Behavior the ticket promises is a blocker or an explicit tracker split - never deferred to a PR nobody opened.
42
42
 
43
+ **One defect, one blocker.** A missing mechanism surfaces through several rules at once (reviewer finding, AC `gap`, doc drift, `contradicted` claim); render it as one blocker that names the defect and lists every locator, and keep each contributing rule's ID in the ledger.
44
+
43
45
  **Severity translation.** Reviewer Critical and Moderate -> blocker; Minor -> nit. A repo `REVIEW.md` mapping overrides this; a severity it names but does not map is fail-safe blocker, noted in `show evidence`.
44
46
 
45
47
  **Triage bar** for findings the orchestrator originates itself: blocker only when it must be fixed before merge (correctness, security, a material performance trap, a convention the repo enforces); everything else is a nit, whatever its category. The bar never re-triages a classification the severity translation already made.
@@ -9,9 +9,11 @@ Render bottom-up for a terminal: least important first, verdict and menu last. E
9
9
  Section order is fixed:
10
10
 
11
11
  ```
12
- Delivers: <one or two sentences: what the PR does; with a ticket: "The PR covers the whole <ref>." |
13
- "The PR covers AC1-2 of <ref>; AC3's observable half (<what>) is checked after merge, not here." |
14
- "The PR covers AC1 of <ref>; AC2 belongs to <split ref>.">
12
+ Delivers: <one sentence: what the PR does. With a ticket, a second sentence built from these clauses in
13
+ order, each present only when it applies: coverage ("The PR covers the whole <ref>" | "covers
14
+ AC1-2 of <ref>" | "covers none of <ref>'s ACs"); split ("AC3 belongs to <split ref>");
15
+ observation ("AC4's observable half (<what>) is checked after merge, not here"); joined with
16
+ semicolons.>
15
17
 
16
18
  Ticket changes: (one item per unresolved `impossible` row)
17
19
  - AC<n> asks for <X>, and <cited constraint>. Proposed wording: "<new AC text>". (drafted | proposed <comment url>; <source>)