9.5 KiB
Delta 0.0.2-alpha.2.fix.1 — correction de gate, formatage et construction interne
Base requise
Partir de 0.0.2-alpha.2 après application et commit du history réel :
deltas/0.0.2/alpha.2.md présent et historique
history/0.0.2/alpha.2.md FAIL
Le delta alpha.2 historique ne doit pas être réécrit.
La version devient :
0.0.2-alpha.2.fix.1
Objet
Corriger uniquement les défauts révélés par la gate opérateur d'alpha.2 :
- supprimer la ligne vide terminale détectée par
git diff --checkdans la matrice de validation ; - empêcher l'audit Markdown embarqué de traiter
node_modulesou d'autres arbres générés comme contenu gouverné ; - appliquer le formatage attendu par
cargo fmtaux quatre fichiers Rust signalés ; - construire
GitSourceKeydepuis son module propriétaire au lieu de tenter d'utiliser son constructeur tuple privé via le réexportcrate::GitSourceKey; - conserver le champ tuple privé et ne pas élargir l'API publique ;
- documenter le
FAILd'alpha.2et la portée strictement corrective de ce fix.
Le fix n'ajoute aucune capacité Git. refresh, résolution vers commit et snapshot/worktree restent réservés à alpha.3.
Scope
REPLACE :
VERSION
Cargo.toml
crates/knowledge-git-lib/src/backend.rs
crates/knowledge-git-lib/src/error.rs
crates/knowledge-git-lib/src/lib.rs
crates/knowledge-git-lib/unit_tests/backend.rs
docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md
docs/validation/001-VALIDATION_MATRIX.md
ADD :
deltas/0.0.2/alpha.2.fix.1.md
DELETE : aucun.
Le history history/0.0.2/alpha.2.md appartient à la base requise mais n'est pas inclus dans ce delta.
Aucun fichier sous Web/, crates/knowledge-git-api/ ou crates/knowledge-sync-api/ n'est modifié.
Corrections attendues
Hygiène documentaire
docs/validation/001-VALIDATION_MATRIX.md doit terminer par une seule fin de ligne, sans ligne vide additionnelle produisant un warning git diff --check.
La gate du fix contrôle les Markdown du workspace mais ignore explicitement les arbres générés/non gouvernés :
.git
node_modules
target
builds
La présence d'un README provenant d'une dépendance npm ne doit donc plus faire échouer la gouvernance documentaire du projet.
Rustfmt
Les fichiers signalés par la gate initiale sont remis dans la forme attendue par rustfmt.toml :
crates/knowledge-git-lib/src/backend.rs
crates/knowledge-git-lib/src/error.rs
crates/knowledge-git-lib/src/lib.rs
crates/knowledge-git-lib/unit_tests/backend.rs
Aucun changement fonctionnel autre que la correction de visibilité ci-dessous n'est introduit.
Construction de GitSourceKey
GitSourceKey conserve son champ tuple privé :
pub struct GitSourceKey(String);
Sa méthode from_source_id, définie dans le module backend, construit le type avec Self(value) depuis son propre impl. Le réexport public reste destiné à nommer le type, pas à contourner la visibilité de son champ interne.
Gate opérateur
Après application du history alpha.2, commit/push de cet état, puis application du présent delta :
test "$(cat VERSION)" = '0.0.2-alpha.2.fix.1'
grep -F 'version = "0.0.2-alpha.2.fix.1"' Cargo.toml
grep -A2 '^## Statut$' history/0.0.2/alpha.2.md | grep -Fx 'FAIL'
git diff --check
python3 - <<'PY'
from pathlib import Path
import re
import tomllib
required = (
"crates/knowledge-git-lib/Cargo.toml",
"crates/knowledge-git-lib/src/backend.rs",
"crates/knowledge-git-lib/src/error.rs",
"crates/knowledge-git-lib/src/lib.rs",
"crates/knowledge-git-lib/unit_tests/backend.rs",
"deltas/0.0.2/alpha.2.md",
"deltas/0.0.2/alpha.2.fix.1.md",
"history/0.0.2/alpha.2.md",
)
for value in required:
assert Path(value).is_file(), value
root = tomllib.loads(Path("Cargo.toml").read_text(encoding="utf-8"))
manifest = tomllib.loads(Path("crates/knowledge-git-lib/Cargo.toml").read_text(encoding="utf-8"))
assert "crates/knowledge-git-lib" in root["workspace"]["members"]
assert set(manifest["dependencies"]) == {"knowledge-domain-lib"}, manifest["dependencies"]
backend = Path("crates/knowledge-git-lib/src/backend.rs").read_text(encoding="utf-8")
error = Path("crates/knowledge-git-lib/src/error.rs").read_text(encoding="utf-8")
assert "return Self(value);" in backend
assert "return crate::GitSourceKey(value);" not in backend
assert "return crate::backend::GitSourceKey(value);" not in backend
assert "pub struct GitSourceKey(String);" in backend
for phrase in (
"std::process::Command::new",
'command.env("GIT_TERMINAL_PROMPT", "0")',
'command.env_remove("GIT_DIR")',
'command.env_remove("GIT_WORK_TREE")',
'command.env_remove("GIT_INDEX_FILE")',
'command.env_remove("GIT_OBJECT_DIRECTORY")',
'command.env_remove("GIT_ALTERNATE_OBJECT_DIRECTORIES")',
'command.env("GIT_CONFIG_KEY_0", "core.hooksPath")',
'std::ffi::OsString::from("--mirror")',
'std::ffi::OsString::from("--no-local")',
'std::ffi::OsString::from("--")',
'std::ffi::OsString::from("--is-bare-repository")',
):
assert phrase in backend, phrase
for forbidden in (
'Command::new("sh")',
'Command::new("bash")',
'Command::new("cmd")',
'Command::new("powershell")',
"stderr: String",
"arguments: Vec<String>",
"refresh(",
"resolve_revision(",
"worktree add",
"knowledge-app-lib",
):
assert forbidden not in backend + error, forbidden
for path in Path("crates/knowledge-git-lib").rglob("*.rs"):
text = path.read_text(encoding="utf-8")
for forbidden in ("unwrap()", "expect(", "panic!("):
assert forbidden not in text, (path, forbidden)
ignored_parts = {".git", "node_modules", "target", "builds"}
checked_markdown = 0
for path in Path(".").rglob("*.md"):
if any(part in ignored_parts for part in path.parts):
continue
lines = path.read_text(encoding="utf-8").splitlines()
assert lines[0] == f"<!-- file: {path.as_posix()} -->", path
assert re.fullmatch(r"<!-- version: [1-9][0-9]* -->", lines[1]), path
checked_markdown += 1
assert checked_markdown > 0
print(f"Knowledge 0.0.2-alpha.2.fix.1 structural audit: clean ({checked_markdown} Markdown file(s))")
PY
python3 -B scripts/audit_rust_test_layout.py crates
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 . --summary-only
cargo fmt --all -- --check
cargo metadata --format-version 1 --no-deps > /tmp/sasedev-knowledge-0.0.2-alpha.2.fix.1-metadata.json
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p knowledge-git-lib --all-targets --all-features
cargo test --workspace --all-targets --all-features
python3 - <<'PY'
import json
from pathlib import Path
metadata = json.loads(Path("/tmp/sasedev-knowledge-0.0.2-alpha.2.fix.1-metadata.json").read_text(encoding="utf-8"))
packages = {package["name"] for package in metadata["packages"]}
expected = {
"knowledge-domain-lib",
"knowledge-git-api",
"knowledge-git-lib",
"knowledge-sync-api",
"knowledge-web-lib",
"knowledge-pgr-server",
"knowledge-howtos-server",
"knowledge-snippets-server",
}
assert packages == expected, packages
assert len(metadata["workspace_members"]) == 8, metadata["workspace_members"]
print("Knowledge 0.0.2-alpha.2.fix.1 Cargo metadata audit: clean")
PY
test -f Cargo.lock
git check-ignore -q Cargo.lock
if git ls-files --error-unmatch Cargo.lock >/dev/null 2>&1; then
echo 'Cargo.lock must remain untracked for Knowledge' >&2
exit 1
fi
test -z "$(git diff --name-only -- Web)"
test -z "$(git diff --name-only -- crates/knowledge-git-api crates/knowledge-sync-api)"
test ! -e crates/knowledge-app-lib
test ! -e crates/knowledge-forge-gitea-lib
test ! -e crates/knowledge-store-postgres-lib
git add -A
git diff --cached --check
git status --short
Résultats attendus
La gate doit notamment produire :
Knowledge 0.0.2-alpha.2.fix.1 structural audit: clean (... Markdown file(s))
Rust test-layout audit: clean (8 crate(s))
Rust export completeness audit: 0 candidate(s) across 8 package(s)
Knowledge 0.0.2-alpha.2.fix.1 Cargo metadata audit: clean
cargo fmt --all -- --check doit être silencieux et cargo check, Clippy et les deux suites de tests doivent tous terminer avec succès.
La suite ciblée knowledge-git-lib doit exécuter 7 tests unitaires PASS, sauf modification explicitement justifiée du nombre de tests dans un fix ultérieur.
Revue opérateur complémentaire
Vérifier que :
- la correction de visibilité n'a pas rendu public l'état interne de
GitSourceKey; - l'audit Markdown ne dépend plus de l'absence physique de
node_modules; - aucun comportement de
refresh, résolution ou snapshot n'est apparu dans le fix ; - aucune nouvelle dépendance Cargo n'a été introduite ;
- le fix ne change pas l'architecture validée d'
alpha.2.
Transition
PASS
Produire history/0.0.2/alpha.2.fix.1.md, appliquer ce history, committer/pousser le fix, puis seulement préparer 0.0.2-alpha.3.
FAIL / PARTIAL / BLOCKED
Conserver le résultat réel dans history/0.0.2/alpha.2.fix.1.md et rester dans le scope alpha.2 avec alpha.2.fix.2 si nécessaire, sauf déclencheur de REPLAN explicitement satisfait.