forked from mosaicstack/stack
Implementing D-17's fix surfaced a conflict between criteria, not within one. AC2 (reject symlinked generated state) cannot hold alongside AC4 (canonical build succeeds): verified independently that apps/web sets output:'standalone' and the built tree carries 42 legitimate pnpm symlinks under .next/standalone. Only building the tree reveals it. Completes the chain: a pre-registered check set can be WRONG (D-8), INCOMPLETE (D-17), or INTERNALLY INCONSISTENT (D-18). Ruling: build-certified symlink manifest — .next itself still rejected; descendants rejected unless exactly certified. Stronger than blanket rejection because it catches retargeting. AC2 restated and RECORDED with provenance rather than absorbed, since silently resolving a conflict between pre-registered criteria destroys the point of registering them. Hardening: the manifest is generated state, so a manifest writable by whoever plants a rogue symlink certifies the attack. Must be inside the integrity envelope, published atomically, with negative controls observed red first including manifest-tampered. RM-02 fourth clause: the registry must detect conflicts between criteria, and retain original text plus restatement plus reason when a criterion changes meaning. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>