La console Spark doit proposer, dans une liste déroulante, les secrets du coffre ObsiGate octroyés au consommateur « spark » (demande de Bruno du 2026-10-28, issue #43, liée à l'issue agent-commun #14). Aucun endpoint de liste n'était accessible par jeton consommateur : GET /api/coffres et GET /api/coffres/{slug}/secrets exigent une session utilisateur.
Changement
Nouvel endpoint GET /api/coffres/distribuables, placé avant la route GET /api/coffres/{slug} :
Auth : Bearer jeton consommateur, même vérification que /distribuer (401 consommateur invalide, 403 consommateur révoqué). Une session utilisateur ne suffit pas.
Retour : métadonnées seules — {reference: "coffre:<slug>/<nom>", coffre, nom, version} — des secrets pour lesquels ce consommateur a un octroi ACTIF (coffre actif, secret non expiré, octroi ni révoqué ni expiré, octrois coffre-wide inclus via statut_octroi_consommateur).
Anti-énumération : un consommateur ne voit que ses propres octrois ; sans octroi, liste vide, pas d'erreur révélatrice. Jamais de valeur dans la réponse (le retour est construit champ par champ, pas via secret_metadata).
Après merge + redéploiement ObsiGate (et merge de la PR agent-commun liée) : dans ObsiGate, octroyer un secret de clé LLM au consommateur « spark », puis dans la console Spark, vue Fournisseurs, la liste « secret du coffre ObsiGate » doit proposer coffre:<slug>/<nom>.
## Besoin
La console Spark doit proposer, dans une liste déroulante, les secrets du coffre ObsiGate octroyés au consommateur « spark » (demande de Bruno du 2026-10-28, issue #43, liée à l'issue agent-commun #14). Aucun endpoint de liste n'était accessible par jeton consommateur : `GET /api/coffres` et `GET /api/coffres/{slug}/secrets` exigent une session utilisateur.
## Changement
Nouvel endpoint `GET /api/coffres/distribuables`, placé avant la route `GET /api/coffres/{slug}` :
- **Auth** : Bearer jeton consommateur, même vérification que `/distribuer` (401 consommateur invalide, 403 consommateur révoqué). Une session utilisateur ne suffit pas.
- **Retour** : métadonnées seules — `{reference: "coffre:<slug>/<nom>", coffre, nom, version}` — des secrets pour lesquels ce consommateur a un octroi ACTIF (coffre actif, secret non expiré, octroi ni révoqué ni expiré, octrois coffre-wide inclus via `statut_octroi_consommateur`).
- **Anti-énumération** : un consommateur ne voit que ses propres octrois ; sans octroi, liste vide, pas d'erreur révélatrice. Jamais de valeur dans la réponse (le retour est construit champ par champ, pas via `secret_metadata`).
## Tests
`tests/test_coffre_secrets.py::TestDistribuables` (4 tests) : seuls les octrois actifs listés, métadonnées seules (aucune valeur dans le texte), octroi expiré exclu, coffre-wide inclus, auth consommateur uniquement, consommateur révoqué → 403, flag désactivé → 503. Vérifiés localement : 39 passent (35 existants + 4 nouveaux).
## Validation demandée (déployée, par Bruno)
Après merge + redéploiement ObsiGate (et merge de la PR agent-commun liée) : dans ObsiGate, octroyer un secret de clé LLM au consommateur « spark », puis dans la console Spark, vue Fournisseurs, la liste « secret du coffre ObsiGate » doit proposer `coffre:<slug>/<nom>`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Besoin
La console Spark doit proposer, dans une liste déroulante, les secrets du coffre ObsiGate octroyés au consommateur « spark » (demande de Bruno du 2026-10-28, issue #43, liée à l'issue agent-commun #14). Aucun endpoint de liste n'était accessible par jeton consommateur :
GET /api/coffresetGET /api/coffres/{slug}/secretsexigent une session utilisateur.Changement
Nouvel endpoint
GET /api/coffres/distribuables, placé avant la routeGET /api/coffres/{slug}:/distribuer(401 consommateur invalide, 403 consommateur révoqué). Une session utilisateur ne suffit pas.{reference: "coffre:<slug>/<nom>", coffre, nom, version}— des secrets pour lesquels ce consommateur a un octroi ACTIF (coffre actif, secret non expiré, octroi ni révoqué ni expiré, octrois coffre-wide inclus viastatut_octroi_consommateur).secret_metadata).Tests
tests/test_coffre_secrets.py::TestDistribuables(4 tests) : seuls les octrois actifs listés, métadonnées seules (aucune valeur dans le texte), octroi expiré exclu, coffre-wide inclus, auth consommateur uniquement, consommateur révoqué → 403, flag désactivé → 503. Vérifiés localement : 39 passent (35 existants + 4 nouveaux).Validation demandée (déployée, par Bruno)
Après merge + redéploiement ObsiGate (et merge de la PR agent-commun liée) : dans ObsiGate, octroyer un secret de clé LLM au consommateur « spark », puis dans la console Spark, vue Fournisseurs, la liste « secret du coffre ObsiGate » doit proposer
coffre:<slug>/<nom>.