0.0.4-rc.1
This commit is contained in:
265
deltas/0.0.4/rc.1.md
Normal file
265
deltas/0.0.4/rc.1.md
Normal file
@@ -0,0 +1,265 @@
|
||||
<!-- file: deltas/0.0.4/rc.1.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta 0.0.4-rc.1 — gel du scope et préparation de release
|
||||
|
||||
## Baseline et version
|
||||
|
||||
Baseline : `0.0.4-beta.1.fix.1`, avec `history/0.0.4/beta.1.fix.1.md` appliqué et committé. Ce delta MUST NOT être appliqué avant ce commit.
|
||||
|
||||
Le commit exact de cette baseline sera celui produit par l'opérateur après la gate `beta.1.fix.1` ; il n'est pas anticipé dans cette livraison simultanée du history et du delta suivant.
|
||||
|
||||
Version avant application :
|
||||
|
||||
```text
|
||||
0.0.4-beta.1.fix.1
|
||||
```
|
||||
|
||||
Version après application :
|
||||
|
||||
```text
|
||||
0.0.4-rc.1
|
||||
```
|
||||
|
||||
## Objet et gel
|
||||
|
||||
La réconciliation `beta.1.fix.1` est `PASS`. La RC gèle le scope fonctionnel de `0.0.4` sur :
|
||||
|
||||
- le contrat transversal des skeleton specifications sous `docs/rules/220-SKELETONS.md` ;
|
||||
- la collection `docs/skeletons/` et son index ;
|
||||
- `001-PROJECT_GOVERNANCE_FOUNDATION.md` comme fondation composable sans spécialisation technologique ;
|
||||
- `002-RUST_CARGO_WORKSPACE.md` comme première spécialisation technologique, composée avec les profils `500 + 510` ;
|
||||
- les cinq templates Rust/Cargo déjà introduits avant `0.0.4`, utilisés avec des décisions destinataire explicites et une instanciation temporaire vérifiable.
|
||||
|
||||
Le changelog reçoit une entrée candidate `0.0.4` orientée utilisateurs. Le plan enregistre les résultats `FAIL → fix PASS` des gates `alpha.4` et `beta.1`, puis le gel RC. Le prompt `005` prépare `0.0.5`, dont la roadmap confirme la mission de réconciliation réelle avec `khadhroony-solana-project` et `sasedev-games` à partir de baselines explicitement fournies.
|
||||
|
||||
Aucun nouveau skeleton, profil, template, audit, générateur ou domaine technologique n'entre en RC. Java/Maven/Gradle, Android, Web, JNI, Tauri et les autres familles différées restent hors scope.
|
||||
|
||||
## Scope
|
||||
|
||||
REPLACE :
|
||||
|
||||
```text
|
||||
VERSION
|
||||
CHANGELOG.md
|
||||
docs/plans/004-V0_0_4_SKELETONS_PLAN.md
|
||||
```
|
||||
|
||||
ADD :
|
||||
|
||||
```text
|
||||
prompts/005-V0_0_5_START_PROMPT.md
|
||||
deltas/0.0.4/rc.1.md
|
||||
```
|
||||
|
||||
DELETE : aucun.
|
||||
|
||||
L'archive contient exactement ces fichiers complets. Le history `beta.1.fix.1` est livré séparément ; le history `rc.1` sera produit après la gate opérateur.
|
||||
|
||||
## Gate opérateur de release candidate
|
||||
|
||||
Après application sur le commit `beta.1.fix.1`, depuis la racine du dépôt :
|
||||
|
||||
```bash
|
||||
test "$(cat VERSION)" = '0.0.4-rc.1'
|
||||
git cat-file -e HEAD:history/0.0.4/beta.1.fix.1.md
|
||||
test -f history/0.0.4/beta.1.fix.1.md
|
||||
test -f deltas/0.0.4/rc.1.md
|
||||
test -f prompts/005-V0_0_5_START_PROMPT.md
|
||||
test ! -e history/0.0.4/rc.1.md
|
||||
|
||||
grep -Fx '<!-- version: 6 -->' CHANGELOG.md
|
||||
grep -Fx '## 0.0.4 (candidate)' CHANGELOG.md
|
||||
grep -Fx '<!-- version: 2 -->' docs/plans/004-V0_0_4_SKELETONS_PLAN.md
|
||||
grep -F '`beta.1.fix.1` a rejoué la réconciliation et est `PASS`' docs/plans/004-V0_0_4_SKELETONS_PLAN.md
|
||||
grep -F 'pgr-v0.0.4.zip' prompts/005-V0_0_5_START_PROMPT.md
|
||||
grep -F 'khadhroony-solana-project' prompts/005-V0_0_5_START_PROMPT.md
|
||||
grep -F 'sasedev-games' prompts/005-V0_0_5_START_PROMPT.md
|
||||
|
||||
python3 -B -m unittest discover -s tests -v
|
||||
|
||||
python3 -B scripts/audit_markdown_headers.py \
|
||||
README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts
|
||||
python3 -B scripts/audit_markdown_tables.py \
|
||||
README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts
|
||||
python3 -B scripts/audit_markdown_links.py \
|
||||
README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts
|
||||
|
||||
python3 -B - <<'PY'
|
||||
from pathlib import Path
|
||||
import re
|
||||
import tomllib
|
||||
|
||||
expected_histories = {
|
||||
'alpha.1.md': 'PASS',
|
||||
'alpha.2.md': 'PASS',
|
||||
'alpha.3.md': 'PASS',
|
||||
'alpha.4.md': 'FAIL',
|
||||
'alpha.4.fix.1.md': 'PASS',
|
||||
'beta.1.md': 'FAIL',
|
||||
'beta.1.fix.1.md': 'PASS',
|
||||
}
|
||||
histories = {path.name for path in Path('history/0.0.4').glob('*.md')}
|
||||
assert histories == set(expected_histories), histories
|
||||
for name, status in expected_histories.items():
|
||||
text = Path('history/0.0.4', name).read_text(encoding='utf-8')
|
||||
assert re.search(rf'## Statut\s+{status}\s', text), (name, status)
|
||||
|
||||
deltas = {path.name for path in Path('deltas/0.0.4').glob('*.md')}
|
||||
assert deltas == set(expected_histories) | {'rc.1.md'}, deltas
|
||||
|
||||
skeletons = sorted(path.name for path in Path('docs/skeletons').glob('*.md'))
|
||||
assert skeletons == [
|
||||
'000-README.md',
|
||||
'001-PROJECT_GOVERNANCE_FOUNDATION.md',
|
||||
'002-RUST_CARGO_WORKSPACE.md',
|
||||
], skeletons
|
||||
|
||||
rule = Path('docs/rules/220-SKELETONS.md').read_text(encoding='utf-8')
|
||||
assert 'Un skeleton sélectionne les owners normatifs applicables ; il ne redéfinit pas leur contenu.' in rule
|
||||
|
||||
foundation = Path('docs/skeletons/001-PROJECT_GOVERNANCE_FOUNDATION.md').read_text(encoding='utf-8')
|
||||
for owner in ('200-GOVERNANCE.md', '210-WORKFLOW.md', '300-DOCUMENTATION.md', '400-VALIDATION.md'):
|
||||
assert owner in foundation, owner
|
||||
|
||||
rust = Path('docs/skeletons/002-RUST_CARGO_WORKSPACE.md').read_text(encoding='utf-8')
|
||||
for owner in ('500-LANGUAGES.md', '510-RUST_CARGO.md'):
|
||||
assert owner in rust, owner
|
||||
assert 'Ils ne deviennent jamais des valeurs universelles par simple copie.' in rust
|
||||
|
||||
for path in (
|
||||
Path('templates/rust-cargo/rustfmt.toml'),
|
||||
Path('templates/rust-cargo/clippy.toml'),
|
||||
Path('templates/rust-cargo/.cargo/config.toml'),
|
||||
Path('templates/rust-cargo/Cargo.toml'),
|
||||
Path('templates/rust-cargo/crates/project-core-lib/Cargo.toml'),
|
||||
):
|
||||
with path.open('rb') as stream:
|
||||
tomllib.load(stream)
|
||||
|
||||
prompt = Path('prompts/005-V0_0_5_START_PROMPT.md').read_text(encoding='utf-8')
|
||||
for value in ('pgr-v0.0.4.zip', 'pgr-0.0.4-publish.001-report.md', '0.0.5-alpha.1', 'khadhroony-solana-project', 'sasedev-games'):
|
||||
assert value in prompt, value
|
||||
assert 'Ne pas déduire leur version, leur commit ou leur contenu' in prompt
|
||||
|
||||
print('RC integration audit: clean (7 prior histories, 3 skeleton docs, 5 TOML parsed, prompt 005 ready)')
|
||||
PY
|
||||
|
||||
command -v cargo
|
||||
command -v rustfmt
|
||||
cargo --version
|
||||
rustc --version
|
||||
rustfmt --version
|
||||
cargo clippy --version
|
||||
|
||||
tmp="$(mktemp -d)"
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
mkdir -p "$tmp/.cargo" "$tmp/crates/smoke-core-lib/src"
|
||||
cp templates/rust-cargo/Cargo.toml "$tmp/Cargo.toml"
|
||||
cp templates/rust-cargo/rustfmt.toml "$tmp/rustfmt.toml"
|
||||
cp templates/rust-cargo/clippy.toml "$tmp/clippy.toml"
|
||||
cp templates/rust-cargo/.cargo/config.toml "$tmp/.cargo/config.toml"
|
||||
cp templates/rust-cargo/crates/project-core-lib/Cargo.toml "$tmp/crates/smoke-core-lib/Cargo.toml"
|
||||
printf '1.2.3\n' > "$tmp/VERSION"
|
||||
|
||||
python3 -B - "$tmp" <<'PY'
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
root = Path(sys.argv[1])
|
||||
replacements = {
|
||||
root / 'Cargo.toml': (
|
||||
('# file: templates/rust-cargo/Cargo.toml', '# file: Cargo.toml'),
|
||||
('members = ["crates/project-core-lib"]', 'members = ["crates/smoke-core-lib"]'),
|
||||
('version = "0.1.0"', 'version = "1.2.3"'),
|
||||
),
|
||||
root / 'rustfmt.toml': (
|
||||
('# file: templates/rust-cargo/rustfmt.toml', '# file: rustfmt.toml'),
|
||||
),
|
||||
root / 'clippy.toml': (
|
||||
('# file: templates/rust-cargo/clippy.toml', '# file: clippy.toml'),
|
||||
),
|
||||
root / '.cargo/config.toml': (
|
||||
('# file: templates/rust-cargo/.cargo/config.toml', '# file: .cargo/config.toml'),
|
||||
(
|
||||
'# Replace project-name with a unique name before using this configuration.',
|
||||
'# Smoke fixture: project-specific build directory already selected.',
|
||||
),
|
||||
('../builds/project-name/target', 'target-smoke'),
|
||||
),
|
||||
root / 'crates/smoke-core-lib/Cargo.toml': (
|
||||
(
|
||||
'# file: templates/rust-cargo/crates/project-core-lib/Cargo.toml',
|
||||
'# file: crates/smoke-core-lib/Cargo.toml',
|
||||
),
|
||||
('name = "project-core-lib"', 'name = "smoke-core-lib"'),
|
||||
),
|
||||
}
|
||||
for path, pairs in replacements.items():
|
||||
text = path.read_text(encoding='utf-8')
|
||||
for old, new in pairs:
|
||||
assert old in text, (path, old)
|
||||
text = text.replace(old, new)
|
||||
path.write_text(text, encoding='utf-8')
|
||||
for path in root.rglob('*'):
|
||||
if path.is_file() and path.name != 'Cargo.lock':
|
||||
text = path.read_text(encoding='utf-8')
|
||||
assert 'project-name' not in text, path
|
||||
assert 'project-core-lib' not in text, path
|
||||
print('RC temporary Rust/Cargo template adaptation: clean')
|
||||
PY
|
||||
|
||||
cat > "$tmp/crates/smoke-core-lib/src/lib.rs" <<'RS'
|
||||
//! Minimal crate used to validate the PGR Rust/Cargo templates.
|
||||
|
||||
/// Returns the deterministic smoke value.
|
||||
pub fn smoke_value() -> u8 {
|
||||
return 1;
|
||||
}
|
||||
RS
|
||||
|
||||
(
|
||||
cd "$tmp"
|
||||
cargo metadata --format-version 1 --no-deps >/dev/null
|
||||
cargo fmt --all -- --check
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||
)
|
||||
|
||||
rm -rf "$tmp"
|
||||
trap - EXIT
|
||||
|
||||
git diff --check
|
||||
git add VERSION CHANGELOG.md docs/plans/004-V0_0_4_SKELETONS_PLAN.md \
|
||||
prompts/005-V0_0_5_START_PROMPT.md deltas/0.0.4/rc.1.md
|
||||
git diff --cached --check
|
||||
git status --short
|
||||
```
|
||||
|
||||
Le scope attendu avant ajout du history est exactement :
|
||||
|
||||
```text
|
||||
M CHANGELOG.md
|
||||
M VERSION
|
||||
A deltas/0.0.4/rc.1.md
|
||||
M docs/plans/004-V0_0_4_SKELETONS_PLAN.md
|
||||
A prompts/005-V0_0_5_START_PROMPT.md
|
||||
```
|
||||
|
||||
## Revue opérateur complémentaire
|
||||
|
||||
Confirmer que le changelog décrit la release et non ses tranches internes, que les deux `FAIL` historiques restent visibles avec leurs fixes `PASS`, que le prompt `005` ne présume aucune version KSP/Games non fournie et que la RC n'étend pas le périmètre fonctionnel.
|
||||
|
||||
Une gate RC `PASS` n'est ni la promotion stable, ni le tag `v0.0.4`, ni la vérification de l'archive publiée après le tag.
|
||||
|
||||
## Transition
|
||||
|
||||
### PASS
|
||||
|
||||
Produire séparément `history/0.0.4/rc.1.md`, l'appliquer puis committer/pousser la RC avant le delta stable `rel.001`.
|
||||
|
||||
Le history RC et le delta stable MAY être livrés ensemble sous forme de deux archives séparées après observation de cette gate opérateur.
|
||||
|
||||
### FAIL
|
||||
|
||||
Consigner l'échec réel dans `history/0.0.4/rc.1.md` et corriger uniquement le scope gelé dans `rc.1.fix.1`, sauf REPLAN explicite si la candidate révèle un défaut fonctionnel plus large.
|
||||
Reference in New Issue
Block a user