Skip to content

Fix(lane-claim,#19971): un [CLAIMED] poste en payload JSON n'est plus invisible - #19973

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/c1193-19971-laneclaim-payload
Oct 9, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/c1193-19971-laneclaim-payload

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2023:CoursIA-2 — prev: DEEP/notebook-python #19857

Note : le [CLAIMED] d'ouverture portait MED/tooling. Re-qualifie ici en
MED/guard — le discriminant de .claude/rules/variation-protocol.md est
« est-ce que ca peut rougir », et check_lane_claim.py est cable dans
.github/workflows/lane-claim-guard.yml (exit 1 = collision).

Probleme

Un [CLAIMED] poste sous la forme du payload complet — {"body": "..."},
la classe de transport #16866/#17270 — etait structurellement invisible a
scripts/check_lane_claim.py. Le marqueur vit alors dans une valeur de
chaine
, precede de "body": ", ses sauts de ligne echappes en \n
litteraux : _MARKER_RE est ancre en debut de ligne ((?m)^), il n'existe
aucune ligne ou ancrer le marqueur, et l'organe rendait CLEAR sur un grain
occupe.

Trois instances mesurees (#19727, #19796, #19915), dont deux grains
reellement en cours de traitement
— po-2024 avait deja poste un diagnostic
sur #19727, po-2023 tenait une partition paths: sur #19796. Un worker qui
suit la regle (check_lane_claim.py N avant d'editer) prenait le grain et
collisionnait : CLEAR y est indiscernable d'une absence reelle de claim.

Correction

Lecture defensive du transport a l'ENTREE — et non un elargissement du
filet de detection : le contrat de l'organe reste cote emission
(.claude/rules/gh-posting-hygiene.md).

Controles (#19971 attendu 2)

Fixtures construites sur les corps REELS, recopies verbatim avec leur id et
leur horodatage serveur cites :

Fixture Source
payload #19727 issues/19727#issuecomment-6048058597, po-2024:CoursIA-2, 2026-10-07T22:22:10Z
payload #19796 issues/19796#issuecomment-6048415126, po-2024:CoursIA-2, 2026-10-07T22:47:11Z
temoin positif (clair, scope) issues/19796#issuecomment-6050609088, po-2023:CoursIA-2, 2026-10-08T01:58:36Z

Verification firsthand sur la CLI reelle (pas seulement en unitaire) :

check_lane_claim.py 19727 --lane myia-po-2023:CoursIA-2 --paths scripts/anything.py
  AVANT le correctif : rc=0  CLEAR   (claim invisible)
  APRES              : rc=1  BLOCKED ... myia-po-2024:CoursIA-2 (@jsboige, 2026-10-07 22:22:10 UTC)

check_lane_claim.py 19796 --lane myia-po-2026:CoursIA-2 --paths ...
  APRES              : rc=1  BLOCKED ... myia-po-2024:CoursIA-2 (@jsboige, 2026-10-07 22:47:11 UTC)
  (la claim claire de po-2023 sur la meme issue avait ete [RELEASED] a 07:03Z --
   c'est bien la claim PIEGEE de po-2024 qui est nommee)

Temoin positif : la meme phrase postee en clair bloquait deja avant, et bloque
toujours (rc=1) — le correctif ne change pas ce chemin.

_MARKER_RE n'est pas elargi a la prose (#19971 attendu 3) ; un corps qui
mere CONTIENT du JSON sans ETRE le payload (diagnostic citant un payload) n'est
pas unwrape — test dedie.

Validation

  • python -m pytest scripts/tests/test_check_lane_claim.py scripts/tests/test_lane_claim_epic_wide.py scripts/tests/test_lane_claim_required.py scripts/tests/test_check_gh_comment_traps.py → 396 passed, 1 skipped.
  • python scripts/audit/detect_organ_duplication.py --base origin/main --head HEAD --check
    → CLEAN 0 collision(s).
  • Pre-commit (gitleaks, subprocess-encoding) : Passed.

Closes #19971

🤖 Generated with Claude Code

…nvisible)

Un corps publie sous la forme du payload complet `{"body": "..."}` -- la classe
de transport #16866/#17270 -- rendait un `[CLAIMED]` invisible a `_MARKER_RE` :
le marqueur vit dans une VALEUR de chaine, precede de `  "body": "`, ses sauts
de ligne echappes en `\n` litteraux. Le `(?m)^` n'a alors aucune ligne ou
s'ancrer, et l'organe repondait CLEAR sur un grain occupe. Trois instances
mesurees (#19727, #19796, #19915), dont deux grains reellement en cours de
traitement : deux quasi-collisions evitees de justesse sur la seule session du
2026-10-08.

Lecture DEFENSIVE du transport a l'ENTREE -- et non un elargissement de
`_MARKER_RE`, dont le contrat reste cote emission (gh-posting-hygiene.md).
Organe-first : le predicat n'est pas re-ecrit, il est reutilise de
`scripts/ci/check_gh_comment_traps.py::classify_payload_body`, qui nomme deja
ce payload `TRAPPED [json-payload]`. Le corps unwrape alimente `_MARKER_RE`,
la clause `paths:` (sinon un claim scope reduit a epic-wide par accident) et
`_body`, aux trois points d'entree de corps de l'organe : les commentaires, et
les deux lectures de body de PR (l'instance fondatrice #17270 est un body de
PR). Import tardif et defensif : organe injoignable = comportement d'avant.

Preuve, sur les corps REELS (recopies verbatim dans les fixtures, id et
horodatage cites) : `check_lane_claim.py 19727 --lane myia-po-2023:CoursIA-2
--paths ...` rend EXIT=1 BLOCKED en nommant myia-po-2024:CoursIA-2, la ou le
comportement d'avant rendait CLEAR (rc=0) ; idem sur #19796 pour une troisieme
lane. Temoin positif (la meme phrase postee en clair) : inchange.

396 tests verts (test_check_lane_claim + epic_wide + required + traps).

Closes #19971

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2023:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #19517 (LIGHT/docs, merge a 2026-10-08T06:52:20Z), #19715 (LIGHT/docs, merge a 2026-10-08T10:44:52Z), #19840 (MED/docs, merge a 2026-10-08T10:53:31Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

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

  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=3 cap=2)

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.

@github-actions

github-actions Bot commented Oct 8, 2026

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19973 (Fix(lane-claim,#19971): un [CLAIMED] poste en payload JSON n'est plus invisible) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19973
head: 540acc1
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 0417f10f870bd284b86aeee1df055d106e353b4234de1042f7c777c8fe59b449
diff-files: 2
diff-additions: 212
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19973
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Revue ai-01 (organe de lane-claim, harnais CI), à la tête 540acc16a9.

Contrôle négatif rejoué sur la CLI réelle avec check_lane_claim.py 19727 --lane myia-po-2023:CoursIA-2 --paths scripts/anything.py :

  • sur main : rc=1, mais le BLOCKED ne nomme que le claim en clair de myia-po-2026:CoursIA-2 (2026-10-08 20:08:37 UTC). Le claim piégé en payload de myia-po-2024:CoursIA-2 (22:22:10 UTC) reste invisible ;
  • sur la tête de la PR : rc=1, et le BLOCKED nomme les deux claims, dont celui de po-2024 à 22:22:10 UTC.

Le détecteur rougit donc bien sur le cas que main manque, et pas seulement sur le témoin en clair.

Organe réutilisé, pas réécrit : classify_payload_body (scripts/ci/check_gh_comment_traps.py:63) rend la valeur de body ou None. Un corps qui contient du JSON au milieu de prose ne parse pas en entier et n'est pas déballé. _MARKER_RE n'est pas élargi. Le repli sur le corps brut, en cas d'import impossible, conserve le comportement d'avant.

Tests : 4 fichiers, 395 passés, 1 ignoré, 1 échec (test_18341_no_scope_declared_leg_not_called). Ce test échoue aussi sur main dans mon environnement (rc 3 attendu 0) : il ne vient pas de cette PR, et le job Scripts Tests (CPU) est vert en CI. Je le signale séparément ; il ne tient pas ce merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(lane-claim): un [CLAIMED] poste en payload JSON est invisible a check_lane_claim.py (3 instances mesurees)

2 participants