taskgo
SkillDocs & knowledgeMaintains a private Git-backed personal project and task control repository using concise current Markdown, derived Git history, ADRs, and status synchronization. Use when tracking tasks, updating project status (STATUS.md), managing ADRs, synchronizing tracker state, delegating tasks to external agents, or generating human-facing activity reports (weekly/monthly/quarterly).
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the taskgo skill
What this skill tells your AI
The instructions your AI receives, as published by ithinkihaveacat/dotfiles in skills/taskgo/SKILL.md and read by ahel’s review.
Use for one user's private control repository (also called the control repo, taskgo tracker, or project tracker) spanning multiple technical projects and external artifacts. Humans mainly read current Markdown; agents mainly edit it, operate Git, reconstruct history, and generate summaries.
Model
HEAD is optimized for resuming work; Git history explains how HEAD came to be. Rewritten current state keeps routine agent context bounded; do not append journals just to retain history.
AGENTS.md # taskgo declaration + repository instructions
INBOX.md # zero-ceremony capture; no schema
<id>/
README.md # identity, scope, domain/stakeholders, constraints, artifacts (or PROJECT.md)
STATUS.md # current human view + generated task block
PLAN.md # intended route forward (optional)
tasks/*.md # stable task records
decisions/*.md # ADRs (optional)
references/* # supporting context, schemas, design tokens, external docs (optional)
bugreports/* # captured bug reports, reproduction logs, triage traces (optional)
scripts/* # automation, audit harnesses, pipelines, report generators (optional)
data/* # input datasets, package lists, static fixtures (optional)
results/* # benchmark telemetry, run logs, audit outputs (optional)
dist/* # static dashboards, deployable bundles, HTML reports (optional)
The root AGENTS.md explicitly states that the repository follows taskgo and
includes the canonical specification URL:
https://github.com/ithinkihaveacat/dotfiles/tree/master/skills/taskgo. This
ensures agents can discover the governing process from the repository itself.
doctor reports a missing declaration or URL.
A control repo may grant standing authority for guarded local checkpoint commits
by adding this marker to its committed root AGENTS.md:
<!-- taskgo:allow-local-commits -->
This authority applies only to taskgo create, taskgo checkpoint, and
taskgo fix operations in that control repo. It never authorizes commits in
linked artifact repos, pushes, amendments, rebases, or other history rewriting.
Invariants
HEADdescribes current belief; currently applicable knowledge belongs in the tree.- Git owns administrative history. Avoid routine
created,updated,blocked_since, etc. Domain dates are fine.reviewed:is fine when deliberate review freshness matters. - Derive lifecycle transitions from historical frontmatter values. Do not
duplicate
Project:,Task:, orEvent:trailers. - Commit prose preserves conclusions/reasoning that state and diffs cannot.
Ref:trailers may link external revisions, PRs, docs, deployments, etc. - Metadata is optional enrichment. Missing/old fields degrade automation, not validity.
- Keep semantic object paths stable normally. Renaming/reconciliation is allowed for conflicts or genuine corrections.
- Canonical history is append-oriented. Rewrite unpublished work if useful; normally correct integrated history with new commits.
- Private tracker information must not implicitly flow into linked
public/shared artifacts.
Conversation:trailers andconversation://URLs belong strictly in control repository metadata (STATUS.md, task frontmatter, and control repo commits); they must never be added to commits in linked artifact repositories. Artifact repositories host permanent production code, tools, and regression test suites; project-scoped working scripts, datasets, and run results belong in the control repo alongside their project. Very large artifacts (such as cloned Git repositories or heavy binary test data) should not be checked into Git; reference them or download on demand. Artifact path references prefer$HOME-relative form (~/...) to remain portable across machines (list multiple checkout paths when locations vary per environment). STATUS.mdis the self-contained projection of current operational state: readingSTATUS.mddirectly answers status, recent progress, and immediate next steps without traversing individual task files. Synchronize generated task state with current tasks; prose requires agent semantic review.taskgotracks work forward from adoption. Historical context predating tracker setup remains in external artifact repositories and is not retroactively backfilled.- Graceful degradation beats ceremony. Humans may edit useful Markdown imperfectly.
Tool Execution
taskgo is bundled in scripts/taskgo within this skill directory. Commands
operate on a fixed control repository root, resolved in this order:
--root DIR/-R DIR(must appear before the command),- the
TASKGO_ROOTenvironment variable, - the default
~/.projects.
The root must be an existing Git repository; resolution never depends on the
current working directory, so commands work identically from any workspace. Run
taskgo root to print the resolved root (for raw Git operations or direct file
edits), or taskgo doctor to see it with the source that selected it. To
execute the tool:
- Optimal (
$PATH): Iftaskgois installed on your system$PATH, invoke it directly:taskgo <command>. - Dynamic anchor: Otherwise, execute the bundled script relative to the
directory containing this
SKILL.md:<skill-dir>/scripts/taskgo <command>.
Tasks
IDs are exactly TASK-XXXXX, with five uppercase hexadecimal digits (0-9,
A-F), e.g. TASK-3A91F. They should be globally unique within the control
repo. Use random IDs, not a counter:
<skill-dir>/scripts/taskgo id
<skill-dir>/scripts/taskgo create PROJECT "Diagnose intermittent disconnects" --slug disconnects
Task files are named TASK-XXXXX-<slug>.md. The slug is a filename mnemonic,
not the title: create derives one from TITLE when --slug is omitted, but a
derived slug keeps the leading words of the title, which are rarely the
distinguishing ones ("Generate readable task filename slugs with clean length
limits" derives generate-readable-task-filename, where filename-slugs is
wanted). Pass --slug (at most 32 characters after normalization) whenever the
title runs longer than a few words; create warns when it had to shorten a
derived slug. Nothing resolves tasks by filename — IDs and titles carry that —
so slugs exist purely for humans reading tasks/, git log, and fuzzy finders.
Rename an existing task file with update --slug.
Preferred states: todo, in-progress, blocked, done, cancelled.
Unknown/missing values remain readable but should be reported.
Dependencies
A task may declare what is holding it up with an optional blocked_by list of
task IDs. Record the edge on the task that is held, never on the blocker;
otherwise a new dependency means editing an unrelated, often already done,
task. Cross-project edges are fine, since IDs are unique across the control
repo.
blocked_by: [TASK-1627D, TASK-EFD32]
The field is read-only scheduling data, consumed at query time. It never changes
any task's status: status stays hand-authored, so blocked remains
available for anything without a task ID (an unshipped upstream release, a
review you are waiting on). The two combine only in views:
taskgo list [PROJECT] --state ready— the frontier:todotasks with no unresolved edges.readyis derived, not a status you can write.- The
STATUS.mdsnapshot lists a task under### Blockedwhen itsstatusisblockedor an edge is unresolved, naming the blockers.syncwrites no task frontmatter. doctorreports an edge naming an unknown task, astatus: blockedwith nothing actually blocking it (usually a stale hand-set status), and any dependency cycle.
Degradation is deliberate: an edge to a task that no longer exists counts as
resolved, so deleting a task can never leave its dependents permanently
unworkable — doctor reports it instead. fix never writes blocked_by: an
invented edge is worse than an absent one, and most TASK- mentions in prose
are companions or supersessions rather than dependencies. Prose still carries
why something is blocked; the field only carries that it is.
Planning & In-Progress Task Template
For new and in-flight tasks, use bold run-in labels to capture the brief for future implementers without hardening into a rigid step-by-step plan:
---
id: TASK-3A91F
status: todo
conversations:
- conversation://<conversation-id>
---
# Title as imperative verb phrase
*(Tip: Front-load external stakeholder or impact context where applicable, e.g.
"Unblock Partner X via token parser refactor" rather than bare "Refactor token parser".)*
**Problem:** (optional) How the current system behaves and why that is a
problem — the mechanics, not just the motivation. Leave the consequences to
Cost.
**Cost:** (required whenever Problem is present) What leaving this undone
costs — never the effort to fix it. Name the currency, then the concrete
consequence and who absorbs it. Correctness, ergonomics, performance,
maintenance and reputation cover most of it; invent a currency where one of
those would misname the harm, and do not force a task into a listed one to be
consistent with other tasks. A magnitude word is fine when evidence follows it
("Low. Confirmed on 2 of ~107 listings"); a bare "High" or "Critical" is not.
Say whether the cost is paid loudly or silently, since a fault that announces
itself is cheaper than one that does not.
**Goal:** (required) The outcome — what should be true once the item is done,
stated as requirements rather than implementation.
**Criteria:** (required where definable) The end condition — an observable,
checkable state (e.g. metrics, test outputs, specific behavior).
**Sketch:** (optional) Early thinking on a candidate approach, research
findings, pointers to relevant code, or approaches ruled out.
**Constraints:** (optional) Boundaries on the solution: simplest thing that
works, no new dependencies, must keep existing APIs, etc.
Completed Task Template
Once a task is completed, rewrite the body as a concise past-tense record of what was implemented and discovered:
---
id: TASK-3A91F
status: done
conversations:
- conversation://<conversation-id>
---
# Title as imperative verb phrase
## Outcome
Summary of what shipped, where it lives, and explicit verdicts. Completed in
[<conversation-id>](conversation://<conversation-id>).
- **External deliverables & links:** Cite direct canonical URLs (PRs, CLs, issue
tickets, published docs/dashboards) alongside any local repository commits.
- **Triage verdicts:** When triaging claims or defects, record an explicit
terminal verdict (e.g. `Verified Bug`, `Tooling Discrepancy`, `Working As Intended (WAI)`,
`Invalid/Disproven`) to prevent ambiguous summarization.
- **Quantitative deltas:** For performance, optimization, or scale tasks, record
numerical metrics (e.g. `reduced latency from 400ms to 45ms`) rather than
qualitative claims.
Where the task declared a Cost, say whether it is now gone, reduced, or still
being paid — the last is a legitimate outcome and worth stating plainly.
## Findings
Key technical discoveries, trade-offs, reproduction steps, or unexpected
behavior.
- **Downstream momentum:** For external issues, PRs, or partner handoffs, append
subsequent lifecycle transitions (acknowledged, reproduced upstream, release
scheduled) to `Findings` as they occur, even after marking the task `done`.
## Next
Immediate follow-up actions or subsequent tasks.
Decisions
Use lightweight Nygard-style ADRs with Status, Context, Decision,
Consequences. Prefer proposed -> accepted. When an accepted decision
changes, preserve it, mark it superseded, and refer to the replacement ADR. Do
not rewrite accepted rationale merely because the decision later changed;
corrections and merge reconciliation are allowed.
STATUS.md
STATUS.md is the self-contained operational projection for humans and agents.
Reading it directly (or running <skill-dir>/scripts/taskgo status PROJECT)
answers project status, recent outcomes, and immediate direction without
inspecting individual task records.
Structure:
## Summary: Human/agent prose describing the current situation and the key outcome/findings of the most recently completed task(s). Cite the active session using full identifier syntax:Active session ([<conversation-id>](conversation://<conversation-id>)): .... "Conversation ID" refers to the globally unique session, conversation, or thread identifier used by the host agent platform (e.g. at least 16 characters). Do not abbreviate the identifier in the link text or target, and never invent fake placeholder IDs. Replace older transition notes rather than accumulating a journal.<!-- taskgo:begin -->to<!-- taskgo:end -->: Mechanically maintained snapshot (In progress,Blocked, task counts).## Next: Immediate next actions (the active horizon ofPLAN.md).
Keep prose complementary to the generated snapshot: do not repeat task counts or
generic lifecycle facts such as "no task is in progress." When changing a task
status, update its frontmatter and any affected Summary, Next, or PLAN prose as
one logical transition before running sync; never leave a new snapshot beside
prose that describes the previous state.
Run <skill-dir>/scripts/taskgo sync PROJECT; the commit helper also
synchronizes the affected project. doctor catches mechanical drift, but the
invoking agent must compare Summary/Next with current tasks, plan, decisions,
and recent work.
Agent workflow
Querying status: to answer questions about project status, recent
accomplishments, or next steps, read STATUS.md (or run
<skill-dir>/scripts/taskgo status PROJECT). Inspect PLAN.md, individual
tasks/, or Git history only if deeper detail or historical transitions are
requested.
Before work: read root AGENTS.md, then project README.md (or PROJECT.md),
STATUS.md, relevant tasks/ADRs, and PLAN.md when direction matters. Inspect
linked artifact repos under their own instructions.
Commit authority, before starting (when reconstructible lifecycle history matters):
- Committed
taskgo:allow-local-commitsmarker present -> authorized for guardedcreate,checkpoint, andfixoperations in this control repo only. - Authorized: commit a meaningful
in-progresstransition before artifact work that may span sessions; commit completion withRef:trailers for linked artifact commits. A small task completed atomically may go directlytodo->done. Pass--conv <conversation-id>or verifyconversationsfrontmatter andSTATUS.mdcite the full active session identifier. - Not authorized: keep changes uncommitted; state clearly that intermediate transitions will not be retained. Never create retrospective state commits that did not reflect reality at the time.
After meaningful work:
- Rewrite specific files to the new current truth.
- Update affected task record(s) (e.g. mark
donewith## Outcomeand## Findings, recording[<conversation-id>](conversation://<conversation-id>)). - Update
STATUS.mdprose (## Summarycaptures the new baseline, active session link, and recent outcome;## Nextreflects immediate next actions);PLAN.mdonly if intended direction changed. - Run
<skill-dir>/scripts/taskgo sync PROJECTafter the semantic edits are coherent. - Run
<skill-dir>/scripts/taskgo doctor PROJECTand perform its semantic review. - Commit a coherent transition when practical. Use
checkpointwith--convwhen standing authority is present. Subject = what became true, not what file changed. Subjects follow the workspace commit standard (Conventional Commits,type(scope): description, at most 50 characters); nonconforming subjects are rewritten deterministically with a[WARN].
Before leaving or completing a task (especially when marking a task done),
double-check that the project is left in a strict handoff-ready state. A
reader must be able to understand the state of the project and what needs to be
done next without referencing anything else, as they will have no outside
information or context from your current session. Both the task tracker and any
artifacts (including code repos) must reflect this state. Ensure that:
- Handoff-ready tracker: state, findings, decisions, and full
session/conversation IDs
(
[<conversation-id>](conversation://<conversation-id>)) needed to resume are fully written into the task/STATUS/PLAN, not left only in the conversation. - Handoff-ready artifacts: tracker claims match actual artifact-repo state
(e.g. a task is never
donewhile its artifact-repo commit remains uncommitted).
Examples:
chore(home-automation): rule out firmware risk
chore(home-automation): block firmware testing
chore(compiler): defer parser migration until v3
Use commit bodies for useful reasoning not recoverable from state/diff. Add
repeatable Ref: trailers for non-derivable external relationships and
Conversation: trailers for session traceability (in control repo commits only;
never in external artifact repos).
Task Export and Ejection (External Agent Handoff)
When delegating a task to an isolated agent or contributor—one operating strictly within a single artifact repository with no access to the control repository—execute the three-phase delegation lifecycle:
- Phase 1: Export (Control Repo Agent): Evaluate isolation feasibility, resolve path drift, and generate a self-contained task brief (ejection payload).
- Phase 2: Implementation (Isolated Worker): Execute the task on an isolated branch utilizing explicit implementer latitude. Rely exclusively on repo-native validation. Report findings out-of-band.
- Phase 3: Reconciliation & Integration (Control Repo Agent): Review the isolated branch, apply workspace-level tooling (formatters/linters), polish commit formatting to strictly enforce metadata segregation, and commit the finalized tracker state.
Feasibility & Sanity Check (Phase 1)
Before generating the brief, verify feasibility and correctness:
- Isolation Feasibility: The task must be entirely executable within a single target repository. Decline requests requiring active multi-repository orchestration or control repo edits.
- Sanity Pass: Validate that all cited target files, directories, and test scripts currently exist in the target repository. Resolve any legacy paths or phantom targets in the task prose before export.
Payload Construction
Construct the exported brief to be completely self-contained, portable, and ready for worker execution:
- Strict Path Portability: Use repository-relative paths (e.g.
src/parser.py) so instructions resolve cleanly in isolated worker environments. Never output absolute host paths (/Users/...), home directory expansions (~/...), orfile:///URLs. - Component Orientation: Synthesize a concise 1–2 sentence overview of the target subsystem, defining its role within the broader artifact codebase.
- Core Specification & Implementer Latitude: Embed the Title, Problem, Goal, Constraints, and Criteria directly from the task record. Explicitly instruct the worker that they possess implementer latitude: the autonomy to deviate from specific file paths or outdated sketches to accommodate current codebase realities, provided the core goal and acceptance criteria are met.
- Inlined Dependencies: Resolve and inline all referenced ADRs
(
decisions/), references, and exemplary codebase patterns. Strip tracker-relative Markdown links (e.g.[ADR-001](../decisions/001.md)) and replace them with raw text to prevent dangling references. - Secrets and Credentials: Inline necessary API keys or secrets into the exported brief. Emit a visible warning in your chat response prompting the user to verify or redact sensitive data.
- Repo-Native Verification: Specify exact repo-native commands (e.g.
prove tests/...,npm test) for validation. Do not assume the presence of workspace-level tools ortaskgoin the isolated environment.
Handoff & Reconciliation Protocol
Append these operational instructions to the exported brief to govern worker execution:
- Opaque Task ID Preservation: Define the
TASK-XXXXXidentifier as an opaque routing key that must be preserved verbatim. - Commit Conventions: Instruct the worker to commit to an isolated feature
branch (e.g.
<agent>/<task-id>-<slug>). The commit message must append the Task ID as a Git trailer (e.g.Resolves: TASK-XXXXX). Final commit message polishing is reserved for Phase 3 reconciliation. - Out-of-Band Reporting: Instruct the worker to report completion or
permanently blocked states exclusively via chat response, including:
- The verbatim Task ID.
- The exact integration target (branch name, PR URL, or commit hashes).
- Its active session record or link (e.g.
conversation://<conversation-id>). - Key technical findings or architectural trade-offs.
- Strict Data Segregation: Explicitly warn the worker: The Task ID belongs in public commit trailers. Branch references, conversation links, telemetry, and internal reasoning belong strictly in the out-of-band chat response. Private metadata must never leak into artifact commits.
Harbor Task Execution
When delegating tasks to autonomous, unattended agent workers running in
isolated environments, follow the Harbor lifecycle using the taskgo harbor
command namespace (prepare, run, verify).
Unattended execution operates under a four-layer evaluation architecture:
- Layer A: Worker Assertions (Untrusted): Self-reported claims
(
completion.json, exit codes, step trajectories) are untrusted and confer zero integration authority. - Layer B: Independent Verification (Host Rerun): Controller re-evaluates
SHA-256 hashes, runs
patch --dry-runto test applicability, verifies valid syntax, checks blast radius (no out-of-scope files touched), and re-executes repo-native tools/tests. - Layer C: Review Judgments: Synthesizes verification results against task
requirements and constraints, producing categorized findings (
BLOCKER,WARN,INFO). - Layer D: Human Acceptance Boundary: Automated systems compile a
self-contained Candidate Acceptance Packet (
acceptance-packet.mdandacceptance-packet.json) enabling one-click human review. Automatic branch merging or tracker advancement is strictly prohibited; human acceptance is required.
Preflight & Installation
- Harbor CLI: Install version 0.22.0 via
uv tool install harbor==0.22.0. - Docker Daemon: Ensure the local Docker daemon is running (
docker info). - Preflight Verification: Validate configuration and runtime dependencies
offline without running containers:
taskgo harbor run ./trial --dry-runor--print-config.
Workflow
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 48
- Forks
- 10
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
taskgo- Source
- github.com/ithinkihaveacat/dotfiles