When you are working against a running llm-tracker hub, fetch GET /help first.
Why:
/helpis the current agent contract for that workspace.- It serves the workspace
README.md, which is copied fromworkspace-template/README.md. - It is the endpoint LLMs should use instead of guessing paths, write modes, or status vocabulary.
If you change any agent-facing behavior, keep these in sync:
workspace-template/README.mdbecause/helpserves itREADME.mdfor human-facing usage and remindersAGENTS.mdwhen the repo-level workflow changes- the MCP layer (
llm-tracker mcp) when the HTTP/CLI contract changes, including tools, resources, and prompts
For this repo specifically:
- keep
/helpaccurate when you add or change agent-facing endpoints or commands - prefer additive updates to the contract rather than silent behavior changes
- if MCP is available, prefer
tracker_help,tracker_projects_status,tracker_project_status,tracker_next,tracker_search,tracker_fuzzy_search,tracker_brief,tracker_why,tracker_decisions,tracker_execute,tracker_verify,tracker_blockers,tracker_changed,tracker_history,tracker_patch,tracker_pick,tracker_undo,tracker_redo, andtracker_reloadover rawcurl - if MCP resources are available, prefer
tracker://helpfor the contract andtracker://workspace/runtimefor daemon + patch workflow details before rereading the full README - if MCP prompts are available, start with
tracker_start_hereand use the workflow prompts instead of inventing your own tool order - remember the MCP daemon rule: read tools work directly from workspace files; write tools (
tracker_patch,tracker_pick,tracker_undo,tracker_redo,tracker_reload) require the hub or daemon to be reachable - remind agents to use
/help,next,searchorfuzzy-search,brief,why,decisions,execute,verify,blockers,changed, andpickbefore they fall back to broad file reads - if the human wants direct zero-token terminal shortcuts in Codex or Claude, use
llm-tracker shortcuts; prompt/skill helpers still spend model tokens - when adding tasks through patch mode, only append genuinely open work; brand-new patch tasks must start as
not_startedorin_progress, notcompleteordeferred - if an idea is already folded into an existing owning row, update that row instead of appending a standalone docs/workflow task and retiring it immediately
- treat bare URLs in
reference/references[]as invalid; use repo-relativepath:lineorpath:line-line - if
/searchreturns a warning, treat that as a degraded local semantic runtime, not as a tracker-data failure; the hub now tries native semantic, then local WASM semantic, then a bundled offline hash semantic runtime, and only then fuzzy fallback - if
/searchreturnsbackend: "semantic_hash_fallback", continue with the returned matches; that means the local model runtime is unavailable but the bundled offline semantic fallback is still working - if
/searchreturnsbackend: "fuzzy_fallback", continue with the returned matches or callfuzzy-searchexplicitly instead of blaming tracker data - if a slug exists on disk but 404s from the hub, retry once first because the hub auto-reloads missing slugs on demand, then prefer
reloadbefore asking for a daemon restart - for metadata backfills on existing projects, prefer bounded active tasks before broad roadmap rows, verify with
next/brief/execute/verify/search, and stop before commit or PR refresh unless the human explicitly asked for that step - do not call a patch that only adds
references[],effort,related, orcommenta complete migration batch for active work; that is retrieval-only enrichment unless execution-contract fields were intentionally out of scope - if the human explicitly asks you to relink a shared symlinked project registration to a different branch/worktree file and the slug is already registered, the safe sequence is: verify target ->
DELETE /api/projects/<slug>to remove only the workspace symlink registration -> re-link the slug ->reload-> verify a read call before writing patches - for linked shared-workspace projects,
GET /api/projects/<slug>and successfulPOST /api/projects/<slug>/patchresponses includefile, the effective tracker JSON path the hub writes; use that instead of guessing whether a linked repo file will get dirtied - for linked shared-workspace projects, high-churn runtime fields (
status,assignee,blocker_reason,meta.scratchpad,updatedAt,rev) now live in<shared-workspace>/.runtime/overlays/<slug>.json; durable tracker edits still write through to the linked repo-local file - for linked repo-local trackers, treat the repo JSON as hub-managed durable state, not branch-local scratch state or a merge artifact; do not use
git restore,git checkout,git stash, or merge-conflict cleanup as a tracker update mechanism - before push or merge, prove
.llm-tracker/trackers/hoplon.jsonon the branch contains the live tracker truth for the touched tasks; comparetracker_briefagainst the repo file and againstorigin/main; do not restore, stash, or discard tracker diffs; if merging would regress tracker truth, stop and make a tracker-sync commit/PR first - for active-task backfills, evaluate the whole author-owned field set, not just the obvious subset:
goal,references[],related,comment,context.tags,context.notes,context.files_touched,blocker_reason,effort,definition_of_done,constraints,expected_changes,allowed_paths, andapproval_required_for - the migration guide's field order is a sequence, not permission to ignore the rest of the author-owned fields when evidence exists
- for linked repo-local trackers such as
<repo>/.llm-tracker/trackers/<slug>.jsonor<repo>/.phalanx/<slug>.json, keep repo file references portable and relative to the repo root; do not rewrite them into machine-specific absolute paths just to force snippet extraction - if a valid repo-relative reference is not producing snippets, verify the shared workspace link and use
reload; treat persistent misses as a resolver/runtime issue to report, not as a reason to bake absolute paths into tracker data - use
kind: "group"plusparent_idfor task tree containment; nested groups are valid, but dependencies remain the only blocker graph - do not use
dependenciesto express grouping, and do not useparent_idto express blocking; if no explicit groups exist, the UI tree view treats swimlanes as the root groups - treat the dependency graph view as derived UI only: it reads existing
dependencies[]blocker edges, adds no schema or data fields, and keeps its optionalparent_idcontainment overlay visual-only