ET-PKG-GAP-WORK-PACKAGE-CONTRACT-001
Vertrag des GAP-Arbeitspakets#
Zweck#
Code-ArtifactCodeansicht öffnen erzeugt und validiert das einheitliche Zwei-Archiv-Arbeitspaket für genau einen GAP-Sprint. Die wiederverwendbare Paketmechanik liegt in engineering-tools; lokale Pfade und Aufrufe verbleiben in runtime.
Paketstruktur#
Die erzeugte Arbeitspaketausgabe enthält die beiden äußeren Archive und ihr maschinenlesbares Manifest:
gap-work-package/
├── package-manifest.json
├── SHA256SUMS.txt
├── sources.zip
└── targets.zip
Es wird kein zusätzlicher Container um sources.zip und targets.zip erzeugt. Damit bleibt der seit GAP 2.1.5 geltende Zwei-Archiv-Vertrag führend.
sources.zip enthält ausschließlich Root-Dateien:
sources.zip
├── PROMPT.md
└── <unveränderliche Referenz-Repositories>.zip
targets.zip enthält ausschließlich Root-Dateien:
targets.zip
├── gap.zip
└── <veränderbare Repository-Arbeitskopien>.zip
Prompt#
PROMPT.md wird aus zwei unveränderten GAP-Artefakten zusammengesetzt:
- dem stabilen Root-
PROMPT.md, - dem im GAP-Manifest aktivierten Work Item.
Der erzeugte Prompt nennt den relativen Pfad des Work Items und übernimmt dessen Inhalt vollständig. Andere Work Items werden nicht in den Prompt kopiert.
Validierung vor Erzeugung#
gap.zipist ein sicheres ZIP mit genau einem Root-Manifest.- Das Manifest identifiziert ein installierbares
semantic-gap. - Genau ein genehmigtes aktives Work Item ist deklariert und im GAP vorhanden.
- Der Work-Item-Pfad bleibt innerhalb des GAP-Roots.
- Jedes Source- und Target-Repository ist ein sicheres ZIP mit genau einem Repository-Root und Root-Manifest.
- Deklarierter Repositoryname und Manifestidentität stimmen überein.
- Jedes Target-Repository liegt im
allowedTargetRepositoriesdes aktiven Work Items. gap.zipwird weder als Source-Repository noch als normales Target-Repository akzeptiert.- Source- und Targetnamen sind jeweils eindeutig.
Absolute Pfade, ..-Segmente und symbolische Links in ZIPs sind unzulässig. Originalarchive werden ausschließlich gelesen. Ohne aktivierte Uploadfilter werden sie byteweise unverändert in die inneren Archive übernommen.
Konfigurierbare Uploadfilter#
Uploadfilter werden ausschließlich über die versionierte Datei Code-ArtifactCodeansicht öffnen aktiviert. Der Aufruf übergibt sie mit --filter-config. Die Konfiguration benennt Repository, Regelversion, Ausschlussmuster, Flat-Root-Äquivalente, Begründung und die zu bewahrenden Originalartefakte; Filterregeln sind nicht im Programmcode fest verdrahtet.
Für runtime gilt:
- Bei einem umschließenden Root werden
runtime/test/**undruntime/prod/**ausgeschlossen. - Der materialisierte Produktionspfad
runtime/production/**wird ebenfalls ausgeschlossen. - Bei einem flachen Root werden die äquivalenten Pfade
test/**,prod/**undproduction/**ausgeschlossen. - Die Regel wirkt nur auf die temporäre Kopie von
runtime.zip, die als Source insources.zipgeschrieben wird. - Das lokale Runtime-Repository, die angegebene ursprüngliche
runtime.zipund die vollständige Runtime-Arbeitskopie intargets.zipbleiben unverändert.
Nach dem Paketieren öffnet das Werkzeug die gefilterte ZIP erneut und weist negativ nach, dass kein Eintrag mehr eines aktiven Ausschlussmusters erfüllt. Ein Treffer bricht die Erzeugung ab.
Für workspace wird archive/** (bei umschließendem Root workspace/archive/**) aus der temporären Uploadkopie ausgeschlossen. Das sind lokale Vorherstände und Importarchive, keine Quellartefakte. Der Ordner im lokalen Workspace wird weder verändert noch gelöscht. Die Regel wird auf Sources und Targets angewandt, damit auch ein historisch bereits enthaltenes archive/ nicht erneut übertragen wird.
Determinismus#
- Alle Archive verwenden feste ZIP-Zeitstempel.
- Root-Dateien werden byteweise nach POSIX-Pfad sortiert.
- JSON wird mit stabiler Schlüsselreihenfolge und abschließendem Zeilenumbruch geschrieben.
- Identische Eingaben erzeugen byteidentische Arbeitspakete.
Paketmanifest#
package-manifest.json beschreibt mindestens:
- Format- und Paketversion,
SHA256SUMS.txtals Integritätsmanifest,- aktives Work Item und dessen Pfad,
- Allowed Target Scope,
- Namen und Inhalte von
sources.zipundtargets.zip, - Rollenregeln des Zwei-Archiv-Modells,
- aktuellen Rücklieferungsvertrag,
- Rollen und maschinenlesbare Identitäten aller Source- und Target-Repositorys,
- Identität des Semantic GAP,
- den Allowed-Target-Grundsatz, dass ausschließlich das aktive Work Item Target-Änderungen freigibt.
Bei aktivierten Uploadfiltern enthält das Manifest zusätzlich für jede angewandte Regel:
- Repository und erkannte Rootform,
- Regelversion und Begründung,
- wirksame Ausschlussmuster,
- tatsächlich ausgeschlossene Pfade,
- Geltungsbereich
temporary-upload-copy-only.
Integritätsmanifest#
SHA256SUMS.txt verwendet ausschließlich kleingeschriebene SHA-256-Hashes und zwei Leerzeichen vor dem logischen Pfad. Die Datei enthält eindeutig sortierte Prüfsummen für:
package-manifest.json,sources.zipundtargets.zip,sources.zip/PROMPT.mdund jedes Repository-ZIP insources.zip,targets.zip/gap.zipund jedes Repository-ZIP intargets.zip.
SHA256SUMS.txt enthält keine Selbstprüfsumme. Validierung berechnet sämtliche Werte neu; fehlende, zusätzliche, doppelte oder abweichende Zeilen sind Fehler.
Sicherheitsprüfungen#
Vor Veröffentlichung werden alle Archive vollständig dekomprimiert und auf CRC-Fehler geprüft. Unzulässig sind ZIP-Slip-Pfade, Backslashes, doppelte kanonische Einträge, symbolische Links, unerwartete Repository-Roots, beschädigte Archive, widersprüchliche Identitäten sowie Manifest- oder Prüfsummenabweichungen.
Repository-ZIPs dürfen entweder einen exakt zum deklarierten Repositorynamen passenden umschließenden Root oder einen flachen Root besitzen. Das Semantic GAP muss unter seinem manifestierten Repository- beziehungsweise Artefaktnamen liegen.
allowedTargetRepositories ist eine duplikatfreie fachliche Menge. Manifest und Work-Item-Frontmatter muessen dieselben Repositorynamen enthalten; ihre Reihenfolge ist nicht semantisch und darf voneinander abweichen.
Atomare Veröffentlichung#
Die Erzeugung schreibt alle vier Ausgabedateien in ein neues Staging-Verzeichnis neben dem Ziel, validiert dieses vollständig und benennt erst danach das gesamte Verzeichnis atomisch auf den Zielnamen um. Das Zielverzeichnis darf vorher nicht existieren. Bei jedem Fehler wird das Staging entfernt; ein teilweise veröffentlichtes Arbeitspaket ist unzulässig.
Validierung eines bestehenden Pakets#
Der Modus validate prüft Rootstruktur, beide inneren Archive, Paketmanifest, Prüfsummen, erzeugten Prompt, GAP-Identität, aktives Work Item, Repositoryrollen, Repository-Identitäten und Allowed Target Scope erneut. Deklarierte Uploadfilter werden gegen die Source-ZIP geprüft; ausgeschlossene Pfade dürfen darin nicht vorkommen. Erfolgreiche Validierung verändert keine Eingabe.
CLI und Exit-Codes#
Erzeugung:
python3 gap_work_package.py create \
--gap semantic-gap.zip \
--filter-config upload-filters.json \
--source engineering-tools=engineering-tools-source.zip \
--target engineering-tools=engineering-tools-target.zip \
--output-dir gap-work-package
Validierung:
python3 gap_work_package.py validate gap-work-package
0: Paket vollständig erzeugt beziehungsweise validiert.2: Eingabe oder Paket verletzt den Vertrag.
Fehler werden auf stderr ausgegeben. Eine fehlgeschlagene Vorprüfung erzeugt kein teilweise gültiges Zielpaket.
Traceability#
- GAP
SE-0006— Einheitliches GAP-Arbeitspaketformat implementieren - GAP
SE-0007— Konfigurierbare Uploadfilter implementieren - GAP
SE-0008— Paketmanifest, Prüfsummen und Sicherheitsprüfungen implementieren - GAP
SE-0012— Legacy-Stilllegung, Scope-Normalisierung und vollständiger Runtime-Produktionsfilter - GAP
00-ausfuehrung/ARBEITSPAKETVERTRAG.md - GAP
00-ausfuehrung/package-manifest.example.json 00-overview/TOOL_CONTRACT_MODEL.mdZIP_ERZEUGUNGSVERTRAG.md