Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[bug] recall: recall quality and adoption never reach the agent's session

Closed
#883 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
38/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
typescript

Research direction

Start with src/utils/session-id.ts and src/contribute-check.ts, then trace the recall cache path from src/recall.ts:639. Review src/transcript-parser.ts:62 and proposal #884 for the adoption path. Done means the listed agent session variables resolve the same id for recall and contribute-check, and adoption is detected across the supported agent workflows.

Written by the indexing model from the issue text.

Description

Two recall feedback signals don't work today. Both fail silently.

1. Recall quality never reaches contribute-check (every agent)

teamai recall "<query>"                        run by the agent's shell tool
  recordRecallQuality(deriveSessionId({}))     src/recall.ts:639
    payload session_id / sessionId             → {} is empty in the CLI
    process.env.CLAUDE_SESSION_ID              → not set by Claude Code
    pid-<ppid>                                 → a new shell per Bash call
  → ~/.teamai/sessions/pid-<n>-recall-cache.json, one orphan file per recall

Stop hook → contribute-check
  readRecallQuality(<hook session_id>)         src/contribute-check.ts:317
  → never finds the cache, so the knowledge-gap bonus never applies
  • src/utils/session-id.ts:32-34 reads CLAUDE_SESSION_ID. Claude Code sets CLAUDE_CODE_SESSION_ID in Bash, hooks and MCP servers, equal to the hook session_id (env vars). ${CLAUDE_SESSION_ID} is only a text placeholder in skill bodies. Checked live in Claude Code 2.1.283: CLAUDE_CODE_SESSION_ID is set, CLAUDE_SESSION_ID is not.
  • The other agents expose their session id under their own names, and teamai reads none of them.

Fix (small, can ship on its own). Read each agent's variable, after the payload and before the pid fallback:

// src/utils/session-id.ts
const AGENT_SESSION_ENV = [
  'CLAUDE_CODE_SESSION_ID',    // Claude Code
  'CODEX_SESSION_ID',          // Codex ≥ 0.148, the root session (equals hook session_id)
  'CODEBUDDY_SESSION_ID',      // CodeBuddy: before CLAUDE_SESSION_ID, which it also sets
  'COPILOT_AGENT_SESSION_ID',  // Copilot CLI ≥ 1.0.29
  'CURSOR_CONVERSATION_ID',    // Cursor
  'PI_SESSION_ID',             // Pi
  'CLAUDE_SESSION_ID',         // kept for CodeBuddy and older setups
] as const;
Agent Variable Equals hook session_id
Claude Code CLAUDE_CODE_SESSION_ID yes (docs, and seen live)
Codex CODEX_SESSION_ID yes; CODEX_THREAD_ID is the subagent's own id
CodeBuddy CODEBUDDY_SESSION_ID yes for the main agent; subagents get their own id
Copilot CLI COPILOT_AGENT_SESSION_ID yes since 1.0.29; not rechecked on 1.0.88
Cursor CURSOR_CONVERSATION_ID yes by source reading; not seen at runtime
Pi PI_SESSION_ID yes
OpenCode, OMP none the generated bridges send no session id either (see the proposal)

Tests: one per variable, and one that recall and contribute-check resolve the same id when the hook payload's session_id equals the env value. Real-CLI check: teamai recall from Claude Code and from Codex writes ~/.teamai/sessions/<session id>-recall-cache.json.

Known limit: when one agent runs another (Claude runs codex exec), the inner shell also sees the outer agent's variable, and a fixed order can pick the outer one. The proposal resolves that through the PostToolUse hook.

2. Adoption is about zero, even on Claude

main agent → teamai-recall subagent → teamai recall
                  │
                  └─ turns written to <session>/subagents/agent-*.jsonl   (Claude Code 2.1.283)

main transcript   only the subagent's summary
                  <!-- teamai:recalled-doc-ids: [redis-timeout] -->      ids, no paths
main agent        Read /…/learnings/redis-timeout.md

Stop → parseTranscriptForVotes                  src/transcript-parser.ts:62
  recalled: [redis-timeout]                     from the comment (428-437)
  paths:    none                                the region with File: lines is in the subagent file (462-507)
  adopted:  []                                  the Read can't be matched
  • Reproduced with a copy of src/transcript-parser.ts on a transcript with an Agent result carrying the comment, then a Read of the same path: recalledDocIds: ["redis-timeout"], adoptedDocIds: [].
  • Adoption only works when the main agent runs teamai recall itself. The recommended subagent path gets no upvotes, except through the opt-in TEAMAI_UPVOTE_JUDGE.
  • Other agents never had adoption: the parser reads only Claude's JSONL. Codex rollouts and CodeBuddy's index.json are passed in but not understood, and Copilot and OpenCode send no transcript path.
  • Impact: upvotes feed KB Health and promotion, which needs at least 5 upvotes (docs/usage-guide.md:1287).

Fix. Not a small patch. The proposal in #884 detects adoption from the PostToolUse hook, which sees both the recall output and the later file read in the same session, for every agent.

Dominant language
TypeScript
Stars
5k
Forks
376
Avg merge
13h 50m
Merged PRs (30d)
306

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Tencent/teamai-cli

All issues in Tencent/teamai-cli

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.