# Delta 0.0.1-alpha.3 — contrats domaine, Git et synchronisation ## Base requise État `0.0.1-alpha.2` committé et poussé avec : ```text history/0.0.1/alpha.2.md = PASS ``` La version devient : ```text 0.0.1-alpha.3 ``` ## Objet Matérialiser les premiers contrats passifs réellement nécessaires aux frontières domaine/Git/synchronisation sans démarrer l'implémentation technique. La tranche : - étend `knowledge-domain-lib` avec `ContentFamily`, `SourceId` et `ContentSource` ; - prouve qu'aucune limite à trois sources n'est codée ; - crée `knowledge-git-api` pour la frontière remplaçable `GitRepository` ; - crée `knowledge-sync-api` pour la frontière multi-producteurs `RepositoryEventSource` ; - maintient Git indépendant d'une forge et le signal de synchronisation non autoritaire ; - adopte les audits Rust PGR de structure/façade désormais pertinents ; - garde `Cargo.lock` versionné mais laisse Cargo le régénérer dans l'environnement opérateur. Aucun `knowledge-git-lib`, adapter Gitea, serveur Actix, schéma PostgreSQL, worker ou frontend n'est ajouté. ## Crates matérialisées ```text knowledge-domain-lib identités sémantiques de famille/source knowledge-git-api GitRepository + GitReference + GitRevision aucune forge obligatoire knowledge-sync-api RepositoryEventSource + RepositorySyncSignal signal de réconciliation, pas vérité de contenu ``` Les suffixes `-api` sont justifiés ici par des implémentations réellement substituables ou multiples ; ils ne sont pas créés par symétrie. ## Audits Rust adoptés Les scripts read-only suivants sont copiés depuis la baseline PGR `v0.1.1` et deviennent des owners locaux de preuve : ```text scripts/_rust_audit_common.py scripts/audit_rust_blank_lines.py scripts/audit_rust_item_spacing.py scripts/audit_rust_module_order.py scripts/audit_rust_trait_import_blocks.py scripts/audit_rust_reexport_blocks.py scripts/audit_rust_export_completeness.py ``` `audit_rust_const_blocks.py` n'est pas adopté comme gate globale. Son usage reste opt-in sur un fichier dont l'ordre des constantes est réellement mécanique. ## `Cargo.lock` Le delta ne livre pas un lockfile fabriqué. L'ajout des deux packages modifie la résolution workspace ; `cargo metadata/check` de la gate opérateur MUST régénérer le `Cargo.lock` réel, qui reste versionné et doit apparaître modifié au staging si Cargo l'actualise. ## Fichiers ajoutés ```text crates/knowledge-domain-lib/src/content_family.rs crates/knowledge-domain-lib/src/source.rs crates/knowledge-domain-lib/src/unit_tests.rs crates/knowledge-git-api/Cargo.toml crates/knowledge-git-api/src/lib.rs crates/knowledge-git-api/src/unit_tests.rs crates/knowledge-sync-api/Cargo.toml crates/knowledge-sync-api/src/lib.rs crates/knowledge-sync-api/src/unit_tests.rs deltas/0.0.1/alpha.3.md scripts/_rust_audit_common.py scripts/audit_rust_blank_lines.py scripts/audit_rust_export_completeness.py scripts/audit_rust_item_spacing.py scripts/audit_rust_module_order.py scripts/audit_rust_reexport_blocks.py scripts/audit_rust_trait_import_blocks.py ``` ## Fichiers remplacés ```text CHANGELOG.md Cargo.toml README.md RULES.md VERSION crates/knowledge-domain-lib/src/lib.rs docs/architecture/001-PROJECT_PROFILE.md docs/architecture/002-KNOWLEDGE_ARCHITECTURE.md docs/plans/001-V0_0_1_FOUNDATION_PLAN.md docs/validation/001-VALIDATION_MATRIX.md ``` Aucun fichier n'est supprimé. ## Validation attendue Après application du history `alpha.2`, commit/push de `alpha.2`, puis extraction du présent delta depuis la racine : ```bash test "$(cat VERSION)" = "0.0.1-alpha.3" git diff --check python3 - <<'PY' from pathlib import Path import tomllib with Path("Cargo.toml").open("rb") as handle: root_manifest = tomllib.load(handle) expected_members = { "crates/knowledge-domain-lib", "crates/knowledge-git-api", "crates/knowledge-sync-api", } assert set(root_manifest["workspace"]["members"]) == expected_members assert root_manifest["workspace"]["package"]["version"] == "0.0.1-alpha.3" assert "knowledge-domain-lib" in root_manifest["workspace"]["dependencies"] for path in ( "crates/knowledge-domain-lib/src/content_family.rs", "crates/knowledge-domain-lib/src/source.rs", "crates/knowledge-domain-lib/src/unit_tests.rs", "crates/knowledge-git-api/Cargo.toml", "crates/knowledge-git-api/src/lib.rs", "crates/knowledge-git-api/src/unit_tests.rs", "crates/knowledge-sync-api/Cargo.toml", "crates/knowledge-sync-api/src/lib.rs", "crates/knowledge-sync-api/src/unit_tests.rs", ): assert Path(path).is_file(), path for forbidden in ( "crates/knowledge-git-lib", "crates/knowledge-forge-gitea-lib", "crates/knowledge-pgr-server", "crates/knowledge-howtos-server", "crates/knowledge-snippets-server", "migrations", "package.json", ): assert not Path(forbidden).exists(), forbidden for manifest in ( "crates/knowledge-git-api/Cargo.toml", "crates/knowledge-sync-api/Cargo.toml", ): text = Path(manifest).read_text(encoding="utf-8") for forbidden_dependency in ("actix", "gitea", "postgres", "sqlx", "tokio", "tracing"): assert forbidden_dependency not in text.lower(), (manifest, forbidden_dependency) architecture = Path("docs/architecture/002-KNOWLEDGE_ARCHITECTURE.md").read_text(encoding="utf-8") for phrase in ( "knowledge-git-api", "knowledge-sync-api", "GitRepository", "RepositoryEventSource", "Explicit", "Periodic", "ExternalSignal", ): assert phrase in architecture, phrase print("Knowledge 0.0.1-alpha.3 structural audit: clean") PY cargo metadata --format-version 1 --no-deps > /tmp/sasedev-knowledge-alpha3-metadata.json cargo fmt --all cargo fmt --all -- --check python3 -B scripts/audit_rust_blank_lines.py crates python3 -B scripts/audit_rust_item_spacing.py crates python3 -B scripts/audit_rust_module_order.py crates python3 -B scripts/audit_rust_trait_import_blocks.py crates python3 -B scripts/audit_rust_reexport_blocks.py crates python3 -B scripts/audit_rust_export_completeness.py --root . cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p knowledge-domain-lib --all-targets --all-features cargo test -p knowledge-git-api --all-targets --all-features cargo test -p knowledge-sync-api --all-targets --all-features test -f Cargo.lock if git check-ignore -q Cargo.lock; then echo 'Cargo.lock must remain versioned' >&2 exit 1 fi python3 - <<'PY' import json from pathlib import Path metadata = json.loads(Path("/tmp/sasedev-knowledge-alpha3-metadata.json").read_text(encoding="utf-8")) packages = {package["name"] for package in metadata["packages"]} assert packages == {"knowledge-domain-lib", "knowledge-git-api", "knowledge-sync-api"}, packages dependencies = { package["name"]: {dependency["name"] for dependency in package["dependencies"]} for package in metadata["packages"] } assert dependencies["knowledge-domain-lib"] == set() assert dependencies["knowledge-git-api"] == {"knowledge-domain-lib"} assert dependencies["knowledge-sync-api"] == {"knowledge-domain-lib"} print("Knowledge 0.0.1-alpha.3 Cargo boundary audit: clean") PY git add -A git diff --cached --check git status --short ``` Ne pas committe `alpha.3` avant production de son history à partir des résultats opérateur.