Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
646dd15
feat: advisor sidecar runtime — synthetic tool, preflight policy, loo…
leaf Sep 26, 2026
b3e6023
feat: advisor management API, CLI, and dashboard card
leaf Sep 26, 2026
9cb3a2b
docs: advisor sidecar — structure doc, manifest ownership, and public…
leaf Sep 26, 2026
73211b3
fix: review findings — preflight skips compaction turns, synthetic to…
leaf Sep 26, 2026
f23e9e7
test: register advisor-slot in the core-module inventory and headless…
leaf Sep 26, 2026
cc40495
test: pin advisor-routes.test.ts against the advisor- filename seed
leaf Sep 26, 2026
743db15
fix: CodeRabbit review round 1 — 10 findings resolved
leaf Sep 26, 2026
9a283e5
chore: remove accidentally committed local agent memory
leaf Sep 26, 2026
5c3caf6
fix(advisor): round-2 review findings — ledger isolation, marker neut…
leaf Sep 27, 2026
4e4fee7
fix(advisor): round-3 review findings — precise confidentiality promi…
leaf Sep 27, 2026
e22db18
fix(advisor): provenance-based detection, atomic task ledger, bounded…
leaf Sep 27, 2026
fb0a669
docs(advisor): unify preflight semantics and privacy disclosure acros…
leaf Sep 27, 2026
ab01f5a
docs(advisor): resolve round-4 findings — wording conflicts, failure …
leaf Sep 27, 2026
fe4c741
revert: strip accidentally committed PR2 (adaptive trigger) code from…
leaf Sep 27, 2026
1a8adad
fix(advisor): bind ledger settlement to the claim that owns it
leaf Sep 27, 2026
f49d15e
fix(advisor): server-owned internal capability, SHA-256 task identity…
leaf Sep 27, 2026
52cfd6d
fix(advisor): finalize review findings — model clearing contract, att…
leaf Sep 27, 2026
cd80402
fix(advisor): finalize round-5 review findings — model clearing, atte…
leaf Sep 27, 2026
a5c1f5c
fix(advisor): resolve round-6 findings — wrapper docs, locale wording…
leaf Sep 27, 2026
5f943c7
fix(advisor): resolve round-7 findings — Turkish caveat, structure cr…
leaf Sep 27, 2026
5c06ab3
fix(advisor): resolve round-8 findings — duplicated condition clause,…
leaf Sep 27, 2026
5bc31d5
chore: align with the rebased dev tree — register the advisor authori…
leaf Sep 27, 2026
198c88c
fix(advisor): zh / zh-TW caveat — no-identity clients skip dedup and …
leaf Sep 27, 2026
aa08b50
fix(advisor): en/de/ja/ru/tr caveat — identity-less clients skip dedu…
leaf Sep 27, 2026
4d53518
test(advisor): advisor settings stay reachable from the companion dis…
Flowershangfromthebranches Sep 27, 2026
7d6e4c4
fix(advisor): require versioned context-sharing consent and quote advice
Flowershangfromthebranches Sep 28, 2026
b69b164
fix(advisor): re-read live consent before consultation dispatch
Flowershangfromthebranches Sep 28, 2026
ffc3c6b
fix(advisor): align locale failure copy, identity-less wording, and o…
Flowershangfromthebranches Sep 28, 2026
8b67dd8
fix(advisor): bound manual-history suppression to the latest user turn
Flowershangfromthebranches Sep 28, 2026
c10c8b9
fix(advisor): satisfy exact-head GUI gates
Flowershangfromthebranches Sep 28, 2026
8c58cdf
fix(advisor): regenerate ocx management surface
Flowershangfromthebranches Sep 28, 2026
41a52f4
fix(gui): reset advisor save feedback timer
Flowershangfromthebranches Sep 28, 2026
a382fa6
fix(advisor): guard empty completion retries, reject unminted interna…
Flowershangfromthebranches Sep 29, 2026
ccc0ec5
fix(advisor): address maintainer authority and continuation blockers
Flowershangfromthebranches Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,12 @@ Sum of the table: **1061**. Zero leftover.

### 2.D Full membership (every `*.test.ts`)

#### `tests/advisor/` (8)

`advisor-context.test.ts`, `advisor-consult.test.ts`, `advisor-guard.test.ts`, `advisor-internal-authority.test.ts`, `advisor-plan.test.ts`, `advisor-responses-wiring.test.ts`, `advisor-settings.test.ts`, `advisor-state.test.ts`

Additional server-domain coverage: `tests/server/advisor-routes.test.ts`.

#### `tests/codex-integration/` (175)

`active-registry-admission.test.ts`, `app-owned-memory.test.ts`, `bearer-admission-routed-provider.test.ts`, `catalog-cursor-search.test.ts`, `catalog-input-modality-enum.test.ts`, `catalog-llamacpp-capabilities.test.ts`, `catalog-oauth-observation.test.ts`, `catalog-retain-models.test.ts`, `catalog-verbosity-default.test.ts`, `catalog-vision-sidecar-modalities.test.ts`, `codex-account-delete-atomicity.test.ts`, `codex-account-label.test.ts`, `codex-account-namespaces.test.ts`, `codex-account-store.test.ts`, `codex-admission-primitives.test.ts`, `codex-admission.test.ts`, `codex-affinity-debug.test.ts`, `codex-app-server-path-spaces.test.ts`, `codex-app-server-processes.test.ts`, `codex-app-server-restart-service.test.ts`, `codex-auth-api.test.ts`, `codex-auth-collision.test.ts`, `codex-auth-context.test.ts`, `codex-catalog-admission.test.ts`, `codex-catalog-golden.test.ts`, `codex-catalog-model-picker-order.test.ts`, `codex-catalog-refresh-status.test.ts`, `codex-catalog-restore.test.ts`, `codex-catalog-sync-hardening.test.ts`, `codex-catalog-write-serialization.test.ts`, `codex-catalog-writer.test.ts`, `codex-catalog.test.ts`, `codex-cli-install-provenance.test.ts`, `codex-cli-update-launcher-policy.test.ts`, `codex-cli-update-zero-effect.test.ts`, `codex-composed-acceptance.test.ts`, `codex-config-generation.test.ts`, `codex-convergence-account-selectors.test.ts`, `codex-convergence-contract.test.ts`, `codex-cooldown-recovery.test.ts`, `codex-coordinator-doctor.test.ts`, `codex-desired-state.test.ts`, `codex-envkey-admission-substitution.test.ts`, `codex-exec-invocation.test.ts`, `codex-features-cache.test.ts`, `codex-features-residual.test.ts`, `codex-filesystem-evidence.test.ts`, `codex-gather-authority.test.ts`, `codex-history-job.test.ts`, `codex-history-lock.test.ts`, `codex-history-provider.test.ts`, `codex-history-reachability.test.ts`, `codex-history-worker-boundary.test.ts`, `codex-history-worker.test.ts`, `codex-history-writer.test.ts`, `codex-home-wsl.test.ts`, `codex-inject-history-wording.test.ts`, `codex-inject-integration.test.ts`, `codex-inject-write-lock.test.ts`, `codex-inject.test.ts`, `codex-injected-marker.test.ts`, `codex-integration-record.test.ts`, `codex-journal.test.ts`, `codex-log-guard-coderabbit.test.ts`, `codex-log-guard-doctor-coderabbit.test.ts`, `codex-log-guard-doctor-protection.test.ts`, `codex-log-guard-doctor.test.ts`, `codex-log-guard-inspect.test.ts`, `codex-log-guard-lock.test.ts`, `codex-log-guard-maintenance-coderabbit.test.ts`, `codex-log-guard-maintenance.test.ts`, `codex-log-guard-policy.test.ts`, `codex-log-guard-processes.test.ts`, `codex-log-guard-protection.test.ts`, `codex-log-guard-status-zero-write.test.ts`, `codex-main-account-refresh.test.ts`, `codex-main-rotation.test.ts`, `codex-management-convergence.test.ts`, `codex-metadata-integrity.test.ts`, `codex-model-entitlements.test.ts`, `codex-models-cache-invalidate.test.ts`, `codex-native-residue.test.ts`, `codex-plan.test.ts`, `codex-plugins-doctor.test.ts`, `codex-pool-rotation.test.ts`, `codex-prompt-adopt.test.ts`, `codex-prompt-base-variants.test.ts`, `codex-prompt-journal.test.ts`, `codex-prompt-layers-read.test.ts`, `codex-prompt-layers-write.test.ts`, `codex-prompt-layers.test.ts`, `codex-prompt-lock.test.ts`, `codex-prompt-route.test.ts`, `codex-prompt-text-probe.test.ts`, `codex-quota-parser-parity.test.ts`, `codex-quota-prime.test.ts`, `codex-quota-rejection.test.ts`, `codex-refresh.test.ts`, `codex-reset-credit-auto-redeem.test.ts`, `codex-reset-credit-operation-ledger.test.ts`, `codex-reset-credit-recovery.test.ts`, `codex-restart-contract-parity.test.ts`, `codex-restart-route.test.ts`, `codex-restore-app-rewrite.test.ts`, `codex-retained-root-serialization.test.ts`, `codex-routing.test.ts`, `codex-runtime.test.ts`, `codex-service-manager-probe-hardening.test.ts`, `codex-service-manager-probe.test.ts`, `codex-shim-autorestore.test.ts`, `codex-shim-readiness.test.ts`, `codex-shim.test.ts`, `codex-spark-visibility.test.ts`, `codex-sqlite-home.test.ts`, `codex-sync-api.test.ts`, `codex-sync-response.test.ts`, `codex-tool-mode.test.ts`, `codex-transition-state-adoption.test.ts`, `codex-transition-state-first-use-regression.test.ts`, `codex-transition-state-race.test.ts`, `codex-transition-state.test.ts`, `codex-user-identity.test.ts`, `codex-v2-gate.test.ts`, `codex-warmup.test.ts`, `codex-websocket-registry.test.ts`, `codex-write-lock.test.ts`, `combos.test.ts`, `compatibility-manifest.test.ts`, `custom-model-catalog-migration.test.ts`, `doctor.test.ts`, `effort-policy.test.ts`, `fast-row-listing.test.ts`, `fast-row.test.ts`, `gather-routed-models-single-flight.test.ts`, `history-migration-guardian.test.ts`, `injection-model-api.test.ts`, `issue-452-empty-503.test.ts`, `issue-702-expired-replay-state.test.ts`, `issue-914-transport-attribution.test.ts`, `model-cache-generation-tombstone.test.ts`, `model-cache.test.ts`, `model-display-names-management-api.test.ts`, `model-metadata-sync.test.ts`, `model-visibility-management-api.test.ts`, `multi-agent-compat.test.ts`, `multi-agent-keep-native-v1.test.ts`, `native-alias-maintainer-regressions.test.ts`, `native-claude-code-toggle.test.ts`, `native-claude-desktop-toggle.test.ts`, `native-codex-toggle.test.ts`, `native-grok-toggle.test.ts`, `native-main-auth-temp.test.ts`, `native-main-claim-cache.test.ts`, `native-main-claim.test.ts`, `native-main-owner-lifetime.test.ts`, `native-model-toggle.test.ts`, `native-profile-api.test.ts`, `native-profile-crash-boundaries.test.ts`, `native-profile-drain-server.test.ts`, `native-profile-manager.test.ts`, `native-profile-processes.test.ts`, `native-profile-recovery.test.ts`, `native-profile-route-security.test.ts`, `native-profile-stage-lifecycle.test.ts`, `native-profile-startup.test.ts`, `native-profile-store.test.ts`, `parallel-tool-calls-optin.test.ts`, `project-config-warnings.test.ts`, `reasoning-effort.test.ts`, `selected-models.test.ts`, `slug-codec.test.ts`, `token-guardian.test.ts`, `ultrafast-tier-honesty.test.ts`, `upstream-reachability.test.ts`, `warmup.test.ts`
Expand Down
1 change: 1 addition & 0 deletions docs-site/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ export default defineConfig({
{ label: "Providers", translations: { fr: "Fournisseurs", ko: "프로바이더", "zh-CN": "提供商", "zh-TW": "供應商", ru: "Провайдеры", ja: "プロバイダー", tr: "Sağlayıcılar" }, slug: "reference/configuration/providers" },
{ label: "Routing", translations: { fr: "Routage", ko: "라우팅", "zh-CN": "路由", "zh-TW": "路由", ru: "Маршрутизация", ja: "ルーティング", tr: "Yönlendirme" }, slug: "reference/configuration/routing" },
{ label: "Agents", translations: { fr: "Agents", ko: "에이전트", "zh-CN": "代理", "zh-TW": "代理", ru: "Агенты", ja: "エージェント", tr: "Ajanlar" }, slug: "reference/configuration/agents" },
{ label: "Advisor", translations: { fr: "Conseiller", ko: "어드바이저", "zh-CN": "顾问", "zh-TW": "顧問", ru: "Консультант", ja: "アドバイザー", tr: "Danışman" }, slug: "reference/configuration/advisor" },
{ label: "Server & Runtime", translations: { fr: "Serveur et environnement d’exécution", ko: "서버 & 런타임", "zh-CN": "服务器与运行时", "zh-TW": "伺服器與執行階段", ru: "Сервер и рантайм", ja: "サーバー & ランタイム", tr: "Sunucu ve Çalışma Zamanı" }, slug: "reference/configuration/server" },
],
},
Expand Down
111 changes: 111 additions & 0 deletions docs-site/src/content/docs/fr/reference/configuration/advisor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
title: Conseiller
description: Le sidecar de consultation experte d'OpenCodex — un modèle expert configuré conseille les workers routés, avec les politiques manual et preflight.
---

Le conseiller est un modèle expert indépendant qui examine la tâche du worker et renvoie des
conseils. La consultation appartient à OpenCodex de bout en bout : le proxy injecte un outil
synthétique `advisor` dans le tour du worker, exécute lui-même la consultation via l'autorité de
routage normale, et réinjecte les conseils pour que le worker d'origine continue. Le worker n'a
rien à déléguer, ne spawn rien et ne porte aucun identifiant de fournisseur.

Cela se distingue de la surface des sous-agents (voir
[Configuration des agents](/fr/reference/configuration/agents/)) : les sous-agents sont une
délégation initiée par le worker via les outils de collaboration de Codex. Le conseiller est un
sidecar côté proxy invisible du client — même un worker qui ne spawn jamais peut être conseillé.

## Configuration

```json
{
"advisor": {
"enabled": true,
"model": "gpt-6-astra",
"effort": "max",
"policy": "preflight",
"contextSharingConsent": "v1"
}
}
```

| Champ | Type | Défaut | Signification |
| --- | --- | --- | --- |
| `enabled?` | `boolean` | `false` | Interrupteur principal. Désactivé : aucun comportement conseiller sur le chemin de requête. |
| `model?` | `string` | — | Le modèle expert. Toute chaîne de modèle acceptée par le routeur : modèle natif seul (`gpt-6-astra`), `provider/model` explicite (`anthropic/claude-sonnet-4-6`, `xai/grok-...`) ou modèle natif qualifié par compte. Inter-fournisseurs entièrement pris en charge. |
| `effort?` | `string` | `"max"` | Intensité de raisonnement de l'appel conseiller (`low`–`ultra`). |
| `policy?` | `"manual" \| "preflight"` | `"manual"` | Quand consulter le conseiller. |
| `timeoutMs?` | `number` | `120000` | Délai de la consultation en boucle locale. |
| `contextSharingConsent?` | `"v1"` | absent | Consentement de l'opérateur pour envoyer le contexte de la tâche au fournisseur conseiller configuré. Seul `"v1"` est courant. Une valeur absente, périmée ou autre n'autorise aucun envoi. `enabled: true` n'est pas ce consentement. |

Gérez-le via la page **Advisor** du tableau de bord ou
`ocx advisor status|on|off|set --model <model> --effort <effort> --policy <manual|preflight>`.

Sans consentement courant, `ocx advisor on` n'active pas le partage inter-fournisseurs : il affiche cette divulgation et s'arrête. `ocx advisor on --ack-context-sharing` et `ocx advisor consent` enregistrent `v1`. `ocx advisor consent --revoke` retire le consentement et arrête immédiatement l'envoi. `ocx advisor set` n'accorde pas le consentement. La case du tableau de bord n'est pas précochée.

## Politiques

- **`manual`** — consultation uniquement sur un appel explicite de l'outil synthétique `advisor`
par le worker. L'appel est intercepté par le proxy, jamais montré au client, et jamais exécuté
comme un outil local.
- **`preflight`** — OpenCodex tente en plus une consultation par tâche automatiquement. Quand le
worker a produit sa première preuve d'orientation (un appel d'outil de l'assistant OU un
résultat d'outil après le dernier message utilisateur), le proxy consulte l'expert et injecte
les conseils avant le prochain tour du worker — même si le worker n'appelle jamais l'outil. Le
déclencheur est une approximation déterministe et documentée, pas un détecteur sémantique de
« modèle bloqué ». Une consultation tentée qui ÉCHOUE n'est pas traitée silencieusement comme
un conseil : la tâche réessaie après l'expiration de l'entrée d'échec du registre, afin qu'une
panne temporaire du conseiller ne rende pas la politique muette pour toujours.

## Consentement

Le contexte de la tâche n'est pas envoyé tant que l'opérateur n'a pas enregistré le consentement de partage `v1`. Le consentement est versionné : un élargissement ultérieur de la divulgation pourra exiger `v2` au lieu de réutiliser cet accord. Le runtime l'applique. Une valeur absente ou périmée rend le conseiller non exécutable (`advisor_context_sharing_consent_required`) sans faire échouer la requête de codage. Ni le worker, ni le modèle conseiller, ni une chaîne dans la tâche ne peuvent accorder le consentement.

## Ce que voit le conseiller

Une consultation peut envoyer :

- la dernière demande de l'utilisateur
- le texte utilisateur, assistant et développeur visible dans la conversation analysée
- les appels d'outils et leurs arguments
- les résultats d'outils
- le catalogue d'outils du worker et leurs descriptions
- l'identité du worker et le modèle conseiller configuré
- une question de focus facultative lorsque le worker appelle `advisor()`

Le fournisseur conseiller configuré peut différer de celui du worker.

OpenCodex n'insère pas dans ce prompt de clés d'API de fournisseur, d'en-têtes Authorization, de jetons OAuth, de secrets de configuration réservés au backend, d'environnement de processus, ni de chaîne de pensée cachée. Il ne déchiffre pas et ne transmet pas un raisonnement privé chiffré du fournisseur. **Le contenu de la tâche n'est pas expurgé de secrets.** Une clé collée dans la tâche, un secret dans un fichier lu par les outils, ou un jeton imprimé par un outil ou un journal peut être envoyé. OpenCodex n'exécute pas de DLP général.

## Autorité

Le conseil manuel est le résultat d'outil de l'appel `advisor` que le worker a lui-même émis. Ce résultat est un objet JSON. Le champ `advice` est le texte du modèle conseiller. Le champ `status` est écrit par le runtime.

Le conseil automatique est un objet JSON cité dans un message consultatif de rôle user distinct. Seule l’instruction fixe du runtime reste dans le message developer ; le texte généré par le conseiller ne passe jamais dans developer/system. Cela fonctionne avec OpenAI Chat et Anthropic sans inventer un appel d’outil. Les guillemets empêchent la rupture structurelle et les champs falsifiés, pas toute injection en langage naturel. Un protocole dédié pourrait mieux distinguer le conseil d’une demande utilisateur. Chaque requête permet au plus trois consultations et quatre continuations du worker. À la limite, l’outil advisor est retiré ; un nouvel appel reçoit une dernière continuation avec un résultat de limite, puis un autre appel termine avec 502 advisor_continuation_limit sans nouvel envoi. La limite est partagée avec les reprises de complétion vide.

La suppression ne lit pas les chaînes du conseiller. Le dédoublonnage automatique appartient au registre du serveur. Un message developer, même s'il recopie le texte de transport, ne supprime pas le preflight.

## Coût et comptabilité

Chaque consultation est un véritable appel de modèle supplémentaire. Elle apparaît dans
l'utilisation sous le **modèle conseiller** — jamais fusionnée avec les tokens du worker — et
chaque consultation écrit une ligne de journal `[advisor]` avec déclencheur, durée, statut et
utilisation : un appel conseiller est toujours prouvable depuis les journaux.

## Comportement en cas d'échec

Le conseiller échoue ouvertement : une consultation déjà envoyée qui échoue (modèle indisponible, configuration erronée, délai
dépassé) donne au worker un court avis « conseiller indisponible », non trompeur (un message
`<opencodex_advisor_unavailable>` pour preflight, un résultat d'outil en erreur pour manual), et
la tâche continue ; rien n'est injecté uniquement quand la consultation est annulée, et un plan
qui ne démarre aucune consultation (désactivé, sans modèle, ou activé sans consentement de partage courant) n'envoie aucun avis preflight. Un appel manuel `advisor()` sans consentement courant renvoie un résultat d'outil consent-required et n'envoie rien. Un échec de consultation ne fait jamais échouer la requête de
codage, et une consultation ne change jamais le modèle principal de la session.

## Limitations PR1

- Les tours natifs OpenAI en passthrough (workers du pool ChatGPT) ne reçoivent pas l'outil
synthétique ; le conseiller couvre les fournisseurs routés (traduits). La consultation
preflight s'applique aux adaptateurs run-turn ; l'outil non.
- Pas de déclencheur adaptatif : pas de détection de blocage, d'analyse d'échecs répétés, de
niveaux d'escalade, de conseillers multiples ni de vote. `manual` et `preflight` seulement.
- Le registre de déduplication preflight vit dans le processus ; après un redémarrage du proxy,
une tâche en cours peut recevoir une tentative preflight de plus.
Loading
Loading