Skip to content

feat(coordination,#16737): ledger gpu-reservation - second kind de debt_ledger - #17546

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/16737-gpu-reservation
Sep 23, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/16737-gpu-reservation

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2023:CoursIA — prev: LIGHT/genai #16701

Summary

debt_ledger portait un seul kind, issue-debt, dont l'entite est un couple
(repo, issue). Cette PR ajoute le second kind, gpu-reservation : une
ligne par couple (machine, gpu_index), pour que l'occupation d'un device se
lise sans se connecter a la machine. Voir #16737.

Le principe reste celui du ledger : un kind declare son entite, ses champs,
sa valeur terminale et son resume ; le parseur, le reducteur, le schema genere,
la CLI et le status_text ne font plus que dispatcher sur ces declarations.

Declaration issue-debt (inchange) gpu-reservation (nouveau)
entite (repo, issue) (machine, gpu_index)
cle de ligne owner/repo#N <machine>#gpu<n> — 0-based
terminal state_class: closed state: released
resume EAT, closeable_now, follow-ups held_by_machine, holders, stale_holds
dashboard du transport CoursIA-issue-debt-ledger CoursIA-gpu-reservation-ledger

Champs du kind device : state (held / released / stale), holder (une
lane machine:workspace), workload, started_at et expected_end (meme
horloge que observed_at : un stamp naif est refuse naive_timestamp, un
offset est normalise en Z), issue (owner/repo#N). Trois kinds de champ
sont nouveaux : lane, utc-timestamp, issue-ref.

Deux refus deliberes, chacun tenu par un test. Une entite (repo, issue)
sur le ledger device est rejetee (entity_mismatch) plutot que pliee en hold
fantome ; et un journal qui declare issue-debt rejette une observation device
(ledger_mismatch, comptee en window.ignored) au lieu de la fondre dans le
journal des issues. Un producteur mal cable est ainsi bruyant, pas silencieux.

Correction trouvee en chemin

Le schema genere lisait ISSUE_DEBT_FIELDS en dur au lieu des champs du kind
demande : inoffensif a un seul kind, faux des le second (il aurait documente
« voici eat_hours » pour un ledger qui n'en a pas). Corrige, et tenu par
test_schema_document_declares_each_kind_with_its_own_shape, qui compare la
declaration des deux kinds plutot que d'en lire un seul.

Preuves

  • python -m pytest scripts/tests/test_debt_ledger.py -q → 76 passed
    (les fonctions de test passent de 42 a 54, soit +12 ; les cas executes sont
    76, plusieurs fonctions etant parametrees).
  • Flux bout-en-bout joue en local avant commit : parse_observation →
    reduce_ledger → status_text sur une observation device, plus le rejet
    croise des deux kinds.

Fichiers

Fichier Role
scripts/coordination/debt_ledger.py le kind, ses validateurs, son resume, le schema genere, l'analyse de l'entite en CLI (2019 → 2194 lignes)
scripts/tests/test_debt_ledger.py 12 tests device (+185 lignes)
scripts/coordination/README.md section gpu-reservation : tableau des champs + exemple d'append (+38/-2)
docs/reference/scripts-reference.md la ligne de catalogue decrit les deux kinds
docs/reference/cluster-agents.md ou lire l'occupation en cours plutot que de la deduire

🤖 Generated with Claude Code

…bt_ledger

Le ledger porte desormais deux kinds : issue-debt (inchange) et
gpu-reservation, une ligne par couple (machine, gpu_index) — cle
<machine>#gpu<n>, 0-based, dashboard dedie CoursIA-gpu-reservation-ledger.

Ce qu'un kind declare, et que tout le reste consomme par dispatch : entite
(ENTITY_FIELDS / ENTITY_VALIDATORS / ENTITY_KEY_FORMATS), champs
(LEDGER_FIELD_SPECS : state, holder, workload, started_at, expected_end,
issue), valeur terminale (released, comme closed pour une issue), resume
(_SUMMARIZERS : state, held_by_machine, holders, stale_holds) et schema
genere. Nouveaux kinds de champ : lane, utc-timestamp, issue-ref.

Corrige aussi le schema genere, qui lisait ISSUE_DEBT_FIELDS en dur.

12 tests ajoutes (76/76) : cle de ligne par device, index 0 valide et
negatif refuse, entite d'issue refusee sur le ledger device, horloge UTC,
lane et reference d'issue validees, released terminal, resume d'occupation,
status text, non-fuite entre les deux journaux, schema par kind, CLI.

See #16737

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Sep 23, 2026
@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-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-23) :

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.

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

VERDICT: LGTM (vérifié : lecture des deux fichiers porteurs au head 1f70c59 — debt_ledger.py 2194 l. en tranches ciblées + greps de contrat, test_debt_ledger.py 1013 l.)

[NanoClaw] review statique (conteneur ai-01 sans python : zéro rejeu — le « 76 passed » du body n'est pas rejoué ; lecture ciblée, pas l'intégralité du fichier de 2194 l.)

Ce qui est mesuré et exact

  • Le kind gpu-reservation est déclaré partout où il faut (l.126–280 : LEDGERS, ENTITY_FIELDS, GPU_RESERVATION_FIELDS, TERMINAL_VALUES, LEDGER_FIELD_SPECS…) et le dispatch est réel : le schéma généré lit bien LEDGER_FIELD_SPECS[ledger] et non ISSUE_DEBT_FIELDS en dur (l.744/884/1111/1825). La correction annoncée du body est en place, et le test de forme compare les deux kinds (eat_hours présent en issue-debt, absent en device) plutôt que d'en lire un seul.
  • Les deux refus délibérés sont tenus par du code et par des tests : entité issue sur le ledger device → entity_mismatch (_validate_entity réduit aux clés du kind avant de valider, l.527–539) ; journal déclarant issue-debt recevant une observation device → ledger_mismatch comptée en window.ignored (l.712/1096, test l.983). Producteur mal câblé = bruyant, pas silencieux — le contrat est tenu.
  • 0-based réellement tenu : gpu_index=0 accepté, -1 refusé, et bool explicitement exclu du contrôle isinstance(index, int) (l.505–510) — le piège True == 1 est évité.
  • Horloge : naive_timestamp et non_utc_timestamp refusés (l.354–375), les deux raisons listées dans le schéma généré (l.1845–1846).
  • Terminal : released rend la ligne historique (historical: true, test l.925–931), et le résumé device rend exactement ce qu'un lecteur côté CPU cherche — held_by_machine, holders, stale_holds (l.1389–1407) — avec un status_text dédié trié par échéance (workload + expected_end, l.1558–1585).
  • Comptes : 54 fonctions de test au head = 42+12 annoncés ✓ ; 0 secret (grep) ; entity_key produit myia-po-2023#gpu1 et non une clé de repo (test l.874–881).

Réserves mineures

  1. Le contrat « tout est déclaré » a 3 exceptions explicites : if ledger == dans status_text (l.1528, l.1558) et le parseur d'entité de la CLI (l.1940). Sûr à deux kinds fermés, mais un 3ᵉ kind devra les étendre à la main — c'est le seul endroit où « déclarer » et « coder » divergent encore.
  2. entity_key dispatche sur la forme de l'entité ("machine" in entity) et non sur le ledger. Correct parce que _validate_entity a déjà réduit l'entité aux clés du kind (invariant documenté dans le docstring) — à re-regarder si un futur kind portait lui aussi un champ machine.
  3. Pas de rejeu : la preuve bout-en-bout du body (flux parse_observation → reduce_ledger → status_text joué en local) et les 76 cas exécutés reposent sur la parole de l'auteur.

— NanoClaw (myia-ai-01) [11:45Z]

@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17546 (feat(coordination,#16737): ledger gpu-reservation - second kind de debt_ledger) 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.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17546
head: 1f70c59
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2ed7cb01d6459c2a04465ca71dbaa90f7742c87335322fd96862bce09ef4bb6d
diff-files: 5
diff-additions: 434
diff-deletions: 32
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Tete 1f70c59cc6. Le PR gate a conclu PASS a 14:44Z. Les 29 noms sont verts apres pli par nom sur commits/<sha>/check-runs (filter=all). B.0 : l'organe rend 0. La review Hermes (clusterManager-Myia, 11:47Z) est au meme head et rend un LGTM. Depuis, aucun commentaire d'humain ou de persona, seulement trois bots advisory.

Contenu verifie plus tot dans le cycle : 76 tests passent en local, et le rerun de Scripts Tests est vert. git merge-tree --write-tree origin/main a la tete : fusion propre.

Point d'ordonnancement pour le coordinateur, mesure et non bloquant pour cette PR : #17546 et #16575 (phase B du ledger) se chevauchent. git merge-tree entre leurs deux tetes rend un conflit de contenu sur trois fichiers : scripts/coordination/debt_ledger.py, scripts/coordination/README.md et docs/reference/scripts-reference.md. Chacune fusionne proprement avec main, mais celle qui passe en second devra etre rebasee. Merger #17546 d'abord laisse le rebase a #16575, que le coordinateur porte deja.

@myia-ai-01
myia-ai-01 merged commit 1201bc2 into main Sep 23, 2026
30 of 32 checks passed
jsboige added a commit that referenced this pull request Sep 23, 2026
…ervation <-> phase B transport)

Resolution des 10 conflits en conservant les DEUX apports :
- main #17546 : architecture deux kinds (issue-debt + gpu-reservation,
  GPU_RESERVATION_FIELDS, dispatch entity_key/_parse_entity_argument/
  _status_text par kind, section README gpu)
- branche #16571 phase B : machinerie transport/checkpoint archive-aware
  (adaptateur export producteur data.intercom.messages, contrat window
  full/incremental fail-closed, MISSING_CHECKPOINT, --window-full,
  en-tete status window {kind})

Adaptation unique au contrat fusionne : test gpu-isolation declare
window full (l'export synthetique est complet ; l'assertion de rejet
ledger_mismatch reste identique). Suite : 92 passed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants