Skip to content

Coding assistants

Factflow carries its own assistant harness in .claude/. It configures how a coding assistant works in this repo: which conventions load automatically, which domain knowledge is available on demand, and which multi-step workflows are one command away.

This is tooling around development. The development process it automates stands on its own — you can follow every step by hand.

DirectoryLoadsPurpose
rules/Automatically, by file pathConstraints. Editing a matching file pulls the rule into context
skills/On demandDomain workflows with worked examples and fixture patterns
commands/When invoked as /nameMulti-step procedures — issue creation, PR review, releases
agents/When delegated toSubagent definitions with their own tool sets
hooks/On tool eventsScripts that intercept actions
issues/Live design docs and task files for in-flight work (tracked)
history/Archived issue folders after their PR merged (tracked, read-only)

.claude/session-state/ and .claude/worktrees/ are gitignored runtime state, not configuration.

The thirteen files in rules/ each declare which paths they govern, so a rule only applies where it is relevant. Editing backend/packages/factflow-infra/src/.../queue/artemis/async_adapter.py pulls in the queue-provider and async-pattern rules; editing a React component pulls in the frontend conventions instead.

RuleGoverns
python-semantics.mdbackend/**/*.py — typing, package boundaries
async-patterns.mdQueue protocol, concurrency layering, completion detection
adapter-conventions.mdbackend/packages/workflows/** — the adapter contract
queue-provider-conventions.mdbackend/**/queue/** — Artemis, RabbitMQ, Pulsar specifics
storage-conventions.mdbackend/**/storage*.py — the sidecar pattern, replay constraints
lineage-conventions.mdCorrelation, pending children, failure isolation
llm-conventions.mdLLM factory, rate limiting, error classification
pipeline-yaml.mdbackend/config/**/*.yaml — config validation
testing-discipline.mdbackend/**/tests/** — fixture selection, invariants
api-contract.mdCross-stack type files — response conventions, SSE
frontend-conventions.mdfrontend/src/** — React patterns, API layer
go-conventions.mdcli/**/*.go — CLI patterns, output formatting
thoroughness.mdGlobal — pattern completeness, destructive operations

These are the authority. When a docs page and a rule disagree, the rule wins, and the code wins over both.

Sixteen skills sit flat one directory deep, prefixed by scope: backend-* for backend domains (queue testing, pipeline testing, adapter patterns, application config, storage patterns, and the rest), shared-* for cross-cutting ones (shared-freestyle, shared-mermaid, shared-epistemic-evaluation, shared-slack-message), plus docsite for this documentation site.

A skill is loaded when the task matches it — writing queue tests pulls in backend-queue-testing, which knows the fixture chain and the provider-specific gotchas. Rules constrain; skills instruct.

CommandArgumentRun byDoes
/ff-issuefree-form titleAnyoneCreates the issue, writes design.md, links it from the issue body
/ff-start<issue-number>AuthorWorktree, branch, task.md, implement, self-review, PR
/ff-review<PR-number>ReviewerChecks out the PR branch, reads changed files, runs the gates, submits a review
/ff-address<issue-or-PR-number>ReviewerCarries out the fixes the review called for, pushes, replies
/ff-code-reviewbackend | frontend | cli | all | pathAnyoneStandalone quality audit. No GitHub interaction, no PR
/ff-release<semver> (optional)Whoever cuts itThe release cycle — see Cutting a release
/freestylefree-form descriptionAnyoneUnderstand → isolate → fix → verify → pause
/scribeAnyoneLoads knowledge-pipeline context

/ff-review and /ff-address belong to the reviewer on a peer-reviewed PR — the reviewer both finds the problems and fixes them, then approves so the author can merge. On a self-reviewed PR the author runs both. See Review and merge for which path applies when.

/ff-start is the ceremonial path. It produces the full artifact trail — issue, design doc, task file, PR, archive — and is what you want for anything a reviewer will need context on. It isolates work in a git worktree so the main tree stays clean.

/freestyle is the direct path for a bug you already understand. It still branches and runs the same gates, but produces no issue artifacts and stops after verifying rather than opening a PR. It hands off to the ceremonial commands when a fix turns out bigger than it looked: "create an issue for this" → /ff-issue, "let's do this properly" → /ff-start.

Both stop and wait rather than committing on their own. Neither pushes without being asked.

  • Source is the only authority. Not a docs page, not a comment, not this page. Verify field names, flags and response shapes against the code that runs.
  • State the scope. "Fix the CLI replay command" gets a better result than "fix replay", because it tells the assistant which stack owns the problem and which types must follow.
  • Cross-stack changes propagate. A backend response-shape change obliges frontend/src/types/ and cli/internal/api/types.go in the same PR. The api label exists to mark exactly this.
  • Untracked files are never deleted. backend/output/, data/ and storage/ hold confidential pipeline data that is gitignored by design and not reproducible. A hook enforces this.