Target: Complex multi-step projects only. NOT for everyday tasks.
This skill implements a Context Engineering pipeline -- not just note-taking, but a structured 5-stage process for extending the AI's effective memory beyond its context window:
> Identify which tasks need tracking (>=5 steps, multi-system, or cross-session)
> Classify every piece of information as a Static Anchor (permanent, verbatim) or Dynamic Flow (compressible)
> Compress dynamic flow via progressive step collapsing, never touching static anchors
> Retrieve exact state on recovery via dual-tier file reads
> Persist after every substantive step with size-controlled snapshots
Like OS virtual memory extends RAM with disk, this skill extends the context window with persistent files. A context overflow is a "page fault"; loading progress.md is the "disk read". The illusion is seamless memory; the reality is strategic compression and retrieval.
The collapse priority system is grounded in information theory -- specifically the Entropy Gate framework from Stanford NLP research, which models each token as carrying a unit of "information energy." Compression is the selective removal of low-energy tokens while preserving high-energy ones, optimizing the trade-off between rate (how much we keep) and distortion (what we lose).
Our 6-level collapse priority is essentially an information energy ranking:
This is NOT just a heuristic. It reflects the principle that information loss is not uniform -- losing a project's API endpoint is catastrophic, while losing a debug log is inconsequential.
Also: even models with 1M+ token context windows suffer from "Lost in the Middle" (Databricks, 2024) -- recall drops for information in the middle of long contexts, regardless of window size. This skill addresses a model architecture limitation, not just a window size problem.
Task 1 (complex project) ---> context overflows ---> session dies
|
v
Task 2 (same workspace) ---> reads Task 1's disk snapshot
---> continues from exact step where Task 1 stopped
If your task finishes in under ~10 conversation turns, you do NOT need this skill.
| Condition | Example |
|---|---|
| ----------- | --------- |
| Estimated >= 5 sequential steps | Build a bot, deploy pipeline, multi-phase doc |
| Touches multiple files/systems | Config changes across 3+ files, cross-service setup |
| Will span multiple sessions | "Today we do step 1-3, tomorrow step 4-6" |
| High risk of context overflow | Heavy file reads, long code generation |
| Has dependencies between steps | Step 4 needs output from step 2 |
| Condition | Example |
|---|---|
| ----------- | --------- |
| 1-3 step quick task | Rename a file, answer a question, convert format |
| Single-file edit | Fix a bug in one file, update one document |
| Q&A or research | Look up info, explain a concept, compare options |
For non-tracked tasks: normal .workbuddy/memory/ daily log + workspace file history is sufficient. Completed tasks remain visible via WorkBuddy's task system and file timestamps.
<workspace_root>/
progress.md # TIER 1: Workspace Overview (summary only)
.progress/ # TIER 2: Per-Task Detail
task-{id}.md # Active/completed task snapshots
archive/ # Auto-archived old completed tasks
progress.md (Workspace Root, < 4KB)Quick summary table of all tracked tasks + workspace conventions.
.progress/task-{id}.md (< 6KB per file)Granular step-by-step progress for ONE complex task.
This skill has a specific scope. It does NOT replace other systems:
| System | What It Records | Scope | Update Frequency |
|---|---|---|---|
| -------- | ---------------- | ------- | ------------------ |
| progress-tracker (this) | Technical state nodes: which step am I on, what's blocked, key decisions made | Per complex task only | Every substantive step |
.workbuddy/memory/YYYY-MM-DD.md | Daily work log: what happened today across ALL tasks | All work, tracked & untracked | Once at end of day |
.workbuddy/memory/MEMORY.md | Long-term: preferences, conventions, decisions worth keeping forever | Cross-project, persistent | Only when new preference/decision emerges |
| WorkBuddy Task System | Agent task list (TaskCreate/Update/List) | In-memory, per-session | Real-time |
Rule of thumb: If it answers "where exactly did I stop?" → progress-tracker. If it answers "what did I learn?" → MEMORY.md. If it answers "what did I do today?" → daily log.
Before creating ANY progress files, evaluate:
def should_track():
# Auto-evaluate before initializing
estimated_steps = estimate_complexity()
if estimated_steps >= 5:
return True
if touches_multiple_systems():
return True
if user_explicitly_requested():
return True
return False # Skip this skill entirely for simple work
If should_track() returns False → do not create any progress files. Proceed with normal workflow.
After completing a substantive step in a tracked task:
When starting a NEW session/task in a workspace that has existing progress files:
progress.md → get task registry.progress/task-{id}.md files → recover detailed state[RECOVERED] Found N tracked task(s):Collapse priority (highest loss tolerance first):
[x] Steps 1-N: [one-line summary] ({date})Code-specific compression rules:
auth.py:L42-58: JWT validation with refresh)What to NEVER write into either tier:
When a task status becomes completed:
.progress/ for 7 days.progress/archive/ automatically.progress/ directory clean: only active + recently-completed tasks visible[OK], [FAIL], [WARN], [RECOVERED], [SKIPPED], [ARCHIVED]task-wecom-bot-v2.mdprogress.md# {Workspace} Progress Overview
**Workspace:** {path}
**Last Updated:** {datetime}
**Tracked Tasks:** N active | M completed
---
## Tracked Task Registry
| ID | Name | Status | Last Step | Detail File |
|----|------|--------|-----------|-------------|
| {id} | {name} | {status} | {step} | .progress/task-{id}.md |
## Global Pending Items
(cross-task items only)
## Conventions
(shared resource paths, naming rules, etc.)
.progress/task-{id}.md# Task: {Name}
**ID:** {id} | **Status:** {status} | **Updated:** {datetime}
---
## Static Anchors (NEVER collapse or summarize these)
- (project structure, API endpoints, core config, key data models)
- (these remain verbatim for the entire task lifecycle)
## Completed Steps
- [x] Step N: Description ({datetime})
(keep last 5 full; collapse older into summary line)
## Current Step
- [ ] Step N+1: Description
- Sub-step / blocker details
## Current Blockers / Open Questions
- [ ] (what is currently stuck or unknown)
- (critical for recovery -- the next session knows exactly where to resume thinking)
## Key Decisions (accumulated)
1. Decision A: rationale
2. Decision B: rationale
## Next Steps
1. ...
2. ...
## Artifacts
(files created/modified by this task)
## Recovery Metadata
- Last checkpoint: {datetime}
- Steps collapsed: none / "1-3 (detail lost, summary retained)"
- Information gaps: none / describe any known gaps
---
*Auto-generated by progress-tracker v2.7.*
Use this checklist to identify what qualifies as a Static Anchor for your project:
| Project Type | Common Static Anchors |
|---|---|
| -------------- | ---------------------- |
| Web App / API | API endpoints & routes, database schema, auth tokens/config, env vars, deployment URLs, CORS origins |
| CLI Tool / Bot | Command-line arguments, config file paths, model/API keys, WebSocket URLs, port numbers, log format rules |
| Data Pipeline | Source/destination paths, field mappings, transformation rules, schema versions, credential locations |
| Documentation / Content | Document structure outline, style guide rules, publishing platform config, file naming conventions |
| Infrastructure | Server IPs/hostnames, container images, health-check endpoints, certificate paths, scaling thresholds |
Quick test: Ask yourself -- "If the next session loses this piece of information, would it have to guess, or could it recover from the codebase?" If guessing is required, it is a Static Anchor. If recoverable by reading code or config files, it is Dynamic Flow.
A real Tier2 file from an actual project, showing what a populated snapshot looks like:
# Task: WeCom Bot Integration
**ID:** wecom-bot | **Status:** in_progress | **Updated:** 2026-06-03 12:21
---
## Static Anchors (NEVER collapse or summarize these)
- App Token: Pfqvb1pWRawE6HsCbN6cyJOZncK
- Table ID: tblLj6IzdwDBAttB
- Export template: 走访记录_导出模板.xlsx (30 columns, A区19+B区11)
- Field alias map: 19 A-fields map 1:1; B-fields need FIELD_ALIAS_MAP at write time
- Model split: glm-5v-turbo (analysis) + glm-4-flash (KB Q&A)
## Completed Steps
- [x] Step 1: Set up project structure, create main.py + requirements.txt (2026-06-02 09:15)
- [x] Step 2: Implement WebSocket connection with auto-reconnect (2026-06-02 10:30)
- [x] Step 3: Build KB search module with two-stage strategy (2026-06-02 14:20)
- [x] Step 4: Integrate GLM-5V for visit analysis (Mode A/B/E) (2026-06-03 09:45)
- [x] Step 5: Fix field alias mapping bug + date parsing bug (2026-06-03 11:00)
[x] Steps 1-3: Project init, WS connection, KB search module (2026-06-02)
## Current Step
- [ ] Step 6: PyInstaller packaging into single exe (~38MB target)
- Sub-step: spec file datas array for templates + .env bundling
- Key decision: use sys._MEIPASS for resource path resolution at runtime
## Current Blockers / Open Questions
- [ ] Not yet tested: does .env path resolution work inside PyInstaller bundle?
- [ ] Need to verify:飞书API rate limit for batch write operations
## Key Decisions (accumulated)
1. Switched from Webhook+cpolar to WebSocket long-connection (cpolar URL changes on restart)
2. DuckDuckGo failed on Python 3.13+Windows; Bing had poor Chinese results -> chose Baidu
3. Mode A (image parsing) skipped due to im:image permission -> Mode E covers the use case
4. Date parse failure returns None instead of 0 to avoid 1970/01/01 dirty data
## Next Steps
1. Package exe and copy to Desktop
2. E2E test: send bitable link -> AI analyzes -> writes backend -> exports Excel
3. Generate usage documentation (Word format)
## Artifacts
- kb_web_service.py (main bot, ~1200 lines)
- visit_parser.py (analysis module, ~580 lines)
- KB_Bot_v4_3.exe (38MB, Desktop)
-走访记录_导出模板.xlsx (export template, 30 columns)
## Recovery Metadata
- Last checkpoint: 2026-06-03 12:21
- Steps collapsed: 1-3 (detail lost, summary retained)
- Information gaps: none identified
---
*Auto-generated by progress-tracker v2.7.*
Notice how:
Mistake: Activating progress tracking for every task, even simple ones.
Consequence: progress.md bloats with noise; simple tasks drown out the important ones; recovery becomes slower and less useful.
Correct: Strictly follow the >=5-step threshold. Simple tasks belong in daily logs only.
Mistake: Letting .progress/ accumulate dozens of old task files.
Consequence: Recovery scans take longer; directory becomes cluttered; hard to spot which tasks are actually active.
Correct: Rely on the auto-archive mechanism. Periodically review .progress/archive/ and confirm the 7-day purge is working.
Mistake: Copying user messages and AI responses verbatim into task files.
Consequence: Tier2 file hits the 6KB cap almost immediately; key decisions get buried in chat noise.
Correct: Extract only decisions, outcomes, and next steps. Raw conversation belongs in memory/YYYY-MM-DD.md if it needs preserving.
Mistake: Running two AI sessions in the same workspace, both writing to progress files.
Consequence: Write conflicts; one session overwrites the other's updates; state becomes inconsistent or corrupted.
Correct: One workspace = one active session at a time. If you need parallel work, use separate workspaces or pause tracking in one session.
Mistake: Putting detailed step information into progress.md (Tier1) instead of just the summary table.
Consequence: Tier1 exceeds 4KB cap quickly; it no longer serves as a quick overview.
Correct: Tier1 = registry table + conventions only. All detail goes into Tier2.
| Symptom | Likely Cause | Resolution |
|---|---|---|
| --------- | ------------- | ------------ |
progress.md is empty or corrupted | Write interrupted during a step; encoding error | Recover from .progress/ Tier2 files -- Tier2 is independent. Rebuild Tier1 from Tier2 headers. |
| Recovery shows 0 tasks but files exist | Tier1 registry out of sync with actual files | Rebuild registry by scanning .progress/task-*.md filenames and reading their status headers. |
| Tier2 file exceeds 6KB | Too many completed steps in full detail | Manually collapse older steps into summary lines. The auto-collapse should have triggered -- check if it was bypassed. |
| Chinese/garbled text in files | Non-UTF-8 encoding on Windows (GBK fallback) | Ensure all writes use explicit UTF-8 encoding. Check your editor's default encoding setting. |
.progress/ directory missing | Workspace was initialized without tracking; or directory was accidentally deleted | Create mkdir -p .progress/archive and re-check if Tier1 exists. If Tier1 exists, reconstruct Tier2 from its detail file column. |
| Write permission denied | Workspace on read-only filesystem or locked directory | Check directory permissions. Ensure no other process has an exclusive lock on the files. |
| Multiple active tasks conflict | Two sessions wrote to the same workspace simultaneously | Review both Tier2 files, merge manually, and adopt the parallel-session prevention rule going forward. |
When things go wrong, follow these step-by-step recovery procedures. They are ordered by severity.
progress.md is corrupted or emptySeverity: Medium. Tier1 is recoverable from Tier2.
Steps:
.progress/ -- the Tier2 files are your lifelinels .progress/task-*.mdprogress.md with the registry table populated from Tier2 headersSeverity: Low. One task lost, others unaffected.
Steps:
progress.md registry -- it has the task name and last known stepgit log --oneline -- information_gaps: [recovered from Tier1 summary, detail may be incomplete].progress/ directory was accidentally deletedSeverity: High. All task detail is lost.
Steps:
progress.md (Tier1) still exists -- it has the summary registry.progress/archive/ directory, then reconstruct each Tier2 from Tier1 rowsmemory/YYYY-MM-DD.md for daily logs -- they may contain task progress notesSeverity: Low. Usually recoverable.
Steps:
df -h (Linux/Mac) or check drive properties (Windows)ls -la progress.md .progress/Severity: Low. Requires manual compression.
Steps:
Severity: Medium. Some data is missing but recoverable.
Steps:
memory/YYYY-MM-DD.md daily logsresolvedRun this in the workspace root to verify the progress system is healthy:
# Check Tier1 exists and is within size limit
if [ -f "progress.md" ]; then
SIZE=$(wc -c < progress.md)
if [ "$SIZE" -gt 4096 ]; then
echo "[WARN] progress.md is ${SIZE} bytes (limit: 4096)"
else
echo "[OK] progress.md: ${SIZE} bytes"
fi
else
echo "[INFO] No progress.md found (normal if tracking not active)"
fi
# Check Tier2 directory and file sizes
if [ -d ".progress" ]; then
ACTIVE=$(find .progress -maxdepth 1 -name "task-*.md" | wc -l)
ARCHIVED=$(find .progress/archive -name "task-*.md" 2>/dev/null | wc -l)
echo "[OK] Active tasks: ${ACTIVE}, Archived: ${ARCHIVED}"
find .progress -name "task-*.md" -size +6k 2>/dev/null | while read f; do
echo "[WARN] Oversized: $f"
done
# Check for archive directory
[ -d ".progress/archive" ] || echo "[WARN] .progress/archive/ directory missing"
else
echo "[INFO] No .progress/ directory (normal if tracking not active)"
fi
Windows (PowerShell) equivalent:
if (Test-Path "progress.md") {
$size = (Get-Item "progress.md").Length
if ($size -gt 4096) { Write-Host "[WARN] progress.md is $size bytes (limit: 4096)" }
else { Write-Host "[OK] progress.md: $size bytes" }
} else { Write-Host "[INFO] No progress.md found" }
if (Test-Path ".progress") {
$active = (Get-ChildItem ".progress" -Filter "task-*.md" -File).Count
$archived = (Get-ChildItem ".progress\archive" -Filter "task-*.md" -File -ErrorAction SilentlyContinue).Count
Write-Host "[OK] Active tasks: $active, Archived: $archived"
Get-ChildItem ".progress" -Filter "task-*.md" | Where-Object { $_.Length -gt 6144 } | ForEach-Object {
Write-Host "[WARN] Oversized: $($_.Name)"
}
} else { Write-Host "[INFO] No .progress/ directory" }
Prerequisites: A workspace directory you can write files to. That's it.
Create the directory structure and Tier1 overview file:
mkdir -p .progress/archive
Create progress.md at workspace root with this content:
# Project Progress Overview
**Workspace:** (your project name)
**Last Updated:** (auto-fill)
**Tracked Tasks:** 0 active | 0 completed
---
## Tracked Task Registry
| ID | Name | Status | Last Step | Detail File |
|----|------|--------|-----------|-------------|
## Global Pending Items
(none yet)
## Conventions
- Tier1 cap: 4KB | Tier2 cap: 6KB per task
- Auto-archive: completed tasks after 7 days
- Encoding: UTF-8, ASCII markers only
Create .progress/task-001.md with this content:
# Task: (Your Task Name)
**ID:** 001 | **Status:** pending | **Updated:** (auto-fill)
---
## Static Anchors (NEVER collapse or summarize these)
(Add project structure, API endpoints, core config here as you discover them)
## Completed Steps
(none yet)
## Current Step
- [ ] Step 1: (First step description)
## Current Blockers / Open Questions
(none yet)
## Key Decisions
(none yet)
## Next Steps
1. ...
## Artifacts
(none yet)
## Recovery Metadata
- Last checkpoint: (auto-fill)
- Steps collapsed: none
- Information gaps: none
---
*Auto-generated by progress-tracker v2.7.*
After completing any step:
progress.md registry table rowTips:
Q: Can I use this with any AI coding assistant?
A: Yes. This skill works with any tool that can read/write files -- Claude Code, Cursor, Windsurf, Copilot, WorkBuddy, or plain terminal. No platform-specific features required.
Q: What happens if context overflows mid-write?
A: Worst case: one Tier file gets a truncated write. Since Tier1 and Tier2 are independent, the other file is always intact. Rebuild the corrupted file from its sibling.
Q: Should I track tasks in nested subdirectories?
A: No. All progress files live at the workspace root. This makes them easy to find and prevents path confusion during recovery.
Q: Can I rename or reorganize task IDs?
A: Yes, but update the Tier1 registry to match. The system only relies on filename matching -- there is no database or index.
Q: How is this different from just using git commits?
A: Git tracks code changes. This tracks task execution state (which step am I on, what's blocked, what decisions were made). They complement each other.
Progress Tracker v2.7 by LLLCAF -- Track what matters, skip what doesn't.
Runs automatically when skill loads in any new session:
import os, glob
prog_file = 'progress.md'
prog_dir = '.progress'
if os.path.exists(prog_file):
print('[RECOVERED] Workspace has tracked progress:')
# read and display progress.md summary
else:
# No tracked tasks exist in this workspace
# This is normal for simple-task workspaces
print('[INFO] No tracked tasks. Working in standard mode.')
return # Skip all progress operations
if os.path.exists(prog_dir):
active = glob.glob(os.path.join(prog_dir, 'task-*.md'))
archived = glob.glob(os.path.join(prog_dir, 'archive', 'task-*.md'))
print('[RECOVERED] %d active + %d archived task(s)' % (len(active), len(archived)))
for tf in sorted(active):
print(' ACTIVE: %s (%d bytes)' % (os.path.basename(tf), os.path.getsize(tf)))
Recovery protocol (beyond auto-scan):
User: "Rename this file to report-final.pdf"
AI: Does it in 1 turn. Done.
No progress files created.
Normal memory/daily-log handles it if needed.
Task 1: Building WeCom bot (20+ turns, 12 steps done)
-> hits context limit -> dies
Task 2: New session, same workspace
AI: Loads skill -> finds progress.md
-> reads task-wecom-bot-v1.md (1916 bytes)
-> reports: "Recovered: WeCom bot at Step 13, 6 decisions preserved"
-> continues from Step 13
Same workspace, different tasks:
- Task A: "Fix typo in doc" -> NOT tracked (simple)
- Task B: "Deploy bot to production" -> TRACKED (6 steps, multi-system)
- Task C: "Answer question about API" -> NOT tracked (Q&A)
progress.md shows only Task B. Tasks A and C are invisible to
the tracker but fully accessible via file history and daily logs.
When this skill is loaded:
progress.md exists → read it.progress/ for relevant task filesProgress Tracker v2.6 — Track what matters, skip what doesn't.
共 5 个版本