This commit is contained in:
2026-09-29 07:07:56 +02:00
parent 3bb1ffebbe
commit 183d354a67
10 changed files with 586 additions and 20 deletions

View File

@@ -1,11 +1,11 @@
<!-- file: CHANGELOG.md --> <!-- file: CHANGELOG.md -->
<!-- version: 13 --> <!-- version: 14 -->
# Changelog SaseDev Knowledge # Changelog SaseDev Knowledge
Ce fichier décrit les changements utiles des releases publiées. Les détails de tranches et preuves opérateur appartiennent aux plans, deltas et histories. Ce fichier décrit les changements utiles des releases publiées. Les détails de tranches et preuves opérateur appartiennent aux plans, deltas et histories.
## 0.0.2 (candidate) ## 0.0.2
- matérialise un backend Git générique de lecture derrière `knowledge-git-api`, sans dépendance obligatoire à une forge ; - matérialise un backend Git générique de lecture derrière `knowledge-git-api`, sans dépendance obligatoire à une forge ;
- prend en charge sources locales/remotes, mirror contrôlé, refresh avec pruning, résolution de référence vers commit et snapshots/worktrees détachés adressés par révision ; - prend en charge sources locales/remotes, mirror contrôlé, refresh avec pruning, résolution de référence vers commit et snapshots/worktrees détachés adressés par révision ;

View File

@@ -1,5 +1,5 @@
# file: Cargo.toml # file: Cargo.toml
# version: 29 # version: 30
[workspace] [workspace]
resolver = "3" resolver = "3"
@@ -16,7 +16,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.0.2-rc.1" version = "0.0.2"
edition = "2024" edition = "2024"
publish = false publish = false
repository = "https://git.sasedev.com/Sasedev/sasedev-knowledge" repository = "https://git.sasedev.com/Sasedev/sasedev-knowledge"

View File

@@ -1,5 +1,5 @@
<!-- file: README.md --> <!-- file: README.md -->
<!-- version: 17 --> <!-- version: 18 -->
# SaseDev Knowledge # SaseDev Knowledge
@@ -11,7 +11,7 @@ Le dépôt applicatif retenu est `sasedev-knowledge`. Le nom court du projet et
La version courante est définie par [`VERSION`](VERSION). La version courante est définie par [`VERSION`](VERSION).
`0.0.1` est la première stable de fondation de SaseDev Knowledge. Les alphas `0.0.2` ont matérialisé le chemin Git générique de lecture, l'autonomie normative locale et le cas d'usage partagé de synchronisation. La phase beta de `0.0.2` est fermée. `0.0.2-rc.1` gèle désormais ce scope comme candidate stable et rejoue la gate complète de release sans ajouter de fonctionnalité. `0.0.1` est la première stable de fondation de SaseDev Knowledge. `0.0.2` est la stable du chemin Git générique de lecture, de l'autonomie normative locale et du cas d'usage partagé de synchronisation `Changed` / `Unchanged`. La release conserve les intégrations forge, PostgreSQL, écriture Git, auth/admin complète et formats éditoriaux finaux hors scope tant qu'une mission ultérieure ne les engage pas explicitement.
`knowledge-git-lib` implémente `knowledge-git-api::GitRepository` pour des sources physiques enregistrées : mirror contrôlé, refresh avec pruning, résolution d'une référence vers un commit et snapshot/worktree détaché adressé par révision. `alpha.4` ne change pas cette sémantique. Les règles nécessaires au développement courant sont désormais possédées localement sous `docs/rules/`, et les futurs prompts Knowledge ne chargent pas PGR sauf réévaluation explicitement engagée. `knowledge-app-lib` compose maintenant refresh, résolution, comparaison avec la révision précédente et préparation de snapshot en un résultat explicite `Changed` / `Unchanged`, sans persister la dernière révision ni matérialiser de scheduler. `knowledge-git-lib` implémente `knowledge-git-api::GitRepository` pour des sources physiques enregistrées : mirror contrôlé, refresh avec pruning, résolution d'une référence vers un commit et snapshot/worktree détaché adressé par révision. `alpha.4` ne change pas cette sémantique. Les règles nécessaires au développement courant sont désormais possédées localement sous `docs/rules/`, et les futurs prompts Knowledge ne chargent pas PGR sauf réévaluation explicitement engagée. `knowledge-app-lib` compose maintenant refresh, résolution, comparaison avec la révision précédente et préparation de snapshot en un résultat explicite `Changed` / `Unchanged`, sans persister la dernière révision ni matérialiser de scheduler.
@@ -77,7 +77,7 @@ Le runtime exige un bind configuré par launcher et l'une des deux sources d'ass
- [`docs/studies/003-V0_0_1_FOUNDATION_RECONCILIATION.md`](docs/studies/003-V0_0_1_FOUNDATION_RECONCILIATION.md) — réconciliation `beta.1`, état matérialisé, DEFER conservés et revue d'horizon ; - [`docs/studies/003-V0_0_1_FOUNDATION_RECONCILIATION.md`](docs/studies/003-V0_0_1_FOUNDATION_RECONCILIATION.md) — réconciliation `beta.1`, état matérialisé, DEFER conservés et revue d'horizon ;
- [`docs/studies/004-V0_0_2_GIT_IMPLEMENTATION_STUDY.md`](docs/studies/004-V0_0_2_GIT_IMPLEMENTATION_STUDY.md) — comparaison processus Git / `gix` / `git2` et décision d'implémentation de lecture ; - [`docs/studies/004-V0_0_2_GIT_IMPLEMENTATION_STUDY.md`](docs/studies/004-V0_0_2_GIT_IMPLEMENTATION_STUDY.md) — comparaison processus Git / `gix` / `git2` et décision d'implémentation de lecture ;
- [`docs/plans/001-V0_0_1_FOUNDATION_PLAN.md`](docs/plans/001-V0_0_1_FOUNDATION_PLAN.md) — plan historique de la fondation stable `0.0.1` ; - [`docs/plans/001-V0_0_1_FOUNDATION_PLAN.md`](docs/plans/001-V0_0_1_FOUNDATION_PLAN.md) — plan historique de la fondation stable `0.0.1` ;
- [`docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md`](docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md) — plan actif de `0.0.2`, gates et trajectoire prévisionnelle ; - [`docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md`](docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md) — plan historique de la stable `0.0.2`, gates et décisions de fermeture ;
- [`docs/validation/001-VALIDATION_MATRIX.md`](docs/validation/001-VALIDATION_MATRIX.md) — matrice de validation ; - [`docs/validation/001-VALIDATION_MATRIX.md`](docs/validation/001-VALIDATION_MATRIX.md) — matrice de validation ;
- [`prompts/001-V0_0_1_START_PROMPT.md`](prompts/001-V0_0_1_START_PROMPT.md) — prompt de démarrage autoritaire de la release. - [`prompts/001-V0_0_1_START_PROMPT.md`](prompts/001-V0_0_1_START_PROMPT.md) — prompt de démarrage autoritaire de la release.
- [`prompts/002-V0_0_2_START_PROMPT.md`](prompts/002-V0_0_2_START_PROMPT.md) — handoff historique exécuté pour ouvrir `0.0.2` depuis la stable `v0.0.1` vérifiée. - [`prompts/002-V0_0_2_START_PROMPT.md`](prompts/002-V0_0_2_START_PROMPT.md) — handoff historique exécuté pour ouvrir `0.0.2` depuis la stable `v0.0.1` vérifiée.

View File

@@ -1,5 +1,5 @@
<!-- file: ROADMAP.md --> <!-- file: ROADMAP.md -->
<!-- version: 7 --> <!-- version: 8 -->
# Roadmap SaseDev Knowledge # Roadmap SaseDev Knowledge
@@ -11,9 +11,9 @@ Statuts : `( )` planifié, `(x)` terminé, `(d)` différé, `(c)` annulé.
- `(x) 0.0.1` — fondation Knowledge : gouvernance PGR, workspace à trois applications Actix Web, architecture Git/forge/PostgreSQL partagé, frontières PGR/HOWTO/snippet, contrat d'administration locale protégée sans UI/auth complète, workspace Rust, premiers contrats, baseline Web reproductible, rendu Maud et intégration réelle du manifest Vite, sans implémentation métier disproportionnée. - `(x) 0.0.1` — fondation Knowledge : gouvernance PGR, workspace à trois applications Actix Web, architecture Git/forge/PostgreSQL partagé, frontières PGR/HOWTO/snippet, contrat d'administration locale protégée sans UI/auth complète, workspace Rust, premiers contrats, baseline Web reproductible, rendu Maud et intégration réelle du manifest Vite, sans implémentation métier disproportionnée.
## Horizon engagé ## Releases livrées
- `( ) 0.0.2` — implémentation Git générique et synchronisation de lecture : backend provider-neutral derrière `knowledge-git-api`, configuration de sources locales/remotes, matérialisation locale reproductible, refresh/résolution de révision, snapshot/worktree de lecture et convergence des déclencheurs explicite/périodique vers un même cas d'usage, sans API de forge obligatoire, écriture/publication Git, PostgreSQL ni format final HOWTO/snippet. - `(x) 0.0.2` — implémentation Git générique et synchronisation de lecture : backend provider-neutral derrière `knowledge-git-api`, configuration de sources locales/remotes, matérialisation locale reproductible, refresh/résolution de révision, snapshot/worktree de lecture et convergence des déclencheurs explicite/périodique vers un même cas d'usage, sans API de forge obligatoire, écriture/publication Git, PostgreSQL ni format final HOWTO/snippet.
## Domaines futurs non numérotés ## Domaines futurs non numérotés
@@ -28,4 +28,4 @@ Les thèmes suivants sont candidats à des releases ultérieures mais ne reçoiv
- authentification/autorisation complète ; - authentification/autorisation complète ;
- déploiement et opérations multi-domaines. - déploiement et opérations multi-domaines.
La revue d'horizon `0.0.2-beta.1` est réalisée : aucune release postérieure à `0.0.2` n'est engagée ni numérotée. Les thèmes futurs restent volontairement non numérotés jusqu'à ce qu'un scope et un ordre réellement utiles soient décidés. La revue d'horizon `0.0.2-beta.1` est réalisée et la stable `0.0.2` est fermée : aucune release postérieure à `0.0.2` n'est engagée ni numérotée. Les thèmes futurs restent volontairement non numérotés jusqu'à ce qu'un scope et un ordre réellement utiles soient décidés.

View File

@@ -1 +1 @@
0.0.2-rc.1 0.0.2

335
deltas/0.0.2/rel.1.md Normal file
View File

@@ -0,0 +1,335 @@
<!-- file: deltas/0.0.2/rel.1.md -->
<!-- version: 1 -->
# Delta 0.0.2 rel.1 — promotion stable pré-tag
## Baseline et version
Baseline : `0.0.2-rc.1`, avec `history/0.0.2/rc.1.md` appliqué et committé.
Ce delta MUST NOT être appliqué avant ce commit.
Version avant application :
```text
0.0.2-rc.1
```
Version après application :
```text
0.0.2
```
`rel.1` identifie la tranche de clôture opérationnelle ; il ne fait pas partie de la version SemVer du produit.
## Objet
Promouvoir mécaniquement la candidate validée vers la stable `0.0.2` sans rouvrir le scope.
La tranche finalise uniquement la version stable, la présentation stable du README, la roadmap, le changelog, l'index documentaire, le plan `0.0.2` et la matrice de validation.
Aucun fichier Rust, frontend, dépendance fonctionnelle, contrat Git/sync, règle normative, étude ou prompt de reprise n'est modifié.
## Scope
REPLACE :
```text
VERSION
Cargo.toml
README.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md
docs/validation/001-VALIDATION_MATRIX.md
```
ADD :
```text
deltas/0.0.2/rel.1.md
```
DELETE : aucun.
Le history `rc.1` est livré séparément. Le history `rel.1` sera produit uniquement après la gate opérateur.
## Présentation stable attendue
Après application :
```text
VERSION 0.0.2
Cargo workspace version 0.0.2
ROADMAP (x) 0.0.2
CHANGELOG ## 0.0.2
README 0.0.2 présentée comme stable
plan 002 plan historique de la stable 0.0.2
aucun prompt 0.0.3 oui
```
Aucune release postérieure à `0.0.2` n'est engagée ni numérotée.
## Gate pré-tag
Exécuter depuis la racine du dépôt :
```bash
test "$(cat VERSION)" = '0.0.2'
grep -F 'version = "0.0.2"' Cargo.toml
grep -A2 '^## Statut$' history/0.0.2/rc.1.md | grep -Fx 'PASS'
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 fmt --all
cargo fmt --all -- --check
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_crate_root_facades.py crates
python3 -B scripts/audit_rust_export_completeness.py --root . --summary-only
cargo metadata --format-version 1 --no-deps > /tmp/sasedev-knowledge-0.0.2-rel.1-metadata.json
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p knowledge-git-lib --test git_read_path
cargo test --workspace --all-targets --all-features
(
cd Web/knowledge-template-lab
npm ci
npm run typecheck
npm run build
)
python3 - <<'PYGATE'
import json
from pathlib import Path
metadata = json.loads(Path('/tmp/sasedev-knowledge-0.0.2-rel.1-metadata.json').read_text(encoding='utf-8'))
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 {package['name'] for package in metadata['packages']} == expected
assert len(metadata['workspace_members']) == 9
statuses = {
'alpha.1': 'FAIL',
'alpha.1.fix.1': 'PASS',
'alpha.2': 'FAIL',
'alpha.2.fix.1': 'FAIL',
'alpha.2.fix.2': 'PASS',
'alpha.3': 'FAIL',
'alpha.3.fix.1': 'PASS',
'alpha.4': 'FAIL',
'alpha.4.fix.1': 'PASS',
'alpha.5': 'PASS',
'beta.1': 'PARTIAL',
'beta.1.fix.1': 'FAIL',
'beta.1.fix.2': 'PASS',
'rc.1': 'PASS',
}
for tranche, status in statuses.items():
path = Path(f'history/0.0.2/{tranche}.md')
assert path.is_file(), path
text = path.read_text(encoding='utf-8')
assert f'## Statut\n\n{status}' in text, (tranche, status)
history_names = {path.stem for path in Path('history/0.0.2').glob('*.md')}
assert history_names == set(statuses), history_names
delta_names = {path.stem for path in Path('deltas/0.0.2').glob('*.md')}
assert delta_names == set(statuses) | {'rel.1'}, delta_names
assert not Path('history/0.0.2/rel.1.md').exists()
assert '## 0.0.2\n' in Path('CHANGELOG.md').read_text(encoding='utf-8')
assert '## 0.0.2 (candidate)' not in Path('CHANGELOG.md').read_text(encoding='utf-8')
roadmap = Path('ROADMAP.md').read_text(encoding='utf-8')
assert '- `(x) 0.0.2`' in roadmap
assert '0.0.3' not in roadmap
readme = Path('README.md').read_text(encoding='utf-8')
assert '`0.0.2` est la stable du chemin Git générique de lecture' in readme
index = Path('docs/000-README.md').read_text(encoding='utf-8')
assert 'plan historique de la stable Git générique' in index
plan = Path('docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md').read_text(encoding='utf-8')
assert 'Plan historique de la stable `0.0.2`' in plan
assert '`rc.1` est `PASS`' in plan
assert not Path('prompts/003-V0_0_3_START_PROMPT.md').exists()
for forbidden in (
Path('crates/knowledge-forge-gitea-lib'),
Path('crates/knowledge-store-postgres-lib'),
):
assert not forbidden.exists(), forbidden
print('Knowledge 0.0.2-rel.1 stable audit: clean')
PYGATE
python3 - <<'PYTEXT'
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 = []
for root in roots:
if root.is_file():
paths.append(root)
elif root.is_dir():
paths.extend(path for path in root.rglob('*') if path.is_file())
for path in paths:
data = path.read_bytes()
assert b'\r' not in data, path
assert data.endswith(b'\n'), path
assert not data.endswith(b'\n\n'), path
text = data.decode('utf-8')
for number, line in enumerate(text.splitlines(), start=1):
assert line == line.rstrip(' \t'), (path, number)
print(f'Knowledge 0.0.2-rel.1 text hygiene: clean ({len(paths)} file(s))')
PYTEXT
python3 - <<'PYMANIFEST'
import json
from pathlib import Path
manifest_path = Path('../builds/sasedev-knowledge/web/template-lab/.vite/manifest.json')
assert manifest_path.is_file(), manifest_path
manifest = json.loads(manifest_path.read_text(encoding='utf-8'))
assert 'src/main.ts' in manifest, manifest.keys()
entry = manifest['src/main.ts']
assert entry.get('file'), entry
assert entry.get('css'), entry
print('Knowledge 0.0.2-rel.1 Vite manifest audit: clean')
PYMANIFEST
python3 - <<'PYSMOKE'
import json
import os
from pathlib import Path
import signal
import subprocess
import time
import urllib.request
root = Path.cwd()
build_root = (root / '../builds/sasedev-knowledge').resolve()
manifest_path = build_root / 'web/template-lab/.vite/manifest.json'
manifest = json.loads(manifest_path.read_text(encoding='utf-8'))
entry = manifest['src/main.ts']
asset_paths = ['/' + entry['file'].lstrip('/')]
asset_paths.extend('/' + value.lstrip('/') for value in entry.get('css', []))
subprocess.run([
'cargo', 'build',
'-p', 'knowledge-pgr-server',
'-p', 'knowledge-howtos-server',
'-p', 'knowledge-snippets-server',
], check=True)
servers = (
('knowledge-pgr-server', 'KNOWLEDGE_PGR_BIND_ADDRESS', 18181),
('knowledge-howtos-server', 'KNOWLEDGE_HOWTOS_BIND_ADDRESS', 18182),
('knowledge-snippets-server', 'KNOWLEDGE_SNIPPETS_BIND_ADDRESS', 18183),
)
for binary_name, bind_variable, port in servers:
binary = build_root / 'target/debug' / binary_name
assert binary.is_file(), binary
env = os.environ.copy()
env.pop('KNOWLEDGE_VITE_DEV_ORIGIN', None)
env['KNOWLEDGE_VITE_MANIFEST_PATH'] = str(manifest_path)
env[bind_variable] = f'127.0.0.1:{port}'
process = subprocess.Popen(
[str(binary)], env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
start_new_session=True, text=True,
)
try:
health_url = f'http://127.0.0.1:{port}/healthz'
for attempt in range(50):
try:
with urllib.request.urlopen(health_url, timeout=1) as response:
body = response.read().decode('utf-8')
assert response.status == 200
assert body == 'ok'
break
except Exception:
if process.poll() is not None:
stdout, stderr = process.communicate()
raise AssertionError((binary_name, process.returncode, stdout, stderr))
if attempt == 49:
raise
time.sleep(0.1)
with urllib.request.urlopen(f'http://127.0.0.1:{port}/', timeout=2) as response:
html = response.read().decode('utf-8')
assert response.status == 200
for asset_path in asset_paths:
assert asset_path in html, (binary_name, asset_path)
with urllib.request.urlopen(f'http://127.0.0.1:{port}{asset_path}', timeout=2) as response:
assert response.status == 200, (binary_name, asset_path, response.status)
print(f'{binary_name} smoke PASS')
finally:
if process.poll() is None:
os.killpg(process.pid, signal.SIGTERM)
try:
process.wait(timeout=5)
except subprocess.TimeoutExpired:
os.killpg(process.pid, signal.SIGKILL)
process.wait(timeout=5)
print('Knowledge 0.0.2-rel.1 HTTP smoke: clean')
PYSMOKE
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 -- crates Web docs/architecture docs/studies docs/rules prompts)"
test ! -e crates/knowledge-forge-gitea-lib
test ! -e crates/knowledge-store-postgres-lib
test ! -e history/0.0.2/rel.1.md
git add -A
git diff --cached --check
git status --short
```
## Transition
### PASS
Produire séparément `history/0.0.2/rel.1.md`, l'appliquer, puis créer le commit stable avec le message exact :
```text
0.0.2
```
Après push de `master`, créer et publier le tag annoté `v0.0.2`, vérifier l'objet tag local/distant et son commit déréférencé, puis télécharger l'archive source réellement produite depuis le tag et produire le rapport externe :
```text
sasedev-knowledge-0.0.2-publish.001-report.md
```
Aucune prochaine release n'est engagée à ce stade. Un futur prompt n'est créé qu'après décision explicite de sa mission et s'appuie sur la stable publiée/vérifiée `0.0.2`.
### FAIL
Créer `history/0.0.2/rel.1.md` avec le diagnostic réel, ne pas créer le tag et corriger uniquement la fermeture dans `rel.1.fix.1`.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/000-README.md --> <!-- file: docs/000-README.md -->
<!-- version: 8 --> <!-- version: 9 -->
# Documentation SaseDev Knowledge # Documentation SaseDev Knowledge
@@ -35,7 +35,7 @@
## Plans ## Plans
- [`plans/001-V0_0_1_FOUNDATION_PLAN.md`](plans/001-V0_0_1_FOUNDATION_PLAN.md) — plan historique de la stable de fondation `0.0.1`. - [`plans/001-V0_0_1_FOUNDATION_PLAN.md`](plans/001-V0_0_1_FOUNDATION_PLAN.md) — plan historique de la stable de fondation `0.0.1`.
- [`plans/002-V0_0_2_GIT_SYNC_PLAN.md`](plans/002-V0_0_2_GIT_SYNC_PLAN.md) — plan actif de Git générique et synchronisation de lecture `0.0.2`. - [`plans/002-V0_0_2_GIT_SYNC_PLAN.md`](plans/002-V0_0_2_GIT_SYNC_PLAN.md) — plan historique de la stable Git générique et synchronisation de lecture `0.0.2`.
## Validation ## Validation

View File

@@ -1,11 +1,11 @@
<!-- file: docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md --> <!-- file: docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md -->
<!-- version: 14 --> <!-- version: 15 -->
# Plan 0.0.2 — Git générique et synchronisation de lecture # Plan 0.0.2 — Git générique et synchronisation de lecture
## Statut et sources ## Statut et sources
Plan actif de la release `0.0.2`, ouvert depuis la stable Knowledge `v0.0.1` publiée et vérifiée. Plan historique de la stable `0.0.2`, ouverte depuis la stable Knowledge `v0.0.1` publiée et vérifiée.
Sources autoritaires de reprise : Sources autoritaires de reprise :
@@ -28,7 +28,7 @@ PGR publish report pgr-0.1.3-publish.001-report.md = PASS
Le passage de PGR `v0.1.1` à `v0.1.3` est traité comme adoption d'un projet existant via `230-ADOPTION`. Les artefacts historiques de `0.0.1` ne sont pas réécrits. `v0.1.3` constitue une provenance d'adoption, pas une dépendance normative vivante : les futurs démarrages Knowledge doivent partir des règles locales et ne consultent PGR que lorsqu'une nouvelle adoption est explicitement engagée. Le passage de PGR `v0.1.1` à `v0.1.3` est traité comme adoption d'un projet existant via `230-ADOPTION`. Les artefacts historiques de `0.0.1` ne sont pas réécrits. `v0.1.3` constitue une provenance d'adoption, pas une dépendance normative vivante : les futurs démarrages Knowledge doivent partir des règles locales et ne consultent PGR que lorsqu'une nouvelle adoption est explicitement engagée.
`0.0.2-alpha.1` est `FAIL` pour défaut de structure du présent plan malgré des contrôles techniques propres. `alpha.1.fix.1` a corrigé uniquement ce cadrage documentaire et sa gate opérateur est `PASS`. `alpha.2` a été fermée par `alpha.2.fix.2` `PASS`. `alpha.3` a été fermée par `alpha.3.fix.1` `PASS`. `alpha.4` a été fermée par `alpha.4.fix.1` `PASS`, terminant l'adoption PGR comme migration ponctuelle. `alpha.5` est `PASS` et ferme le scope fonctionnel alpha avec `knowledge-app-lib` et le cas d'usage partagé `Changed` / `Unchanged`. `beta.1` est `PARTIAL` : la réconciliation, les audits Rust/Git et la baseline Web passent, mais la gate générée a omis les smokes HTTP requis pendant la stabilisation. `beta.1.fix.1` est `FAIL` : les smokes HTTP sont désormais acquis, mais un `SyntaxError` dans l'audit de stabilisation et une ligne vide supplémentaire à EOF font échouer la gate. `beta.1.fix.2` est `PASS` et ferme la stabilisation beta. `rc.1` est la tranche courante : le scope est gelé et seule la validation complète de candidate est autorisée. `0.0.2-alpha.1` est `FAIL` pour défaut de structure du présent plan malgré des contrôles techniques propres. `alpha.1.fix.1` a corrigé uniquement ce cadrage documentaire et sa gate opérateur est `PASS`. `alpha.2` a été fermée par `alpha.2.fix.2` `PASS`. `alpha.3` a été fermée par `alpha.3.fix.1` `PASS`. `alpha.4` a été fermée par `alpha.4.fix.1` `PASS`, terminant l'adoption PGR comme migration ponctuelle. `alpha.5` est `PASS` et ferme le scope fonctionnel alpha avec `knowledge-app-lib` et le cas d'usage partagé `Changed` / `Unchanged`. `beta.1` est `PARTIAL`; `beta.1.fix.1` est `FAIL`; `beta.1.fix.2` est `PASS` et ferme la stabilisation beta. `rc.1` est `PASS` et valide la candidate complète. `rel.1` est la tranche courante de promotion mécanique pré-tag vers la stable `0.0.2`.
## Mission ## Mission
@@ -255,7 +255,7 @@ Résultat de revue proposé et soumis à la gate beta : aucune prochaine mission
### rc.1 — candidate stable ### rc.1 — candidate stable
Statut : **à valider**. Statut opérateur : **PASS**.
`beta.1.fix.2` est `PASS`. Le scope fonctionnel de `0.0.2` est gelé et la candidate doit exécuter la gate complète de release sans introduire de changement produit. `beta.1.fix.2` est `PASS`. Le scope fonctionnel de `0.0.2` est gelé et la candidate doit exécuter la gate complète de release sans introduire de changement produit.
@@ -315,7 +315,7 @@ Un REPLAN modifie le présent plan de manière explicite ; il ne doit pas être
## Revue d'horizon ## Revue d'horizon
État courant : **réalisée et stabilisation beta fermée par `0.0.2-beta.1.fix.2` `PASS`; `rc.1` en validation candidate**. État courant : **réalisée ; stabilisation beta et candidate `rc.1` fermées `PASS`; `rel.1` en promotion stable pré-tag**.
Résultat : aucune version postérieure à `0.0.2` n'est réservée. Les domaines futurs restent non numérotés parce qu'aucune mission suivante ne possède encore un scope et un ordre suffisamment décidés. Résultat : aucune version postérieure à `0.0.2` n'est réservée. Les domaines futurs restent non numérotés parce qu'aucune mission suivante ne possède encore un scope et un ordre suffisamment décidés.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/001-VALIDATION_MATRIX.md --> <!-- file: docs/validation/001-VALIDATION_MATRIX.md -->
<!-- version: 31 --> <!-- version: 32 -->
# Matrice de validation Knowledge # Matrice de validation Knowledge
@@ -819,3 +819,24 @@ CHECK git diff --check puis git diff --cached --check
``` ```
Pendant la gate RC, `deltas/0.0.2/rc.1.md` doit être le seul delta `0.0.2` sans history correspondant. Un `PASS` autorise uniquement `rel.1` ; toute régression fonctionnelle importante impose un retour de phase ou un REPLAN. Pendant la gate RC, `deltas/0.0.2/rc.1.md` doit être le seul delta `0.0.2` sans history correspondant. Un `PASS` autorise uniquement `rel.1` ; toute régression fonctionnelle importante impose un retour de phase ou un REPLAN.
## Gate de `0.0.2-rel.1`
La fermeture stable pré-tag doit prouver :
- `VERSION = 0.0.2` et version workspace Cargo identique ;
- history `rc.1` `PASS` committé avant application de `rel.1` ;
- `rel.1` comme seul delta `0.0.2` sans history pendant sa gate ;
- changelog stable `## 0.0.2` sans marqueur `candidate` ;
- roadmap avec `(x) 0.0.2` et aucune release postérieure numérotée ;
- README, index documentaire et plan `0.0.2` présentés comme stables/historiques ;
- aucun prompt `0.0.3` inventé ;
- absence de changement sous `crates/`, `Web/`, `docs/architecture/`, `docs/studies/`, `docs/rules/` et `prompts/` ;
- `cargo fmt --all` puis `cargo fmt --all -- --check` avant les audits Rust ;
- audits Rust locaux, `cargo check`, Clippy strict, test Git réel et tests workspace `PASS` ;
- `npm ci`, typecheck, build Vite et manifest de production `PASS` ;
- trois smokes HTTP `PASS` avec `/healthz`, `/` et assets hashés servis ;
- `Cargo.lock` local présent, ignoré et non suivi ;
- fichiers texte gouvernés terminés par exactement un LF ;
- `git diff --check` et `git diff --cached --check` propres ;
- aucun tag stable ou rapport post-tag déclaré comme existant avant le history `rel.1` `PASS` et le commit stable.

210
history/0.0.2/rel.1.md Normal file
View File

@@ -0,0 +1,210 @@
<!-- file: history/0.0.2/rel.1.md -->
<!-- version: 1 -->
# History 0.0.2 rel.1 — promotion stable pré-tag
## Statut
PASS
La gate opérateur de `0.0.2-rel.1` exécutée le `2026-09-29` est propre.
## Baseline opérateur
`rc.1` `PASS` a été historisé, committé et poussé avant application de `rel.1` :
```text
history/0.0.2/rc.1.md = PASS
commit 3bb1ffe
message 0.0.2-rc.1
branch master
push origin/master PASS
status clean après push
```
Le premier `git push origin master` a été interrompu pendant la demande d'identifiant puis relancé ; le second push a réussi et a avancé `origin/master` de `6de544f` à `3bb1ffe`.
## Promotion stable
La version produit est :
```text
VERSION 0.0.2
Cargo workspace version 0.0.2
```
La tranche ne modifie aucun fichier sous :
```text
crates/
Web/
docs/architecture/
docs/studies/
docs/rules/
prompts/
```
La présentation stable est cohérente :
```text
ROADMAP 0.0.2 terminé ; aucune release postérieure engagée
CHANGELOG section ## 0.0.2 sans marqueur candidate
README 0.0.2 présentée comme stable du chemin Git générique de lecture
plan 002 plan historique de la stable 0.0.2
index docs plan 002 référencé comme plan historique de la stable Git générique
prompt 0.0.3 absent
```
## Markdown et format
Les preuves suivantes passent :
```text
git diff --check PASS
Markdown header audit clean (95 file(s))
Markdown link audit clean (72 local link(s), 95 file(s))
Markdown table audit clean (4 table(s), 95 file(s))
cargo fmt --all PASS
cargo fmt --all -- --check PASS
```
## Audits Rust
Les audits passent après formatage :
```text
Rust test-layout audit clean (9 crate(s))
Rust blank-line audit clean (32 file(s))
Rust item-spacing audit clean (32 file(s))
Rust module-order audit clean (32 file(s))
Rust trait-import-block audit clean (32 file(s))
Rust re-export-block audit clean (32 file(s))
Rust crate-root facade audit clean (6 crate root(s))
Rust export completeness audit 0 candidate(s) across 9 package(s)
```
## Cargo, Clippy et tests
Les neuf packages compilent en version stable `0.0.2`.
```text
cargo check --workspace PASS
cargo clippy --workspace --all-targets --all-features PASS
cargo test -p knowledge-git-lib --test git_read_path 2 PASS
cargo test --workspace --all-targets --all-features PASS
```
Les tests workspace confirment notamment :
```text
knowledge-app-lib 3 PASS
knowledge-domain-lib 3 PASS
knowledge-git-api 1 PASS
knowledge-git-lib 8 unit + 2 integration PASS
knowledge-sync-api 1 PASS
knowledge-web-lib 4 PASS
launchers 0 test, compilation PASS
```
## Web et manifest Vite
La baseline Web passe :
```text
npm ci PASS
npm run typecheck PASS
npm run build PASS
```
Les avertissements Sass/Bootstrap de dépréciation et le warning npm relatif au script d'installation de `@parcel/watcher` restent non bloquants ; les commandes terminent avec succès.
Le manifest Vite est présent et valide :
```text
Knowledge 0.0.2-rel.1 Vite manifest audit: clean
```
## Audit stable
L'audit de cohérence passe :
```text
Knowledge 0.0.2-rel.1 stable audit: clean
```
Il confirme notamment :
- neuf packages Cargo exactement ;
- les quatorze histories antérieurs avec leurs statuts réels ;
- `rc.1 = PASS` ;
- `rel.1` comme seul delta `0.0.2` sans history pendant sa gate ;
- `CHANGELOG.md` stable sans marqueur `candidate` ;
- roadmap `0.0.2` terminée ;
- aucune `0.0.3` réservée et aucun prompt `0.0.3` créé ;
- absence des crates forge/PostgreSQL différées.
L'hygiène texte passe avec exactement un LF terminal sur les `95` fichiers gouvernés :
```text
Knowledge 0.0.2-rel.1 text hygiene: clean (95 file(s))
```
## Smokes HTTP
Les trois launchers passent explicitement :
```text
knowledge-pgr-server smoke PASS
knowledge-howtos-server smoke PASS
knowledge-snippets-server smoke PASS
Knowledge 0.0.2-rel.1 HTTP smoke: clean
```
Les smokes confirment `/healthz`, `/`, les références du manifest Vite dans le HTML et le service HTTP effectif des assets JS/CSS hashés.
## Hygiène Git finale
`Cargo.lock` reste présent localement, ignoré et non suivi.
Les surfaces produit et normatives gelées ne sont pas modifiées par `rel.1`.
Le staging final observé avant ajout du présent history est exactement :
```text
M CHANGELOG.md
M Cargo.toml
M README.md
M ROADMAP.md
M VERSION
A deltas/0.0.2/rel.1.md
M docs/000-README.md
M docs/plans/002-V0_0_2_GIT_SYNC_PLAN.md
M docs/validation/001-VALIDATION_MATRIX.md
```
`git diff --cached --check` passe.
## Décision
`0.0.2-rel.1` est `PASS`.
La release stable `0.0.2` peut maintenant être matérialisée.
L'ordre obligatoire est :
```text
appliquer ce history
-> git add / diff --cached --check / status
-> commit exact "0.0.2"
-> push origin master
-> vérifier workspace propre
-> créer le tag annoté v0.0.2 sur ce commit
-> pousser le tag
-> vérifier tag local et distant et le commit déréférencé
-> télécharger l'archive réellement servie par Gitea depuis v0.0.2
-> produire sasedev-knowledge-0.0.2-publish.001-report.md
```
Le présent history ne déclare pas le tag, l'archive du tag ou le rapport post-tag comme déjà existants.
Aucune prochaine release n'est engagée. Un futur prompt de démarrage ne doit être créé qu'après décision explicite de sa mission et doit s'appuyer sur la stable publiée/vérifiée `0.0.2` et les artefacts locaux Knowledge, sans consultation PGR automatique.