mandrel 1.79.0 → 1.80.0

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.
@@ -107,6 +107,18 @@ rejected by `pre-push` hooks):
107
107
  4. **Never bypass hooks**: Do not use `--no-verify`, `--no-gpg-sign`, or
108
108
  other hook-skipping flags unless the operator explicitly authorizes it.
109
109
  If a hook fails, investigate the underlying cause.
110
+ - **Known false-negative signature**: a `pre-push`/`pre-commit` failure
111
+ whose message is a _zero-match_ error (e.g. Biome's
112
+ `No files were processed in the specified paths`) rather than a
113
+ reported violation, combined with an agent CWD under a harness-managed
114
+ worktree path a consumer's lint config ignores (e.g.
115
+ `.claude/worktrees/<name>/` against a `files.includes` glob like
116
+ `"!**/.claude"`), is a **consumer-tooling gap**, not a real lint
117
+ failure. It does not authorize `--no-verify`. See
118
+ [`worktree-lifecycle.md` § Harness-worktree ⇄ consumer-lint-ignore interaction](../workflows/helpers/worktree-lifecycle.md#harness-worktree-consumer-lint-ignore-interaction-story-152)
119
+ for the recognition signature and the sanctioned consumer-side fix
120
+ (`--no-errors-on-unmatched` or equivalent) before escalating via
121
+ `agent::blocked`.
110
122
 
111
123
  ## Meta Labels (Retrospective Signal Routing)
112
124
 
@@ -260,6 +260,74 @@ Symlink strategy:
260
260
  specific failure up to 3 times with 250/500/1000 ms backoff. Unrelated fetch
261
261
  failures surface immediately — no retry.
262
262
 
263
+ ## Harness-worktree ⇄ consumer-lint-ignore interaction (Story #152)
264
+
265
+ Mandrel's own worktree isolation (above) always roots story worktrees at
266
+ `delivery.worktreeIsolation.root` (default `.worktrees/` at the repo root).
267
+ That path is separate from **the host IDE/CLI harness's own worktree
268
+ mechanism** — for example Claude Code, when it manages an agent session as a
269
+ git worktree, nests it at `.claude/worktrees/<name>/`. A mandrel delivery
270
+ agent can be invoked from *either* location depending on how the operator's
271
+ harness composes with `/deliver`: mandrel's own `.worktrees/story-<id>/` when
272
+ `worktreeIsolation.enabled` drives the checkout, or a harness-level
273
+ `.claude/worktrees/<name>/` when the harness itself provides the isolated
274
+ working directory mandrel runs inside.
275
+
276
+ This matters because a consumer's `pre-push` (or `pre-commit`) lint step is
277
+ commonly configured with an ignore glob that excludes noisy agent-tooling
278
+ directories, e.g. a Biome `files.includes` entry like `"!**/.claude"`. When
279
+ the *agent's CWD itself* resolves under `.claude/worktrees/<name>/`, a
280
+ lint invocation scoped to `.` (`biome check .`, or equivalent) resolves
281
+ every candidate path as living under the ignored `.claude` prefix — the glob
282
+ matches zero files, and tools that treat zero-match as failure (Biome's
283
+ default `check` behavior without `--no-errors-on-unmatched`) exit non-zero
284
+ with something like `No files were processed in the specified paths`. This
285
+ is a **false negative**: the changed files were never actually linted
286
+ against, and the hook is not reporting a real defect. It is functionally
287
+ distinct from a `pre-push` rejection caused by a genuine lint violation, and
288
+ must not be treated the same way.
289
+
290
+ **Do not resolve this by bypassing the push hook.**
291
+ [`rules/git-conventions.md`](../../rules/git-conventions.md) § "Push
292
+ Validation & Reliability" prohibits skipping hooks without explicit operator
293
+ authorization, and that prohibition is not weakened by this interaction —
294
+ the zero-match failure is a **consumer-tooling gap**, not a framework
295
+ authorization the agent gets to grant itself.
296
+
297
+ **Sanctioned resolution path:**
298
+
299
+ 1. **Recognize the signature.** A `pre-push`/`pre-commit` failure whose
300
+ message is a zero-match error (`No files were processed`, `0 files
301
+ matched`, or equivalent for the consumer's linter) — not a reported
302
+ violation in a specific file — combined with an agent CWD under
303
+ `.claude/worktrees/` (or any other harness-managed path a consumer's lint
304
+ config ignores) is this known interaction, not a real lint failure.
305
+ 2. **Fix it in the consumer, not the agent invocation.** The remedy lives in
306
+ the consumer's own lint command, mirroring what its `lint-staged` config
307
+ (if present) likely already does for the same reason: make the zero-match
308
+ case a no-op instead of a failure. For Biome:
309
+ `biome check --no-errors-on-unmatched .`. Other linters have an
310
+ equivalent flag (e.g. ESLint's `--no-error-on-unmatched-pattern`). This is
311
+ a one-line consumer-side change, typically to `.husky/pre-push` or the
312
+ `package.json` script it invokes.
313
+ 3. **Escalate through the normal HITL path**, per
314
+ [`.agents/instructions.md` § 1.J](../../instructions.md), if the agent
315
+ cannot edit the consumer's hook/lint config directly (e.g. it sits outside
316
+ the Story's scope). Transition to `agent::blocked`, name the zero-match
317
+ signature and the one-line remedy in the blocker summary, and let the
318
+ operator apply the consumer-side fix or explicitly authorize a one-time
319
+ hook-skip per [`rules/git-conventions.md`](../../rules/git-conventions.md)
320
+ § "Push Validation & Reliability". Explicit operator authorization is the
321
+ *only* circumstance under which a hook may be skipped — never as an
322
+ agent's unilateral default when this signature is recognized.
323
+ 4. **Do not relocate mandrel's own worktrees to work around a harness-level
324
+ path.** `delivery.worktreeIsolation.root` controls where *mandrel*
325
+ materializes `story-<id>` worktrees (default `.worktrees/`, already
326
+ outside `.claude/`) and is unrelated to where the host harness places its
327
+ own session worktree. Changing `worktreeIsolation.root` does not fix this
328
+ interaction when the false negative originates from the harness's path,
329
+ not mandrel's.
330
+
263
331
  ## Fallback: single-tree mode
264
332
 
265
333
  Set `delivery.worktreeIsolation.enabled: false` (or omit the block) to
package/docs/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.80.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.79.0...mandrel-v1.80.0) (2026-07-01)
6
+
7
+
8
+ ### Chores
9
+
10
+ * **release:** force a release to ship the [#4306](https://github.com/dsj1984/mandrel/issues/4306) worktree-lifecycle doc fix ([#4307](https://github.com/dsj1984/mandrel/issues/4307)) ([fa54ebb](https://github.com/dsj1984/mandrel/commit/fa54ebb52fc8fe264bab2f4c6dea180973023c28))
11
+
5
12
  ## [1.79.0](https://github.com/dsj1984/mandrel/compare/mandrel-v1.78.0...mandrel-v1.79.0) (2026-06-30)
6
13
 
7
14
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mandrel",
3
- "version": "1.79.0",
3
+ "version": "1.80.0",
4
4
  "description": "Claude Code-first opinionated workflow framework: instructions, personas, skills, and SDLC workflows that govern AI coding assistants.",
5
5
  "files": [
6
6
  ".agents/",