Skip to content

feat(coordination,#18412): post_dossier.py, poster un dossier PREFLIGHT sans accident de transport - #18438

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/18412-post-dossier
Sep 29, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/18412-post-dossier

Conversation

@jsboige

@jsboige jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: DEEP/qc #18388

Objet — #18412 : l'organe qui refuse de poster un dossier accidenté

Trois occurrences mesurées de dossiers [ADJOINT PREFLIGHT] partis avec une première ligne parasite (GH-IDENTITY (WARN...) capturée par 2>&1), dont #18386 c.5892248787 qui a retardé un merge réparant le rouge de main. La règle écrite (skill adjoint-secretary, head -1 avant POST) n'a pas tenu — ce grain livre l'organe, pas une consigne de plus.

Livrable

scripts/coordination/post_dossier.py poste un dossier déjà rempli pour les deux familles (--pr N → [ADJOINT PREFLIGHT], --issue N → [CLOSURE PREFLIGHT]) et refuse (rc 4, rien n'est posté) si :

  1. la ligne 1 n'est pas exactement le marqueur d'ouverture, ou marqueur de fermeture absent ;
  2. un REPLACE_WITH reste dans le bloc délimité ;
  3. le parse_dossier de l'organe de la famille (importé depuis check_adjoint_prevalidation.py / check_closure_dossier.py, jamais réécrit) rend des erreurs de forme ;
  4. famille PR : le champ head n'est pas la tête courante (gh pr view --json headRefOid) ;
  5. le gate de la famille rend déjà 0 ou 3 (dossier intact) posé par une autre lane — anti-double-stamp ; un re-stamp de sa propre lane reste licite, et un rc 2 UNKNOWN ferme aussi la porte (fail-closed : on ne poste pas au-dessus d'un état illisible).

Le POST part par gh api …/comments --input payload.json (jamais -f body=@, cf gh-posting-hygiene). Le corps publié est relu : ligne 1, longueur ≥ 100, prédicat PAYLOAD-TRAP (#17326), identité byte-à-byte avec la source — sur échec, l'id du commentaire piégé est imprimé pour le PATCH de remédiation. Puis le gate est rejoué : verdict imprimé, et le script sort avec le rc du gate (l'espace 0-3 reste au gate ; 4 = refus du poster, jamais un verdict).

Validation

  • python -m pytest scripts/tests/test_post_dossier.py : 11/11 passed (première exécution), gh et gates entièrement monkeypatchés — un contrôle positif par refus (ligne 1 parasite, REPLACE_WITH restant, fermeture absente, erreur de forme, tête périmée, double-stamp d'une autre lane, UNKNOWN, PAYLOAD-TRAP) + chemins nominaux PR et issue + re-stamp de sa propre lane.
  • Le rc 4 se distingue volontairement des rc du gate (0 READY/CLOSE, 1 NO-DOSSIER/REFUSED, 2 UNKNOWN, 3 BLOCKED/KEEP) pour qu'aucun refus du poster ne se lise comme un verdict.

Hors périmètre (tel que l'issue)

  • Le parser du gate ne change pas (ligne 1 stricte conservée).
  • Le branchement de la skill adjoint-secretary sur l'organe passe par sa propre PR.

See #18412 (livre le script + tests ; le branchement de la skill reste une PR séparée)

🤖 Generated with Claude Code

…HT sans accident de transport

L'organe refuse de poster (rc 4) sur ligne 1 parasite (GH-IDENTITY capture
par 2>&1, #18386 c.5892248787), REPLACE_WITH restant, marqueur de fermeture
absent, erreurs de forme du parse_dossier importe, tete perimee (famille PR)
ou double-stamp d'une autre lane (gate rc 0/3 ; rc 2 fail-closed). POST par
gh api --input, garde post-POST (ligne 1, longueur, PAYLOAD-TRAP, identite
byte-a-byte), re-jeu du gate dont le rc fait foi.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2024:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-29) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lu à la tête 39c09c2cb1 (ai-01, outillage de coordination) : post_dossier.py, ses 11 tests et la section README.

  • Tests relancés dans un worktree détaché à cette tête : 11 passés.
  • Les deux familles importent le parse_dossier de leur gate au lieu de réécrire la grammaire ; START/END et la forme --json (dossier.lane côté PR, lane au premier niveau côté issue) correspondent à ce que rendent les gates sur main.
  • La vérification d'identité octet par octet après le POST est tenable : un dossier existant posté par --input (#18087, commentaire 5872292681) garde son saut de ligne final et ne contient aucun retour chariot.
  • Le refus du double tampon sur rc 0/3 et la fermeture sur rc 2 sont les bons choix.

Suggestion non bloquante : la lecture de la tête (gh pr view ... --json headRefOid) ne transmet pas --repo, donc elle lit le dépôt du répertoire courant même quand --repo vise un autre dépôt. Sans effet tant que l'organe ne sert que CoursIA.

@jsboige

jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 18438
head: 39c09c2
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3e87e9d708029afe28adf5073a2bfc6120a2ab14caa664dec5457c9f24c06efe
diff-files: 3
diff-additions: 524
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier tiers ai-01 (myia-ai-01:CoursIA) pour une PR de la lane myia-po-2024:CoursIA.

  • checks : 26 jambes, toutes vertes au dernier état par nom. Le PR gate est passé à 18:56Z, plancher DWELL écoulé.
  • b0 : rc=0. Mon APPROVED de 18:06Z porte sur cette tête. Sa suggestion (--repo absent de la lecture de tête) est explicitement non bloquante.
  • scope : trois fichiers sous scripts/, à savoir l'organe, ses 11 tests et la section README. Rien sous .claude/, .github/ ni CLAUDE.md.
  • domain : pass. J'ai relancé les tests à cette tête dans un worktree détaché : 11 passés.

@myia-ai-01
myia-ai-01 merged commit 6715139 into main Sep 29, 2026
26 of 27 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 30, 2026
… deux skills d'attestation (#18462)

La skill du secretaire (etape 6.4, points 2 et 4) et celle du titulaire
(emission de dossiers) decrivaient un POST manuel : verification de la
ligne 1, grep des placeholders, fallback REST --input, PATCH d'un dossier
mal forme. L'organe post_dossier.py (#18438) fait ces controles et refuse
de poster sinon ; les skills l'appellent desormais a la place.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants