Tracker setup
Markdown task-tracker system for Claude Code on long, multi-session academic projects
npx -y skills add alexclymo/claude-tracker-skills --skill tracker-setupAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 18 days oldThe repository was created 18 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when the user wants to set up the task system, set up a tracker, or initialise task tracking in a project — triggers like "set up the task system here", "set up a tracker for this project", "initialise task tracking". Scaffolds a git-tracked tracker/ directory of task and decision documents plus a CLAUDE.md standing-rules block. Manages project task *documents* on disk, not Claude Code's in-session task tools (TaskCreate/TaskList) — those are scoped to one conversation and never persist; this skill is for the durable, git-tracked record instead.
SKILL.md
20.1 KB, ~4.8k tokens by cl100k_base, as published. Nobody here has run it
tracker-setup
One-time scaffold. Run this once per project, at the project root. If the project already has a tracker, this skill refuses to touch it and hands off instead — see Step 0.
This document is self-contained for execution: it tells you what to run and in what order. It
points at references/ for content to copy, but does not restate what those files say.
Step 0 — check whether a tracker already exists
Before touching git or anything else, look at the project root:
- If
tracker/exists: stop. Do not scaffold, do not overwrite anything. Tell the user this project already has a tracker and invoke thetracker-auditskill instead — that skill, not this one, handles an existing tracker. - Else if
tasks/exists (andtracker/does not): stop. Tell the user this project uses the supersededtasks/layout, that these skills do not support it, and that migrating totracker/is done by hand, not by this skill. Do not scaffold anything. - Otherwise: proceed to Step 1.
Step 1 — git before anything else
Run, at the project root:
git rev-parse --is-inside-work-tree
If this fails (no repo yet):
- Take
<project-name>as the basename of the project's absolute root directory. - Check whether the project's absolute path contains
Dropbox,iCloud,OneDrive, orGoogle Driveas a substring.-
If it does not: run
git init -b main. None of the multi-machine questions below apply — skip straight to point 3. -
If it does: the project lives inside a cloud-sync folder. A
.gitdirectory syncs like any other folder, but git's object store is not designed for that: a sync client can write a partial object mid-commit, two devices can converge on conflicting copies of the same ref, or a sync event can simply delete.gitoutright — and none of this looks like an error to the sync client, only to git, later. Do not pick a layout for the user. Ask: "Will you work on this project from more than one computer?" Then present these four options — compactly, the goal is a clear choice, not a wall of text — and apply whichever one the user picks:- A — one machine, git database outside the sync folder (
--separate-git-dir). Recommended when it applies. Works at any repo size. Blunt warning: the.gitpointer file holds an absolute path, which binds the repo to this machine — on a second computer git will fail outright, or, worse, find a different repo living at that path, while the sync client keeps syncing the working tree regardless, so edits made elsewhere show up as uncommitted changes with no history behind them. - B — several machines, git database inside the sync folder. The simplest multi-machine
option, and the only one where gitignored material (data, workspaces, model outputs) travels
between machines too — usually the whole reason the project is in a sync folder. Degrades
as the repo grows: sync churn on
.gitrisks silent corruption, and the risk is higher multi-machine, since two machines can touch.gitmid-sync. Rule: let the sync client finish before switching machines, never work from two at once. Suitable for small projects only. - C — several machines, separate-git-dir on each, shared remote. Holds up at any size but demands clean setup on every machine and disciplined pull-before/push-after every session. Strongly discouraged — easy to get subtly wrong. Gitignored material does NOT travel this way.
- D — no git at all. Sync history is the only history. Always available, and the honest
choice for someone not comfortable with git. Costs: no traceability, no revert, and
tracker-closeloses its commit duty.
Apply the choice:
- A:
mkdir -p "$HOME/git-repos" && git init -b main --separate-git-dir="$HOME/git-repos/<project-name>.git". Tell the user plainly what this does: working files stay in the project folder and keep syncing normally;.gitthere becomes a small pointer file readinggitdir: $HOME/git-repos/<project-name>.git; the real object database lives outside the sync folder entirely. - B: plain
git init -b main, inside the sync folder as normal. - C: run A's command on this machine; tell the user every other machine needs its own
git init -b main --separate-git-dir=...pointed outside its own sync folder, plus a shared remote (point 5 below can set that up now). - D: run no git command at all. Tell the user plainly that
tracker/will not be under version control and sync history is the only history from here on;.gitignoreis still worth writing (point 3) for editor/tooling hygiene even without git.
Record the letter chosen — Step 4 writes it, plus a one-line reminder, into
CLAUDE.md's## Project settingssection:- A: "One machine; git database lives outside the sync folder via an absolute-path pointer — this repo will not work from a second machine without redoing setup there."
- B: "Several machines; git database lives inside the sync folder — let sync finish before switching machines, never work from two at once. Check sync status before starting work each session; this catches divergence, it does not make multi-machine editing safe."
- C: "Several machines; separate git database on each, shared remote — pull before and push after every session; gitignored files do not travel this way. Check the remote before starting work each session; this catches divergence, it does not make multi-machine editing safe."
- D: "No git — sync history is the only history;
tracker-closeskips the commit step."
- A — one machine, git database outside the sync folder (
-
- If the project root has no
.gitignore, write one. Be ruthless about large binaries and generated output — this is a text-and-code tracker system, nothing it produces should ever need a binary in git. Cover at minimum: common data/model artifact extensions (*.csv,*.parquet,*.h5,*.hdf5,*.pkl,*.npy,*.npz,*.pt,*.pth,*.ckpt,*.onnx), archives (*.zip,*.tar,*.tar.gz,*.7z), media (*.mp4,*.mov,*.mp3,*.wav), and the usual environment/cache clutter (__pycache__/,*.pyc,.venv/,venv/,node_modules/,.DS_Store,*.log,.vscode/,.idea/). If a.gitignorealready exists, leave it as the user wrote it. - Do not stage or commit anything yet. Nothing is committed until Step 5, and even then only
tracker/and theCLAUDE.mdblock — never the project's existing code. That stays uncommitted (or committed later by the user, separately) unless the user asks otherwise. - Mention, once, that you can set up a private remote for this repo if the user wants one now — offer it, do not require it, and do not block on an answer.
If the check succeeds (a repo already exists): do nothing to git itself. Note whether
.gitignore exists; if the project has none, apply the same ruthless default from point 3 above.
Proceed to Step 2 either way.
Step 2 — scan the project to find its initial task list
Do this before writing anything into tracker/ (Step 3 needs these findings):
- Git history (
git log --onelineif any commits exist) — what's already done. - Open branches (
git branch -a, if any exist beyond the current one) — each unmerged branch is a candidate in-flight or proposed task; check its name and its unique commits (git log main..<branch> --oneline) to see what it's working toward. TODO/XXX/FIXMEmarkers (e.g.grep -rn 'TODO\|XXX\|FIXME'over source files, excluding anything the new.gitignoreexcludes) and any obviously incomplete or stubbed-out files — what's in flight.- The dependency chain between what you find — what unblocks what — to decide
Dependsand which ready task comes next. - Anything that looks aspirational but not yet started (a stub module, a named-but-empty
directory, a comment describing a future step) goes in as
proposed, notreadyorin-progress.
Turn each finding into one future INDEX.md row (ID | Task | Status | Depends | R:Human | R:Claude | Category, task name ≤50 chars) plus one future detail file. Use T1xx numbering for this first
phase unless the scan clearly reveals distinct phases already (see index_template.md's
phase-numbering convention).
If the project is a research project, phase names like "Data pipeline" / "Model estimation" / "Results and writeup" are a reasonable example split — offer it as an example, not a default, and prefer whatever the scan actually shows. If it's a software project, phase names like "Scaffolding" / "Core feature" / "Hardening and release" are the equivalent example. Say explicitly, when presenting either, that it is an example the user should confirm or correct, not a decision already made on their behalf.
Step 3 — scaffold tracker/
Create tracker/ and tracker/detail/ at the project root. tracker/detail/ is shared: task
detail files (T###_<slug>.md) and decision detail files (D##_<slug>.md) both live there, side
by side, distinguished only by the ID prefix.
Using the six file templates in references/ — index_template.md, priorities_template.md,
decisions_template.md, journal_template.md, archive_template.md, detail_template.md — write
tracker/INDEX.md, tracker/PRIORITIES.md, tracker/DECISIONS.md, tracker/JOURNAL.md,
tracker/ARCHIVE.md, and one tracker/detail/T###_<slug>.md per task found in Step 2.
Adapt, do not copy. Every template carries one worked example (a fictional data-pipeline
project, tasks T101–T203, decisions D01–D03) so its cross-references resolve to each other
inside the template file. That example exists to show the shape — file-type line, conventions
header, column layout, section rules, word caps — not to be pasted into a real project. Carry the
structural parts (the file-type line, the Conventions/Rules header, the section-kind rules, the
word-cap and bullet-length rules) into each real file verbatim; replace every example row, entry,
and narrative sentence with this project's own content from Step 2, or leave it genuinely empty
where there is nothing yet:
INDEX.md— real conventions header (unchanged from the template) plus "The path forward" and phase tables built from Step 2's findings. A brand-new project has one phase table, not two.PRIORITIES.md— use the template's own "Day-one initial state" block in place of its worked three-section example — the template says exactly when to do this. Two of its three sections ("Recent sessions" empty, and the "Notes for next session" bullet) transfer as written. But its "Next priorities" bullet ("start the first ready task") is written for the case where INDEX is still empty when PRIORITIES is scaffolded — by this point in this skill's own order, Step 2 already found real tasks and Step 3 already wrote them into INDEX, so name the actual first task by ID instead of the generic phrase (e.g. "Confirm the initial task list in INDEX.md looks right, then pick upT101" — pick whichever real task is unblocked, regardless of whether the scan classified itreadyorin-progress; INDEX's own status is the source of truth, so don't repeat "ready" here if the row says otherwise). SetLast updated:to today's date.DECISIONS.md— keep the Conventions header and the<!-- BEGIN ledger -->/<!-- END ledger -->markers; the ledger and the body start empty (noD##rows, no entries) — a new project has made no decisions yet. Do not invent one to fill the space.JOURNAL.mdandARCHIVE.md— keep the header and the explanatory sentence; drop the example entry. Both start with zero entries.tracker/detail/T###_<slug>.md— one per initial task, built fromdetail_template.md's structure (Current state head, Goal, Sub-steps, Acceptance criteria, Stopping criteria, Notes, Progress log). Leave## Stopping criteriaand## Progress logempty at scaffold time — per the template, stopping criteria are written when autonomy is granted for that task, not guessed at creation, and there is no session narrative yet to log. A brand-new project has made no decisions yet (see theDECISIONS.mdbullet above), so notracker/detail/D##_<slug>.mdfile is created at scaffold time either — when the first decision is ratified, build one fromdecision_detail_template.md, e.g.tracker/detail/D01_<slug>.md, in this sametracker/detail/folder, alongside theT###_<slug>.mdfiles above.
Step 4 — ask the remaining preferences, then generate the CLAUDE.md block
Two more one-time choices belong in ## Project settings, alongside the git layout recorded in
Step 1. Ask both before writing the block.
Code-commit preference. Ask how tracker-close should treat code changes at session end — the
tracker/-separate-from-code rule itself is never optional (Step 5 below, and tracker-close Duty
5); this only decides whether code also gets committed:
- auto — close commits code changes too, as a second, separate commit from the
tracker/commit. This is the default if the user expresses no preference. - ask — close asks each time whether to commit code changes.
- never — close leaves code alone, as today.
Working relationship (optional). Offer, don't push, a short block covering: the project's domain and what you're helping with; where the user's judgment beats yours and you should defer; where you should challenge or flag rather than comply; what to escalate rather than decide alone. This is deliberately not a persona — never claim expert-level or superior knowledge; asserting expertise mainly raises confidence, and confidently-wrong is the failure this whole system exists to fight. Offer this fillable default, capped at 80 words, for the user to edit or skip entirely:
You are helping with an academic research project in <domain>. Work as a collaborator, not an assistant: say when you are unsure, flag reasoning you think is wrong rather than going along with it, and ask before acting on an ambiguous instruction. The user's domain judgment in <areas> is better than yours — defer there and check rather than assume. Escalate anything that changes the project's direction.
Skipping this section entirely is fine.
Generate the block, in two parts, in order. Read references/claude_md_block.md. First, copy
its <!-- BEGIN tracker line through its <!-- END tracker --> line, inclusive, unedited — it is
generated from references/invariants.md and regenerated the same way later by tracker-audit.
Second, write its ## Project settings section, filled in with this project's actual answers in
place of the reference file's placeholders, after <!-- END tracker -->, never inside it — kept
out of the generated region precisely so a later regeneration can never overwrite a choice this
project's user made once and that nothing can re-derive:
- Git layout bullet: the letter chosen in Step 1 plus its recorded one-line reminder — omit this bullet entirely if the project was never in a sync folder (there was no question to answer).
- Code-commit bullet:
auto,ask, ornever, as just chosen. - Working-relationship bullet: the filled-in or edited text, or omit the bullet entirely if skipped.
Matching rule (see claude_md_block.md's own header note): a CLAUDE.md has the block if some line
starts with <!-- BEGIN tracker — a prefix match. Never grep for the byte-exact string
<!-- BEGIN tracker -->; the shipped BEGIN line carries a parenthetical after it and that exact
string never appears in an installed block.
- If
CLAUDE.mddoes not exist at the project root: create it containing exactly the block, then## Project settingsright after<!-- END tracker -->. - If
CLAUDE.mdexists and no line starts with<!-- BEGIN tracker: append the block, then## Project settings, to the end of the file, separated from existing content by a blank line. - If a line already starts with
<!-- BEGIN tracker: this should not happen at setup time (Step 0 would have already handed off), but if it does, stop and hand off totracker-auditrather than writing a second block.
Locate ## Project settings by heading name, never by "whatever comes after END." A project's
CLAUDE.md may carry its own sections after where this block lands — the user's own notes, other
tooling's config — and setup must never assume everything past <!-- END tracker --> belongs to it.
If a line reading exactly ## Project settings already exists, write into that section in place. Otherwise
insert the new ## Project settings section immediately after <!-- END tracker -->, ahead of
anything else already there, leaving all of it untouched.
Step 5 — initial commit of tracker/ alone
If git layout D was chosen in Step 1 (no git for this project), skip this step entirely — there
is no git to stage or commit to. Tell the user plainly that tracker/ and CLAUDE.md exist on disk
but are not under version control, and that sync history is the only history from here on. Nothing
in this step applies; the project is otherwise fully set up.
Otherwise, stage only what this skill created — nothing from the project's pre-existing code:
git add tracker/ CLAUDE.md
Before committing, sanity-check what's staged: git diff --cached --stat (file count) and a rough
size check (git diff --cached --stat also shows this, or du -sh tracker/). Everything staged
here is hand-written markdown produced in Steps 2–4, so the count should match what you created
(five tracker/*.md files, one or more tracker/detail/*.md files, one CLAUDE.md) and the total
size should be a few tens of KB at most. If the count or size is a surprise — something unrelated
got staged — stop and investigate before committing; do not commit through an unexplained surprise.
Then commit:
git commit -m "Set up tracker/: scaffold task and decision system"
This is the only commit this skill makes. It never commits the project's existing code — that stays exactly as git left it (untracked, or already committed, depending on Step 1), for the user to commit separately whenever they choose.
What this leaves behind
After this skill finishes, the project has:
- A
tracker/directory that is now the single source of truth for project state, and aCLAUDE.mdblock that puts the standing rules — the I2 write modes, edit-in-place, scope tags, demote-before-add,★reserved for supersession/scope, the date-stamp refresh, stopping criteria before unsupervised work, committingtracker/separately from code — always in context, every session, without anyone having to invoke anything. - A
## Project settingssection right after that block, holding this project's own one-time choices — git layout, code-commit preference, and, if the user wanted it, a short working-relationship note — placed outside the generated region so regeneration can never touch it. - Everything else about
tracker/is invoked, not standing:tracker-setup(this skill, once),tracker-close(every session),tracker-audit(periodic),tracker-supersede(at a pivot). None of them run themselves; an agent has to call them. - One judgment this skill and its siblings never make on their own: declaring a pivot — that
some approach, model, or plan is now dead and something else is now current.
tracker-auditcan surface a candidate and ask; only the human decides yes.
What ships with it: 10 files
35.6 KB alongside SKILL.md
references/
- archive_template.md788 B
- claude_md_block.md5.5 KB
- decision_detail_template.md1.7 KB
- decisions_template.md2.2 KB
- detail_template.md3.3 KB
- index_template.md4.1 KB
- invariants.md8.2 KB
- journal_template.md533 B
- mechanical_checks.md7.0 KB
- priorities_template.md2.3 KB