From f37481627a1a9a1c03f6f945bc161a4f3060e9d8 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sat, 26 Sep 2026 19:06:59 +0200 Subject: [PATCH] 0.1.0-alpha.3 --- VERSION | 2 +- deltas/0.1.0/alpha.3.md | 185 ++++++++++++++++++ docs/000-README.md | 3 +- .../006-V0_1_0_REUSABLE_BASELINE_PLAN.md | 13 +- docs/rules/210-WORKFLOW.md | 39 +++- .../templates/006-OPERATOR_COMMAND_HANDOFF.md | 126 ++++++++++++ history/0.1.0/alpha.3.md | 115 +++++++++++ 7 files changed, 472 insertions(+), 11 deletions(-) create mode 100644 deltas/0.1.0/alpha.3.md create mode 100644 docs/templates/006-OPERATOR_COMMAND_HANDOFF.md create mode 100644 history/0.1.0/alpha.3.md diff --git a/VERSION b/VERSION index 2fe3e9d..d594bc9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0-alpha.2.fix.1 +0.1.0-alpha.3 diff --git a/deltas/0.1.0/alpha.3.md b/deltas/0.1.0/alpha.3.md new file mode 100644 index 0000000..9d1ebc6 --- /dev/null +++ b/deltas/0.1.0/alpha.3.md @@ -0,0 +1,185 @@ + + + +# Delta 0.1.0-alpha.3 — handoff automatique des commandes opérateur + +## Baseline et version + +Baseline attendue : commit opérateur de `0.1.0-alpha.2.fix.1`, réalisé après application de `history/0.1.0/alpha.2.fix.1.md` avec statut `PASS`. + +Le hash de ce commit n'est pas anticipé. + +Version avant application : + +```text +0.1.0-alpha.2.fix.1 +``` + +Version après application : + +```text +0.1.0-alpha.3 +``` + +## Objet + +Rendre normative la remise automatique des commandes opérateur après chaque history et pendant la publication stable. + +La tranche doit supprimer le besoin récurrent de demander séparément : + +```text +quel message de commit utiliser ? +quand pousser ? +quand appliquer le prochain delta ? +quelles commandes exécuter pour le tag ? +quelles preuves fournir pour produire publish.* ? +``` + +Le workflow reste l'owner normatif. Un nouveau pattern documentaire fournit uniquement une forme de rendu réutilisable. + +## Scope + +REPLACE : + +```text +VERSION +docs/000-README.md +docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +docs/rules/210-WORKFLOW.md +``` + +ADD : + +```text +docs/templates/006-OPERATOR_COMMAND_HANDOFF.md +deltas/0.1.0/alpha.3.md +``` + +DELETE : aucun. + +## Changements normatifs + +`210-WORKFLOW.md` impose désormais qu'après production d'un history destiné à l'opérateur, le générateur fournisse spontanément le bloc de fermeture correspondant. Le rendu doit utiliser les valeurs Git réelles lorsqu'elles sont établies et ne doit jamais inventer branche, remote ou politique de tag. + +Le contrat distingue explicitement : + +- fermeture ordinaire `history -> commit/push -> delta suivant` ; +- fermeture `FAIL/PARTIAL/BLOCKED -> commit de la tranche -> fix` ; +- première clôture `rel.N[/fix.M] PASS -> commit X.Y.Z -> tag` ; +- vérification d'un tag annoté avec distinction objet tag / commit déréférencé ; +- artefacts et preuves que l'opérateur doit fournir pour produire `publish.*` ; +- message manuel de reprise après `publish.* PASS` déjà possédé par `003-NEW_SESSION_PROMPT.md`. + +## Nouveau pattern documentaire + +`docs/templates/006-OPERATOR_COMMAND_HANDOFF.md` fournit les blocs adaptables pour : + +```text +history ZIP +commit / push +fix ou delta suivant +tag stable +preuves post-tag +transition après publish.* +``` + +Il ne fixe pas `origin`, `master` ou une forge particulière comme valeurs universelles. Une commande concrète livrée à l'opérateur doit employer les valeurs déjà établies pour le projet. + +## Validation opérateur + +Exécuter depuis la racine du workspace après application du delta : + +```bash +test "$(cat VERSION)" = '0.1.0-alpha.3' +test -f history/0.1.0/alpha.2.fix.1.md +test -f deltas/0.1.0/alpha.3.md +test -f docs/templates/006-OPERATOR_COMMAND_HANDOFF.md +test ! -e history/0.1.0/alpha.3.md + +grep -Fx '' docs/rules/210-WORKFLOW.md +grep -Fx '' docs/000-README.md +grep -Fx '' docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md + +python3 -B - <<'PYGATE' +from pathlib import Path +import re + +history = Path('history/0.1.0/alpha.2.fix.1.md').read_text(encoding='utf-8') +assert re.search(r'## Statut\s+PASS\s', history) + +workflow = Path('docs/rules/210-WORKFLOW.md').read_text(encoding='utf-8') +template = Path('docs/templates/006-OPERATOR_COMMAND_HANDOFF.md').read_text(encoding='utf-8') +plan = Path('docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md').read_text(encoding='utf-8') +index = Path('docs/000-README.md').read_text(encoding='utf-8') + +for phrase in ( + '## Remise automatique des commandes opérateur', + "le générateur MUST remettre spontanément les commandes nécessaires pour fermer cette tranche", + 'Le générateur MUST NOT inventer un remote, une branche ou une politique de tag non établis.', + 'première clôture `rel.N[/fix.M]` qui établit réellement la stable', + 'refs/tags/vX.Y.Z^{}', + 'Le rapport `publish.*` est produit seulement à partir des artefacts et preuves réellement disponibles après publication.', + '../templates/006-OPERATOR_COMMAND_HANDOFF.md', +): + assert phrase in workflow, phrase + +for phrase in ( + '## Fermeture d'une tranche non stable', + 'git diff --cached --check', + 'git push ', + '## Tranche échouée suivie d'un fix', + '## Première clôture qui établit réellement la stable', + 'git tag -a vX.Y.Z -m "vX.Y.Z"', + "git ls-remote 'refs/tags/vX.Y.Z^{}'", + '## Remise nécessaire pour `publish.*`', + '## Après `publish.* PASS`', +): + assert phrase in template, phrase + +assert '006-OPERATOR_COMMAND_HANDOFF.md' in index +assert 'Statut opérateur : **PASS**.' in plan +assert '### alpha.3 — handoff automatique des commandes opérateur' in plan + +print('0.1.0 alpha.3 operator handoff audit: clean (history-to-commit, stable tag and publish evidence rendered explicitly)') +PYGATE + +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 + +git diff --check +git add VERSION docs/000-README.md \ + docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md \ + docs/rules/210-WORKFLOW.md \ + docs/templates/006-OPERATOR_COMMAND_HANDOFF.md \ + deltas/0.1.0/alpha.3.md +git diff --cached --check +git status --short +``` + +## Résultat attendu + +La gate est `PASS` si : + +- le history `alpha.2.fix.1` est présent et `PASS` ; +- le workflow impose la remise spontanée des commandes et interdit d'inventer les paramètres Git ; +- le pattern couvre tranche ordinaire, échec + fix, stable/tag et preuves `publish.*` ; +- la vérification d'un tag annoté distingue objet tag et commit déréférencé ; +- les `48` tests existants restent propres ; +- les trois audits Markdown restent propres ; +- le scope Git correspond exactement aux six fichiers de `alpha.3`. + +## Transition + +Si `PASS` : + +1. produire `history/0.1.0/alpha.3.md` ; +2. remettre automatiquement le bloc opérateur conforme au nouveau pattern pour committer/pousser `0.1.0-alpha.3` ; +3. préparer `0.1.0-alpha.4`, consacré à l'adoption proportionnée de PGR par un projet existant. + +Si `FAIL` : conserver le history réel et corriger uniquement la cause dans `alpha.3.fix.N`, sauf preuve imposant un REPLAN. diff --git a/docs/000-README.md b/docs/000-README.md index 1a56d05..23ee578 100644 --- a/docs/000-README.md +++ b/docs/000-README.md @@ -1,5 +1,5 @@ - + # Documentation PGR @@ -23,6 +23,7 @@ Les templates techniques copiables sous `templates/` restent séparés des instr ## Points d'entrée de 0.1.0 - [`plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md`](plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md) — audit de la stable `v0.0.5`, cadrage du workflow de clôture/publication et préparation de la première baseline PGR réellement réutilisable. +- [`templates/006-OPERATOR_COMMAND_HANDOFF.md`](templates/006-OPERATOR_COMMAND_HANDOFF.md) — pattern de remise automatique des commandes entre history, commit/push, delta suivant, tag et vérification post-tag. ## Points d'entrée de 0.0.5 diff --git a/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md b/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md index 1cf8a58..e286113 100644 --- a/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +++ b/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md @@ -1,5 +1,5 @@ - + # Plan 0.1.0 — première baseline PGR réutilisable @@ -181,20 +181,17 @@ Le défaut appartient à la gate opérateur, pas aux owners `200-GOVERNANCE` / ` ### alpha.2.fix.1 — correction de la gate `rel.N` -Corriger uniquement la validation de `alpha.2` : +Statut opérateur : **PASS**. -- conserver `200-GOVERNANCE.md` et `210-WORKFLOW.md` inchangés ; -- remplacer les assertions shell fragiles par une vérification Python syntaxiquement sûre ; -- rejouer la suite Python complète, les audits Markdown et la preuve structurelle ; -- conserver le `FAIL` de `alpha.2` avant toute progression. +Le fix a conservé `200-GOVERNANCE.md`, `210-WORKFLOW.md` et le delta historique `alpha.2.md` inchangés. La preuve Python corrigée a reconfirmé la convention `rel.N`, le `FAIL` historique de `alpha.2`, les anciens artefacts `rel.001*` et l'indépendance de `publish.001`. -Après PASS de ce fix, reprendre la trajectoire normale à `alpha.3`. +La validation a exécuté `48/48` tests et les trois audits Markdown sans diagnostic. Aucun nouveau fix ni REPLAN n'est requis. ### alpha.3 — handoff automatique des commandes opérateur Formaliser le bloc de commandes remis après chaque history, l'ordre commit/push avant application du delta suivant, les commandes supplémentaires de tag pour une stable validée et la liste des preuves à fournir pour produire le rapport post-tag. -Créer ou adapter un template documentaire uniquement si cela évite de dupliquer ces commandes dans chaque delta. +La tranche introduit un pattern documentaire dédié afin de ne pas recopier ces règles dans chaque delta. Le workflow reste owner de la sémantique ; le template possède seulement la forme de rendu et les variantes tranche normale / échec + fix / clôture stable / post-tag. ### alpha.4 — adoption d'un projet existant diff --git a/docs/rules/210-WORKFLOW.md b/docs/rules/210-WORKFLOW.md index 0604755..aeb856e 100644 --- a/docs/rules/210-WORKFLOW.md +++ b/docs/rules/210-WORKFLOW.md @@ -1,5 +1,5 @@ - + # Workflow artifact rules @@ -197,6 +197,43 @@ Un projet qui possède une convention de message différente MAY utiliser un map Le repository ne doit jamais mélanger deux tranches non clôturées dans un même commit. +## Remise automatique des commandes opérateur + +Après production d'un history destiné à être appliqué par l'opérateur, le générateur MUST remettre spontanément les commandes nécessaires pour fermer cette tranche. Il ne doit pas attendre une demande séparée du type « je commit avec quel message ? ». + +Lorsque les valeurs Git sont établies par le projet ou par les sorties opérateur de la session, le bloc remis MUST utiliser les valeurs réelles : archive history, message de commit, remote et branche. Le générateur MUST NOT inventer un remote, une branche ou une politique de tag non établis. Une valeur encore inconnue doit être signalée explicitement ou résolue par une commande de découverte sûre avant la commande qui en dépend. + +Pour une livraison ZIP et une tranche non stable, le handoff couvre normalement dans cet ordre : + +```text +apply history archive + ↓ +git add / staged whitespace check / status + ↓ +commit avec le message attendu + ↓ +push de la branche courante + ↓ +apply du delta suivant ou du fix déjà livré +``` + +Lorsqu'un history `FAIL`, `PARTIAL` ou `BLOCKED` conduit à un `.fix.N`, le bloc de commandes ferme d'abord la tranche constatée sous son identité propre puis autorise seulement l'application du correctif. Lorsqu'un history `PASS` conduit à la tranche planifiée suivante, le même ordre s'applique. + +Pour la première clôture `rel.N[/fix.M]` qui établit réellement la stable, le bloc MUST utiliser le message de commit stable `X.Y.Z`, puis fournir séparément les commandes de tag et de vérification applicables. Le tag MUST NOT être créé avant le commit stable et son push lorsque le projet exige que la branche canonique distante porte d'abord ce commit. + +Le handoff de publication MUST également indiquer exactement ce que l'opérateur doit remettre au générateur pour produire la preuve post-tag applicable. Pour une archive source générée par la forge à partir du tag, cela inclut normalement : + +- le ZIP téléchargé depuis le tag canonique ; +- le SHA du commit stable local observé avant ou pendant le tag ; +- le commit déréférencé localement par le tag ; +- la référence distante du tag ; +- pour un tag annoté, le commit distant déréférencé `refs/tags/vX.Y.Z^{}` afin de ne pas confondre l'objet tag avec son commit ; +- toute autre preuve explicitement requise par la politique locale de publication. + +Le rapport `publish.*` est produit seulement à partir des artefacts et preuves réellement disponibles après publication. Il MUST NOT être prérempli avec un `PASS` futur. + +[`../templates/006-OPERATOR_COMMAND_HANDOFF.md`](../templates/006-OPERATOR_COMMAND_HANDOFF.md) fournit le pattern de rendu des blocs de commandes. Il complète le présent contrat sans devenir une seconde source normative. + ## Manifest de suppression Lorsqu'un delta supprime des chemins, un manifest de suppression MAY être utilisé pour permettre une application fiable de l'archive. diff --git a/docs/templates/006-OPERATOR_COMMAND_HANDOFF.md b/docs/templates/006-OPERATOR_COMMAND_HANDOFF.md new file mode 100644 index 0000000..fd54a08 --- /dev/null +++ b/docs/templates/006-OPERATOR_COMMAND_HANDOFF.md @@ -0,0 +1,126 @@ + + + +# Pattern — handoff des commandes opérateur + +## Usage + +Ce pattern matérialise la sortie opérateur exigée par [`210-WORKFLOW.md`](../rules/210-WORKFLOW.md) après production d'un history et pendant une clôture stable. Son objectif est d'éviter que l'opérateur doive demander séparément quelles commandes exécuter entre le history reçu, son commit, le delta suivant et, pour une stable, le tag puis la vérification post-tag. + +Le pattern est un guide de rendu : `210-WORKFLOW.md` reste l'owner normatif. + +## Informations à résoudre avant le rendu + +Le générateur doit déterminer depuis les preuves disponibles : + +```text +project +X.Y.Z +tranche courante +statut du history +archive history réellement livrée +message de commit attendu +remote Git établi +branche Git établie +delta/fix suivant déjà livré ou non +stable obtenue ou non +tag canonique attendu +forge/archive post-tag applicable +preuve publish.* attendue ou non +``` + +Une valeur non établie ne doit pas être inventée. Si le remote ou la branche manque, le rendu peut d'abord fournir une commande de découverte telle que `git remote -v` ou `git branch --show-current`, puis demander d'utiliser la valeur réellement observée ; il ne doit pas transformer silencieusement un exemple `origin/master` en règle universelle. + +## Fermeture d'une tranche non stable + +Lorsque le history est livré sous forme de ZIP et que remote/branche sont établis, le bloc remis suit cette forme : + +```bash +unzip -o --.history.zip -d . + +git add -A +git diff --cached --check +git status --short +git commit -m "" +git push +``` + +Si le delta suivant ou le fix est déjà livré dans la même réponse, son application est affichée **après** le bloc de commit/push : + +```bash +unzip -o .delta.zip -d . +``` + +L'ordre visuel du rendu doit refléter l'ordre autorisé : history → commit/push → delta suivant. + +## Tranche échouée suivie d'un fix + +Un `FAIL`, `PARTIAL` ou `BLOCKED` est d'abord committé avec l'identité de la tranche observée, puis le fix est appliqué. Exemple générique : + +```bash +unzip -o --alpha.2.history.zip -d . + +git add -A +git diff --cached --check +git status --short +git commit -m "X.Y.Z-alpha.2" +git push + +unzip -o --alpha.2.fix.1.delta.zip -d . +``` + +Le history `FAIL` n'est jamais remplacé par le futur `PASS` du fix. + +## Première clôture qui établit réellement la stable + +Quand `rel.N[/fix.M]` obtient le premier `PASS` stable, le commit porte l'identité produit : + +```bash +unzip -o --.history.zip -d . + +git add -A +git diff --cached --check +git status --short +git commit -m "X.Y.Z" +git push +``` + +Le tag vient ensuite. Si la politique locale utilise un tag annoté, le bloc type est : + +```bash +git status --short +git rev-parse HEAD +git tag -a vX.Y.Z -m "vX.Y.Z" +git push vX.Y.Z + +git rev-list -n 1 vX.Y.Z +git ls-remote --exit-code --tags refs/tags/vX.Y.Z +git ls-remote 'refs/tags/vX.Y.Z^{}' +``` + +Pour un tag annoté, `refs/tags/vX.Y.Z` peut identifier l'objet tag et différer du SHA du commit. La référence déréférencée `refs/tags/vX.Y.Z^{}` est celle qui doit être comparée au commit stable. + +Si le projet utilise volontairement une autre forme de tag, le bloc est adapté à cette politique au lieu d'imposer `git tag -a`. + +## Remise nécessaire pour `publish.*` + +Après création/push du tag et génération de l'archive par la forge, le générateur indique explicitement ce qu'il attend. Pour le cas source-archive usuel : + +```text +1. télécharger depuis la forge le ZIP correspondant exactement au tag vX.Y.Z ; +2. fournir ce ZIP au générateur ; +3. fournir les sorties Git du commit/tag local et distant exécutées ci-dessus ; +4. fournir toute preuve de publication supplémentaire exigée localement. +``` + +Le générateur vérifie alors l'archive publiée, calcule son empreinte dans son propre environnement lorsque possible et produit le rapport `publish.*` à partir des observations réelles. Le rapport reste extérieur au tag qu'il vérifie. + +## Après `publish.* PASS` + +Si une version suivante est déjà décidée et son prompt existe dans la stable, le générateur remet automatiquement la phrase de nouvelle session définie par [`003-NEW_SESSION_PROMPT.md`](003-NEW_SESSION_PROMPT.md), avec les noms réels du ZIP taggé, du rapport post-tag et du prompt versionné. + +Si l'horizon reste ouvert, il remet à la place le handoff ou la consigne de revue d'horizon applicable sans inventer de prochaine version. + +## Critère de qualité + +Le handoff est correct lorsque l'opérateur peut passer du history reçu au commit, au delta suivant ou à la publication sans devoir deviner une commande, un message de commit, un ordre d'application ou un artefact à fournir, tout en conservant explicites les valeurs Git qui ne sont pas encore établies. diff --git a/history/0.1.0/alpha.3.md b/history/0.1.0/alpha.3.md new file mode 100644 index 0000000..92b2fdf --- /dev/null +++ b/history/0.1.0/alpha.3.md @@ -0,0 +1,115 @@ + + + +# History 0.1.0-alpha.3 — handoff automatique des commandes opérateur + +## Statut + +FAIL + +La gate opérateur de `0.1.0-alpha.3` exécutée le `2026-09-26` n'a pas atteint un PASS complet. Le contenu de workflow et le nouveau pattern de handoff ont été appliqués, les `48` tests ont réussi et les trois audits Markdown sont propres, mais le contrôle Python obligatoire livré par le delta contient une chaîne littérale invalide : l'apostrophe de `d'une` ferme prématurément une chaîne entourée de quotes simples. + +Le défaut appartient donc à la gate de validation de `alpha.3`. Aucun défaut normatif de `210-WORKFLOW.md` ni de `006-OPERATOR_COMMAND_HANDOFF.md` n'est établi par les preuves opérateur disponibles. + +## Baseline opérateur + +La tranche précédente `0.1.0-alpha.2.fix.1` a été clôturée avec son history `PASS`, puis committée et poussée avant application de `alpha.3` : + +```text +commit 3230356 +message 0.1.0-alpha.2.fix.1 +push origin/master PASS +``` + +Après application de `alpha.3`, les contrôles initiaux ont confirmé : + +```text +VERSION 0.1.0-alpha.3 +history/0.1.0/alpha.2.fix.1.md présent +deltas/0.1.0/alpha.3.md présent +docs/templates/006-OPERATOR_COMMAND_HANDOFF.md présent +history/0.1.0/alpha.3.md absent pendant la gate +docs/rules/210-WORKFLOW.md version 7 +docs/000-README.md version 19 +docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md version 4 +``` + +## Défaut exact de la gate + +Le delta contenait dans son bloc Python : + +```python +for phrase in ( + '## Fermeture d'une tranche non stable', + ... +): + assert phrase in template, phrase +``` + +L'apostrophe de `d'une` termine la chaîne Python avant `une tranche non stable`. L'interpréteur a donc arrêté le contrôle spécifique avec : + +```text +File "", line 24 + '## Fermeture d'une tranche non stable', + ^ +SyntaxError: unterminated string literal (detected at line 24) +``` + +La gate spécifique n'a donc pas pu produire son message final `clean`. Ce défaut est analogue à celui déjà rencontré sur `alpha.2`, mais il se situe cette fois dans une chaîne Python et non dans le quoting shell d'un `grep`. + +## Preuves réussies malgré le défaut + +La suite Python globale a exécuté `48` tests et tous ont réussi : + +```text +Ran 48 tests in 0.698s + +OK +``` + +Les audits Markdown ont affiché : + +```text +Markdown header audit: clean (180 file(s)) +Markdown table audit: clean (8 table(s), 180 file(s)) +Markdown link audit: clean (167 local link(s), 180 file(s)) +``` + +Le scope Git observé avant ajout du présent history est exactement : + +```text +M VERSION +A deltas/0.1.0/alpha.3.md +M docs/000-README.md +M docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +M docs/rules/210-WORKFLOW.md +A docs/templates/006-OPERATOR_COMMAND_HANDOFF.md +``` + +Ce scope correspond aux six fichiers annoncés par `alpha.3`. + +## Décision + +Aucun REPLAN n'est requis. Le correctif doit rester strictement limité à la gate de `alpha.3` : + +```text +0.1.0-alpha.3.fix.1 +``` + +Le fix doit : + +- conserver intégralement le delta historique `alpha.3.md` ; +- conserver `docs/rules/210-WORKFLOW.md`, `docs/templates/006-OPERATOR_COMMAND_HANDOFF.md` et `docs/000-README.md` inchangés ; +- remplacer uniquement les littéraux Python fragiles de la validation par une forme syntaxiquement sûre ; +- reconfirmer le history `alpha.3` en `FAIL`, le contenu du workflow et du template, les `48` tests et les trois audits Markdown ; +- vérifier que le scope du fix reste borné à `VERSION`, au plan actif et au nouveau delta de correction. + +## Résultat + +`0.1.0-alpha.3` est enregistré `FAIL` pour défaut de syntaxe dans sa gate opérateur, sans défaut normatif établi sur le handoff automatique des commandes. + +La seule transition autorisée est : + +```text +0.1.0-alpha.3.fix.1 +```