[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:
@@ -4362,6 +4362,95 @@ if cm_persona is not None and chat_spec is not None:
|
||||
else:
|
||||
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)
|
||||
PY
|
||||
rc=$?
|
||||
|
||||
Reference in New Issue
Block a user