1818DEFAULT_GRAPHTRAIL_DELTA_TIMEOUT_SECONDS = 10.0
1919CAPTURE_BEFORE_RETRY_MODES = ("warn" , "block" , "off" )
2020DEFAULT_CAPTURE_BEFORE_RETRY = "warn"
21+ DEFAULT_VERIFY_RUNS_KEEP = 50
22+ DEFAULT_VERIFY_ARCHIVE_ENABLED = True
23+ DEFAULT_VERIFY_ARCHIVE_DIR = ".brigade/work/verify-archive"
2124
2225
2326@dataclass
@@ -26,6 +29,9 @@ class Config:
2629 selection : Selection
2730 graphtrail_delta_timeout_seconds : float = DEFAULT_GRAPHTRAIL_DELTA_TIMEOUT_SECONDS
2831 capture_before_retry : str = DEFAULT_CAPTURE_BEFORE_RETRY
32+ verify_runs_keep : int = DEFAULT_VERIFY_RUNS_KEEP
33+ verify_archive_enabled : bool = DEFAULT_VERIFY_ARCHIVE_ENABLED
34+ verify_archive_dir : str = DEFAULT_VERIFY_ARCHIVE_DIR
2935
3036
3137def validate_graphtrail_delta_timeout (value : Any ) -> float :
@@ -65,6 +71,42 @@ def resolve_graphtrail_delta_timeout(target: Path, cli_override: float | None =
6571 return DEFAULT_GRAPHTRAIL_DELTA_TIMEOUT_SECONDS
6672
6773
74+ def validate_verify_runs_keep (value : Any ) -> int :
75+ if isinstance (value , bool ) or not isinstance (value , int ) or value < 1 :
76+ raise ValueError ("verify_runs_keep must be a positive integer" )
77+ return value
78+
79+
80+ def validate_verify_archive_enabled (value : Any ) -> bool :
81+ if not isinstance (value , bool ):
82+ raise ValueError ("verify_archive_enabled must be true or false" )
83+ return value
84+
85+
86+ def validate_verify_archive_dir (value : Any ) -> str :
87+ if not isinstance (value , str ) or not value .strip ():
88+ raise ValueError ("verify_archive_dir must be a non-empty string" )
89+ return value .strip ()
90+
91+
92+ def resolve_verify_runs_keep (target : Path ) -> int :
93+ cfg = load_config (target )
94+ if cfg is not None :
95+ return cfg .verify_runs_keep
96+ return DEFAULT_VERIFY_RUNS_KEEP
97+
98+
99+ def resolve_verify_archive (target : Path ) -> tuple [bool , Path ]:
100+ """Return (enabled, archive root) for verify-run evidence archival."""
101+ cfg = load_config (target )
102+ enabled = cfg .verify_archive_enabled if cfg is not None else DEFAULT_VERIFY_ARCHIVE_ENABLED
103+ raw = cfg .verify_archive_dir if cfg is not None else DEFAULT_VERIFY_ARCHIVE_DIR
104+ path = Path (raw ).expanduser ()
105+ if not path .is_absolute ():
106+ path = target / path
107+ return enabled , path
108+
109+
68110def config_path (target : Path ) -> Path :
69111 return target / CONFIG_REL_PATH
70112
@@ -86,6 +128,15 @@ def write_config(target: Path, cfg: Config) -> None:
86128 capture_before_retry = validate_capture_before_retry (cfg .capture_before_retry )
87129 if capture_before_retry != DEFAULT_CAPTURE_BEFORE_RETRY :
88130 payload ["capture_before_retry" ] = capture_before_retry
131+ verify_runs_keep = validate_verify_runs_keep (cfg .verify_runs_keep )
132+ if verify_runs_keep != DEFAULT_VERIFY_RUNS_KEEP :
133+ payload ["verify_runs_keep" ] = verify_runs_keep
134+ verify_archive_enabled = validate_verify_archive_enabled (cfg .verify_archive_enabled )
135+ if verify_archive_enabled != DEFAULT_VERIFY_ARCHIVE_ENABLED :
136+ payload ["verify_archive_enabled" ] = verify_archive_enabled
137+ verify_archive_dir = validate_verify_archive_dir (cfg .verify_archive_dir )
138+ if verify_archive_dir != DEFAULT_VERIFY_ARCHIVE_DIR :
139+ payload ["verify_archive_dir" ] = verify_archive_dir
89140 path .write_text (json .dumps (payload , indent = 2 ) + "\n " )
90141
91142
@@ -113,9 +164,17 @@ def load_config(target: Path) -> Optional[Config]:
113164 timeout_raw = data .get ("graphtrail_delta_timeout_seconds" , DEFAULT_GRAPHTRAIL_DELTA_TIMEOUT_SECONDS )
114165 timeout = validate_graphtrail_delta_timeout (timeout_raw )
115166 capture_before_retry = validate_capture_before_retry (data .get ("capture_before_retry" , DEFAULT_CAPTURE_BEFORE_RETRY ))
167+ verify_runs_keep = validate_verify_runs_keep (data .get ("verify_runs_keep" , DEFAULT_VERIFY_RUNS_KEEP ))
168+ verify_archive_enabled = validate_verify_archive_enabled (
169+ data .get ("verify_archive_enabled" , DEFAULT_VERIFY_ARCHIVE_ENABLED )
170+ )
171+ verify_archive_dir = validate_verify_archive_dir (data .get ("verify_archive_dir" , DEFAULT_VERIFY_ARCHIVE_DIR ))
116172 return Config (
117173 version = version ,
118174 selection = sel ,
119175 graphtrail_delta_timeout_seconds = timeout ,
120176 capture_before_retry = capture_before_retry ,
177+ verify_runs_keep = verify_runs_keep ,
178+ verify_archive_enabled = verify_archive_enabled ,
179+ verify_archive_dir = verify_archive_dir ,
121180 )
0 commit comments