Give AI agents a way to remember why decisions were made and which approaches actually worked.
English | 简体中文
Task Experience Loop (TEL) is a local, auditable memory layer for long-running work with Codex. It keeps unfinished commitments, durable decisions, and proven working patterns in Markdown so a new task can pick up the reasoning behind earlier work.
TEL is not a chat archive or an agent orchestrator. It keeps only what should still matter later:
- the work a project has not finished;
- decisions that should constrain future work;
- approaches worth reusing;
- user-specific names that an agent should resolve consistently.
TEL has two separate parts: the Python CLI manages local data, while the Codex Plugin provides the TEL protocol and action-oriented SOP skills.
TEL requires Python 3.12 or later. With uv:
uv tool install git+https://github.com/GlacierAlgo/task-experience-loop.gitOr install from a checkout:
git clone https://github.com/GlacierAlgo/task-experience-loop.git
cd task-experience-loop
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install .TEL stores data in ~/.tel by default. Set TEL_DIR only when you want a different location:
export TEL_DIR="$HOME/path/to/tel-data"Add this repository as a Codex marketplace, then install the plugin:
codex plugin marketplace add GlacierAlgo/task-experience-loop
codex plugin add task-experience-loop@task-experience-loopStart a new Codex task after installation so the bundled skills are discovered.
The plugin does not edit global AGENTS.md, create links into a development checkout, or enable session-start behavior automatically. Invoke $tel when you need it. If you deliberately want TEL active in every project, copy the small always-on profile into your personal global instructions.
Run these commands inside any Git repository:
tel task start "make search results explainable"
tel context --stdout
tel taskWhen the work is complete:
tel task doneTEL derives the project id from the nearest Git root. Set TEL_PROJECT only for workspaces where that is not possible.
tel task add "next task" # add to this project's Backlog
tel task start "current task" # one Active task per project
tel task done # remove the completed commitment
tel noun add dgx "DGX execution host" # record a user-specific term
tel search architecture # search durable decisions
tel compact # propose memory-pool cleanup
tel context --stdout # print context for this projecttel compact never edits decision or pattern records. It writes review proposals; an agent must inspect them and obtain user approval before changing source records.
~/.tel/
├── kanban.md # unfinished commitments for all projects
├── constraints.md # cross-project constraints
├── nouns.md # user-specific terms
├── decisions/ # durable decisions
├── patterns/ # reusable working patterns
├── summaries/ # generated indexes and review proposals
├── archive/ # superseded decisions
└── loop-context.md # generated context for the current project
Project-specific decisions declare projects: [project-id] in frontmatter. TEL does not infer ownership from project names that happen to appear in prose or old task titles.
The task state machine is intentionally small:
absent --add--> Backlog
absent/Backlog --start--> Active
Backlog/Active --done--> absent
Completed work belongs in Git, project artifacts, or session history instead of accumulating forever on the live board.
tel/: the Python CLI and local Markdown data model.plugins/task-experience-loop/: the installable Codex Plugin.plugins/task-experience-loop/skills/: TEL and action-oriented SOP skills..agents/plugins/marketplace.json: the repository marketplace entry.tests/: focused CLI and data-contract tests.
The plugin and CLI are intentionally separate. Installing the plugin does not grant it a database, remote service, or access to private data; the CLI reads and writes only the local directory selected by TEL_DIR.