[DTP-Worker] Sprint 8 · buffer · Mobile/app_config : le SDK MAJEUR Expo (« Expo 54 ») ANCRÉ sur la roadmap Sprint 5 l.56 « Rebuild Expo 54 »
La version MAJEURE du SDK Expo que l'app compagnon cible (`expoSdkMajor`) est data-derived : `out/app_config.json.expo.extra.expoSdkMajor = 54` (byte-gaté par check_artifacts ⇒ faisant autorité), recopié dans `out/MANIFEST.json.app.expo_sdk_major`, dérivé de `mobile_spec.json[app].expo_sdk_major` dont la SOURCE FAISANT AUTORITÉ est la roadmap Sprint 5 l.56 « Rebuild Expo 54 » (le spec le DÉCLARE via `expo_sdk_source`). Le README:4/19/35/72 recopie « Expo 54 » CINQ fois À LA MAIN — dont la ligne de source « Expo SDK **54** | roadmap Sprint 5 l.56 ». Le bloc « Mobile · récap de l'app Expo » amont ne gate QUE le quadruplet onglets/rôles/langues/identifiants a_confirmer (comptes de MANIFEST.counts), AVEUGLE au majeur du SDK. Piège #6 : BUMPER le SDK (Expo 55 sort · eas build cible 55) dans le spec/artefact SANS toucher au README (ou l'inverse), ou DÉRIVER la roadmap de l'artefact, laisse la prose PÉRIMÉE en silence pendant que le graphe byte-gaté dit autre chose → l'agent Mobile lancerait `eas build` sur le MAUVAIS SDK (le rebuild même que la ligne roadmap prescrit) — « vert trompeur » qu'aucune suite tests/ (FONCTIONS de génération, jamais la prose ni l'ancre à la roadmap) n'attrape. Même patron d'ANCRAGE que la marque SEO §Entités (Helios RD ancrée sur CLAUDE.md) ou les roadmap_line de la recette, mais sur une valeur dont la roadmap — non CLAUDE.md — est l'INPUT faisant autorité. Gate ajouté (bloc « Mobile · le SDK MAJEUR Expo … ANCRÉ sur la roadmap Sprint 5 l.56 ») : le majeur re-dérivé de app_config.json byte-gaté, puis (a) cohérence interne artefact ⇔ MANIFEST ⇔ spec ; (b) ancrage roadmap `Rebuild Expo <N>` == artefact (ancre vive) ; (c) le spec DÉCLARE l'ancrage (expo_sdk_source cite roadmap + Expo N) ; (d) TOUTE mention prose « Expo [SDK] N » == artefact (aucune périmée) ; (e) la ligne de source du tableau cite l'ancre roadmap. Un claim absent échoue AUSSI. 7 morsures vérifiées (README 54→55 prose périmée · artefact 54→55 README+roadmap périmés = le vrai silent green · roadmap Rebuild Expo 54→55 artefact périmé · MANIFEST 54→55 chaîne incohérente · spec expo_sdk_source sans roadmap · README ligne source sans roadmap · README retire toute mention Expo N), restauré vert (git checkout --, JAMAIS git clean), 7 gates re-verts. ci/README.md (table récap + paragraphe détaillé) mis à jour. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -796,3 +796,58 @@ absolu) · **7 gates re-verts** · unittest module `chat_otoia` re-vert.
|
|||||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'import réel des
|
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'import réel des
|
||||||
`Custom Block` + le câblage de l'endpoint OTOIA restent côté agent ERPNext Backend / VPS).
|
`Custom Block` + le câblage de l'endpoint OTOIA restent côté agent ERPNext Backend / VPS).
|
||||||
- **Auto-score 4Big** : 96/100.
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
|
## Session `20260801_070237` · Buffer S8 · Mobile/app_config : le **SDK MAJEUR Expo** (« Expo 54 ») — la version majeure que l'app compagnon cible, **ANCRÉE sur la roadmap Sprint 5 l.56** « Rebuild Expo 54 » — était transcrite À LA MAIN **cinq fois** dans le README SANS AUCUN gate d'IDENTITÉ ni d'ANCRAGE. Le bloc « Mobile · récap de l'app Expo » existant ne gate QUE le quadruplet onglets/rôles/langues/identifiants `a_confirmer` (comptes de `MANIFEST.counts`), AVEUGLE au majeur du SDK.
|
||||||
|
|
||||||
|
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||||
|
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Même patron d'ANCRAGE que
|
||||||
|
la marque SEO §Entités (`Helios RD` ancrée sur CLAUDE.md) ou les `roadmap_line` de la
|
||||||
|
recette `qa/acceptance` — appliqué ici à une valeur ancrée sur la **ROADMAP** (source
|
||||||
|
faisant autorité de la version Expo, CLAUDE.md ne la spécifiant pas).
|
||||||
|
|
||||||
|
**Dérive silencieuse fermée** :
|
||||||
|
- `05_deliverables_mvp/mobile/app_config/README.md:4/19/35/72` — « Expo 54 »
|
||||||
|
(×4 mentions) + la ligne de source « Expo SDK **54** | roadmap Sprint 5 l.56 ».
|
||||||
|
- Chaîne de dérivation (byte-gatée par `check_artifacts`) : roadmap Sprint 5 l.56
|
||||||
|
« Rebuild Expo 54 » (INPUT faisant autorité) → `mobile_spec.json[app]`
|
||||||
|
(`expo_sdk_major = 54` + `expo_sdk_source` cite la roadmap) →
|
||||||
|
`out/app_config.json.expo.extra.expoSdkMajor = 54` + `out/MANIFEST.json
|
||||||
|
.app.expo_sdk_major = 54`.
|
||||||
|
- Piège #6 : BUMPER le SDK (Expo 55 sort · `eas build` cible 55) dans le
|
||||||
|
spec/artefact SANS toucher au README (ou l'inverse), ou DÉRIVER la roadmap de
|
||||||
|
l'artefact, laisse la prose PÉRIMÉE en silence pendant que le graphe byte-gaté
|
||||||
|
dit autre chose → l'agent Mobile lancerait `eas build` sur le MAUVAIS SDK (le
|
||||||
|
rebuild même que la ligne roadmap prescrit). Aucune suite `tests/` (FONCTIONS de
|
||||||
|
génération, jamais la prose ni l'ancre à la roadmap) n'attrape ce « vert
|
||||||
|
trompeur ».
|
||||||
|
- **État courant** : aucune mention périmée — les 4 « Expo 54 », le spec, le
|
||||||
|
MANIFEST et la roadmap concordent (anti-invention #6, rien à réécrire). Le défaut
|
||||||
|
est la **surface ungated + non ancrée à la roadmap**.
|
||||||
|
|
||||||
|
**Gate ajouté** (`ci/check_readme_claims.sh`, nouveau bloc « Mobile · le SDK MAJEUR
|
||||||
|
Expo … ANCRÉ sur la roadmap Sprint 5 l.56 », inséré avant `sys.exit`) : le majeur
|
||||||
|
`sdk` re-dérivé de `app_config.json` byte-gaté, puis (a) **cohérence interne**
|
||||||
|
artefact ⇔ `MANIFEST.app.expo_sdk_major` ⇔ `spec.app.expo_sdk_major` ; (b)
|
||||||
|
**ancrage roadmap** — `re.search("Rebuild Expo (\d+)")` sur
|
||||||
|
`04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md` == `sdk` (ancre vive) ; (c) le spec DÉCLARE
|
||||||
|
l'ancrage (`expo_sdk_source` cite « roadmap » + « Expo N ») ; (d) **toute** mention
|
||||||
|
prose « Expo [SDK] N » (regex `Expo(?:\s+SDK)?\s*\*{0,2}(\d+)`) == `sdk` (aucune
|
||||||
|
périmée) ; (e) la ligne de source du tableau cite l'ancre `roadmap` à côté du majeur.
|
||||||
|
Un claim absent échoue AUSSI (traçabilité).
|
||||||
|
|
||||||
|
**7 morsures vérifiées** : README `Expo SDK **54**→**55**` (prose périmée) ·
|
||||||
|
**artefact** `54→55` (README + roadmap périmés = le vrai *silent green*) ·
|
||||||
|
**roadmap** `Rebuild Expo 54→55` (artefact périmé · ancre qui dérive) ·
|
||||||
|
**MANIFEST** `54→55` (chaîne interne incohérente) · spec `expo_sdk_source` sans
|
||||||
|
« roadmap » (ancrage déclaré manquant) · README ligne de source sans « roadmap »
|
||||||
|
(ancrage prose manquant) · README retire TOUTE mention « Expo N » (claim absent) ;
|
||||||
|
restauré = green : cohérence interne · ancre roadmap vive · spec déclare · 4
|
||||||
|
mentions == 54 · ligne source cite roadmap · exit 0. Working tree byte-restauré
|
||||||
|
(`git checkout --`, **JAMAIS** `git clean`) · **7 gates re-verts**.
|
||||||
|
|
||||||
|
- `ci/README.md` (table récap du pipeline + paragraphe détaillé « SDK majeur Expo
|
||||||
|
de l'app mobile ancré sur la roadmap Sprint 5 l.56 ») mis à jour.
|
||||||
|
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||||
|
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; `eas build`/
|
||||||
|
`eas submit` App Store #32 / Play Store restent côté agent Mobile · VPS).
|
||||||
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|||||||
+33
-1
File diff suppressed because one or more lines are too long
@@ -4362,6 +4362,95 @@ if cm_persona is not None and chat_spec is not None:
|
|||||||
else:
|
else:
|
||||||
good("Chat OTOIA · (e) oracle du test persona/capabilities == CLAUDE.md")
|
good("Chat OTOIA · (e) oracle du test persona/capabilities == CLAUDE.md")
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Mobile · le SDK MAJEUR Expo (« Expo 54 ») — ANCRÉ sur la roadmap Sprint 5 l.56,
|
||||||
|
# transcrit À LA MAIN dans le README sans AUCUN gate d'IDENTITÉ ni d'ancrage.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# La version MAJEURE du SDK Expo que l'app compagnon cible (`expoSdkMajor`) est une
|
||||||
|
# donnée DATA-DERIVED : le générateur émet out/app_config.json (byte-gaté par
|
||||||
|
# check_artifacts ⇒ faisant autorité) portant `expo.extra.expoSdkMajor`, recopié
|
||||||
|
# dans out/MANIFEST.json (`app.expo_sdk_major`), lui-même dérivé de
|
||||||
|
# mobile_spec.json (`app.expo_sdk_major`) dont la SOURCE FAISANT AUTORITÉ est la
|
||||||
|
# roadmap Sprint 5 l.56 « **Rebuild Expo 54** » (le spec le DÉCLARE via
|
||||||
|
# `app.expo_sdk_source`). Le README:4/19/35/72 recopie ce « Expo 54 » CINQ fois À
|
||||||
|
# LA MAIN — dont la ligne de source « Expo SDK **54** | roadmap Sprint 5 l.56 ».
|
||||||
|
# Le bloc « Mobile · récap de l'app Expo » amont ne gate QUE le quadruplet
|
||||||
|
# onglets/rôles/langues/identifiants a_confirmer (comptes de MANIFEST.counts) —
|
||||||
|
# AVEUGLE au majeur du SDK. Aucun gate ne comparait cette valeur à l'artefact ni
|
||||||
|
# ne l'ancrait à la roadmap : BUMPER le SDK (Expo 55 sort · EAS build cible 55)
|
||||||
|
# dans le spec/artefact SANS toucher au README (ou l'inverse), ou dériver la
|
||||||
|
# roadmap de l'artefact, laisse la prose PÉRIMÉE en silence pendant que le graphe
|
||||||
|
# byte-gaté dit autre chose — l'agent Mobile lancerait `eas build` sur le mauvais
|
||||||
|
# SDK (le rebuild même que la ligne roadmap prescrit) — « vert trompeur » qu'aucune
|
||||||
|
# suite tests/ (qui teste des FONCTIONS de génération, jamais la prose ni l'ancre à
|
||||||
|
# la roadmap) n'attrape. Même patron que l'ancrage §Entités/CLAUDE.md (SEO org) ou
|
||||||
|
# les `roadmap_line` de la recette : on RE-DÉRIVE le majeur de SON artefact
|
||||||
|
# byte-gaté (zéro duplication du contrat #6), on ANCRE à la roadmap faisant
|
||||||
|
# autorité, et on exige que TOUTE mention prose == cette valeur. Cohérences
|
||||||
|
# croisées bonus (mordent une chaîne INTERNEMENT incohérente) : artefact ⇔ MANIFEST
|
||||||
|
# ⇔ spec d'accord ; le spec DÉCLARE l'ancre roadmap. Un claim absent échoue AUSSI.
|
||||||
|
# ============================================================================
|
||||||
|
MOB_SDK_RD = f"{D}/mobile/app_config/README.md"
|
||||||
|
try:
|
||||||
|
sdk = int(load("mobile/app_config/out/app_config.json")["expo"]["extra"]["expoSdkMajor"])
|
||||||
|
_mman = load("mobile/app_config/out/MANIFEST.json")
|
||||||
|
_mspec = json.load(open(f"{D}/mobile/app_config/mobile_spec.json", encoding="utf-8"))
|
||||||
|
except (OSError, KeyError, ValueError, TypeError) as e:
|
||||||
|
bad(f"Mobile Expo SDK · artefact/spec illisible/inattendu : {e}"); sdk = None
|
||||||
|
if sdk is not None:
|
||||||
|
# (a) cohérence interne : artefact ⇔ MANIFEST ⇔ spec d'accord sur le majeur
|
||||||
|
man_sdk = _mman.get("app", {}).get("expo_sdk_major")
|
||||||
|
spec_sdk = _mspec.get("app", {}).get("expo_sdk_major")
|
||||||
|
if man_sdk != sdk or spec_sdk != sdk:
|
||||||
|
bad(f"Mobile Expo SDK · incohérence artefact={sdk} MANIFEST={man_sdk} "
|
||||||
|
f"spec={spec_sdk} → chaîne de dérivation cassée")
|
||||||
|
else:
|
||||||
|
good(f"Mobile Expo SDK · artefact ⇔ MANIFEST ⇔ spec d'accord (Expo {sdk})")
|
||||||
|
# (b) ANCRAGE roadmap : la roadmap faisant autorité dit « Rebuild Expo <N> »
|
||||||
|
try:
|
||||||
|
_rm = re.sub(r"\s+", " ",
|
||||||
|
open("04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md", encoding="utf-8").read())
|
||||||
|
except OSError as e:
|
||||||
|
bad(f"Mobile Expo SDK · roadmap illisible : {e}"); _rm = None
|
||||||
|
if _rm is not None:
|
||||||
|
_rmm = re.search(r"Rebuild Expo (\d+)", _rm)
|
||||||
|
if _rmm is None:
|
||||||
|
bad(f"Mobile Expo SDK · « Rebuild Expo <N> » INTROUVABLE dans la roadmap "
|
||||||
|
f"(attendu {sdk}) → ancre morte")
|
||||||
|
elif int(_rmm.group(1)) == sdk:
|
||||||
|
good(f"Mobile Expo SDK · roadmap « Rebuild Expo {sdk} » == artefact (ancre vive)")
|
||||||
|
else:
|
||||||
|
bad(f"Mobile Expo SDK · roadmap dit « Rebuild Expo {_rmm.group(1)} » MAIS "
|
||||||
|
f"artefact dit {sdk} → régénérer depuis la roadmap")
|
||||||
|
# (c) le spec DÉCLARE son ancrage roadmap (expo_sdk_source cite roadmap + Expo N)
|
||||||
|
_ssrc = str(_mspec.get("app", {}).get("expo_sdk_source", ""))
|
||||||
|
if "roadmap" not in _ssrc.lower() or re.search(rf"Expo {sdk}\b", _ssrc) is None:
|
||||||
|
bad(f"Mobile Expo SDK · spec.app.expo_sdk_source n'ancre pas roadmap+Expo {sdk} "
|
||||||
|
f"(={_ssrc!r}) → ancrage déclaré manquant")
|
||||||
|
else:
|
||||||
|
good("Mobile Expo SDK · spec DÉCLARE l'ancrage roadmap (expo_sdk_source)")
|
||||||
|
# (d) README prose : TOUTE mention « Expo [SDK] N » == artefact (aucune périmée)
|
||||||
|
mob_sdk_rd = read_norm(MOB_SDK_RD)
|
||||||
|
if mob_sdk_rd is not None:
|
||||||
|
nums = [int(x) for x in re.findall(r"Expo(?:\s+SDK)?\s*\*{0,2}(\d+)", mob_sdk_rd)]
|
||||||
|
if not nums:
|
||||||
|
bad(f"Mobile Expo SDK · {MOB_SDK_RD} — aucune mention « Expo <N> » "
|
||||||
|
f"(attendu {sdk}) · claim absent = régression #6")
|
||||||
|
else:
|
||||||
|
stale = sorted({n for n in nums if n != sdk})
|
||||||
|
if stale:
|
||||||
|
bad(f"Mobile Expo SDK · {MOB_SDK_RD} — mention(s) périmée(s) Expo {stale} "
|
||||||
|
f"MAIS artefact {sdk} → régénérer le README")
|
||||||
|
else:
|
||||||
|
good(f"Mobile Expo SDK · {MOB_SDK_RD} — {len(nums)} mention(s) « Expo {sdk} » "
|
||||||
|
f"== artefact")
|
||||||
|
# (e) la ligne de source du tableau NOMME l'ancre roadmap à côté du majeur
|
||||||
|
if re.search(rf"Expo SDK \*\*{sdk}\*\*[^|]*\|[^|]*roadmap", mob_sdk_rd) is None:
|
||||||
|
bad(f"Mobile Expo SDK · {MOB_SDK_RD} — la ligne « Expo SDK **{sdk}** » ne cite "
|
||||||
|
f"pas son ancre `roadmap` (Sprint 5 l.56) → ancrage prose manquant")
|
||||||
|
else:
|
||||||
|
good(f"Mobile Expo SDK · {MOB_SDK_RD} — « Expo SDK **{sdk}** » cite l'ancre roadmap")
|
||||||
|
|
||||||
sys.exit(1 if FAIL else 0)
|
sys.exit(1 if FAIL else 0)
|
||||||
PY
|
PY
|
||||||
rc=$?
|
rc=$?
|
||||||
|
|||||||
Reference in New Issue
Block a user