The glossary had no entry for the containment predicate at all, which is the epic's actual deliverable. The new entry states the engine/export split, the branded type, the named acceptance policy, the preserved message contract, and — the part most likely to be undone by a later cleanup — the two implementations deliberately NOT collapsed and why each is stricter or narrower rather than duplicative. Glossary gate re-run: 269 refs, exit 0. Install-tree goldens regenerated and confirmed byte-identical rather than assumed unchanged; lint:ci exits 0, so no conformance-tier drift either. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
672 B
672 B
type, pr
| type | pr |
|---|---|
| Changed | 0 |
The path-containment predicate is now a single exported seam — security.cjs no longer exports validatePath; assertWithinRoot (throws), tryWithinRoot (returns null) and requireSafePath are the only containment exports, and all three return a branded ContainedPath so a validated path cannot be silently swapped for an unvalidated one. The per-call-site { allowAbsolute: true } flag is replaced by the named PathAcceptance policy, which states what it actually permits: an absolute path outside the root was always rejected and still is. Rejection message text and every command's observable behavior are unchanged. (#4653)