pi-gauntlet 5.2.0 → 5.2.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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## v5.2.1 - 2026-09-01
4
+
5
+ - `linear` skill: seven `linearis` invocations corrected against the installed CLI (2026.7.0) - the nonexistent `issues comment-edit` becomes `issues edit <comment>`, `reply` takes a root discussion thread ID, `edit-reply` takes `<reply>`, `files upload` takes `<file>` (two occurrences), `attachments create`'s issue positional is optional, and gotcha (e) now documents two distinct relation flag sets (`relations add` has no `--blocked-by`). Setup is **preferred, not required**: a missing or unauthenticated `linearis` degrades and reports instead of blocking the run (MCP stays the fallback for a missing binary only). Drift resistance added in place - a once-per-session `linearis issues usage` consult for the issue-domain rows, a visible verified-against stamp under the quick-reference table, and one narrow parser-shape row in the failure table. Fixes #22. Spec: `doc/specs/2026-09-01-gh-22-linear-cli-verification.md`.
6
+
3
7
  ## v5.2.0 - 2026-08-31
4
8
 
5
9
  - **`plan_check` deterministic plan checker (new tool).** `phase-tracker` now registers `plan_check({ planPath })`, running 8 mechanical plan-vs-spec checks (table closure, quote integrity, anchor resolution, path existence, placeholder scan, wave file-disjointness, solo-line presence, header-only entrypoint) from a pi-free library at `extensions/lib/plan-check.ts`. Fail-closed: it never throws, and findings are returned for the main model to fix autonomously.
package/README.md CHANGED
@@ -262,8 +262,9 @@ Use the `jira` CLI (authenticated via `jira login`), not `gh` or `linearis`.
262
262
  - post comment (Reporter note only): `jira issue comment ABC-123 --body "<text>"`
263
263
  ```
264
264
 
265
- **`linear` setup:** mandatory - `linearis` installed and authenticated (or a Linear
266
- MCP server as a fallback when `linearis` is unavailable). Optional - the five
265
+ **`linear` setup:** preferred, not required - `linearis` installed and authenticated
266
+ (or a Linear MCP server as a fallback when `linearis` is missing). Without either, the
267
+ skill reports the gap and continues; it never blocks the run. Optional - the five
267
268
  `## Issue tracker` override keys (`tracker`, `workspace urlKey`, `default team`,
268
269
  `self`, `id cache`); the full schema is documented once, in
269
270
  [skills/linear/SKILL.md](./skills/linear/SKILL.md) - not restated here. Off switch:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "5.2.0",
3
+ "version": "5.2.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",
@@ -21,8 +21,10 @@ this skill alters re-gates.
21
21
 
22
22
  ## 1. Setup
23
23
 
24
- Mandatory: `linearis` on PATH and authenticated (`linearis auth status`). Token
25
- resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`.
24
+ Preferred: `linearis` on PATH and authenticated (`linearis auth status`). Token
25
+ resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`. This is a
26
+ preference, not a precondition - a missing or unauthenticated CLI degrades Linear
27
+ functionality and is reported, never blocks the run.
26
28
 
27
29
  > **No `linearis` installed?** If `command -v linearis` fails, fall back to a
28
30
  > **Linear MCP server** when the harness has one configured - its tools cover the
@@ -32,7 +34,20 @@ resolution order: `--api-token`, `LINEAR_API_TOKEN`, `~/.linearis/token`.
32
34
  > examples below are then guidance for the equivalent MCP call, not literal
33
35
  > shell. pi-gauntlet ships no MCP setup; MCP is opportunistic.
34
36
 
35
- No `linearis` and no MCP: report inability, never fabricate.
37
+ No `linearis` and no MCP: report inability, never fabricate. MCP is the fallback for a
38
+ **missing binary only** (`command -v linearis` fails); an installed-but-unauthenticated
39
+ `linearis` re-auths rather than rerouting to MCP.
40
+
41
+ **Session sweep.** When `linearis` is present and authenticated, run
42
+ `linearis issues usage` once per session, before the first issue operation, and treat
43
+ its output as ground truth for the **issue-domain rows** of the section 3 table (Read,
44
+ Search, List, Create, Update, Discuss, Reply, Edit). Non-issue domains such as labels,
45
+ teams, users, cycles, projects, attachments, files are outside this call's coverage and
46
+ fall to the section 8 backstop, same as any row the sweep didn't run or couldn't reach.
47
+ If the call errors, returns nothing, or the MCP path is in use, note once that the
48
+ issue-domain rows are unverified this session and continue. The sweep lives inside this
49
+ branch only - strictly after the override check above - so
50
+ `tracker: github | none | <unknown>` still means zero probing.
36
51
 
37
52
  Optional: each `## Issue tracker` override key below, with its degradation.
38
53
 
@@ -87,43 +102,50 @@ treated as absent.
87
102
  | Create | `linearis issues create "<title>" --team <default team> [--parent-ticket <id>] --status <status>` | Title is positional (no `--title`); `--team` required; `--parent-ticket` for sub-issues; state an explicit `--status` rather than relying on the default. |
88
103
  | Update | `linearis issues update <id> --status <status> --assignee <who> --labels <labels> --due-date <date> [relation flags]` | See gotcha (e) for relation flags. |
89
104
  | Discuss | `linearis issues discuss <id> --body "<text>"` | Starts a new top-level comment thread. |
90
- | Reply | `linearis issues reply <id> --body "<text>"` | Root comments only - see gotcha (b). |
91
- | Edit | `linearis issues comment-edit <id> --body "<text>"` / `linearis issues edit-reply <id> --body "<text>"` | Full rewrite, no history - see gotcha (a). |
105
+ | Reply | `linearis issues reply <thread> --body "<text>"` | `<thread>` is a root discussion thread ID, not an issue ID - see gotcha (b). |
106
+ | Edit | `linearis issues edit <comment> --body "<text>"` / `linearis issues edit-reply <reply> --body "<text>"` | Full rewrite, no history - see gotcha (a). |
92
107
  | Labels, teams, users, cycles | `linearis labels list`, `linearis teams list`, `linearis users list`, `linearis cycles list` | Use to resolve names to IDs; see id-cache convention. |
93
- | Attachments | `linearis attachments create <id> --url <url>` | Link-only, no inline render - see gotcha (d). |
94
- | Upload | `linearis files upload <path>` | Returns an `assetUrl` for inline embedding - see gotcha (d). |
108
+ | Attachments | `linearis attachments create [<issue>] --url <url>` | Positional is optional (`--issue <issue>` alias); link-only, no inline render - see gotcha (d). |
109
+ | Upload | `linearis files upload <file>` | Returns an `assetUrl` for inline embedding - see gotcha (d). |
95
110
 
96
111
  Workspace values above (`<default team>`, `<who>`, etc.) are placeholders bound to
97
112
  the override keys in section 2 - never a real urlKey, team prefix, or email.
98
113
 
114
+ Snapshot verified against `linearis 2026.7.0` (2026-09-01). The installed CLI's
115
+ `usage`/`--help` is ground truth; when they disagree, follow the CLI and tell the user
116
+ this table is stale.
117
+
99
118
  ## 4. Gotchas
100
119
 
101
120
  a. **Comment edit is a rewrite, no visible history.** To amend rather than replace,
102
121
  fetch the old body and pass `OLD + "\n\n" + ADDITION`; surface the overwrite diff
103
122
  to the user before pushing.
104
123
 
105
- b. **`reply` targets must be root comments** (`parentId: null`). A non-root target
106
- fails with a misleading validation error. To respond in-thread, resolve the
107
- thread's root via `discussions`/`--with-comment-threads` and `reply` to that
108
- root, or start a new `discuss` thread instead. `edit-reply` is NOT a reply
109
- fallback - it rewrites an existing reply. Use it only for an explicitly
110
- requested edit of the caller's own reply, behind the rewrite-confirmation rule
111
- in (a).
124
+ b. **`reply` targets must be root discussion threads.** `--help`: "`<thread>` must be a
125
+ root discussion thread ID." A non-root target fails with a misleading validation
126
+ error. To respond in-thread, resolve the thread's root via
127
+ `discussions`/`--with-comment-threads` and `reply` to that root, or start a new
128
+ `discuss` thread instead. `edit-reply` is NOT a reply fallback - it rewrites an
129
+ existing reply. Use it only for an explicitly requested edit of the caller's own
130
+ reply, behind the rewrite-confirmation rule in (a).
112
131
 
113
132
  c. **`@ABC-123` never resolves via the CLI/API.** Use the full issue URL
114
133
  `https://linear.app/<workspace urlKey>/issue/<id>`, which unfurls to a native
115
134
  badge and records a relation. A literal `@ID` in a body stays literal text.
116
135
 
117
- d. **Images go inline, links don't render.** `linearis files upload <path>` ->
136
+ d. **Images go inline, links don't render.** `linearis files upload <file>` ->
118
137
  `![alt](<assetUrl>)` in the body embeds the image. `attachments create` only
119
138
  links a URL and renders no image. Asset URLs returned by a `read` are
120
139
  short-lived signed JWTs - re-upload for a fresh one, never re-paste an old one.
121
140
 
122
- e. **Relation flags are single-value.** `--blocks`, `--blocked-by`, `--relates-to`,
123
- `--duplicate-of` on `create`/`update` keep only the last value if repeated in one
124
- call. For multiple relations in one call, use
125
- `linearis issues relations add <id>` with its comma-separated flags; otherwise
126
- issue separate `update` calls.
141
+ e. **Two different relation flag sets.** On `create`/`update`: `--blocks`,
142
+ `--blocked-by`, `--relates-to`, `--duplicate-of`, `--similar-to`, plus
143
+ `--remove-relation` on `update`. These are single-value - repeating one in a single
144
+ call keeps only the last value (observed behavior, not stated by `--help`). On
145
+ `linearis issues relations add <issue>` the set is smaller and comma-separated:
146
+ `--blocks`, `--related`, `--duplicate`, `--similar` - there is **no** `--blocked-by`,
147
+ so express that direction by inverting the relation or using `update`. For multiple
148
+ relations in one call use `relations add`; otherwise issue separate `update` calls.
127
149
 
128
150
  f. **`create`'s title is positional.** There is no `--title` flag.
129
151
 
@@ -173,9 +195,16 @@ Safety rules, in addition to the write gate above:
173
195
  | Missing `--team` error on create | `--team` is required | Supply `--team <default team>`. |
174
196
  | Search returns nothing unexpected | Search is case-sensitive | Retry with matching case. |
175
197
  | Cannot edit a comment | Comment belongs to another user | Reply instead of editing. |
176
- | Reply validation error | Target is not a root comment | See gotcha (b). |
198
+ | Reply validation error | Target is not a root discussion thread | See gotcha (b). |
177
199
  | `@ID` shows as literal text | `@ABC-123` mentions don't resolve | Use the full issue URL (gotcha c). |
178
200
  | Read is slow | Big ticket with many comments/attachments | Drop `--with-*` flags not needed. |
201
+ | Parser-shape failure on a documented invocation: unknown command/option, unexpected argument | Section 3's snapshot may have drifted from the installed CLI | Re-read that subcommand's `--help`; report the row stale **only if** help actually contradicts it, then follow help |
202
+
203
+ The last row's trigger is deliberately narrow. Data, auth, status-name, and root-thread
204
+ validation errors have their own rows above and are **not** drift - routing them to "the
205
+ skill is stale" would misdiagnose ordinary failures. This row is the reactive path for
206
+ when the section 1 session sweep didn't run, couldn't run, or doesn't cover the failing
207
+ subcommand (any row outside the `issues` domain).
179
208
 
180
209
  ## 9. Discovery pointers
181
210