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