Blocker 2. gate.mjs compares submitted answers to stored expected values, never re-deriving from derived_from — a query pointing at a nonexistent/drifted contract still yields implementation_authority GRANTED. The authority read is also unconfined (../ escapes the repo). Fix: extract audit.mjs's re-derivation into a shared lib and enforce it at gate time; confine the authority read. Verified: gate.mjs:68-73,280-288.
Part of the v0.3.0 production quest (product-1). Verified at release commit fc0fa05.
Blocker 2. gate.mjs compares submitted answers to stored expected values, never re-deriving from derived_from — a query pointing at a nonexistent/drifted contract still yields implementation_authority GRANTED. The authority read is also unconfined (../ escapes the repo). Fix: extract audit.mjs's re-derivation into a shared lib and enforce it at gate time; confine the authority read. Verified: gate.mjs:68-73,280-288.
Part of the v0.3.0 production quest (product-1). Verified at release commit fc0fa05.