|
11 | 11 | The verdict uses STRICT release gates: |
12 | 12 |
|
13 | 13 | - **RED** (a real blocker) if any of the 5 libraries has failing CI, is off |
14 | | - ``main``, has uncommitted source changes, or is behind origin; or the latest |
15 | | - Build test run is ``ready == false``; or any workspace is pinned AHEAD of its |
16 | | - installed library, has a ``general.yaml`` ↔ ``version.txt`` MISMATCH, or an |
17 | | - unparseable (BAD) version; or the deep install verification last reported |
18 | | - ``ready == false``. |
19 | | -- **YELLOW** (caution) for soft signals: script-timing regressions, stale open |
20 | | - PRs, stale parked scripts, a workspace pinned BEHIND, a stale or never-run |
21 | | - install verification, and — crucially — any *unknown* (missing test-run |
22 | | - report, a library absent from the snapshot). An unknown is never silently |
23 | | - treated as green and never escalated to red. |
| 14 | + ``main``, has uncommitted source changes, or is behind origin; or any workspace |
| 15 | + is pinned AHEAD of its installed library, has a ``general.yaml`` ↔ |
| 16 | + ``version.txt`` MISMATCH, or an unparseable (BAD) version; or the deep install |
| 17 | + verification last reported ``ready == false``. |
| 18 | +- **YELLOW** (caution) for soft signals: workspace-validation not passing (the |
| 19 | + workspace scripts/notebooks carry standing debt, so this is advisory — never a |
| 20 | + hard block), script-timing regressions, stale open PRs, stale parked scripts, a |
| 21 | + workspace pinned BEHIND, a stale or never-run install verification, and — |
| 22 | + crucially — any *unknown* (missing test-run report, a library absent from the |
| 23 | + snapshot). An unknown is never silently treated as green and never escalated to |
| 24 | + red. |
24 | 25 | - **GREEN** otherwise. |
25 | 26 |
|
26 | 27 | Red dominates yellow structurally: reasons are collected into separate lists |
|
61 | 62 | "lib_branch": (15, 30), |
62 | 63 | "lib_dirty": (15, 30), |
63 | 64 | "lib_behind": (20, 40), |
64 | | - "test_not_ready": (40, 40), |
| 65 | + "test_failing": (15, 15), |
65 | 66 | "skew_ahead": (25, 50), |
66 | 67 | "lib_unknown": (10, 30), |
67 | 68 | "test_unknown": (10, 10), |
@@ -164,8 +165,14 @@ def hit(key: str, n: int = 1) -> None: |
164 | 165 | if isinstance(test_run, dict) and "ready" in test_run: |
165 | 166 | ready = test_run.get("ready") |
166 | 167 | if ready is False: |
167 | | - red.append(f"test run not ready ({test_run.get('run_label', '?')})") |
168 | | - hit("test_not_ready") |
| 168 | + # Workspace scripts/notebooks carry standing debt; failing validation |
| 169 | + # is advisory (YELLOW), not a release blocker. Real blockers are the |
| 170 | + # library CI / install / version-skew gates above. |
| 171 | + yellow.append( |
| 172 | + f"workspace validation not passing " |
| 173 | + f"({_as_int(test_run.get('failed', 0))} failed, {test_run.get('run_label', '?')})" |
| 174 | + ) |
| 175 | + hit("test_failing") |
169 | 176 | elif ready is True: |
170 | 177 | age = _age_days(test_run.get("ts"), ref) |
171 | 178 | if age is not None and age > TEST_STALE_DAYS: |
|
0 commit comments