Files
pgr/deltas/0.0.4/rc.1.md
2026-09-24 17:45:22 +02:00

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.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 :

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.