REVIEWED_TREE: b538235e5050fbea5bd8852d9d09a6b2bb0f6275 /workspace/gstack

1. **Unlanded lifecycle scripts are excluded from parent validation.** `/workspace/gstack/lib/ship-release.ts:456–459` reuses metadata exclusions computed against the reviewed tree, not against main. An unchanged `package.json` qualifies even when the parent added a dependency or `postinstall` that main never received. Reproduced a parent whose source change landed but whose `postinstall` didn't: unrestricted `heldBy` returned null, while finish printed `REVIEWED_BASE: stack parent … landed` and `behavior=0`. The child's review against that parent never covered the retained script. Classify the parent's manifest changes against main before excluding them. Severity: High. Blocks: yes

2. **Historical parent acceptance can hide a rollback of main's security fix.** `/workspace/gstack/lib/ship-release.ts:219,255–256` accepts a historical landing but inspects only paths differing between the reviewed and current trees. If main subsequently fixes a parent line and the child's merge keeps the old parent version, that path is unchanged since review and never examined. Reproduced main changing `MIN_TOKEN_LENGTH` from 8 to 16 while the merge retained 8: `heldBy` found the historical squash, and finish reported `behavior=0` and fresh docs despite the rollback against main. Compare the current branch patch's paths too. Severity: High. Blocks: yes

3. **The absorbed-change shortcut ignores executable and symlink modes.** `/workspace/gstack/lib/ship-patch.ts:132–141` compares blob bytes only. After a child reviews a `100644 → 100755` change, reverting it to main's `100644` leaves identical blobs, so `baseHolds` incorrectly returns true. Reproduced `comparePath=changed`, `baseHolds=true`, and finish routing the reverted executable as `base=1 behavior=0`. This can ship a nonexecutable entry point without re-review. Validate tree-entry modes before granting this shortcut. Severity: Medium. Blocks: yes

Recommendation: Request changes because an unlanded package.json postinstall can pass parent validation and escape the child's review.
