Deft Directive is a Markdown framework that provides layered behavioral rules, workflow strategies, and quality gates for AI-assisted software development. This guide walks you through installing Deft, configuring your preferences, creating your first project specification, and using strategies to drive implementation.
Note: Full guide content is deferred until Phases 1-3 of the Deft Directive specification ship. This stub establishes the document structure; sections will be fleshed out as the framework stabilises. See SPECIFICATION.md and ROADMAP.md for current status.
If you are adopting Deft on a project that already has an issue tracker (existing repo, brownfield migration, an upstream bug list that has been accumulating), you do not have to start from an empty vbrief/proposed/. The refinement skill's Phase 0 triage workflow lets you walk an existing backlog locally, decide what to keep, and let only the accepted items land in vbrief/proposed/. Trigger words: "triage", "work the cache", "pre-ingest", "action menu".
A real-sized backlog can drain the shared GitHub GraphQL bucket if you fetch everything at once (see #976 for the recurring symptom). Scope the first populate so it lands in seconds rather than minutes:
task triage:bootstrap -- --limit 50 --state openFlag surface (shared by task triage:bootstrap and task cache:fetch-all):
--limit <N>caps the number of issues fetched (start with50and widen as needed).--state {open|closed|all}selects the issue state (defaultopen).--batch-size <N>caps the per-page fetch (default10).--delay-ms <N>inserts a sleep between batches so a populate against a large repo does not trip the rate limiter (default500; a429retries automatically using the upstreamRetry-Afterheader).--repo OWNER/NAMEis optional; when omitted, the bootstrap infers the slug fromgit remote get-url origin.
The unbounded no-flag form remains the default for small backlogs. For real-sized repos, prefer the scoped first run; you can always re-enter triage later to widen the slice.
After the cache is populated, ask your agent to triage. For each cached candidate the agent presents a numbered action menu and waits for your decision:
1. Accept -- task triage:accept <issue> (writes proposed/ vBRIEF + audit-log entry)
2. Reject -- task triage:reject <issue> (audit-log entry only; closes the upstream issue)
3. Defer -- task triage:defer <issue> (non-terminal; resurfaces on the next pass)
4. Needs-AC -- task triage:needs-ac <issue> (non-terminal; flags missing acceptance criteria)
5. Mark duplicate -- task triage:mark-duplicate <a> <b> (terminal; cross-links the duplicate target)
6. Discuss
7. Back
Only accepted items become scope vBRIEFs in vbrief/proposed/. Rejected, deferred, and duplicate decisions are recorded in the audit log so the backlog stays focused. Bulk verbs (task triage:bulk-accept / bulk-reject / bulk-defer / bulk-needs-ac) handle predictable patterns (e.g. "reject every wontfix-labelled candidate") without walking the menu N times.
Phase 0 reads and writes three distinct stores; they never collapse into one:
- Cache —
.deft-cache/github-issue/<owner>/<repo>/<N>/is the local mirror of fetched issue bodies, labels, and state. Populated bytask cache:fetch-all; read viatask cache:get -- github-issue OWNER/NAME/<N>. The directory is gitignored — your local mirror is private to your machine. The cache is the read surface for triage so decisions are reproducible across re-runs (no livegh issue viewper decision). - Audit log —
vbrief/.eval/candidates.jsonlis an append-only JSONL recording every candidate you have ever seen plus the action taken (accept | reject | defer | needs-ac | mark-duplicate) and a timestamp. Re-running triage against the same cache short-circuits items that already have a terminal entry, so deferred / Needs-AC items resurface and rejected ones do not. - Accepted backlog —
vbrief/proposed/is the standard scope-vBRIEF lifecycle folder. Writes flow only throughtask triage:accept, which delegates the actual vBRIEF authoring totask issue:ingestso slug, reference, and schema rules stay in one place. Hand-authored proposed/ vBRIEFs are still allowed; what changed is that triage no longer writes there silently.
The shared GitHub GraphQL bucket (5000 points/hour per identity) is the operational bottleneck under multi-agent / shared-identity workflows, not the REST core bucket. The triage cache is REST-backed (gh api reads, not gh issue view --json), and the populate uses batched delays plus automatic 429 retries with the upstream Retry-After header. There is no live gh issue view per accept / reject / defer decision — every decision reads from the local cache. This is why the scoped flags exist: they let you keep the populate inside the REST budget and well clear of the GraphQL bottleneck (see #976 for the recurrence pattern). Refresh the cache on demand with task cache:fetch-all (idempotent — fresh entries are skipped) or audit drift against vbrief/active/*.vbrief.json with task triage:refresh-active.
Full command reference for every triage and cache verb lives in commands.md § Backlog triage & cache tasks; the canonical agent-facing description of the workflow lives in skills/deft-directive-refinement/SKILL.md Phase 0.