Files
sasedev-knowledge/deltas/0.0.1/alpha.3.md
2026-09-27 22:23:43 +02:00

7.3 KiB

Delta 0.0.1-alpha.3 — contrats domaine, Git et synchronisation

Base requise

État 0.0.1-alpha.2 committé et poussé avec :

history/0.0.1/alpha.2.md = PASS

La version devient :

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

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 :

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

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

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 :

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.