Curriculum-Pakete sicher provisionieren
Dieses Runbook beschreibt die lokale Installation und Aktivierung bereits gebauter
full-standalone-v1-JSON-Pakete. Der Provisioner ist die einzige schreibende
Komponente des Package-Stores. Die SkillPilot-Runtime liest ausschließlich den
exakt gepinnten aktiven Lock und verändert den Store nicht.
Sicherheitsmodell
Ein eingehendes ZIP wird nie direkt als Runtime-Quelle verwendet. Der Provisioner
- kopiert eine unveränderte Eingabedatei mit stabiler Dateiidentität in eine private Quarantäne und berechnet dabei äußeren SHA-256 und Bytezahl;
- ruft den unabhängigen Finished-Package-Validator v2 in einem getrennten Prozess auf;
- extrahiert ausschließlich das exakte, sichere Archivinventar in ein privates Staging-Verzeichnis;
- prüft Manifest,
SHA256SUMS, jeden Manifestrecord und den vollständigen extrahierten Dateibaum erneut; - promotet Objekt, Validatorreport und Install-Record atomar unter dem äußeren ZIP-Hash;
- verändert den aktiven Lock erst durch einen getrennten, expliziten CAS-Schritt.
Symlinks, Sonderdateien, unsichere oder kollidierende Pfade, ZIP64, Data Descriptor, verschachtelte Archive, unerwartete Dateien und Profilüberschreitungen werden fail-closed abgewiesen. Ein fehlgeschlagener Installations-, Aktivierungs- oder Rollback-Versuch lässt den zuvor aktiven Lock unverändert.
Store-Layout
<store>/
.provisioner.lock
quarantine/
staging/
objects/sha256/<outerZipSha256>/<archiveRoot>/
validation-reports/<outerZipSha256>.json
install-records/<outerZipSha256>.json
locks/active.json
locks/history/<lockSha256>.json
objects/, Validatorreports und Install-Records sind nach erfolgreicher Promotion
unveränderlich. Jeder aktive Lock verweist auf die exakten Hashes dieser drei
Evidenzebenen sowie auf Manifest, Closure, Definition-Index und fachlichen
contentDigest. Es gibt weder Verzeichnisscan als Discoverymechanismus noch eine
ungepinnte latest-Auswahl.
Bedienfolge
Die verbindliche CLI-Hilfe ist jederzeit verfügbar:
python3 -B scripts/provision_curriculum_package.py --help
Die normale Reihenfolge ist:
install: ZIP in Quarantäne kopieren, unabhängig validieren, sicher extrahieren und content-adressiert installieren;verify: ein installiertes Objekt einschließlich aller Kontroll- und Payloadbytes erneut prüfen;activate: eine vollständig angegebene Paketmenge bei passender--expected-active-sha256atomar aktivieren;status: aktiven Lock und installierte Identitäten strukturiert ausgeben;rollback: einen früheren, hashadressierten Lock ebenfalls per CAS reaktivieren.
Für die erste Aktivierung wird der erwartete Vorgänger ausdrücklich als none
angegeben. Jede weitere Aktivierung und jedes Rollback benötigt den SHA-256 des
aktuell beobachteten Locks. Damit kann ein paralleler oder überholter Operator keine
neuere Auswahl überschreiben. Die Lock-Einträge werden kanonisch nach packageId
sortiert; doppelte Paket-IDs, inkompatible Consumerbereiche und widersprüchliche
Definitionen verhindern die Aktivierung.
Die konkrete Syntax und alle Pflichtparameter stehen in den Unterkommando-Hilfen, zum Beispiel:
python3 -B scripts/provision_curriculum_package.py activate --help
python3 -B scripts/provision_curriculum_package.py rollback --help
Runtime-Konfiguration
Erst nach Installation und Aktivierung wird der Backend-Consumer auf den Store geschaltet:
skillpilot:
curriculum:
source: package
consumer-version: 0.1.0
packages:
store-directory: /srv/skillpilot/curriculum-packages
active-lock: locks/active.json
Der Runtime-Prozess benötigt nur Leserechte. In Produktion sollen Provisioner und Runtime unter getrennten OS-Identitäten laufen; Schreibrechte auf Store und Lock gehören ausschließlich zur Provisioning-/Deployment-Autorität. Paketmodus fällt bei fehlender oder beschädigter Evidenz nicht auf Repository, Classpath oder Netzwerk zurück.
Qualitätssicherung
Der begrenzte adversariale Selbsttest läuft mit:
python3 -B scripts/provision_curriculum_package.py self-test
Zusätzlich validiert die Repository-CI die drei externen Betriebsverträge für
Validatorreport, Install-Record und aktiven Lock. Diese Schemas sind bewusst keine
paketlokalen fachlichen Payloadschemas und verändern daher weder das geschlossene
full-standalone-v1-Inventar noch dessen Digest.
Bewusste Grenzen
- Eine technisch gültige Installation ist keine Publikationsfreigabe. Offene fachliche, Quellen- und Rechte-Reviews bleiben verbindlich.
- Der v2-Validatorreport und die lokale content-adressierte Evidenz schützen die Installation vor Drift und Replay innerhalb dieses Betriebsmodells. Die kryptographische Publisher-Identität und die signierte JSON-/OWL-Releasegruppe folgen mit DPK-011.
embedded-fragmentbleibt bis zur vollständigen fachübergreifenden Closure- und Consumer-Lane fail-closed.- Der checkout-unabhängige Betrieb ist seit DPK-007 durch denselben Loader- und
Storepfad nachgewiesen: eine package-only SkillPilot-Assembly besteht 15
Funktionsprüfungen einschließlich realem React-/Chromium-Fluss und
Catalog-404-Fail-closed-Fall. Sie läuft mit
--clearenv, fester Environment-Allowlist und nur Loopback in einem checkout-verdeckten Namespace; der Datei-/Netzwerk-Trace des vollständigen Prozessbaums beobachtet keine fachliche Repository-Poison-Lane. Die evaluator-gesteuerte frische Attestation und ihre Assembly-/Evidence-Bindung sind unter Curriculum Package Readiness beschrieben.