9.7 KiB
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 :
0.0.4-beta.1.fix.1
Version après application :
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.mdcomme fondation composable sans spécialisation technologique ;002-RUST_CARGO_WORKSPACE.mdcomme première spécialisation technologique, composée avec les profils500 + 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 :
VERSION
CHANGELOG.md
docs/plans/004-V0_0_4_SKELETONS_PLAN.md
ADD :
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 :
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 :
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.