Skip to content

feat: specify and verify resumable incremental transcript capture across Codex rollouts #716

Open

Description

@cdeust

Problem

Cortex reads Codex rollouts and deduplicates profile updates by session. Those inspected paths do not establish a replayable append contract across continuation files, late delivery, transcript rewrites and lost acknowledgements. This is a bounded investigation finding, not proof that every capture path lacks a cursor.

Proposed solution

Audit all capture producers first. Reuse any existing cursor/idempotency mechanism; otherwise define durable progress, source identity, prefix rewrite detection and delivery identity.

Acceptance evidence

  • One logical session spans two rollout files; a late event from the first file cannot drop the second file.
  • Repeat delivery and simulate acceptance followed by acknowledgement loss; the final retained conversation has no missing or duplicated turns.
  • Modify an earlier turn and expose replacement/reconciliation explicitly.
  • Verify real native events in each advertised host, separately from synthetic hook tests.

Alternatives considered

Keep the current behavior and document its limits. This remains valid where the added guarantee has no user need; the issue should close with a documented product decision rather than assume that copying Hindsight is always appropriate. Reuse existing Cortex mechanisms before adding a second pipeline.

Scope assessment

HIGH. Raised from the October 10 Hindsight/Cortex comparison. Static observations refer to the pinned revisions below. They do not establish successful execution of Hindsight's whole pipeline or a repository-wide absence in Cortex. Priority is a proposal, not a release blocker.

Evidence

mcp_server/infrastructure/transcript_rollout.py:44; mcp_server/hooks/session_lifecycle.py:351; comparator hindsight-integrations/coding-agents/src/core/retain-cursor.ts:44

Activity

  1. cdeust commented on Nov 5, 2026

    @cdeust
    OwnerAuthor

    Première tranche livrée dans #874 (Refs #716) : l'audit des producteurs de capture que l'issue demande en premier (docs/audits/transcript-capture-producers-2026-11-05.md, sans changement de code).

    Constat principal : aucun producteur ne garde de curseur dans un transcript, rien ne découvre les rollouts Codex, et le seul lecteur de rollout n'en tire que les noms d'outils et le nombre de tours. Il n'y a donc aucun mécanisme existant à réutiliser pour le contenu des messages.

    Tranches restantes, après la décision produit du propriétaire (curseur durable, ou limites documentées puis fermeture, cf. Alternatives considered) :

    1. Test : une session sur deux fichiers rollout atteint le journal et le profil avec l'activité des deux fichiers. Le correctif commence à l'entrée Codex (session_queue.py clé le job par sha256(session_id) seul et écarte le second SessionEnd), puis la séparation des clés journal/profil pour les appels directs.
    2. Test de redélivrance et de perte d'acquittement sur le worker de capture (il acquitte avant de stocker).
    3. Détection de réécriture d'un tour antérieur, ou limite documentée.
    4. Reçus d'événements natifs par hôte annoncé, séparés des tests de hooks synthétiques.

    Generated by Claude Code

  2. added 2 commits that reference this issue on Nov 5, 2026
  3. cdeust commented on Nov 6, 2026

    @cdeust
    OwnerAuthor

    CI autopilot : mise en hold, la suite de #716 attend une décision du propriétaire.

    La tranche 1 (audit des producteurs, #874) est fusionnée. Elle conclut qu'aucun mécanisme existant ne peut être réutilisé : aucun producteur ne garde de curseur, rien ne découvre les rollouts Codex, et aucun ne capture le texte des messages d'un rollout (docs/audits/transcript-capture-producers-2026-11-05.md).

    Question à trancher (issue, Alternatives considered) :

    • A. Contrat d'ajout rejouable. L'autopilot enchaîne alors les tranches listées dans le commentaire précédent. La première change la clé du job Codex dans plugins/hypermnesia-mcp-codex/scripts/session_queue.py : sha256(session_id) plus l'identité du fichier rollout, au lieu de sha256(session_id) seul, pour qu'un second SessionEnd de la même session ne soit plus écarté. Elle sépare aussi les clés journal et profil.
    • B. Limites documentées puis fermeture. L'autopilot écrit la page des limites (perte du second rollout, absence de détection de réécriture, fenêtre de dédup de 1000 lignes) et l'issue se ferme sur cette décision.

    Un commentaire de cdeust qui choisit A ou B lève ce hold au passage suivant.


    Generated by Claude Code

  4. added
    autopilot:holdCI autopilot stood down: a human decision is required
    on Nov 6, 2026
  5. cdeust commented on Nov 12, 2026

    @cdeust
    OwnerAuthor

    Décision : cette issue n'attend plus de réponse du propriétaire.

    Le propriétaire a demandé le 12 novembre 2026 que les issues avancent sans lui ; il ne répondra pas aux questions posées ici. Ce commentaire de cdeust lève le hold et précise la demande. Il vaut pour toute la suite de cette issue.

    • Tranche toi-même chaque question restée ouverte : d'abord une décision écrite et acceptée du dépôt (ADR accepté, docs/), puis ce que le texte de l'issue propose ou exclut, puis les standards du dépôt ; à défaut, la plus petite tranche qui réalise ce que l'issue demande. Une valeur qui manque se mesure, elle ne s'invente pas.
    • Écris la décision dans un commentaire marqué <!-- ci-autopilot decision --> (ce qui est retenu, la raison et sa source, ce qui est écarté, comment revenir en arrière), puis livre la tranche dans une PR. Une décision écrite ne se rejoue pas aux passages suivants.
    • Ne repose pas autopilot:hold pour une question : seulement pour l'irréversible, un accès que tu n'as pas, une dépendance nommée encore ouverte ou le plafond de tentatives, en nommant exactement ce qui manque.
    • Jamais de tag, de release, de montée de version du projet ni de déclenchement manuel d'un workflow.

    Règle complète : #343 (comment)

    Écrit par la session « écosystème autonome » sur instruction du propriétaire (12 novembre 2026).


    Generated by Claude Code

  6. removed
    autopilot:holdCI autopilot stood down: a human decision is required
    on Nov 12, 2026
  7. cdeust commented on Nov 12, 2026

    @cdeust
    OwnerAuthor

    Hold autopilot:hold levé : un commentaire de cdeust (« Décision : cette issue n'attend plus de réponse du propriétaire », 12/11/2026) a été posté après la pose du hold.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions