Tc tracker

Use when the user asks to track technical changes, create change records, manage TC lifecycles, or hand off work between AI sessions.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/tc-tracker, including the files SKILL.md points to.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit alirezarezvani/claude-skills/engineering/skills/tc-tracker#main ~/.claude/skills/tc-tracker

For one project only, change the path to .claude/skills/tc-tracker. This skill also uses tc_config.json, tc_registry.json, tc_record.json, tc_init.py, tc_create.py, tc_update.py — copying SKILL.md alone won't be enough. See the folder on GitHub.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Tc tracker

Show the full text208 lines
namedescription
tc-trackerUse when the user asks to track technical changes, create change records, manage TC lifecycles, or hand off work between AI sessions. Covers init/create/update/status/resume/close/export workflows for structured code change documentation.

TC Tracker

Track every code change with structured JSON records, an enforced state machine, and a session handoff format that lets a new AI session resume work cleanly when a previous one expires.

Overview

A Technical Change (TC) is a structured record that captures what changed, why it changed, who changed it, when it changed, how it was tested, and where work stands for the next session. Records live as JSON in docs/TC/ inside the target project, validated against a strict schema and a state machine.

Use this skill when the user:

  • Asks to "track this change" or wants an audit trail for code modifications
  • Wants to hand off in-progress work to a future AI session
  • Needs structured release notes that go beyond commit messages
  • Onboards an existing project and wants retroactive change documentation
  • Asks for /tc init, /tc create, /tc update, /tc status, /tc resume, or /tc close

Do NOT use this skill when:

  • The user only wants a changelog from git history (use engineering/changelog-generator)
  • The user only wants to track tech debt items (use engineering/tech-debt-tracker)
  • The change is trivial (typo, formatting) and won't affect behavior

Storage Layout

Each project stores TCs at {project_root}/docs/TC/:

docs/TC/
├── tc_config.json          # Project settings
├── tc_registry.json        # Master index + statistics
├── records/
│   └── TC-001-04-05-26-user-auth/
│       └── tc_record.json  # Source of truth
└── evidence/
    └── TC-001/             # Log snippets, command output, screenshots

TC ID Convention

  • Parent TC: TC-NNN-MM-DD-YY-functionality-slug (e.g., TC-001-04-05-26-user-authentication)
  • Sub-TC: TC-NNN.A or TC-NNN.A.1 (letter = revision, digit = sub-revision)
  • NNN is sequential, MM-DD-YY is the creation date, slug is kebab-case.

State Machine

planned -> in_progress -> implemented -> tested -> deployed
   |            |              |           |          |
   +-> blocked -+              +- in_progress <-------+
        |                          (rework / hotfix)
        +-> planned

See references/lifecycle.md for the full transition table and recovery flows.

Workflow Commands

The skill ships five Python scripts that perform deterministic, stdlib-only operations on TC records. Each one supports --help and --json.

1. Initialize tracking in a project
python3 scripts/tc_init.py --project "My Project" --root .

Creates docs/TC/, docs/TC/records/, docs/TC/evidence/, tc_config.json, and tc_registry.json. Idempotent — re-running reports "already initialized" with current stats.

2. Create a new TC record
python3 scripts/tc_create.py \
  --root . \
  --name "user-authentication" \
  --title "Add JWT-based user authentication" \
  --scope feature \
  --priority high \
  --summary "Adds JWT login + middleware" \
  --motivation "Required for protected endpoints"

Generates the next sequential TC ID, creates the record directory, writes a fully populated tc_record.json (status planned, R1 creation revision), and updates the registry.

3. Update a TC record
# Status transition (validated against the state machine)
python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
  --set-status in_progress --reason "Starting implementation"

# Add a file
python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
  --add-file src/auth.py:created

# Append handoff data
python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
  --handoff-progress "JWT middleware wired up" \
  --handoff-next "Write integration tests" \
  --handoff-next "Update README"

Every change appends a sequential R<n> revision entry, refreshes updated, and re-validates against the schema before writing atomically (.tmp then rename).

4. View status
# Single TC
python3 scripts/tc_status.py --root . --tc-id TC-001-04-05-26-user-auth

# All TCs (registry summary)
python3 scripts/tc_status.py --root . --all --json
5. Validate a record or registry
python3 scripts/tc_validator.py --record docs/TC/records/TC-001-.../tc_record.json
python3 scripts/tc_validator.py --registry docs/TC/tc_registry.json

Validator enforces the schema, checks state-machine legality, verifies sequential R<n> and T<n> IDs, and asserts approval consistency (approved=true requires approved_by and approved_date).

See references/tc-schema.md for the full schema.

Slash-Command Dispatcher

The repo ships a /tc slash command at commands/tc.md that dispatches to these scripts based on subcommand:

Command Action
/tc init Run tc_init.py for the current project
/tc create <name> Prompt for fields, run tc_create.py
/tc update <tc-id> Apply user-described changes via tc_update.py
/tc status [tc-id] Run tc_status.py
/tc resume <tc-id> Display handoff, archive prior session, start a new one
/tc close <tc-id> Transition to deployed, set approval
/tc export Re-render all derived artifacts
/tc dashboard Re-render the registry summary

The slash command is the user interface; the Python scripts are the engine.

Session Handoff Format

The handoff block lives at session_context.handoff inside each TC and is the single most important field for AI continuity. It contains:

  • progress_summary — what has been done
  • next_steps — ordered list of remaining actions
  • blockers — anything preventing progress
  • key_context — critical decisions, gotchas, patterns the next bot must know
  • files_in_progress — files being edited and their state (editing, needs_review, partially_done, ready)
  • decisions_made — architectural decisions with rationale and timestamp

See references/handoff-format.md for the full structure and fill-out rules.

Validation Rules (Always Enforced)

  1. State machine — only valid transitions are allowed.
  2. Sequential IDs — revision_history uses R1, R2, R3...; test_cases uses T1, T2, T3....
  3. Append-only history — revision entries are never modified or deleted.
  4. Approval consistency — approved=true requires approved_by and approved_date.
  5. TC ID format — must match TC-NNN-MM-DD-YY-slug.
  6. Sub-TC ID format — must match TC-NNN.A or TC-NNN.A.N.
  7. Atomic writes — JSON is written to .tmp then renamed.
  8. Registry stats — recomputed on every registry write.

Non-Blocking Bookkeeping Pattern

TC tracking must NOT interrupt the main workflow.

  • Never stop to update TC records inline. Keep coding.
  • At natural milestones, spawn a background subagent to update the record.
  • Surface questions only when genuinely needed ("This work doesn't match any active TC — create one?"), and ask once per session, not per file.
  • At session end, write a final handoff block before closing.

Retroactive Bulk Creation

For onboarding an existing project with undocumented history, build a retro_changelog.json (one entry per logical change) and feed it to tc_create.py in a loop, or extend the script for batch mode. Group commits by feature, not by file.

Anti-Patterns

Anti-pattern Why it's bad Do this instead
Editing revision_history to "fix" a typo History is append-only — tampering destroys the audit trail Add a new revision that corrects the field
Skipping the state machine ("just set status to deployed") Bypasses validation and hides skipped phases Walk through in_progress -> implemented -> tested -> deployed
Creating one TC per file changed Fragments related work and explodes the registry One TC per logical unit (feature, fix, refactor)
Updating TC inline between every code edit Slows the main agent, wastes context Spawn a background subagent at milestones
Marking approved=true without approved_by Validator will reject; misleading audit trail Always set approved_by and approved_date together
Overwriting tc_record.json directly with a text editor Risks corruption mid-write and skips validation Use tc_update.py (atomic write + schema check)
Putting secrets in notes or evidence Records are committed to the repo Reference an env var or external secret store
Reusing TC IDs after deletion Breaks the sequential guarantee and confuses history Increment forward only — never recycle
Letting next_steps go stale Defeats the purpose of handoff Update on every milestone, even if it's "nothing changed"

Cross-References

  • engineering/changelog-generator — Generates Keep-a-Changelog release notes from Conventional Commits. Pair it with TC tracker: TC for the granular per-change audit trail, changelog for user-facing release notes.
  • engineering/tech-debt-tracker — For tracking long-lived debt items rather than discrete code changes.
  • engineering/focused-fix — When a bug fix needs systematic feature-wide repair, run /focused-fix first then capture the result as a TC.
  • project-management/decision-log — Architectural decisions made inside a TC's decisions_made block can also be promoted to a project-wide decision log.
  • engineering-team/code-reviewer — Pre-merge review fits naturally into the tested -> deployed transition; capture the reviewer in approval.approved_by.

References in This Skill

1---
2name: "tc-tracker"
3description: "Use when the user asks to track technical changes, create change records, manage TC lifecycles, or hand off work between AI sessions. Covers init/create/update/status/resume/close/export workflows for structured code change documentation."
4---
5 
6# TC Tracker
7 
8Track every code change with structured JSON records, an enforced state machine, and a session handoff format that lets a new AI session resume work cleanly when a previous one expires.
9 
10## Overview
11 
12A Technical Change (TC) is a structured record that captures **what** changed, **why** it changed, **who** changed it, **when** it changed, **how it was tested**, and **where work stands** for the next session. Records live as JSON in `docs/TC/` inside the target project, validated against a strict schema and a state machine.
13 
14**Use this skill when the user:**
15- Asks to "track this change" or wants an audit trail for code modifications
16- Wants to hand off in-progress work to a future AI session
17- Needs structured release notes that go beyond commit messages
18- Onboards an existing project and wants retroactive change documentation
19- Asks for `/tc init`, `/tc create`, `/tc update`, `/tc status`, `/tc resume`, or `/tc close`
20 
21**Do NOT use this skill when:**
22- The user only wants a changelog from git history (use `engineering/changelog-generator`)
23- The user only wants to track tech debt items (use `engineering/tech-debt-tracker`)
24- The change is trivial (typo, formatting) and won't affect behavior
25 
26## Storage Layout
27 
28Each project stores TCs at `{project_root}/docs/TC/`:
29 
30```
31docs/TC/
32├── tc_config.json # Project settings
33├── tc_registry.json # Master index + statistics
34├── records/
35│ └── TC-001-04-05-26-user-auth/
36│ └── tc_record.json # Source of truth
37└── evidence/
38 └── TC-001/ # Log snippets, command output, screenshots
39```
40 
41## TC ID Convention
42 
43- **Parent TC:** `TC-NNN-MM-DD-YY-functionality-slug` (e.g., `TC-001-04-05-26-user-authentication`)
44- **Sub-TC:** `TC-NNN.A` or `TC-NNN.A.1` (letter = revision, digit = sub-revision)
45- `NNN` is sequential, `MM-DD-YY` is the creation date, slug is kebab-case.
46 
47## State Machine
48 
49```
50planned -> in_progress -> implemented -> tested -> deployed
51 | | | | |
52 +-> blocked -+ +- in_progress <-------+
53 | (rework / hotfix)
54 +-> planned
55```
56 
57> See [references/lifecycle.md](references/lifecycle.md) for the full transition table and recovery flows.
58 
59## Workflow Commands
60 
61The skill ships five Python scripts that perform deterministic, stdlib-only operations on TC records. Each one supports `--help` and `--json`.
62 
63### 1. Initialize tracking in a project
64 
65```bash
66python3 scripts/tc_init.py --project "My Project" --root .
67```
68 
69Creates `docs/TC/`, `docs/TC/records/`, `docs/TC/evidence/`, `tc_config.json`, and `tc_registry.json`. Idempotent — re-running reports "already initialized" with current stats.
70 
71### 2. Create a new TC record
72 
73```bash
74python3 scripts/tc_create.py \
75 --root . \
76 --name "user-authentication" \
77 --title "Add JWT-based user authentication" \
78 --scope feature \
79 --priority high \
80 --summary "Adds JWT login + middleware" \
81 --motivation "Required for protected endpoints"
82```
83 
84Generates the next sequential TC ID, creates the record directory, writes a fully populated `tc_record.json` (status `planned`, R1 creation revision), and updates the registry.
85 
86### 3. Update a TC record
87 
88```bash
89# Status transition (validated against the state machine)
90python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
91 --set-status in_progress --reason "Starting implementation"
92 
93# Add a file
94python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
95 --add-file src/auth.py:created
96 
97# Append handoff data
98python3 scripts/tc_update.py --root . --tc-id TC-001-04-05-26-user-auth \
99 --handoff-progress "JWT middleware wired up" \
100 --handoff-next "Write integration tests" \
101 --handoff-next "Update README"
102```
103 
104Every change appends a sequential `R<n>` revision entry, refreshes `updated`, and re-validates against the schema before writing atomically (`.tmp` then rename).
105 
106### 4. View status
107 
108```bash
109# Single TC
110python3 scripts/tc_status.py --root . --tc-id TC-001-04-05-26-user-auth
111 
112# All TCs (registry summary)
113python3 scripts/tc_status.py --root . --all --json
114```
115 
116### 5. Validate a record or registry
117 
118```bash
119python3 scripts/tc_validator.py --record docs/TC/records/TC-001-.../tc_record.json
120python3 scripts/tc_validator.py --registry docs/TC/tc_registry.json
121```
122 
123Validator enforces the schema, checks state-machine legality, verifies sequential `R<n>` and `T<n>` IDs, and asserts approval consistency (`approved=true` requires `approved_by` and `approved_date`).
124 
125> See [references/tc-schema.md](references/tc-schema.md) for the full schema.
126 
127## Slash-Command Dispatcher
128 
129The repo ships a `/tc` slash command at `commands/tc.md` that dispatches to these scripts based on subcommand:
130 
131| Command | Action |
132|---------|--------|
133| `/tc init` | Run `tc_init.py` for the current project |
134| `/tc create <name>` | Prompt for fields, run `tc_create.py` |
135| `/tc update <tc-id>` | Apply user-described changes via `tc_update.py` |
136| `/tc status [tc-id]` | Run `tc_status.py` |
137| `/tc resume <tc-id>` | Display handoff, archive prior session, start a new one |
138| `/tc close <tc-id>` | Transition to `deployed`, set approval |
139| `/tc export` | Re-render all derived artifacts |
140| `/tc dashboard` | Re-render the registry summary |
141 
142The slash command is the user interface; the Python scripts are the engine.
143 
144## Session Handoff Format
145 
146The handoff block lives at `session_context.handoff` inside each TC and is the single most important field for AI continuity. It contains:
147 
148- `progress_summary` — what has been done
149- `next_steps` — ordered list of remaining actions
150- `blockers` — anything preventing progress
151- `key_context` — critical decisions, gotchas, patterns the next bot must know
152- `files_in_progress` — files being edited and their state (`editing`, `needs_review`, `partially_done`, `ready`)
153- `decisions_made` — architectural decisions with rationale and timestamp
154 
155> See [references/handoff-format.md](references/handoff-format.md) for the full structure and fill-out rules.
156 
157## Validation Rules (Always Enforced)
158 
1591. **State machine** — only valid transitions are allowed.
1602. **Sequential IDs** — `revision_history` uses `R1, R2, R3...`; `test_cases` uses `T1, T2, T3...`.
1613. **Append-only history** — revision entries are never modified or deleted.
1624. **Approval consistency** — `approved=true` requires `approved_by` and `approved_date`.
1635. **TC ID format** — must match `TC-NNN-MM-DD-YY-slug`.
1646. **Sub-TC ID format** — must match `TC-NNN.A` or `TC-NNN.A.N`.
1657. **Atomic writes** — JSON is written to `.tmp` then renamed.
1668. **Registry stats** — recomputed on every registry write.
167 
168## Non-Blocking Bookkeeping Pattern
169 
170TC tracking must NOT interrupt the main workflow.
171 
172- **Never stop to update TC records inline.** Keep coding.
173- At natural milestones, spawn a background subagent to update the record.
174- Surface questions only when genuinely needed ("This work doesn't match any active TC — create one?"), and ask once per session, not per file.
175- At session end, write a final handoff block before closing.
176 
177## Retroactive Bulk Creation
178 
179For onboarding an existing project with undocumented history, build a `retro_changelog.json` (one entry per logical change) and feed it to `tc_create.py` in a loop, or extend the script for batch mode. Group commits by feature, not by file.
180 
181## Anti-Patterns
182 
183| Anti-pattern | Why it's bad | Do this instead |
184|--------------|--------------|-----------------|
185| Editing `revision_history` to "fix" a typo | History is append-only — tampering destroys the audit trail | Add a new revision that corrects the field |
186| Skipping the state machine ("just set status to deployed") | Bypasses validation and hides skipped phases | Walk through `in_progress -> implemented -> tested -> deployed` |
187| Creating one TC per file changed | Fragments related work and explodes the registry | One TC per logical unit (feature, fix, refactor) |
188| Updating TC inline between every code edit | Slows the main agent, wastes context | Spawn a background subagent at milestones |
189| Marking `approved=true` without `approved_by` | Validator will reject; misleading audit trail | Always set `approved_by` and `approved_date` together |
190| Overwriting `tc_record.json` directly with a text editor | Risks corruption mid-write and skips validation | Use `tc_update.py` (atomic write + schema check) |
191| Putting secrets in `notes` or evidence | Records are committed to the repo | Reference an env var or external secret store |
192| Reusing TC IDs after deletion | Breaks the sequential guarantee and confuses history | Increment forward only — never recycle |
193| Letting `next_steps` go stale | Defeats the purpose of handoff | Update on every milestone, even if it's "nothing changed" |
194 
195## Cross-References
196 
197- `engineering/changelog-generator` — Generates Keep-a-Changelog release notes from Conventional Commits. Pair it with TC tracker: TC for the granular per-change audit trail, changelog for user-facing release notes.
198- `engineering/tech-debt-tracker` — For tracking long-lived debt items rather than discrete code changes.
199- `engineering/focused-fix` — When a bug fix needs systematic feature-wide repair, run `/focused-fix` first then capture the result as a TC.
200- `project-management/decision-log` — Architectural decisions made inside a TC's `decisions_made` block can also be promoted to a project-wide decision log.
201- `engineering-team/code-reviewer` — Pre-merge review fits naturally into the `tested -> deployed` transition; capture the reviewer in `approval.approved_by`.
202 
203## References in This Skill
204 
205- [references/tc-schema.md](references/tc-schema.md) — Full JSON schema for TC records and the registry.
206- [references/lifecycle.md](references/lifecycle.md) — State machine, valid transitions, and recovery flows.
207- [references/handoff-format.md](references/handoff-format.md) — Session handoff structure and best practices.
208 

Discussion

Alternatives

Also in Developer docsSee all 533 in Development →