@@ -27,7 +27,8 @@ import {
2727 hasValidOverrideAllow ,
2828 isRestrictedOverrideContext ,
2929 tryOverrideBypass ,
30- writeOverrideAllow ,
30+ writeSealedOverrideAllow ,
31+ writeUnsignedOverrideAllow ,
3132} from "./override.js" ;
3233import { initAttestKey , signPayload } from "./seal.js" ;
3334import { DEFAULT_CONFIG } from "./types.js" ;
@@ -143,18 +144,28 @@ describe("attest prerequisites", () => {
143144
144145describe ( "override policy" , ( ) => {
145146 let dir : string ;
147+ let attestHome : string ;
148+ const passphrase = "override-test-passphrase" ;
146149 const keys = [
147150 "KNOW_CODE_OVERRIDE" ,
148151 "KNOW_CODE_HOOK_FORMAT" ,
149152 "CI" ,
150153 "GITHUB_ACTIONS" ,
154+ "KNOW_CODE_ATTEST_HOME" ,
155+ "KNOW_CODE_ATTEST_PASSPHRASE" ,
151156 ] as const ;
152157 const prev : Record < string , string | undefined > = { } ;
153158
154159 before ( ( ) => {
155160 for ( const k of keys ) prev [ k ] = process . env [ k ] ;
161+ delete process . env . KNOW_CODE_HOOK_FORMAT ;
162+ attestHome = mkdtempSync ( join ( tmpdir ( ) , "kc-ovr-att-" ) ) ;
163+ process . env . KNOW_CODE_ATTEST_HOME = attestHome ;
164+ process . env . KNOW_CODE_ATTEST_PASSPHRASE = passphrase ;
156165 dir = mkdtempSync ( join ( tmpdir ( ) , "override-" ) ) ;
157166 mkdirSync ( join ( dir , ".know-code" ) , { recursive : true } ) ;
167+ writeConfig ( dir , { ...DEFAULT_CONFIG , level : "lite" , requireAttest : true } ) ;
168+ initAttestKey ( dir , passphrase ) ;
158169 } ) ;
159170
160171 after ( ( ) => {
@@ -163,15 +174,18 @@ describe("override policy", () => {
163174 else process . env [ k ] = prev [ k ] ;
164175 }
165176 rmSync ( dir , { recursive : true , force : true } ) ;
177+ rmSync ( attestHome , { recursive : true , force : true } ) ;
166178 } ) ;
167179
168- it ( "denies OVERRIDE in agent-hook context" , ( ) => {
169- process . env . KNOW_CODE_OVERRIDE = "1" ;
170- process . env . KNOW_CODE_HOOK_FORMAT = "cursor" ;
180+ it ( "denies OVERRIDE in agent-hook context" , async ( ) => {
181+ delete process . env . KNOW_CODE_HOOK_FORMAT ;
171182 delete process . env . CI ;
172183 delete process . env . GITHUB_ACTIONS ;
184+ // Seal while not in agent context (sealing requires human TTY path).
185+ await writeSealedOverrideAllow ( dir , { passphrase } ) ;
186+ process . env . KNOW_CODE_OVERRIDE = "1" ;
187+ process . env . KNOW_CODE_HOOK_FORMAT = "cursor" ;
173188 assert . equal ( isRestrictedOverrideContext ( ) , true ) ;
174- writeOverrideAllow ( dir ) ;
175189 const r = tryOverrideBypass ( dir ) ;
176190 assert . equal ( r . allowed , false ) ;
177191 assert . match ( r . reason || "" , / d e n i e d i n a g e n t h o o k s / ) ;
@@ -189,12 +203,23 @@ describe("override policy", () => {
189203 assert . match ( r . reason || "" , / k n o w - c o d e o v e r r i d e / ) ;
190204 } ) ;
191205
192- it ( "allows then consumes override-allow" , ( ) => {
206+ it ( "denies agent-minted unsigned override-allow" , ( ) => {
207+ process . env . KNOW_CODE_OVERRIDE = "1" ;
208+ delete process . env . KNOW_CODE_HOOK_FORMAT ;
209+ delete process . env . CI ;
210+ delete process . env . GITHUB_ACTIONS ;
211+ writeUnsignedOverrideAllow ( dir ) ;
212+ assert . equal ( hasValidOverrideAllow ( dir ) , false ) ;
213+ const r = tryOverrideBypass ( dir ) ;
214+ assert . equal ( r . allowed , false ) ;
215+ } ) ;
216+
217+ it ( "allows then consumes sealed override-allow" , async ( ) => {
193218 process . env . KNOW_CODE_OVERRIDE = "1" ;
194219 delete process . env . KNOW_CODE_HOOK_FORMAT ;
195220 delete process . env . CI ;
196221 delete process . env . GITHUB_ACTIONS ;
197- writeOverrideAllow ( dir ) ;
222+ await writeSealedOverrideAllow ( dir , { passphrase } ) ;
198223 assert . equal ( hasValidOverrideAllow ( dir ) , true ) ;
199224 const r = tryOverrideBypass ( dir ) ;
200225 assert . equal ( r . allowed , true ) ;
0 commit comments