Branch protection: de geheimen/SAST-scan is geen verplichte check, en verouderde basis mag mergen #1891

Closed
opened 2026-08-31 13:37:23 +00:00 by brenno · 0 comments
Owner

De branch-protection op main staat er, maar hij bewaakt minder dan de
documentatie doet vermoeden. Uitgelezen via
GET /repos/librekat/ocideck/branch_protections:

"enable_status_check": true,
"status_check_contexts": ["static-gate / static-gate (pull_request)"],
"block_on_outdated_branch": false,
"require_signed_commits": false,
"required_approvals": 0,
"apply_to_admins": true,
"enable_push": false

1. scans is geen verplichte check

.forgejo/workflows/scans.yml draait make check-secrets (gitleaks +
trufflehog over de héle historie) en make sast (semgrep) op élke PR. Hij staat
niet in status_check_contexts. Zijn context zou
scans / scans (pull_request) zijn.

Gevolg: valt de scan om, of draait hij niet (runner weg, image niet pullbaar,
run afgebroken), dan houdt niets de merge tegen. In de praktijk staat hij groen
— 27 van 27 runs — maar dat is geluk, geen borging.

docs/CHECKS.md schrijft zelf op waarom juist déze poort niet mag glippen:

voor een secret is het moment niet interchangeable. Found before the merge it
is an edit; found after, it is in the history and revoking is the only real
remedy.

Dat argument dráágt een verplichte check. Hij is er niet.

2. block_on_outdated_branch: false

Een PR mag mergen tegen een verouderde basis. Dat is precies het mechanisme
achter #1605, waar een PR met een oude basis vijf alinea's uit USER_GUIDE.md
terugdraaide die intussen op main waren geland. Geen poort ziet verdwijning;
deze instelling is de enige knop die het gedrag zelf tegenhoudt. Hij staat uit.

Ook static-gate op main (de post-merge-trigger) bestaat expliciet omdat een
PR-run alleen de voorvertoning van díe ene samenvoeging toetst — zie de
toelichting in static-gate.yml, die eindigt met "Voorkómen doet hij het niet;
dat kan alleen door élke PR vlak vóór de merge opnieuw tegen de actuele main
te draaien." Dat is letterlijk wat block_on_outdated_branch doet.

3. require_signed_commits: false

Het project ondertekent zijn releases (minisign, make sign-release) en
verantwoordt zich op leveringsketen (SBOM, CRA-positie, security-insights.yml).
De commits zelf zijn niet ondertekend. Met meerdere agentsessies die op deze
repo committen is de vraag "wie heeft dit erin gezet" niet triviaal.

Voorstel

  1. scans / scans (pull_request) toevoegen aan status_check_contexts. Kosten:
    de scan duurt seconden; de ontsnappingsroute (regel tijdelijk lichten) staat
    al beschreven in docs/CHECKS.md.
  2. block_on_outdated_branch: true aanzetten. Kosten: bij gelijktijdige PR's
    moet er vaker gerebased worden. Baten: #1605 kan niet meer, en de
    static-gate-push-run wordt van vangnet weer bevestiging.
  3. Ondertekende commits: wegen, niet automatisch invoeren — het raakt de
    werkwijze van elke sessie. Wel expliciet vastleggen wat het antwoord is, want
    nu is het een niet-gemaakte keuze.
  4. docs/CHECKS.md bijwerken: er staat nu wél dat static-gate verplicht is,
    maar niet dat scans dat níet is. Die asymmetrie is precies wat iemand
    verkeerd leest.

Gevonden bij een kritische review van het kwaliteitsbewakingssysteem, 31-08-2026.

De branch-protection op `main` staat er, maar hij bewaakt minder dan de documentatie doet vermoeden. Uitgelezen via `GET /repos/librekat/ocideck/branch_protections`: ```json "enable_status_check": true, "status_check_contexts": ["static-gate / static-gate (pull_request)"], "block_on_outdated_branch": false, "require_signed_commits": false, "required_approvals": 0, "apply_to_admins": true, "enable_push": false ``` ## 1. `scans` is geen verplichte check `.forgejo/workflows/scans.yml` draait `make check-secrets` (gitleaks + trufflehog over de héle historie) en `make sast` (semgrep) op élke PR. Hij staat **niet** in `status_check_contexts`. Zijn context zou `scans / scans (pull_request)` zijn. Gevolg: valt de scan om, of draait hij niet (runner weg, image niet pullbaar, run afgebroken), dan houdt niets de merge tegen. In de praktijk staat hij groen — 27 van 27 runs — maar dat is geluk, geen borging. `docs/CHECKS.md` schrijft zelf op waarom juist déze poort niet mag glippen: > voor een secret is het moment niet interchangeable. Found before the merge it > is an edit; found after, it is in the history and revoking is the only real > remedy. Dat argument dráágt een verplichte check. Hij is er niet. ## 2. `block_on_outdated_branch: false` Een PR mag mergen tegen een verouderde basis. Dat is precies het mechanisme achter #1605, waar een PR met een oude basis vijf alinea's uit `USER_GUIDE.md` terugdraaide die intussen op `main` waren geland. Geen poort ziet verdwijning; deze instelling is de enige knop die het gedrag zelf tegenhoudt. Hij staat uit. Ook `static-gate` op `main` (de post-merge-trigger) bestaat expliciet omdat een PR-run alleen de voorvertoning van díe ene samenvoeging toetst — zie de toelichting in `static-gate.yml`, die eindigt met "Voorkómen doet hij het niet; dat kan alleen door élke PR vlak vóór de merge opnieuw tegen de actuele `main` te draaien." Dat is letterlijk wat `block_on_outdated_branch` doet. ## 3. `require_signed_commits: false` Het project ondertekent zijn releases (minisign, `make sign-release`) en verantwoordt zich op leveringsketen (SBOM, CRA-positie, `security-insights.yml`). De commits zelf zijn niet ondertekend. Met meerdere agentsessies die op deze repo committen is de vraag "wie heeft dit erin gezet" niet triviaal. ## Voorstel 1. `scans / scans (pull_request)` toevoegen aan `status_check_contexts`. Kosten: de scan duurt seconden; de ontsnappingsroute (regel tijdelijk lichten) staat al beschreven in `docs/CHECKS.md`. 2. `block_on_outdated_branch: true` aanzetten. Kosten: bij gelijktijdige PR's moet er vaker gerebased worden. Baten: #1605 kan niet meer, en de `static-gate`-push-run wordt van vangnet weer bevestiging. 3. Ondertekende commits: wegen, niet automatisch invoeren — het raakt de werkwijze van elke sessie. Wel expliciet vastleggen wat het antwoord is, want nu is het een niet-gemaakte keuze. 4. `docs/CHECKS.md` bijwerken: er staat nu wél dat `static-gate` verplicht is, maar niet dat `scans` dat níet is. Die asymmetrie is precies wat iemand verkeerd leest. _Gevonden bij een kritische review van het kwaliteitsbewakingssysteem, 31-08-2026._
brenno 2026-08-31 16:08:06 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1891
No description provided.