## House rules These apply in every Craft repository. A later rule may be stricter, not weaker. The source is `standards/house-rules-core.md` in `storytold/craft-contrib`. Propose changes there, not in a copy. 1. **A person is accountable.** Whoever runs an agent answers for what it opens and for its review comments. 2. **Check, then claim.** Before writing code, read the issue comments, search pull requests for `#N` and the keywords, and check recent commits on `main`. Comment on the issue first. Release a claim you will not finish. 3. **Verify, don't guess.** Open a definition before using it. Confirm the cause in the code, even when someone names a location. 4. **Keep fixes narrow and tested.** Fix what the issue describes, where the bug is. Add a test that fails without the fix. 5. **Review the diff before opening a pull request.** Identifiers exist as used, the test fails without the fix, nothing unrelated changed, and the description is true. 6. **Look for a better pull request.** If another fixes the same thing, close yours when it is better or equal, and say why. 7. **Report only what ran.** Say what you tested and what you could not run. Without a local build or test, say so and rely on CI before marking ready. 8. **`main` changes through a pull request.** Do not push to it. Branch protection enforces this. There is no exception. 9. **Stop and ask only about** licensing outside the allowlist, publishing, releases, a new remote, secrets, spending money, destructive git, and anything else hard to undo. Otherwise keep working. `plan/` is a gitignored notebook, not rules. Without it, do not ask for it and do not stop. 10. **Keep secrets and personal details out** of the repository, logs and requests. 11. **CI stays shared.** Workflows call `storytold/craft-common-actions`. Do not change CI in a feature or fix pull request. If CI cannot cover a change, open an issue there. 12. **Guards say why.** A check that looks removable says what it prevents. Read that before changing it. 13. **Instructions must be readable by everyone.** No notes about one machine, and no links to files a reader cannot open. `craftrules` is retired. Do not link to it. 14. **Keep pull requests moving.** Concurrent pull requests are fine; unanswered actionable feedback is not. Respond in 7 days, a reminder at 14, closure eligible at 30, from when an actionable request waits on the author. Suggestions and unconfirmed bot findings do not start the clock. A fix, explanation or agreed plan resets it; unrelated activity does not. Waiting on a reviewer or maintainer pauses it and does not count against the author. A maintainer decides closure; it is never automatic. Reuse search results, do not poll, and stop at a rate limit. 15. **No agent attribution.** A pull request does not say an agent wrote it. A repository rule may not require that. # AGENTS.md This file provides guidance for coding agents when working with the Artcraft monorepo. ## Project Overview Artcraft is a public-facing Tauri desktop app for generating AI images and video. It uses Rust and TypeScript. Backend services, company tooling, and website builds live in the separate `artcraft-services` repository. ## Project Structure ``` artcraft/ ├── _database/sql/artcraft_migrations/ # Embedded SQLite task database migrations ├── .sqlx/ # SQLite query metadata for offline builds ├── crates/ │ ├── desktop/artcraft/ # Tauri app, configuration, capabilities, icons │ ├── api_clients/ # Desktop provider clients and shared API types │ ├── lib/ # Desktop support libraries │ ├── schema/database/sqlite_tasks/ # Desktop task persistence │ ├── schema/public/ # Shared wire-format enums and identifiers │ ├── testing/ # Shared test helpers │ └── vendor/tauri-plugin-http/ # HTTP plugin fork with cookie access ├── frontend/ │ ├── apps/artcraft/ # Tauri app frontend and public resources │ └── libs/ # Shared frontend libraries ├── script/artcraft/ # Desktop development and build scripts ├── test_data/ # Fixtures used by retained crate tests └── Cargo.toml # Desktop dependency workspace ``` Keep `external/` and `secrets/` untouched. Repository pruning must preserve untracked and ignored local files; delete only Git-tracked paths unless the user explicitly authorizes a cache cleanup. ## Code Style - Rust with no minimum supported version - SQLx for SQLite; prefer `sqlx::query!` / `sqlx::query_as!` compile-time checked macros over runtime `sqlx::query()` whenever possible - A mix of wreq and reqwest for Rust HTTP clients - Never use `println!` or `eprintln!` outside of tests; use `log` crate macros instead - When two crates export the same type name, alias imports with a suffix: `use foo::Bar as BarFoo;` - Prefer `use` imports over inline fully-qualified paths; only qualify inline for true one-offs or std collisions - TypeScript with Nx, React, Vite, Zustand, and Three.js - Use two spaces for indentation - Each Tauri command belongs in its own file module, named after the command. Keep shared state, types, and helpers in separate support modules; see the [Storyteller command conventions](crates/desktop/artcraft/src/services/storyteller/commands/AGENTS.md). ### File Layout Organize for top-to-bottom reading. Important things first, details later. - **Constants** at the top (after imports) - **Structs/enums** next; outer structs above inner sub-structs - **API types** in order: Request, Response, Error - **In impl blocks**: constructors first, then public methods, then private helpers - Private helpers go *below* the methods that call them - Among helpers: meatier logic above leaf-level formatters - **In test modules**: constants first, then test cases (grouped into sub-modules when 2+), then helper functions last ## Markdown - **Tables must be space-padded so columns align in plain text.** Markdown tables are read raw (terminals, diffs, editors) at least as often as rendered, and condensed tables are unreadable there. Pad every cell to its column width: ```markdown | Model | Configuration | Credits | Speed | Score | |--------------|---------------|--------------------|---------| | Meshy 6 | text or image | 104 | 80.0 | +24 | | Rodin 2.5 | text or image | 13 | 10.0 | +3 | ``` Not: `| Model | Configuration | Credits | Speed | Score |` packed tight with varying widths per row.