Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## Ziel & Scope
- Ziel:
- Scope (in):
- Non-Goals (out):

## Umgesetzte Aufgaben (abhaken)
- [ ] Aufgabe 1 umgesetzt
- [ ] Aufgabe 2 umgesetzt
- [ ] Aufgabe 3 umgesetzt

## Nachbesserungen aus Review (iterativ)
- [ ] Alle Copilot-/Reviewer-Kommentare geprueft
- [ ] Alle notwendigen Code-Nachbesserungen umgesetzt
- [ ] PR-Beschreibung nach Nachbesserung aktualisiert
- [ ] Alle Threads `resolved` (inkl. outdated)

## Security- und Merge-Gates
- [ ] Required Checks sind gruen
- [ ] `security/code-scanning/tools`: 0 offene Alerts
- [ ] Keine offenen blocker findings

## Evidence (auditierbar)
- [ ] Build/Test/Checks mit Artefakten vorhanden
- [ ] Relevante Befehle im PR-Text dokumentiert
- [ ] Risiken/Assumptions explizit benannt

## DoD (mindestens 2 pro Punkt)
| Punkt | DoD A | DoD B | Status |
| --- | --- | --- | --- |
| Aufgabe 1 | | | [ ] |
| Aufgabe 2 | | | [ ] |
| Aufgabe 3 | | | [ ] |

## Risiken / Open Items
- [ ] keine
- [ ] vorhanden (unten auflisten)

### Details (nur falls vorhanden)
- Risiko 1:
- Risiko 2:
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ on:

permissions:
contents: read
security-events: read
pull-requests: read

concurrency:
group: ci-${{ github.ref }}
Expand Down Expand Up @@ -78,6 +80,8 @@ jobs:
with:
node-version: "20"
- name: Run Entry Check
env:
GH_TOKEN: ${{ github.token }}
run: bash -euo pipefail tools/ci/bin/run.sh preflight
- name: Upload Artifact
if: always()
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ jobs:
- name: Run OpenSSF Scorecard
uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3
with:
repo_token: ${{ secrets.SECURITY_CLAIMS_TOKEN }}
results_file: artifacts/ci/scorecard/results.sarif
results_format: sarif
# Keep deterministic local evidence + SARIF upload, avoid remote publish rejection
Expand Down
121 changes: 68 additions & 53 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# Codex Operating Rules (Repository Contract)

## 1) Mission
- Work deterministic, evidence-based, and fail-closed.
- Prefer correctness, reproducibility, and security over speed.
- Never change `SECURITY.md`.
## 1) Ziel und Leitlinie
- Deterministisch, evidenzbasiert, fail-closed arbeiten.
- Korrektheit, Reproduzierbarkeit, Security und Auditierbarkeit vor Geschwindigkeit.
- `SECURITY.md` ist eingefroren und darf nicht geaendert werden.

## 2) Mandatory Response Structure
Use this exact structure for substantial tasks:
## 2) Pflicht-Struktur fuer substanzielle Antworten
1. GOAL & SCOPE
2. DEFINITIONS & ASSUMPTIONS
3. PLAN (STEPS + CHECKS)
Expand All @@ -15,61 +14,77 @@ Use this exact structure for substantial tasks:
6. RESULT & DECISION LOG
7. RISKS / OPEN ITEMS / NEXT STEPS (PRIORITIZED)

## 3) Iterative Delivery Model (Hard Process)
- WIP limit is 1: one topic per branch/PR.
- Branch naming must use `codex/tomtastisch-patch-<n>`.
- After each push:
- Wait for required checks to finish.
- Address review comments.
- Resolve all threads, including outdated threads.
- Merge only if:
- Required checks are green.
- No unresolved review threads remain.
- PR is mergeable by ruleset/branch protection.
- After merge:
- Verify latest `main` run is green.
- Start next topic in a new patch branch.
## 3) Iteratives Arbeitsmodell (verbindlich)
- WIP-Limit 1: genau ein Thema pro Branch/PR.
- Branch-Namensschema:
- `codex/<tag>/<kurztext-kebab>`
- erlaubte `<tag>`: `fix|release|feat|refactor|docs|test|ci|chore|security`
- PR-Titelschema:
- `<tag>(<scope>): <deutsche kurzbeschreibung>`
- Nach jedem Push:
- auf alle erforderlichen Checks warten,
- alle Review-Kommentare abarbeiten,
- alle Threads auf `resolved` setzen (inkl. outdated).
- Merge nur wenn:
- required checks gruener Status,
- keine offenen Review-Threads,
- PR laut Ruleset/Branch-Protection mergebar,
- Code-Scanning-Toolstatus fuer offene Alerts ist `0` (kein offener Alert).
- Nach Merge:
- neuesten `main`-Run auf `success` verifizieren,
- naechstes Thema in neuem Branch starten.

## 4) Fail-Closed Policy
- Blocker checks must pass; no silent bypass.
- `unknown` is allowed only for explicitly report-only claims.
- Live API checks are blocker-grade:
- retries with backoff required,
- explicit reason codes required,
- final timeout/error => fail.
## 4) PR-Beschreibung (verbindlich)
- PR-Beschreibung auf Deutsch.
- Muss enthalten:
- Ziel/Scope,
- umgesetzte Aufgaben als Checkliste,
- Nachbesserungen als Checkliste,
- Evidence (Befehle/Artefakte),
- DoD-Matrix mit mindestens zwei auditierbaren DoD je umgesetztem Punkt.
- Bei Review-Fixes wird die PR-Beschreibung aktiv aktualisiert.

## 5) Evidence Requirements
- Every material claim needs evidence:
- command,
- artifact/log output,
- file path.
- If unverifiable, mark as `ASSUMPTION` and add a concrete verification command.
## 5) Fail-Closed und Live-API-Regeln
- Blocker-Checks muessen bestehen; kein stilles Bypass.
- `unknown` nur fuer explizite report-only Claims.
- Live-API-Claims sind blocker:
- Retry + Exponential Backoff,
- reason codes (`auth|rate-limit|network|5xx|unknown`),
- finaler Fehler => `fail`.

## 6) Security and Workflow Guardrails
- Least privilege for GitHub Actions permissions:
## 6) Evidence-Pflicht
- Jede materielle Aussage benoetigt:
- Kommando,
- Artefakt/Log,
- Datei-/Pfadangabe.
- Nicht verifizierbare Aussagen sind `ASSUMPTION` plus Verifikationskommando.

## 7) Security- und Workflow-Guardrails
- GitHub Actions mit Least Privilege:
- top-level read-only,
- write permissions only at job-level where required.
- Pin action references to immutable SHAs.
- No secret values in logs/output.
- Do not enable risky patterns like `pull_request_target` + secrets unless explicitly approved.
- write nur job-lokal bei Bedarf.
- Actions nur SHA-gepinnt.
- Keine Secret-Werte in Logs.
- Kein `pull_request_target` + Secrets ohne explizite Freigabe.
- Scorecard/Governance-Drift wird nicht ignoriert; offene Alerts sind vor Merge zu schliessen.

## 7) Versioning Convergence (Mandatory)
The following must stay equal by policy:
## 8) Versionierungs-Konvergenz (blocker)
Die folgenden Werte muessen immer identisch sein:
- `Directory.Build.props` -> `RepoVersion`
- `src/FileTypeDetection/FileTypeDetectionLib.vbproj` -> `Version`
- `src/FileTypeDetection/FileTypeDetectionLib.vbproj` -> `PackageVersion`
- Top entry in `docs/versioning/002_HISTORY_VERSIONS.MD`
- GitHub latest release tag version
- NuGet latest package version
- Top-Eintrag in `docs/versioning/002_HISTORY_VERSIONS.MD`
- neuestes GitHub-Release-Tag
- neueste NuGet-Paketversion

If any mismatch exists, treat as blocker and fix before merge/release.
Abweichung ist blocker und vor Merge/Release zu beheben.

## 8) Scope and Safety Constraints
- Never revert unrelated user changes.
- Never use destructive git commands (`reset --hard`, `checkout --`) unless explicitly requested.
- Keep changes minimal and scoped to the current topic.
- If unexpected workspace drift is detected, stop and ask before proceeding.
## 9) Scope/Safety
- Keine Ruecknahme fremder, nicht beauftragter Aenderungen.
- Keine destruktiven Git-Befehle ohne explizite Freigabe.
- Aenderungen klein, fokussiert, nachvollziehbar.
- Unerwarteter Drift => stoppen und klaeren.

## 9) Local Overrides
- If `AGENTS.override.md` exists locally, apply it in addition to this file.
- `AGENTS.override.md` is local-only and must not be committed.
## 10) Lokale Overrides
- Optional: `AGENTS.override.md` wird zusaetzlich angewendet.
- `AGENTS.override.md` ist lokal-only und darf nicht committed werden.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
<PropertyGroup>
<RepoVersion>5.1.2</RepoVersion>
<RepoVersion>5.1.3</RepoVersion>
</PropertyGroup>
</Project>
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
<PackageVersion Include="FsCheck" Version="3.2.0" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Mime" Version="3.8.0" />
Expand Down
2 changes: 2 additions & 0 deletions docs/audit/013_SCORECARD_GOVERNANCE_ALERT_MAPPING.MD
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,5 @@ Diese Datei mappt die repo-/governance-basierten Scorecard-Alerts ohne konkrete
2. Für jeden Governance-Alert Evidence-Befehl ausführen und Artefakt in `artifacts/security/` persistieren.
3. Bei Drift (`fail`) sofortige Korrektur in Ruleset/Workflow.
4. Nach Korrektur Re-Run von Scorecard + Security-Claims-Evidence.
5. Merge-Gate: `security/code-scanning/tools` muss `0` offene Alerts liefern.
6. Nicht technisch remediierbare Heuristik-Alerts (z. B. Repo-Alter `<90 Tage`) werden nur mit begruendetem Dismissal-Kommentar geschlossen und im PR-Evidence protokolliert.
3 changes: 3 additions & 0 deletions docs/governance/003_INDEX_GOVERNANCE.MD
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ This index is non-normative. Normative policy definitions are the rule files und
| `CI-DOCS-002` | `tools/ci/policies/rules/docs_drift.yaml` |
| `CI-NAMING-001` | `tools/ci/policies/rules/naming_snt.yaml` |
| `CI-VERSION-001` | `tools/ci/policies/rules/versioning_svt.yaml` |

## Zusatzrichtlinien (dokumentativ)
- Branch/PR Naming (DE): `docs/governance/007_POLICY_BRANCH_PR_NAMING_DE.MD`
59 changes: 59 additions & 0 deletions docs/governance/007_POLICY_BRANCH_PR_NAMING_DE.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Policy Branch/PR Naming (DE)

## 1. Zweck
Diese Policy definiert ein einheitliches, professionelles und maschinenpruefbares Naming fuer Branches und Pull Requests.

## 2. Verbindliche Konventionen

### 2.1 Branches
- Muss-Format: `codex/<tag>/<kurztext-kebab>`
- Uebergang (legacy, befristet): `codex/<tag>-<kurztext-kebab>` wird fuer bestehende Branches akzeptiert.
- Erlaubte `<tag>`:
- `fix`
- `release`
- `feat`
- `refactor`
- `docs`
- `test`
- `ci`
- `chore`
- `security`
- `<kurztext-kebab>`:
- nur `a-z`, `0-9`, `-`
- keine Leerzeichen, keine Sonderzeichen
- mindestens 3 Zeichen

### 2.2 PR-Titel
- Muss-Format: `<tag>(<scope>): <deutsche kurzbeschreibung>`
- `tag` wie oben.
- `scope`:
- nur `a-z0-9-`
- optional, aber empfohlen.
- Kurzbeschreibung:
- Deutsch,
- praezise, kein Platzhaltertext,
- Ergebnis-/Aenderungsbezug.

### 2.3 PR-Beschreibung
- Muss auf Deutsch sein.
- Muss die Repository-PR-Template-Struktur einhalten.
- Muss Checklisten und DoD-Matrix enthalten.

## 3. Verbotene Muster
- Unpraezise Titel wie `update`, `changes`, `misc`.
- Branches ohne Tag-Segment.
- PRs ohne Checklistenpflege nach Nachbesserungen.

## 4. Durchsetzung
- CI-Check `pr-governance` validiert:
- Branch-Format,
- PR-Titel-Format,
- Pflichtsektionen und Checklisten in der PR-Beschreibung.
- Fail-closed: Verstoss blockiert Merge.

## 5. DoD
- DoD A: `pr-governance` laeuft erfolgreich fuer die PR.
- DoD B: Branch- und PR-Name entsprechen exakt der Konvention.

## 6. Rule Mapping
- Normative Rule-Datei: `tools/ci/policies/rules/naming_snt.yaml`
5 changes: 3 additions & 2 deletions docs/versioning/002_HISTORY_VERSIONS.MD
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ Heuristik fuer die Rueckwirkungs-Zuordnung:
- `docs|test|ci|chore|tooling|refactor|fix` => Patch

Aktueller Entwicklungsstand:
- Aktuelle Entwicklungslinie enthält `5.x` (aktuell veroeffentlichtes Tag: `v5.1.1`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).
- Aktuelle Entwicklungslinie enthaelt `5.x` (aktuell veroeffentlichtes Tag: `v5.1.2`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).

| Version | Kurzbeschreibung | Commit | Keyword |
|---|---|---|---|
| `5.1.2` | Optimize Gate4 NuGet post-publish polling with adaptive retry schedule and bump patch version | pending merge commit | patch |
| `5.1.3` | PR-Governance-Haertung (DE-Naming, PR-Template, fail-closed Gate fuer `security/code-scanning/tools = 0`) | TBD (nach Merge) | patch |
| `5.1.2` | Gate4 Polling-Optimierung und Release-Haertung | [f12711d](https://github.com/tomtastisch/FileClassifier/commit/f12711d) | patch |
| `5.1.1` | Dependabot security-only mode und fail-closed Guards fuer secret-pflichtige Workflows | [d0ad8ec](https://github.com/tomtastisch/FileClassifier/commit/d0ad8ec) | patch |
| `5.1.0` | Security/Governance hardening wave: pinned actions, dependency review, labeler fixes, root assurance index | [e2a4a42](https://github.com/tomtastisch/FileClassifier/commit/e2a4a42) | minor |
| `5.0.0` | Finalize hashing API rename to EvidenceHashing and add optional HMAC digests | [444d027](https://github.com/tomtastisch/FileClassifier/commit/444d027) | breaking |
Expand Down
31 changes: 28 additions & 3 deletions docs/versioning/003_CHANGELOG_RELEASES.MD
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,36 @@ Alle Aenderungen werden hier technisch dokumentiert. Die Release-Version selbst
der Git-Tag `vX.Y.Z` (optional `-prerelease`) als SSOT.

## [Unreleased]
- Added:
- TBD
- Changed:
- TBD
- Fixed:
- TBD
- Docs/CI/Tooling:
- TBD

## [5.1.3]
- Added:
- Verbindliches PR-Template in deutscher Sprache mit Checklisten, Nachbesserungs-Tracking und DoD-Matrix.
- Governance-Policy fuer Branch-/PR-Naming (`docs/governance/007_POLICY_BRANCH_PR_NAMING_DE.MD`).
- FsCheck-basierter Fuzzing-Smoke-Test als nachweisbarer Fuzzing-Signaltest.
- Changed:
- NuGet Post-Publish SVT (`Gate 4`) auf adaptiven Retry-Schedule umgestellt, um die durchschnittliche Laufzeit bei unverändert fail-closed Verhalten zu senken.
- Repo-/Package-Version auf `5.1.2` (Patch `Z + 1`) angehoben.
- `preflight` erzwingt jetzt fail-closed:
- PR-Governance-Check (Branch/Titel/PR-Body),
- `security/code-scanning/tools` muss 0 offene Alerts liefern.
- Scorecard-Workflow nutzt `SECURITY_CLAIMS_TOKEN` als PAT-basierte Tokenquelle fuer robuste Governance-Auswertung.
- Agent-Regelwerk (`AGENTS.md`) auf verbindliche iterative Abarbeitung und Merge-Gates erweitert.
- Fixed:
- Versionskonvergenz auf `5.1.3` nachgezogen (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie).
- Docs/CI/Tooling:
- Retry-Schedule-Defaults und neues ENV `SVT_POSTPUBLISH_RETRY_SCHEDULE_SECONDS` in `docs/021_USAGE_NUGET.MD` und `docs/ci/002_NUGET_TRUSTED_PUBLISHING.MD` nachgezogen.
- Governance-Index um Branch-/PR-Naming-Policy erweitert.

## [5.1.2]
- Changed:
- Gate4 Pollingdauer fuer Release-Verifikation optimiert.
- Fixed:
- Release-/SVT-Ablauf fuer `release_tag` deterministisch stabilisiert.

## [5.1.1]
- Added:
Expand Down
4 changes: 2 additions & 2 deletions src/FileTypeDetection/FileTypeDetectionLib.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<PackageId>Tomtastisch.FileClassifier</PackageId>
<Version>5.1.2</Version>
<PackageVersion>5.1.2</PackageVersion>
<Version>5.1.3</Version>
<PackageVersion>5.1.3</PackageVersion>
<Authors>tomtastisch</Authors>
<Description>Deterministic file type and MIME detection with fail-closed archive safety checks, secure extraction primitives, and reproducible hashing evidence for .NET.</Description>
<PackageTags>filetype;mime;detection;magic-bytes;sniffing;archive;zip;tar;7z;rar;zipslip;security;hashing;sha256;deterministic;dotnet;net8;net10</PackageTags>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="FsCheck"/>
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
<PackageReference Include="Reqnroll.Tools.MsBuild.Generation"/>
<PackageReference Include="Reqnroll.xunit.v3"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace FileTypeDetectionLib.Tests.Unit.Fuzzing;

public sealed class FsCheckSmokeTests
{
[Fact]
public void FuzzingSmoke_GeneratorProducesSamples()
{
// FsCheck-based fuzzing signal: randomized sample generation.
var samples = FsCheck.FSharp.Gen.Sample(20, FsCheck.FSharp.Gen.Choose(0, 100));
Assert.Equal(20, samples.Count());
Assert.All(samples, value => Assert.InRange(value, 0, 100));
}
}
Loading
Loading