233 lines
7.3 KiB
Markdown
233 lines
7.3 KiB
Markdown
<!-- file: deltas/0.0.1/alpha.3.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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.
|