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
32 changes: 16 additions & 16 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
# CODEOWNERS – automatic review routing for Project Nova
#
# Merge authority comes from the protected-main push restriction, not from this
# file: only @cubetribe and @travelhawk may merge into main. Once native
# code-owner review is enabled, every PR requires an approval by the other
# maintainer. The detailed day-to-day stream ownership remains authoritative in
# file: only @cubetribe may merge into main. CODEOWNERS routes review to the
# project owner; it is not a second-person approval gate for owner-authored PRs.
# The detailed day-to-day stream ownership remains authoritative in
# docs/production/hashkrieg/13-15_Parallelbetrieb.md.

# Every path is owned by the two maintainers for the required peer review.
* @cubetribe @travelhawk
# Every path is owned by the sole project owner.
* @cubetribe

# CI, PR policy, code-owner policy, and their enforcement scripts.
/.github/ @cubetribe @travelhawk
/.github/ @cubetribe

# Repository governance and commercial-relicensing terms.
/AGENTS.md @cubetribe @travelhawk
/GOVERNANCE.md @cubetribe @travelhawk
/CONTRIBUTING.md @cubetribe @travelhawk
/CONTRIBUTOR_LICENSE_AGREEMENT.md @cubetribe @travelhawk
/LICENSE @cubetribe @travelhawk
/NOTICE @cubetribe @travelhawk
/CHANGELOG.md @cubetribe @travelhawk
/docs/meta/ @cubetribe @travelhawk
/docs/production/DecisionLog.md @cubetribe @travelhawk
/docs/production/hashkrieg/ @cubetribe @travelhawk
/AGENTS.md @cubetribe
/GOVERNANCE.md @cubetribe
/CONTRIBUTING.md @cubetribe
/CONTRIBUTOR_LICENSE_AGREEMENT.md @cubetribe
/LICENSE @cubetribe
/NOTICE @cubetribe
/CHANGELOG.md @cubetribe
/docs/meta/ @cubetribe
/docs/production/DecisionLog.md @cubetribe
/docs/production/hashkrieg/ @cubetribe
8 changes: 5 additions & 3 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<!-- Danke für deinen Beitrag zu Project Nova! Kurz halten ist erwünscht. -->

## Was & Warum
<!-- 1–3 Sätze. Bei Änderungen am Spielverhalten: was hast du im laufenden Spiel gesehen? -->
<!-- 1–3 Sätze. Bei Änderungen am Spielverhalten: Was war im laufenden Spiel
zu sehen? Falls zurückgestellt: "nicht gespielt", Grund, automatisierte
Ersatznachweise und Restrisiko nennen. -->

## Checkliste
- [ ] `dotnet test tools/Nova.SimRunner.Tests` lokal grün
Expand All @@ -11,8 +13,8 @@

## Externe Beiträge

<!-- Für @cubetribe und @travelhawk nicht erforderlich. Alle anderen PRs werden
erst nach der bestätigten Maintainer-Prüfung und dem folgenden Häkchen grün. -->
<!-- Für @cubetribe nicht erforderlich. Alle anderen PRs werden erst nach der
bestätigten Inhaberprüfung und dem folgenden Häkchen grün. -->
- [ ] I agree to the Contributor License Agreement

<!-- Governance-Tier 2: D-IDs für echte Entscheidungen und Versionen für
Expand Down
11 changes: 7 additions & 4 deletions .github/scripts/check_external_contributor_review.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Require a current maintainer approval and CLA acceptance for external PRs."""
"""Require the project owner's current approval and CLA for external PRs."""

from __future__ import annotations

Expand All @@ -10,7 +10,7 @@
from typing import Any


MAINTAINERS = frozenset({"cubetribe", "travelhawk"})
MAINTAINERS = frozenset({"cubetribe"})
CLA_MARKER = "- [x] I agree to the Contributor License Agreement"
DECISIVE_REVIEW_STATES = frozenset({"APPROVED", "CHANGES_REQUESTED", "DISMISSED"})

Expand Down Expand Up @@ -59,8 +59,8 @@ def evaluate(

return (
False,
"External contributions require an APPROVED review by cubetribe or "
"travelhawk on the current head commit.",
"External contributions require an APPROVED review by cubetribe "
"on the current head commit.",
)


Expand All @@ -75,6 +75,9 @@ def _self_test() -> None:
}
stale = {**approved, "id": 2, "commit_id": "b" * 40}
assert evaluate(author="cubetribe", head_sha=head, body="", reviews=[])[0]
assert not evaluate(author="travelhawk", head_sha=head, body="", reviews=[])[0]
assert not evaluate(author="travelhawk", head_sha=head, body=CLA_MARKER, reviews=[])[0]
assert evaluate(author="travelhawk", head_sha=head, body=CLA_MARKER, reviews=[approved])[0]
assert not evaluate(author="outside", head_sha=head, body="", reviews=[])[0]
assert not evaluate(author="outside", head_sha=head, body=CLA_MARKER, reviews=[])[0]
assert evaluate(author="outside", head_sha=head, body=CLA_MARKER, reviews=[approved])[0]
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/external-contributor-review.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: External Contributor Review

# D-091: every PR authored by someone other than the two maintainers needs a
# CLA acknowledgment and an approval on its current head commit. This
# D-105: every PR authored by someone other than the project owner needs a CLA
# acknowledgment and the owner's approval on its current head commit. This
# metadata-only workflow operates with read-only permissions, reads its
# implementation from main, and never checks out or executes pull-request code.
# After an approval is submitted, rerun the latest failed check; native branch
Expand All @@ -28,7 +28,7 @@ jobs:
with:
ref: ${{ github.event.repository.default_branch }}
persist-credentials: false
- name: Verify contributor terms and maintainer approval
- name: Verify contributor terms and project-owner approval
env:
GH_TOKEN: ${{ github.token }}
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
Expand Down
8 changes: 5 additions & 3 deletions .github/workflows/quality-gate.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: Quality Gate

# D-066 two-phase quality gate. DORMANT until governance tier 3 (D-076, D-091).
# D-066 two-phase quality gate. DORMANT until governance tier 3
# (D-076, D-091, D-105).
#
# The gate chain G0-G5 no longer blocks milestone progress; see GOVERNANCE.md
# and quality/README.md. Nothing here is deleted - this workflow is the
Expand All @@ -13,8 +14,9 @@ name: Quality Gate
# Job "gate-evidence-authorize" implements the protected authorize path of
# the two-phase GateAuthorization receipt contract (D-066, G0-A2). It runs
# only via manual workflow_dispatch on main behind the protected
# "quality-gate" environment (a maintainer must create that environment with
# required reviewers once before the first authorize run can start).
# "quality-gate" environment (the project owner must create it with at least
# one required reviewer independent from the authorize execution before the
# first run; that approval attests evidence, not project governance).
#
# IMPORTANT for dispatchers: the validator binds the run to GITHUB_SHA and
# requires it to equal the trusted tool checkout HEAD. Dispatch this workflow
Expand Down
19 changes: 13 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# AGENTS.md – Arbeitsregeln für KI-Agenten & Mitwirkende

**Dokumentversion:** 4.1.0 | **Status:** verbindlich ab Merge des Sprint-13.0-PR | **Verantwortungsbereich:** Maintainers | **Sprint:** 13.0 | **Governance-Tier:** 2 ([GOVERNANCE.md](GOVERNANCE.md))
**Dokumentversion:** 5.0.0 | **Status:** verbindlich | **Verantwortungsbereich:** Project Owner | **Sprint:** 16 | **Governance-Tier:** 2 ([GOVERNANCE.md](GOVERNANCE.md))

Verbindliche Betriebsanleitung für jeden KI-Coding-Agenten (Claude, Kimi, Codex,
Cursor u. a.) und jede Person, die an *Project Nova* arbeitet. **Lies diese Datei
zuerst.** Sie wird von den gängigen Agenten-Tools automatisch als Kontext geladen.

Welche Regeln in welcher Projektphase gelten, steht in [GOVERNANCE.md](GOVERNANCE.md).
Aktiv ist **Tier 2: externe Beitragende, zwei Maintainer.**
Aktiv ist **Tier 2: externe Beitragende, ein Projektinhaber.** Dennis Westermann
(`@cubetribe`) ist alleiniger Projektinhaber, Maintainer und Mergeberechtigter.

## 1. Projekt in einem Absatz

Expand Down Expand Up @@ -51,11 +52,16 @@ Eine Änderung ist fertig, wenn diese vier Punkte stimmen:
Zusätzlich, wenn zutreffend:

- Echte Entscheidung getroffen? → D-ID im [DecisionLog](docs/production/DecisionLog.md)
- Spielverhalten geändert? → einmal im laufenden Spiel ansehen und im PR beschreiben
- Spielverhalten geändert? → im laufenden Spiel ansehen und im PR beschreiben;
der Projektinhaber darf diese Abnahme ausdrücklich zurückstellen, wenn der PR
stattdessen „nicht gespielt“, Grund, automatisierte Ersatznachweise und
Restrisiko nennt. Der PR ist dann mergebar, aber nicht spielerisch abgenommen
und kein Meilenstein-Nachweis.
- Neues oder entferntes Dokument? → [docs/README.md](docs/README.md)-Index nachziehen
- Tier-2-PR? → Freigabe des anderen Maintainers auf dem aktuellen Head;
externer PR zusätzlich mit bestätigter
[Contributor License Agreement](CONTRIBUTOR_LICENSE_AGREEMENT.md)
- Inhaber-PR? → Selbst-Merge erst nach grüner Pflicht-CI und dokumentiertem,
unabhängigem Read-only-Review.
- Externer PR? → Freigabe des Projektinhabers auf dem aktuellen Head und
bestätigte [Contributor License Agreement](CONTRIBUTOR_LICENSE_AGREEMENT.md)
- Vertrag oder öffentliche Doku? → Kopfversion und Änderungsverlauf pflegen

Weiterhin nicht verlangt: Gate-Evidence, Receipt-Ketten und Performance-Evidenz
Expand Down Expand Up @@ -163,3 +169,4 @@ gh pr create --fill --base main
| 3.1.0–3.7.0 | 2026-07-24 – 2026-07-26 | Ausbau des Gate-Evidenzregimes (D-062 bis D-067) | Orchestrator |
| 4.0.0 | 2026-08-06 | D-076: auf Governance-Tier 1 zurückgeschnitten. Gate-Kette, Receipt-Verträge und Evidenzpflicht schlafen gelegt; DoD von 13 auf 4 Punkte; Doku-Ritual freiwillig; Sprint-Ritual entfernt; `dotnet test` als kanonischer CI-Check verankert | Orchestrator |
| 4.1.0 | 2026-08-08 | D-091: Governance-Tier 2 für externe Beiträge aktiviert; Maintainer-Review/CLA für fremde PRs und Versionspflicht für Verträge/öffentliche Doku ergänzt | Dennis Westermann / Michael Falk |
| 5.0.0 | 2026-08-10 | D-105: Dennis Westermann als alleinigen Projektinhaber, Maintainer, Tier-Entscheider und Mergeberechtigten festgelegt; Selbst-Merge bei grüner Pflicht-CI und unabhängigem Review sowie ehrliche Spielabnahme-Zurückstellung geregelt | Dennis Westermann |
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@ die Versionierung folgt (in der aktuellen Doku-Phase) dem Dokumentationsstand de
> Wiki-/Vertrags-Minor und kein Game-Release. Es wird kein Tag oder Release
> erzeugt; MS-0 und MS-1 bleiben offen.

### Entschieden
- **D-105: Dennis Westermann (`@cubetribe`) führt das Projekt allein.** Er ist
alleiniger Projektinhaber, Maintainer, Tier-Entscheider und Mergeberechtigter;
Michael Falk (`@travelhawk`) bleibt historischer Autor und
Organisationsmitglied, hat aber keine Projekt-Governance-Rolle mehr.
Inhaber-PRs dürfen nach grüner Pflicht-CI und unabhängigem Read-only-Review
selbst gemergt werden, externe PRs brauchen weiterhin CLA und seine aktuelle
Freigabe. PR-only, strikte Checks, Squash/lineare Historie und kein
Force-Push bleiben bestehen. Manuelle Spielabnahme darf sichtbar als „nicht
gespielt“ zurückgestellt werden; der PR ist dann integrierbar, aber nicht
spielerisch abgenommen und kein Meilenstein-Nachweis

### Hinzugefügt
- **Die Welle der Skirmish-KI kann in Kampfstärke statt in Köpfen messen
(Verhalten `r6`):** `CombatStrength` bewertet eine Einheit als
Expand Down
60 changes: 31 additions & 29 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Beitragen zu Project Nova

**Version:** 4.0.1 | **Status:** verbindlich ab Merge des Sprint-13.0-PR | **Verantwortungsbereich:** Maintainers | **Sprint:** 13.0 | **Governance-Tier:** 2 ([GOVERNANCE.md](GOVERNANCE.md))
**Version:** 5.0.0 | **Status:** verbindlich | **Verantwortungsbereich:** Project Owner | **Sprint:** 16 | **Governance-Tier:** 2 ([GOVERNANCE.md](GOVERNANCE.md))

Branch-, PR- und Review-Ablauf für Menschen und KI-Agenten. Detailregeln stehen
in [AGENTS.md](AGENTS.md), Dokumentregeln in
Expand All @@ -23,7 +23,7 @@ Force-Pushes auf `main`, keine History-Rewrites auf geteilten Branches.
lokal grün bekommen.
4. Zeile unter `[Unreleased]` in [CHANGELOG.md](CHANGELOG.md) ergänzen.
5. Conventional Commit, Branch pushen, PR nach `main` öffnen.
6. CI abwarten, mergen.
6. CI abwarten; der Projektinhaber merged.

Commit, Push, Merge und Release sind getrennte Autoritätsgrenzen. **KI-Agenten
committen oder pushen nur nach einer ausdrücklichen Anfrage für die konkrete
Expand Down Expand Up @@ -54,7 +54,7 @@ Pflicht auf jedem PR:
dürfen nicht im selben PR geändert werden. Ein dokumentierter Reset braucht
das Maintainer-Label `baseline-reset-approved`.
- **`external-contributor-review`** – bei einem externen PR müssen die
CLA-Zustimmung und eine Freigabe eines Maintainers auf dem aktuellen Head
CLA-Zustimmung und die Freigabe des Projektinhabers auf dem aktuellen Head
vorliegen.

Unity-EditMode-Tests laufen mangels CI-Lizenz nicht automatisch. Wer die
Expand All @@ -63,30 +63,30 @@ führt sie lokal aus und schreibt das Ergebnis in den PR.

## 4. Zugänge und Reviews (Tier 2)

`main` ist technisch auf die beiden Maintainer beschränkt:
`main` ist technisch auf den alleinigen Projektinhaber und Maintainer beschränkt:

- [@cubetribe](https://github.com/cubetribe) (Dennis Westermann)
- [@travelhawk](https://github.com/travelhawk) (Michael Falk)

Nur diese Accounts dürfen einen PR nach `main` mergen. Externe arbeiten aus
einem Fork, erhalten weder einen Collaborator-Zugang noch Mitgliedschaft im
Maintainer-Team und öffnen einen PR nach `main`.
Nur dieser Account darf einen PR nach `main` mergen. Michael Falk
(`@travelhawk`) hat keine Maintainer- oder Governance-Rolle mehr in diesem
Projekt; eine fortbestehende Organisationsmitgliedschaft ändert das nicht.
Externe arbeiten aus einem Fork, erhalten weder einen Schreibzugang noch eine
Projekt-Maintainer-Rolle und öffnen einen PR nach `main`.

Jeder PR braucht eine Freigabe des jeweils anderen Maintainers auf dem aktuellen
Head-Commit. Ein neuer Push macht eine alte Freigabe unwirksam. Der Remote-
Rollout setzt dafür eine erforderliche Freigabe, das Verwerfen veralteter
Freigaben und eine Freigabe des letzten Pushes. Für externe PRs prüft
`external-contributor-review` zusätzlich die CLA-Zustimmung und genau diese
Maintainer-Freigabe. Bis die Einstellungen nach den ersten erfolgreichen Läufen
in Folge-PRs aus dem geschützten `main`-Stand aktiv sind, werden keine externen
PRs gemergt.
Inhaber-PRs dürfen nach grüner Pflicht-CI und dokumentiertem, unabhängigem
Read-only-Review selbst gemergt werden. Für externe PRs prüft
`external-contributor-review` zusätzlich zur CLA-Zustimmung eine
`APPROVED`-Review von `@cubetribe` auf dem aktuellen Head-Commit. Ein neuer Push
macht diese Freigabe unwirksam.

Nach einer neu eingereichten Freigabe wird der jüngste fehlgeschlagene
`external-contributor-review`-Lauf erneut gestartet. Die native Branch
Protection bleibt der maßgebliche, automatisch aktualisierte Review-Schutz.
`external-contributor-review`-Lauf erneut gestartet. Die Branch Protection
bleibt der maßgebliche Schutz für PR-only, Pflichtchecks, lineare Historie und
das Verbot von Force-Pushes.

`CODEOWNERS` ordnet jeden Pfad den beiden Maintainers zu; GitHubs native
Code-Owner-Prüfung macht die Peer-Freigabe damit eindeutig. Die ausdrücklich
`CODEOWNERS` ordnet jeden Pfad `@cubetribe` zu und routet Review-Anfragen; eine
Code-Owner-Freigabe ist für Inhaber-PRs kein zusätzliches Selbstfreigabe-Gate.
Die ausdrücklich
benannte Steuerfläche (`.github/`, Lizenz, Governance und Planungsdokumente)
bleibt besonders sichtbar, ersetzt aber nicht die Schreibhoheit aus
[13-15_Parallelbetrieb.md](docs/production/hashkrieg/13-15_Parallelbetrieb.md).
Expand Down Expand Up @@ -122,25 +122,26 @@ Binärdateien oder Debug-Artefakte einchecken.
## 7. Pull Requests

Die Beschreibung nennt: was und warum, betroffene Bereiche, gegebenenfalls die
D-ID einer echten Architektur-, Design- oder Prozessentscheidung, den
Changelog-Eintrag und – bei Änderungen am Spielverhalten – was du im laufenden
Spiel gesehen hast. Verträge und öffentliche Doku erhalten in Tier 2 außerdem
eine Kopfversion und einen Änderungsverlauf.
D-ID einer echten Architektur-, Design- oder Prozessentscheidung und den
Changelog-Eintrag. Bei Änderungen am Spielverhalten nennt sie entweder die
Beobachtung im laufenden Spiel oder ausdrücklich „nicht gespielt“, Grund,
automatisierte Ersatznachweise und Restrisiko. Eine solche Zurückstellung macht
den PR mergebar, aber nicht spielerisch abgenommen. Verträge und öffentliche
Doku erhalten in Tier 2 außerdem eine Kopfversion und einen Änderungsverlauf.

## 8. Releases

Nur ein Maintainer erzeugt nach expliziter Freigabe Tag und Release. Wiki-Versionen
Nur der Projektinhaber erzeugt nach expliziter Freigabe Tag und Release. Wiki-Versionen
sind keine Game-Releases. Es gibt bisher kein veröffentlichtes Release.

## Offene Punkte

- Die neuen Tier-2-Checks und die erforderliche Maintainer-Peer-Review werden
erst nach dem Merge und ihren ersten erfolgreichen Folge-PR-Läufen in GitHubs
Branch Protection hinterlegt.
- `integrity`, `baseline-guard` und `external-contributor-review` sind noch
nicht als Required Checks in GitHubs Branch Protection hinterlegt.

## Nächste Schritte

1. Neue externe Beiträge erst nach dem vollständigen Remote-Rollout annehmen.
1. Neue externe Beiträge nur mit CLA und aktueller Inhaberfreigabe annehmen.
2. Den Baseline-Wächter mit einem absichtlich falschen PR nachweislich rot
auslösen.

Expand All @@ -154,3 +155,4 @@ sind keine Game-Releases. Es gibt bisher kein veröffentlichtes Release.
| 3.0.0 | 2026-08-06 | D-076: auf Tier 1 zurückgeschnitten. Gate- und Evidenzpflichten entfernt, `tests` als Pflichtcheck ergänzt, `integrity` auf `quality/**` begrenzt, Selbst-Merge erlaubt | Maintainers |
| 4.0.0 | 2026-08-08 | D-091: Tier 2 aktiviert; Maintainer-Peer-Review auf aktuellem Head für jeden PR, Fork-only plus CLA für externe Beiträge, Baseline-Wächter und zwei festgelegte Merge-Accounts dokumentiert | Dennis Westermann / Michael Falk |
| 4.0.1 | 2026-08-08 | CLA-Wirkung nicht rückwirkend präzisiert und D-ID-Pflicht auf echte Entscheidungen vereinheitlicht | Dennis Westermann |
| 5.0.0 | 2026-08-10 | D-105: `@cubetribe` als alleinigen Projektinhaber und Mergeberechtigten festgelegt; Inhaber-Selbst-Merge, externe aktuelle Freigabe und ehrliche Spielabnahme-Zurückstellung geregelt | Dennis Westermann |
Loading
Loading