diff --git a/deltas/0.0.3/rel.1.fix.1.md b/deltas/0.0.3/rel.1.fix.1.md new file mode 100644 index 0000000..8075544 --- /dev/null +++ b/deltas/0.0.3/rel.1.fix.1.md @@ -0,0 +1,112 @@ + + + +# Delta 0.0.3 rel.1.fix.1 — complétion de la preuve de clôture stable + +## Baseline et version + +Baseline : `0.0.3-rel.1` avec `history/0.0.3/rel.1.md` appliqué, committé et poussé avec le statut `PARTIAL`. + +Ce delta MUST NOT être appliqué avant ce commit. + +Version produit avant et après application : + +```text +0.0.3 +``` + +`rel.1.fix.1` est une tranche opérationnelle de clôture ; elle ne change pas la version SemVer stable visée. + +## Objet + +Compléter uniquement les deux preuves absentes du transcript `rel.1` : + +- audit explicite de l'ensemble exact du workspace à partir de `cargo metadata` ; +- audit explicite d'hygiène texte. + +Toutes les preuves produit/runtime de `rel.1` — Rust, Git, Web, Vite et trois smokes HTTP — sont déjà `PASS` et sont conservées dans son history. Ce fix ne modifie aucun fichier concerné par ces preuves. + +## Scope + +REPLACE : + +```text +docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md +docs/validation/001-VALIDATION_MATRIX.md +``` + +ADD : + +```text +deltas/0.0.3/rel.1.fix.1.md +``` + +DELETE : aucun. + +Aucun changement sous `VERSION`, `Cargo.toml`, `crates/`, `Web/`, `CHANGELOG.md`, `ROADMAP.md`, `docs/architecture/`, `docs/studies/`, `docs/rules/` ou `prompts/`. + +## Gate opérateur + +Exécuter depuis la racine du dépôt : + +```bash +test "$(cat VERSION)" = '0.0.3' +grep -F 'version = "0.0.3"' Cargo.toml +sed -n '/^## Statut$/{n;n;p;q;}' history/0.0.3/rel.1.md | tr -d '`' | grep -Fx 'PARTIAL' + +git diff --check + +python3 -B scripts/audit_markdown_headers.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts deltas history +python3 -B scripts/audit_markdown_links.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts deltas history +python3 -B scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts deltas history + +cargo metadata --format-version 1 --no-deps > /tmp/sasedev-knowledge-0.0.3-rel.1.fix.1-metadata.json + +python3 -c 'import json; from pathlib import Path; m=json.loads(Path("/tmp/sasedev-knowledge-0.0.3-rel.1.fix.1-metadata.json").read_text()); expected={"knowledge-app-lib","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 {p["name"] for p in m["packages"]} == expected; assert len(m["workspace_members"]) == 9; print("Knowledge 0.0.3-rel.1.fix.1 workspace audit: clean")' + +python3 -c 'from pathlib import Path; roots=[Path("README.md"),Path("RULES.md"),Path("ROADMAP.md"),Path("CHANGELOG.md"),Path("docs"),Path("prompts"),Path("deltas"),Path("history")]; paths=[p for r in roots for p in ([r] if r.is_file() else r.rglob("*")) if p.is_file()]; bad=[str(p) for p in paths if (lambda b: b"\r" in b or not b.endswith(b"\n") or b.endswith(b"\n\n") or any(line != line.rstrip(" \t") for line in b.decode("utf-8").splitlines()))(p.read_bytes())]; print(f"Knowledge 0.0.3-rel.1.fix.1 text hygiene: clean ({len(paths)} file(s))") if not bad else (_ for _ in ()).throw(AssertionError(bad))' + +test -z "$(git diff --name-only -- VERSION Cargo.toml crates Web CHANGELOG.md ROADMAP.md docs/architecture docs/studies docs/rules prompts)" +test ! -e history/0.0.3/rel.1.fix.1.md + +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 -f Web/knowledge-template-lab/package-lock.json +! git show-ref --verify --quiet refs/tags/v0.0.3 +test ! -e sasedev-knowledge-0.0.3-publish.001-report.md + +git add -A +git diff --cached --check +git status --short +``` + +## Staging attendu + +Avant ajout du history de ce fix : + +```text +A deltas/0.0.3/rel.1.fix.1.md +M docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md +M docs/validation/001-VALIDATION_MATRIX.md +``` + +## Transition + +### PASS + +Produire `history/0.0.3/rel.1.fix.1.md`, l'appliquer, puis créer le premier commit stable avec le message exact : + +```text +0.0.3 +``` + +Après push de `master`, créer/pousser le tag annoté `v0.0.3`, vérifier tag/commit/archive réellement publiés puis produire séparément le rapport post-tag `sasedev-knowledge-0.0.3-publish.001-report.md`. + +### FAIL / PARTIAL / BLOCKED + +Conserver le résultat réel dans son history et corriger uniquement la fermeture stable dans le fix suivant, sans créer le tag. diff --git a/docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md b/docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md index a75a6a2..c111f11 100644 --- a/docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md +++ b/docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md @@ -1,5 +1,5 @@ - + # Plan 0.0.3 — écriture Git contrôlée et push gardé @@ -235,6 +235,15 @@ La gate de `alpha.1` reste une gate de cadrage : elle valide baseline, documenta - produire le history observé avant commit produit/tag ; - ne fabriquer aucun rapport post-tag avant publication réelle. +### rel.1.fix.1 — complétion de la preuve de clôture stable + +- conserver `rel.1 = PARTIAL` avec toutes les preuves produit/runtime réellement acquises ; +- ne modifier aucun code produit, frontend, changelog, roadmap, architecture, étude, règle ou prompt ; +- compléter explicitement l'audit de composition du workspace à partir du JSON `cargo metadata` déjà prévu par la gate ; +- compléter explicitement l'audit d'hygiène texte sur les documents gouvernés ; +- réutiliser les preuves Cargo/Clippy/tests, Web et smokes HTTP `PASS` de `rel.1` puisqu'aucun fichier concerné n'est modifié ; +- autoriser le premier commit stable `0.0.3` uniquement après `PASS` complet de ce fix. + ## Déclencheurs de REPLAN REPLAN avant de poursuivre si : @@ -264,7 +273,7 @@ La release est fermable lorsque : - les règles/architecture décrivent l'état effectivement obtenu ; - beta et RC ont fermé les non-régressions prévues. -Le `PARTIAL` de `alpha.1` a autorisé `0.0.3-alpha.1.fix.1`. Le premier fix est resté `PARTIAL`, puis `alpha.1.fix.2` a fermé la preuve en `PASS`. `alpha.2` a matérialisé le contrat d'écriture provider-neutral en `PASS`. `alpha.3` est conservée `FAIL` à cause de l'assertion de test `E0369`; `alpha.3.fix.1` a corrigé uniquement le test en `PASS`. `alpha.4` a ensuite fermé le scope fonctionnel alpha en `PASS`. `beta.1` a stabilisé et réconcilié cet état en `PASS`, sans nouveau code produit. `rc.1` a confirmé toutes les preuves produit/runtime mais reste `FAIL` à cause d'une assertion lexicale trop stricte sur le statut historique `alpha.1`. `rc.1.fix.1` a corrigé uniquement cette preuve en `PASS`. `rel.1` assure maintenant la promotion stable pré-tag sans rouvrir le scope. +Le `PARTIAL` de `alpha.1` a autorisé `0.0.3-alpha.1.fix.1`. Le premier fix est resté `PARTIAL`, puis `alpha.1.fix.2` a fermé la preuve en `PASS`. `alpha.2` a matérialisé le contrat d'écriture provider-neutral en `PASS`. `alpha.3` est conservée `FAIL` à cause de l'assertion de test `E0369`; `alpha.3.fix.1` a corrigé uniquement le test en `PASS`. `alpha.4` a ensuite fermé le scope fonctionnel alpha en `PASS`. `beta.1` a stabilisé et réconcilié cet état en `PASS`, sans nouveau code produit. `rc.1` a confirmé toutes les preuves produit/runtime mais reste `FAIL` à cause d'une assertion lexicale trop stricte sur le statut historique `alpha.1`. `rc.1.fix.1` a corrigé uniquement cette preuve en `PASS`. `rel.1` a acquis toutes les preuves produit/runtime de la promotion stable mais reste `PARTIAL` parce que deux contrôles annoncés — composition exacte du workspace et hygiène texte — ne figurent pas dans le transcript. `rel.1.fix.1` ferme uniquement ces deux preuves avant le premier commit stable réellement `PASS`. ## Revue d'horizon diff --git a/docs/validation/001-VALIDATION_MATRIX.md b/docs/validation/001-VALIDATION_MATRIX.md index a808c8c..1cc7efb 100644 --- a/docs/validation/001-VALIDATION_MATRIX.md +++ b/docs/validation/001-VALIDATION_MATRIX.md @@ -1,5 +1,5 @@ - + # Matrice de validation Knowledge @@ -251,6 +251,22 @@ La fermeture stable pré-tag doit prouver : Un `PASS` de `rel.1` autorise le commit produit exact `0.0.3`, le push, puis seulement la création/push du tag annoté `v0.0.3`, le téléchargement de l'archive réellement servie et la production séparée du rapport `sasedev-knowledge-0.0.3-publish.001-report.md`. +## Gate de `0.0.3-rel.1.fix.1` + +Le fix de complétion de preuve stable doit prouver : + +- `VERSION = 0.0.3` et version workspace identique ; la clôture stable reste la même version produit ; +- history `history/0.0.3/rel.1.md` présent avec statut `PARTIAL` et committé avant application ; +- aucune modification sous `crates/`, `Web/`, `CHANGELOG.md`, `ROADMAP.md`, `docs/architecture/`, `docs/studies/`, `docs/rules/` ou `prompts/` ; +- fichier `cargo metadata --format-version 1 --no-deps` produit puis ensemble exact des neuf packages/workspace members vérifié explicitement ; +- hygiène texte explicite `PASS` sur README/RULES/ROADMAP/CHANGELOG/docs/prompts/deltas/history ; +- audits Markdown locaux propres après ajout du fix ; +- preuves `rel.1` conservées : formatage/audits Rust, Cargo/Clippy/tests, Web/Vite et trois smokes HTTP tous `PASS` ; +- tag `v0.0.3` et rapport post-tag toujours absents avant le history `rel.1.fix.1` `PASS` ; +- `Cargo.lock` local ignoré/non suivi, package-lock Web versionné et staging final propre. + +Le premier `PASS` d'une clôture `rel.N[/fix.M]` autorise alors le commit produit exact `0.0.3`, le push, puis le tag annoté `v0.0.3` et la vérification post-tag. + ## PostgreSQL Aucune gate PostgreSQL n'est créée avant matérialisation d'une dépendance ou d'un schéma réel. diff --git a/history/0.0.3/rel.1.fix.1.md b/history/0.0.3/rel.1.fix.1.md new file mode 100644 index 0000000..c3abade --- /dev/null +++ b/history/0.0.3/rel.1.fix.1.md @@ -0,0 +1,139 @@ + + + +# History 0.0.3-rel.1.fix.1 — complétion de la preuve de clôture stable + +## Statut + +PASS + +La gate opérateur de `0.0.3-rel.1.fix.1` exécutée le `2026-09-29` est complète et propre. Elle complète exactement les deux preuves absentes de `rel.1` sans modifier le produit, le Web, la version stable visée ni les documents de release déjà finalisés. + +## Baseline opérateur + +`rel.1` `PARTIAL` a été historisé, committé et poussé avant application du fix : + +```text +history/0.0.3/rel.1.md PARTIAL +commit 9a1f73d +message 0.0.3-rel.1 +branch master +push origin/master PASS +workspace après push propre +``` + +Le push observé a avancé `origin/master` de `0351aa0` à `9a1f73d`. + +## Version et audits documentaires + +La version produit reste volontairement stable pendant cette tranche opérationnelle : + +```text +VERSION 0.0.3 +Cargo workspace version 0.0.3 +history rel.1 PARTIAL +git diff --check PASS +Markdown header audit clean (124 file(s)) +Markdown link audit clean (82 local link(s), 124 file(s)) +Markdown table audit clean (4 table(s), 124 file(s)) +``` + +## Preuve workspace complétée + +La preuve explicitement manquante dans `rel.1` est maintenant acquise : + +```text +cargo metadata --format-version 1 --no-deps PASS +workspace packages exacts PASS +workspace_members 9 +``` + +L'ensemble exact observé est : + +```text +knowledge-app-lib +knowledge-domain-lib +knowledge-git-api +knowledge-git-lib +knowledge-sync-api +knowledge-web-lib +knowledge-pgr-server +knowledge-howtos-server +knowledge-snippets-server +``` + +Le contrôle opérateur imprime : + +```text +Knowledge 0.0.3-rel.1.fix.1 workspace audit: clean +``` + +## Preuve d'hygiène texte complétée + +La seconde preuve manquante est acquise sur les racines documentaires et de gouvernance prévues : + +```text +README.md +RULES.md +ROADMAP.md +CHANGELOG.md +docs/ +prompts/ +deltas/ +history/ +``` + +Résultat observé : + +```text +Knowledge 0.0.3-rel.1.fix.1 text hygiene: clean (124 file(s)) +``` + +Aucun retour chariot CR, fin de fichier incorrecte, double newline terminale ou espace/tab de fin de ligne n'est détecté par cette gate. + +## Scope et invariants de clôture + +Les contrôles finaux passent : + +```text +aucun diff VERSION/Cargo.toml/crates/Web/CHANGELOG/ROADMAP/ + architecture/studies/rules/prompts PASS +history/0.0.3/rel.1.fix.1.md avant history absent +Cargo.lock présent, ignoré, non suivi +Web/knowledge-template-lab/package-lock.json présent +tag local v0.0.3 absent +sasedev-knowledge-0.0.3-publish.001-report.md absent +git diff --cached --check PASS +``` + +Le staging final observé avant ajout du présent history est exactement : + +```text +A deltas/0.0.3/rel.1.fix.1.md +M docs/plans/003-V0_0_3_GIT_WRITE_PLAN.md +M docs/validation/001-VALIDATION_MATRIX.md +``` + +## Preuves produit héritées de rel.1 + +Ce fix ne modifie aucun fichier produit ou Web. Les preuves complètes acquises pendant `rel.1` restent donc autoritaires pour la clôture stable : + +```text +cargo fmt / audits Rust PASS +cargo check / Clippy PASS +Git read path PASS (2) +Git write candidate PASS (2) +Git guarded push PASS (2) +workspace tests PASS +npm ci / typecheck / Vite build PASS +Vite manifest PASS +knowledge-pgr-server smoke PASS +knowledge-howtos-server smoke PASS +knowledge-snippets-server smoke PASS +``` + +## Décision + +`0.0.3-rel.1.fix.1` est `PASS`. + +La clôture stable de `0.0.3` est maintenant suffisamment prouvée. Le présent history doit être appliqué puis inclus, avec les trois fichiers déjà stagés par le fix, dans le premier commit stable portant le message exact `0.0.3`. Après push de `master`, le tag annoté `v0.0.3` peut être créé et poussé. Le rapport post-tag `sasedev-knowledge-0.0.3-publish.001-report.md` ne doit être produit qu'après vérification des identifiants réellement publiés et de l'archive réellement servie par Gitea.